package com.thaiopensource.validate.mns;
import org.xml.sax.Attributes;
class NamespaceFilteredAttributes implements Attributes {
private final String ns;
private final boolean keepLocal;
private final Attributes attributes;
private final int[] indexMap;
private final int[] reverseIndexMap;
public NamespaceFilteredAttributes(String ns, boolean keepLocal, Attributes attributes) {
this.ns = ns;
this.keepLocal = keepLocal;
this.attributes = attributes;
int n = 0;
for (int i = 0, len = attributes.getLength(); i < len; i++)
if (keepAttribute(attributes.getURI(i)))
n++;
indexMap = new int[n];
reverseIndexMap = new int[attributes.getLength()];
n = 0;
for (int i = 0, len = attributes.getLength(); i < len; i++) {
if (keepAttribute(attributes.getURI(i))) {
reverseIndexMap[i] = n;
indexMap[n++] = i;
}
else
reverseIndexMap[i] = -1;
}
}
private boolean keepAttribute(String uri) {
return uri.equals(ns) || (keepLocal && uri.equals(""));
}
public int getLength() {
return indexMap.length;
}
public String getURI(int index) {
if (index < 0 || index >= indexMap.length)
return null;
return attributes.getURI(indexMap[index]);
}
public String getLocalName(int index) {
if (index < 0 || index >= indexMap.length)
return null;
return attributes.getLocalName(indexMap[index]);
}
public String getQName(int index) {
if (index < 0 || index >= indexMap.length)
return null;
return attributes.getQName(indexMap[index]);
}
public String getType(int index) {
if (index < 0 || index >= indexMap.length)
return null;
return attributes.getType(indexMap[index]);
}
public String getValue(int index) {
if (index < 0 || index >= indexMap.length)
return null;
return attributes.getValue(indexMap[index]);
}
public int getIndex(String uri, String localName) {
int n = attributes.getIndex(uri, localName);
if (n < 0)
return n;
return reverseIndexMap[n];
}
public int getIndex(String qName) {
int n = attributes.getIndex(qName);
if (n < 0)
return n;
return reverseIndexMap[n];
}
public String getType(String uri, String localName) {
if (keepAttribute(uri))
return attributes.getType(uri, localName);
return null;
}
public String getValue(String uri, String localName) {
if (keepAttribute(uri))
return attributes.getValue(uri, localName);
return null;
}
public String getType(String qName) {
int i = getIndex(qName);
if (i < 0)
return null;
return getType(i);
}
public String getValue(String qName) {
int i = getIndex(qName);
if (i < 0)
return null;
return getValue(i);
}
}