package com.thaiopensource.validate.nvdl;
import org.xml.sax.Attributes;
/**
* Implementation of the Attributes interface that filters out some of the
* attributes of an actual Attributes implementation. We will keep only the
* attributes whose indexes are specified in a given set of indexes.
*/
class FilteredAttributes implements Attributes {
/**
* The actual attributes, we will filter out some of them.
*/
private final Attributes attributes;
/**
* The set of indexes of the attributes to used.
*/
private final IntSet indexSet;
/**
* Maps indexes in the real attributes list to 1 based indexes in the
* filtered attributes list. For instance if we keep only the
* 1st and the 3rd attributes from 4 attributes then the
* reverse index map will have as values
* [0] --> 1
* [1] --> 0
* [2] --> 2
* [3] --> 0
*
*/
private int[] reverseIndexMap;
/**
* Creates a filtered attributes instance.
* @param indexSet The set with indexes that we will keep.
* @param attributes The actual attributes.
*/
public FilteredAttributes(IntSet indexSet, Attributes attributes) {
this.indexSet = indexSet;
this.attributes = attributes;
}
/**
* Gets the index in the filtered set for a given real index.
* If the reverseIndexMap is not computed it computes it,
* otherwise it just uses the previously computed map.
* @param k The index in the real attributes.
* @return The index in the filtered attributes.
*/
private int reverseIndex(int k) {
if (reverseIndexMap == null) {
reverseIndexMap = new int[attributes.getLength()];
for (int i = 0, len = indexSet.size(); i < len; i++)
reverseIndexMap[indexSet.get(i)] = i + 1;
}
return reverseIndexMap[k] - 1;
}
/**
* The number of attributes, the same as the length of the list of indexes.
*/
public int getLength() {
return indexSet.size();
}
/**
* Get the URI for the index-th attribute.
*/
public String getURI(int index) {
if (index < 0 || index >= indexSet.size())
return null;
return attributes.getURI(indexSet.get(index));
}
/**
* Get the local name for the index-th attribute.
*/
public String getLocalName(int index) {
if (index < 0 || index >= indexSet.size())
return null;
return attributes.getLocalName(indexSet.get(index));
}
/**
* Get the QName for the index-th attribute.
*/
public String getQName(int index) {
if (index < 0 || index >= indexSet.size())
return null;
return attributes.getQName(indexSet.get(index));
}
/**
* Get the type for the index-th attribute.
*/
public String getType(int index) {
if (index < 0 || index >= indexSet.size())
return null;
return attributes.getType(indexSet.get(index));
}
/**
* Get the value for the index-th attribute.
*/
public String getValue(int index) {
if (index < 0 || index >= indexSet.size())
return null;
return attributes.getValue(indexSet.get(index));
}
public int getIndex(String uri, String localName) {
int n = attributes.getIndex(uri, localName);
if (n < 0)
return n;
return reverseIndex(n);
}
public int getIndex(String qName) {
int n = attributes.getIndex(qName);
if (n < 0)
return n;
return reverseIndex(n);
}
/**
* Get the real index, in the initial attributes list of a given attribute.
* If the attribute is filtered out then return -1.
* @param uri The attribute uri.
* @param localName The attribute local name.
* @return The real index if the attribute is present and not filtered out, otherwise -1.
*/
private int getRealIndex(String uri, String localName) {
int index = attributes.getIndex(uri, localName);
if (index < 0 || reverseIndex(index) < 0)
return -1;
return index;
}
/**
* Get the real index, in the initial attributes list of a given attribute.
* If the attribute is filtered out then return -1.
* @param qName The attribute qualified name.
* @return The real index if the attribute is present and not filtered out, otherwise -1.
*/
private int getRealIndex(String qName) {
int index = attributes.getIndex(qName);
if (index < 0 || reverseIndex(index) < 0)
return -1;
return index;
}
/**
* Get the type of the attribute.
* @param uri The attribute uri.
* @param localName The attribute local name.
*/
public String getType(String uri, String localName) {
return attributes.getType(getRealIndex(uri, localName));
}
/**
* Get the value of the attribute.
* @param uri The attribute uri.
* @param localName The attribute local name.
*/
public String getValue(String uri, String localName) {
return attributes.getValue(getRealIndex(uri, localName));
}
/**
* Get the type of the attribute.
* @param qName The attribute qualified name.
*/
public String getType(String qName) {
return attributes.getType(getRealIndex(qName));
}
/**
* Get the value of the attribute.
* @param qName The attribute qualified name.
*/
public String getValue(String qName) {
return attributes.getValue(getRealIndex(qName));
}
}