1/*
2 * reserved comment block
3 * DO NOT REMOVE OR ALTER!
4 */
5/*
6 * 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
12 *
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 *
35 */
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}
275