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