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 }