diff options
Diffstat (limited to 'examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/AttributesImpl.java')
-rw-r--r-- | examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/AttributesImpl.java | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/AttributesImpl.java b/examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/AttributesImpl.java new file mode 100644 index 000000000..a1cbc8e3e --- /dev/null +++ b/examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/AttributesImpl.java @@ -0,0 +1,345 @@ +/******************************************************************************* + * Copyright (c) 2000, 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.compare.examples.xml; + +import org.xml.sax.Attributes; + +/** + * An Attributes implementation that can perform more operations + * than the attribute list helper supplied with the standard SAX2 + * distribution. + */ +public class AttributesImpl implements Attributes { + + /** Head node. */ + private ListNode fHead; + + /** Tail node. */ + private ListNode fTail; + + /** Length. */ + private int fLength; + + + /* Returns the number of attributes. */ + @Override + public int getLength() { + return fLength; + } + + /* Returns the index of the specified attribute. */ + @Override + public int getIndex(String raw) { + ListNode place= fHead; + int index= 0; + while (place != null) { + if (place.raw.equals(raw)) { + return index; + } + index++; + place= place.next; + } + return -1; + } + + /* Returns the index of the specified attribute. */ + @Override + public int getIndex(String uri, String local) { + ListNode place= fHead; + int index= 0; + while (place != null) { + if (place.uri.equals(uri) && place.local.equals(local)) { + return index; + } + index++; + place= place.next; + } + return -1; + } + + /* Returns the attribute URI by index. */ + @Override + public String getURI(int index) { + + ListNode node= getListNodeAt(index); + return node != null ? node.uri : null; + } + + /* Returns the attribute local name by index. */ + @Override + public String getLocalName(int index) { + + ListNode node= getListNodeAt(index); + return node != null ? node.local : null; + } + + /* Returns the attribute raw name by index. */ + @Override + public String getQName(int index) { + + ListNode node= getListNodeAt(index); + return node != null ? node.raw : null; + + } + + /* Returns the attribute type by index. */ + @Override + public String getType(int index) { + + ListNode node= getListNodeAt(index); + return (node != null) ? node.type : null; + } + + /* Returns the attribute type by uri and local. */ + @Override + public String getType(String uri, String local) { + + ListNode node= getListNode(uri, local); + return (node != null) ? node.type : null; + + } + + /* Returns the attribute type by raw name. */ + @Override + public String getType(String raw) { + + ListNode node= getListNode(raw); + return (node != null) ? node.type : null; + } + + /* Returns the attribute value by index. */ + @Override + public String getValue(int index) { + + ListNode node= getListNodeAt(index); + return (node != null) ? node.value : null; + } + + /* Returns the attribute value by uri and local. */ + @Override + public String getValue(String uri, String local) { + + ListNode node= getListNode(uri, local); + return (node != null) ? node.value : null; + } + + /* Returns the attribute value by raw name. */ + @Override + public String getValue(String raw) { + + ListNode node= getListNode(raw); + return (node != null) ? node.value : null; + } + + /* Adds an attribute. */ + public void addAttribute(String raw, String type, String value) { + addAttribute(null, null, raw, type, value); + } + + /* Adds an attribute. */ + public void addAttribute( + String uri, + String local, + String raw, + String type, + String value) { + + ListNode node= new ListNode(uri, local, raw, type, value); + if (fLength == 0) { + fHead= node; + } else { + fTail.next= node; + } + fTail= node; + fLength++; + } + + /* Inserts an attribute. */ + public void insertAttributeAt( + int index, + String raw, + String type, + String value) { + insertAttributeAt(index, null, null, raw, type, value); + } + + /* Inserts an attribute. */ + public void insertAttributeAt( + int index, + String uri, + String local, + String raw, + String type, + String value) { + + // if list is empty, add attribute + if (fLength == 0 || index >= fLength) { + addAttribute(uri, local, raw, type, value); + return; + } + + // insert at beginning of list + ListNode node= new ListNode(uri, local, raw, type, value); + if (index < 1) { + node.next= fHead; + fHead= node; + } else { + ListNode prev= getListNodeAt(index - 1); + node.next= prev.next; + prev.next= node; + } + fLength++; + } + + /* Removes an attribute. */ + public void removeAttributeAt(int index) { + + if (fLength == 0) + return; + + if (index == 0) { + fHead= fHead.next; + if (fHead == null) { + fTail= null; + } + fLength--; + } else { + ListNode prev= getListNodeAt(index - 1); + ListNode node= getListNodeAt(index); + if (node != null) { + prev.next= node.next; + if (node == fTail) { + fTail= prev; + } + fLength--; + } + } + } + + /* Removes the specified attribute. */ + public void removeAttribute(String raw) { + removeAttributeAt(getIndex(raw)); + } + + /* Removes the specified attribute. */ + public void removeAttribute(String uri, String local) { + removeAttributeAt(getIndex(uri, local)); + } + + /* Returns the node at the specified index. */ + private ListNode getListNodeAt(int i) { + + for (ListNode place= fHead; place != null; place= place.next) { + if (--i == -1) { + return place; + } + } + return null; + } + + /* Returns the first node with the specified uri and local. */ + public ListNode getListNode(String uri, String local) { + + if (uri != null && local != null) { + ListNode place= fHead; + while (place != null) { + if (place.uri != null + && place.local != null + && place.uri.equals(uri) + && place.local.equals(local)) { + return place; + } + place= place.next; + } + } + return null; + } + + /* Returns the first node with the specified raw name. */ + private ListNode getListNode(String raw) { + + if (raw != null) { + for (ListNode place= fHead; place != null; place= place.next) { + if (place.raw != null && place.raw.equals(raw)) { + return place; + } + } + } + + return null; + } + + /* Returns a string representation of this object. */ + @Override + public String toString() { + StringBuffer str= new StringBuffer(); + + str.append('['); + str.append("len="); //$NON-NLS-1$ + str.append(fLength); + str.append(", {"); //$NON-NLS-1$ + for (ListNode place= fHead; place != null; place= place.next) { + str.append(place.toString()); + if (place.next != null) { + str.append(", "); //$NON-NLS-1$ + } + } + str.append("}]"); //$NON-NLS-1$ + + return str.toString(); + } + + /* + * An attribute node. + */ + static class ListNode { + + /** Attribute uri. */ + public String uri; + + /** Attribute local. */ + public String local; + + /** Attribute raw. */ + public String raw; + + /** Attribute type. */ + public String type; + + /** Attribute value. */ + public String value; + + /** Next node. */ + public ListNode next; + + /* Constructs a list node. */ + public ListNode( + String uri0, + String local0, + String raw0, + String type0, + String value0) { + + this.uri= uri0; + this.local= local0; + this.raw= raw0; + this.type= type0; + this.value= value0; + + } + + /* Returns string representation of this object. */ + @Override + public String toString() { + return raw != null ? raw : local; + } + } +} |