001    package com.thaiopensource.validate.nrl;
002    
003    import org.xml.sax.Attributes;
004    
005    class FilteredAttributes implements Attributes {
006      private final Attributes attributes;
007      private final IntSet indexSet;
008      private int[] reverseIndexMap;
009    
010      public FilteredAttributes(IntSet indexSet, Attributes attributes) {
011        this.indexSet = indexSet;
012        this.attributes = attributes;
013      }
014    
015      private int reverseIndex(int k) {
016        if (reverseIndexMap == null) {
017          reverseIndexMap = new int[attributes.getLength()];
018          for (int i = 0, len = indexSet.size(); i < len; i++)
019            reverseIndexMap[indexSet.get(i)] = i + 1;
020        }
021        return reverseIndexMap[k] - 1;
022      }
023    
024      public int getLength() {
025        return indexSet.size();
026      }
027    
028      public String getURI(int index) {
029        if (index < 0 || index >= indexSet.size())
030          return null;
031        return attributes.getURI(indexSet.get(index));
032      }
033    
034      public String getLocalName(int index) {
035        if (index < 0 || index >= indexSet.size())
036          return null;
037        return attributes.getLocalName(indexSet.get(index));
038      }
039    
040      public String getQName(int index) {
041        if (index < 0 || index >= indexSet.size())
042          return null;
043        return attributes.getQName(indexSet.get(index));
044      }
045    
046      public String getType(int index) {
047        if (index < 0 || index >= indexSet.size())
048          return null;
049        return attributes.getType(indexSet.get(index));
050      }
051    
052      public String getValue(int index) {
053        if (index < 0 || index >= indexSet.size())
054          return null;
055        return attributes.getValue(indexSet.get(index));
056      }
057    
058      public int getIndex(String uri, String localName) {
059        int n = attributes.getIndex(uri, localName);
060        if (n < 0)
061          return n;
062        return reverseIndex(n);
063      }
064    
065      public int getIndex(String qName) {
066        int n = attributes.getIndex(qName);
067        if (n < 0)
068          return n;
069        return reverseIndex(n);
070      }
071    
072      private int getRealIndex(String uri, String localName) {
073        int index = attributes.getIndex(uri, localName);
074        if (index < 0 || reverseIndex(index) < 0)
075          return -1;
076        return index;
077      }
078    
079      private int getRealIndex(String qName) {
080        int index = attributes.getIndex(qName);
081        if (index < 0 || reverseIndex(index) < 0)
082          return -1;
083        return index;
084      }
085    
086      public String getType(String uri, String localName) {
087        return attributes.getType(getRealIndex(uri, localName));
088      }
089    
090      public String getValue(String uri, String localName) {
091        return attributes.getValue(getRealIndex(uri, localName));
092      }
093    
094      public String getType(String qName) {
095        return attributes.getType(getRealIndex(qName));
096      }
097    
098      public String getValue(String qName) {
099        return attributes.getValue(getRealIndex(qName));
100      }
101    
102    }