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 }