Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 0e4b257ea90d8b9135ba4c5203117e61c4b280e5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
/*******************************************************************************
 * 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. */
	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;
		}
	}
}

Back to the top