blob: 15c83a10856d8f2b5279ccfcd1dbad36ea2d4c8b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 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. */
public int getLength() {
return fLength;
}
/* Returns the index of the specified attribute. */
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. */
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. */
public String getURI(int index) {
ListNode node= getListNodeAt(index);
return node != null ? node.uri : null;
}
/* Returns the attribute local name by index. */
public String getLocalName(int index) {
ListNode node= getListNodeAt(index);
return node != null ? node.local : null;
}
/* Returns the attribute raw name by index. */
public String getQName(int index) {
ListNode node= getListNodeAt(index);
return node != null ? node.raw : null;
}
/* Returns the attribute type by index. */
public String getType(int index) {
ListNode node= getListNodeAt(index);
return (node != null) ? node.type : null;
}
/* Returns the attribute type by uri and local. */
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. */
public String getType(String raw) {
ListNode node= getListNode(raw);
return (node != null) ? node.type : null;
}
/* Returns the attribute value by index. */
public String getValue(int index) {
ListNode node= getListNodeAt(index);
return (node != null) ? node.value : null;
}
/* Returns the attribute value by uri and local. */
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. */
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. */
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. */
public String toString() {
return raw != null ? raw : local;
}
}
}