blob: 7b17e2b6efa1703aca79754a185ce0b5c36d7569 [file] [log] [blame]
Kelly O'Hair13c4ad82012-03-04 11:55:34 -08001/*
2 * reserved comment block
3 * DO NOT REMOVE OR ALTER!
4 */
5/*
Joe Wangcf59a022017-04-17 16:24:10 -07006 * Licensed to the Apache Software Foundation (ASF) under one or more
7 * contributor license agreements. See the NOTICE file distributed with
8 * this work for additional information regarding copyright ownership.
9 * The ASF licenses this file to You under the Apache License, Version 2.0
10 * (the "License"); you may not use this file except in compliance with
11 * the License. You may obtain a copy of the License at
Kelly O'Hair13c4ad82012-03-04 11:55:34 -080012 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 */
21
22package com.sun.org.apache.xerces.internal.impl.xs.opti;
23
24import org.w3c.dom.Attr;
25import org.w3c.dom.Document;
26import org.w3c.dom.NamedNodeMap;
27import org.w3c.dom.Node;
28
29/**
30 * @xerces.internal
31 *
32 * @author Rahul Srivastava, Sun Microsystems Inc.
33 * @author Sandy Gao, IBM
34 *
Kelly O'Hair13c4ad82012-03-04 11:55:34 -080035 */
36public class ElementImpl extends DefaultElement {
37
38 SchemaDOM schemaDOM;
39 Attr[] attrs;
40 int row;
41 int col;
42 int parentRow;
43
44 int line;
45 int column;
46 int charOffset;
47 String fAnnotation;
48 String fSyntheticAnnotation;
49
50 public ElementImpl(int line, int column, int offset) {
51 row = -1;
52 col = -1;
53 parentRow = -1;
54 nodeType = Node.ELEMENT_NODE;
55
56 this.line = line;
57 this.column = column;
58 charOffset = offset;
59 }
60
61 public ElementImpl(int line, int column) {
62 this(line, column, -1);
63 }
64
65
66 public ElementImpl(String prefix, String localpart, String rawname,
67 String uri, int line, int column, int offset) {
68 super(prefix, localpart, rawname, uri, Node.ELEMENT_NODE);
69 row = -1;
70 col = -1;
71 parentRow = -1;
72
73 this.line = line;
74 this.column = column;
75 charOffset = offset;
76 }
77
78 public ElementImpl(String prefix, String localpart, String rawname,
79 String uri, int line, int column) {
80 this(prefix, localpart, rawname, uri, line, column, -1);
81 }
82
83
84 //
85 // org.w3c.dom.Node methods
86 //
87
88 public Document getOwnerDocument() {
89 return schemaDOM;
90 }
91
92
93 public Node getParentNode() {
94 return schemaDOM.relations[row][0];
95 }
96
97
98 public boolean hasChildNodes() {
99 if (parentRow == -1) {
100 return false;
101 }
102 else {
103 return true;
104 }
105 }
106
107
108 public Node getFirstChild() {
109 if (parentRow == -1) {
110 return null;
111 }
112 return schemaDOM.relations[parentRow][1];
113 }
114
115
116 public Node getLastChild() {
117 if (parentRow == -1) {
118 return null;
119 }
120 int i=1;
121 for (; i<schemaDOM.relations[parentRow].length; i++) {
122 if (schemaDOM.relations[parentRow][i] == null) {
123 return schemaDOM.relations[parentRow][i-1];
124 }
125 }
126 if (i ==1) {
127 i++;
128 }
129 return schemaDOM.relations[parentRow][i-1];
130 }
131
132
133 public Node getPreviousSibling() {
134 if (col == 1) {
135 return null;
136 }
137 return schemaDOM.relations[row][col-1];
138 }
139
140
141 public Node getNextSibling() {
142 if (col == schemaDOM.relations[row].length-1) {
143 return null;
144 }
145 return schemaDOM.relations[row][col+1];
146 }
147
148
149 public NamedNodeMap getAttributes() {
150 return new NamedNodeMapImpl(attrs);
151 }
152
153
154 public boolean hasAttributes() {
155 return (attrs.length == 0 ? false : true);
156 }
157
158
159
160 //
161 // org.w3c.dom.Element methods
162 //
163
164 public String getTagName() {
165 return rawname;
166 }
167
168
169 public String getAttribute(String name) {
170
171 for (int i=0; i<attrs.length; i++) {
172 if (attrs[i].getName().equals(name)) {
173 return attrs[i].getValue();
174 }
175 }
176 return "";
177 }
178
179
180 public Attr getAttributeNode(String name) {
181 for (int i=0; i<attrs.length; i++) {
182 if (attrs[i].getName().equals(name)) {
183 return attrs[i];
184 }
185 }
186 return null;
187 }
188
189
190 public String getAttributeNS(String namespaceURI, String localName) {
191 for (int i=0; i<attrs.length; i++) {
192 if (attrs[i].getLocalName().equals(localName) && nsEquals(attrs[i].getNamespaceURI(), namespaceURI)) {
193 return attrs[i].getValue();
194 }
195 }
196 return "";
197 }
198
199
200 public Attr getAttributeNodeNS(String namespaceURI, String localName) {
201 for (int i=0; i<attrs.length; i++) {
202 if (attrs[i].getName().equals(localName) && nsEquals(attrs[i].getNamespaceURI(), namespaceURI)) {
203 return attrs[i];
204 }
205 }
206 return null;
207 }
208
209
210 public boolean hasAttribute(String name) {
211 for (int i=0; i<attrs.length; i++) {
212 if (attrs[i].getName().equals(name)) {
213 return true;
214 }
215 }
216 return false;
217 }
218
219
220 public boolean hasAttributeNS(String namespaceURI, String localName) {
221 for (int i=0; i<attrs.length; i++) {
222 if (attrs[i].getName().equals(localName) && nsEquals(attrs[i].getNamespaceURI(), namespaceURI)) {
223 return true;
224 }
225 }
226 return false;
227 }
228
229
230 public void setAttribute(String name, String value) {
231 for (int i=0; i<attrs.length; i++) {
232 if (attrs[i].getName().equals(name)) {
233 attrs[i].setValue(value);
234 return;
235 }
236 }
237 }
238
239 /** Returns the line number. */
240 public int getLineNumber() {
241 return line;
242 }
243
244 /** Returns the column number. */
245 public int getColumnNumber() {
246 return column;
247 }
248
249 /** Returns the character offset. */
250 public int getCharacterOffset() {
251 return charOffset;
252 }
253
254 public String getAnnotation() {
255 return fAnnotation;
256 }
257
258 public String getSyntheticAnnotation() {
259 return fSyntheticAnnotation;
260 }
261
262 /**
263 * Compares two namespace URIs with an extra case for null entries
264 */
265 private static boolean nsEquals(String nsURI_1, String nsURI_2) {
266 if (nsURI_1 == null) {
267 return (nsURI_2 == null);
268 }
269 else {
270 return nsURI_1.equals(nsURI_2);
271 }
272 }
273
274}