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 }