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 }