1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.apache.harmony.xml; 18 19 import org.xml.sax.Attributes; 20 21 /** 22 * Wraps native attribute array. 23 */ 24 abstract class ExpatAttributes implements Attributes { 25 26 /** 27 * Since we don't do validation, pretty much everything is CDATA type. 28 */ 29 private static final String CDATA = "CDATA"; 30 31 /** 32 * Gets the number of attributes. 33 */ getLength()34 public abstract int getLength(); 35 36 /** 37 * Gets the pointer to the parser. We need this so we can get to the 38 * interned string pool. 39 */ getParserPointer()40 abstract long getParserPointer(); 41 42 /** 43 * Gets the pointer to the underlying attribute array. Can be 0 if the 44 * length is 0. 45 */ getPointer()46 public abstract long getPointer(); 47 getURI(int index)48 public String getURI(int index) { 49 if (index < 0 || index >= getLength()) { 50 return null; 51 } 52 return getURI(getParserPointer(), getPointer(), index); 53 } 54 getLocalName(int index)55 public String getLocalName(int index) { 56 return (index < 0 || index >= getLength()) 57 ? null 58 : getLocalName(getParserPointer(), getPointer(), index); 59 } 60 getQName(int index)61 public String getQName(int index) { 62 return (index < 0 || index >= getLength()) 63 ? null 64 : getQName(getParserPointer(), getPointer(), index); 65 } 66 getType(int index)67 public String getType(int index) { 68 return (index < 0 || index >= getLength()) ? null : CDATA; 69 } 70 getValue(int index)71 public String getValue(int index) { 72 return (index < 0 || index >= getLength()) 73 ? null 74 : getValueByIndex(getPointer(), index); 75 } 76 getIndex(String uri, String localName)77 public int getIndex(String uri, String localName) { 78 if (uri == null) { 79 throw new NullPointerException("uri == null"); 80 } 81 if (localName == null) { 82 throw new NullPointerException("localName == null"); 83 } 84 long pointer = getPointer(); 85 if (pointer == 0) { 86 return -1; 87 } 88 return getIndex(pointer, uri, localName); 89 } 90 getIndex(String qName)91 public int getIndex(String qName) { 92 if (qName == null) { 93 throw new NullPointerException("qName == null"); 94 } 95 long pointer = getPointer(); 96 if (pointer == 0) { 97 return -1; 98 } 99 return getIndexForQName(pointer, qName); 100 } 101 getType(String uri, String localName)102 public String getType(String uri, String localName) { 103 if (uri == null) { 104 throw new NullPointerException("uri == null"); 105 } 106 if (localName == null) { 107 throw new NullPointerException("localName == null"); 108 } 109 return getIndex(uri, localName) == -1 ? null : CDATA; 110 } 111 getType(String qName)112 public String getType(String qName) { 113 return getIndex(qName) == -1 ? null : CDATA; 114 } 115 getValue(String uri, String localName)116 public String getValue(String uri, String localName) { 117 if (uri == null) { 118 throw new NullPointerException("uri == null"); 119 } 120 if (localName == null) { 121 throw new NullPointerException("localName == null"); 122 } 123 long pointer = getPointer(); 124 if (pointer == 0) { 125 return null; 126 } 127 return getValue(pointer, uri, localName); 128 } 129 getValue(String qName)130 public String getValue(String qName) { 131 if (qName == null) { 132 throw new NullPointerException("qName == null"); 133 } 134 long pointer = getPointer(); 135 if (pointer == 0) { 136 return null; 137 } 138 return getValueForQName(pointer, qName); 139 } 140 getURI(long pointer, long attributePointer, int index)141 private static native String getURI(long pointer, long attributePointer, int index); getLocalName(long pointer, long attributePointer, int index)142 private static native String getLocalName(long pointer, long attributePointer, int index); getQName(long pointer, long attributePointer, int index)143 private static native String getQName(long pointer, long attributePointer, int index); getValueByIndex(long attributePointer, int index)144 private static native String getValueByIndex(long attributePointer, int index); getIndex(long attributePointer, String uri, String localName)145 private static native int getIndex(long attributePointer, String uri, String localName); getIndexForQName(long attributePointer, String qName)146 private static native int getIndexForQName(long attributePointer, String qName); getValue(long attributePointer, String uri, String localName)147 private static native String getValue(long attributePointer, String uri, String localName); getValueForQName(long attributePointer, String qName)148 private static native String getValueForQName(long attributePointer, String qName); freeAttributes(long pointer)149 protected native void freeAttributes(long pointer); 150 } 151