Mercurial > repos > pfrommolt > ngsrich
diff NGSrich_0.5.5/src/org/jdom/AttributeList.java @ 0:89ad0a9cca52 default tip
Uploaded
author | pfrommolt |
---|---|
date | Mon, 21 Nov 2011 08:12:19 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NGSrich_0.5.5/src/org/jdom/AttributeList.java Mon Nov 21 08:12:19 2011 -0500 @@ -0,0 +1,518 @@ +/*-- + + $Id: AttributeList.java,v 1.24 2007/11/10 05:28:58 jhunter Exp $ + + Copyright (C) 2000-2007 Jason Hunter & Brett McLaughlin. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "JDOM" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact <request_AT_jdom_DOT_org>. + + 4. Products derived from this software may not be called "JDOM", nor + may "JDOM" appear in their name, without prior written permission + from the JDOM Project Management <request_AT_jdom_DOT_org>. + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + JDOM Project (http://www.jdom.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.jdom.org/images/logos. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + This software consists of voluntary contributions made by many + individuals on behalf of the JDOM Project and was originally + created by Jason Hunter <jhunter_AT_jdom_DOT_org> and + Brett McLaughlin <brett_AT_jdom_DOT_org>. For more information + on the JDOM Project, please see <http://www.jdom.org/>. + + */ + +package org.jdom; + +import java.util.*; + +/** + * <code>AttributeList</code> represents legal JDOM <code>Attribute</code> + * content. This class is NOT PUBLIC; users should see it as a simple List + * implementation. + * + * @author Alex Rosen + * @author Philippe Riand + * @author Bradley S. Huffman + * @version $Revision: 1.24 $, $Date: 2007/11/10 05:28:58 $ + * @see CDATA + * @see Comment + * @see Element + * @see EntityRef + * @see ProcessingInstruction + * @see Text + */ +class AttributeList extends AbstractList + implements List, java.io.Serializable { + + private static final String CVS_ID = + "@(#) $RCSfile: AttributeList.java,v $ $Revision: 1.24 $ $Date: 2007/11/10 05:28:58 $ $Name: jdom_1_1_1 $"; + + private static final int INITIAL_ARRAY_SIZE = 5; + + /** The backing list */ + private Attribute elementData[]; + private int size; + + /** The parent Element */ + private Element parent; + + /** Force an Element parent */ + private AttributeList() {} + + /** + * Create a new instance of the AttributeList representing + * Element content + * + * @param parent element whose attributes are to be held + */ + AttributeList(Element parent) { + this.parent = parent; + } + + /** + * Package internal method to support building from sources that are + * 100% trusted. + * + * @param a attribute to add without any checks + */ + final void uncheckedAddAttribute(Attribute a) { + a.parent = parent; + ensureCapacity(size + 1); + elementData[size++] = a; + modCount++; + } + + /** + * Add a attribute to the end of the list or replace a existing + * attribute with the same name and <code>Namespace</code>. + * + * @param obj The object to insert into the list. + * @return true (as per the general contract of Collection.add). + * @throws IndexOutOfBoundsException if index < 0 || index > size() + */ + public boolean add(Object obj) { + if (obj instanceof Attribute) { + Attribute attribute = (Attribute) obj; + int duplicate = indexOfDuplicate(attribute); + if (duplicate < 0) { + add(size(), attribute); + } + else { + set(duplicate, attribute); + } + } + else if (obj == null) { + throw new IllegalAddException("Cannot add null attribute"); + } + else { + throw new IllegalAddException("Class " + + obj.getClass().getName() + + " is not an attribute"); + } + return true; + } + + /** + * Inserts the specified attribute at the specified position in this list. + * Shifts the attribute currently at that position (if any) and any + * subsequent attributes to the right (adds one to their indices). + * + * @param index The location to set the value to. + * @param obj The object to insert into the list. + * throws IndexOutOfBoundsException if index < 0 || index > size() + */ + public void add(int index, Object obj) { + if (obj instanceof Attribute) { + Attribute attribute = (Attribute) obj; + int duplicate = indexOfDuplicate(attribute); + if (duplicate >= 0) { + throw new IllegalAddException("Cannot add duplicate attribute"); + } + add(index, attribute); + } + else if (obj == null) { + throw new IllegalAddException("Cannot add null attribute"); + } + else { + throw new IllegalAddException("Class " + + obj.getClass().getName() + + " is not an attribute"); + } + modCount++; + } + + /** + * Check and add the <code>Attribute</code> to this list at + * the given index. Note: does not check for duplicate + * attributes. + * + * @param index index where to add <code>Attribute</code> + * @param attribute <code>Attribute</code> to add + */ + void add(int index, Attribute attribute) { + if (attribute.getParent() != null) { + throw new IllegalAddException( + "The attribute already has an existing parent \"" + + attribute.getParent().getQualifiedName() + "\""); + } + + String reason = Verifier.checkNamespaceCollision(attribute, parent); + if (reason != null) { + throw new IllegalAddException(parent, attribute, reason); + } + + if (index<0 || index>size) { + throw new IndexOutOfBoundsException("Index: " + index + + " Size: " + size()); + } + + attribute.setParent(parent); + + ensureCapacity(size+1); + if( index==size ) { + elementData[size++] = attribute; + } else { + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = attribute; + size++; + } + modCount++; + } + + /** + * Add all the objects in the specified collection. + * + * @param collection The collection containing all the objects to add. + * @return <code>true</code> if the list was modified as a result of + * the add. + */ + public boolean addAll(Collection collection) { + return addAll(size(), collection); + } + + /** + * Inserts the specified collecton at the specified position in this list. + * Shifts the attribute currently at that position (if any) and any + * subsequent attributes to the right (adds one to their indices). + * + * @param index The offset to start adding the data in the collection + * @param collection The collection to insert into the list. + * @return <code>true</code> if the list was modified as a result of + * the add. + * throws IndexOutOfBoundsException if index < 0 || index > size() + */ + public boolean addAll(int index, Collection collection) { + if (index<0 || index>size) { + throw new IndexOutOfBoundsException("Index: " + index + + " Size: " + size()); + } + + if ((collection == null) || (collection.size() == 0)) { + return false; + } + ensureCapacity(size() + collection.size()); + + int count = 0; + + try { + Iterator i = collection.iterator(); + while (i.hasNext()) { + Object obj = i.next(); + add(index + count, obj); + count++; + } + } + catch (RuntimeException exception) { + for (int i = 0; i < count; i++) { + remove(index); + } + throw exception; + } + + return true; + } + + /** + * Clear the current list. + */ + public void clear() { + if (elementData != null) { + for (int i = 0; i < size; i++) { + Attribute attribute = elementData[i]; + attribute.setParent(null); + } + elementData = null; + size = 0; + } + modCount++; + } + + /** + * Clear the current list and set it to the contents + * of the <code>Collection</code>. + * object. + * + * @param collection The collection to use. + */ + void clearAndSet(Collection collection) { + Attribute[] old = elementData; + int oldSize = size; + + elementData = null; + size = 0; + + if ((collection != null) && (collection.size() != 0)) { + ensureCapacity(collection.size()); + try { + addAll(0, collection); + } + catch (RuntimeException exception) { + elementData = old; + size = oldSize; + throw exception; + } + } + + if (old != null) { + for (int i = 0; i < oldSize; i++) { + Attribute attribute = old[i]; + attribute.setParent(null); + } + } + modCount++; + } + + /** + * Increases the capacity of this <code>AttributeList</code> instance, + * if necessary, to ensure that it can hold at least the number of + * items specified by the minimum capacity argument. + * + * @param minCapacity the desired minimum capacity. + */ + private void ensureCapacity(int minCapacity) { + if (elementData == null) { + elementData = new Attribute[Math.max(minCapacity, INITIAL_ARRAY_SIZE)]; + } + else { + int oldCapacity = elementData.length; + if (minCapacity > oldCapacity) { + Attribute oldData[] = elementData; + int newCapacity = (oldCapacity * 3)/2 + 1; + if (newCapacity < minCapacity) + newCapacity = minCapacity; + elementData = new Attribute[newCapacity]; + System.arraycopy(oldData, 0, elementData, 0, size); + } + } + } + + /** + * Return the object at the specified offset. + * + * @param index The offset of the object. + * @return The Object which was returned. + */ + public Object get(int index) { + if (index<0 || index>=size) { + throw new IndexOutOfBoundsException("Index: " + index + + " Size: " + size()); + } + + return elementData[index]; + } + + /** + * Return the <code>Attribute</code> with the + * given name and <code>Namespace</code>. + * + * @param name name of attribute to return + * @param namespace <code>Namespace</code> to match + * @return the <code>Attribute</code>, or null if one doesn't exist. + */ + Object get(String name, Namespace namespace) { + int index = indexOf(name, namespace); + if (index < 0) { + return null; + } + return elementData[index]; + } + + /** + * Return index of the <code>Attribute</code> with the + * given name and uri. + */ + int indexOf(String name, Namespace namespace) { + String uri = namespace.getURI(); + if (elementData != null) { + for (int i = 0; i < size; i++) { + Attribute old = elementData[i]; + String oldURI = old.getNamespaceURI(); + String oldName = old.getName(); + if (oldURI.equals(uri) && oldName.equals(name)) { + return i; + } + } + } + return -1; + } + + /** + * Remove the object at the specified offset. + * + * @param index The offset of the object. + * @return The Object which was removed. + */ + public Object remove(int index) { + if (index<0 || index>=size) + throw new IndexOutOfBoundsException("Index: " + index + + " Size: " + size()); + + Attribute old = elementData[index]; + old.setParent(null); + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index+1, elementData, index,numMoved); + elementData[--size] = null; // Let gc do its work + modCount++; + return old; + } + + /** + * Remove the <code>Attribute</code> with the + * given name and <code>Namespace</code>. + * + * @param namespace <code>Namespace</code> to match + * @return the <code>true</code> if attribute was removed, + * <code>false</code> otherwise + */ + boolean remove(String name, Namespace namespace) { + int index = indexOf(name, namespace); + if (index < 0) { + return false; + } + remove(index); + return true; + } + + /** + * Set the object at the specified location to the supplied + * object. + * + * @param index The location to set the value to. + * @param obj The location to set the value to. + * @return The object which was replaced. + * throws IndexOutOfBoundsException if index < 0 || index >= size() + */ + public Object set(int index, Object obj) { + if (obj instanceof Attribute) { + Attribute attribute = (Attribute) obj; + int duplicate = indexOfDuplicate(attribute); + if ((duplicate >= 0) && (duplicate != index)) { + throw new IllegalAddException("Cannot set duplicate attribute"); + } + return set(index, attribute); + } + else if (obj == null) { + throw new IllegalAddException("Cannot add null attribute"); + } + else { + throw new IllegalAddException("Class " + + obj.getClass().getName() + + " is not an attribute"); + } + } + + /** + * Set the object at the specified location to the supplied + * object. Note: does not check for duplicate attributes. + * + * @param index The location to set the value to. + * @param attribute The attribute to set. + * @return The object which was replaced. + * throws IndexOutOfBoundsException if index < 0 || index >= size() + */ + Object set(int index, Attribute attribute) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("Index: " + index + + " Size: " + size()); + + if (attribute.getParent() != null) { + throw new IllegalAddException( + "The attribute already has an existing parent \"" + + attribute.getParent().getQualifiedName() + "\""); + } + + String reason = Verifier.checkNamespaceCollision(attribute, parent); + if (reason != null) { + throw new IllegalAddException(parent, attribute, reason); + } + + Attribute old = (Attribute) elementData[index]; + old.setParent(null); + + elementData[index] = attribute; + attribute.setParent(parent); + return old; + } + + /** + * Return index of attribute with same name and Namespace, or + * -1 if one doesn't exist + */ + private int indexOfDuplicate(Attribute attribute) { + int duplicate = -1; + String name = attribute.getName(); + Namespace namespace = attribute.getNamespace(); + duplicate = indexOf(name, namespace); + return duplicate; + } + + /** + * Return the number of items in this list + * + * @return The number of items in this list. + */ + public int size() { + return size; + } + + /** + * Return this list as a <code>String</code> + */ + public String toString() { + return super.toString(); + } +}