1/*
2 * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 *
25 * THIS FILE WAS MODIFIED BY SUN MICROSYSTEMS, INC.
26 */
27
28package com.sun.xml.internal.fastinfoset;
29
30import javax.xml.namespace.QName;
31
32public class QualifiedName {
33    public String prefix;
34    public String namespaceName;
35    public String localName;
36    public String qName;
37    public int index;
38    public int prefixIndex;
39    public int namespaceNameIndex;
40    public int localNameIndex;
41    public int attributeId;
42    public int attributeHash;
43    private QName qNameObject;
44
45    public QualifiedName() { }
46
47    public QualifiedName(String prefix, String namespaceName, String localName, String qName) {
48        this.prefix = prefix;
49        this.namespaceName = namespaceName;
50        this.localName = localName;
51        this.qName = qName;
52        this.index = -1;
53        this.prefixIndex = 0;
54        this.namespaceNameIndex = 0;
55        this.localNameIndex = -1;
56    }
57
58    public void set(String prefix, String namespaceName, String localName, String qName) {
59        this.prefix = prefix;
60        this.namespaceName = namespaceName;
61        this.localName = localName;
62        this.qName = qName;
63        this.index = -1;
64        this.prefixIndex = 0;
65        this.namespaceNameIndex = 0;
66        this.localNameIndex = -1;
67        this.qNameObject = null;
68    }
69
70    public QualifiedName(String prefix, String namespaceName, String localName, String qName, int index) {
71        this.prefix = prefix;
72        this.namespaceName = namespaceName;
73        this.localName = localName;
74        this.qName = qName;
75        this.index = index;
76        this.prefixIndex = 0;
77        this.namespaceNameIndex = 0;
78        this.localNameIndex = -1;
79    }
80
81    public final QualifiedName set(String prefix, String namespaceName, String localName, String qName, int index) {
82        this.prefix = prefix;
83        this.namespaceName = namespaceName;
84        this.localName = localName;
85        this.qName = qName;
86        this.index = index;
87        this.prefixIndex = 0;
88        this.namespaceNameIndex = 0;
89        this.localNameIndex = -1;
90        this.qNameObject = null;
91        return this;
92    }
93
94    public QualifiedName(String prefix, String namespaceName, String localName, String qName, int index,
95            int prefixIndex, int namespaceNameIndex, int localNameIndex) {
96        this.prefix = prefix;
97        this.namespaceName = namespaceName;
98        this.localName = localName;
99        this.qName = qName;
100        this.index = index;
101        this.prefixIndex = prefixIndex + 1;
102        this.namespaceNameIndex = namespaceNameIndex + 1;
103        this.localNameIndex = localNameIndex;
104    }
105
106    public final QualifiedName set(String prefix, String namespaceName, String localName, String qName, int index,
107            int prefixIndex, int namespaceNameIndex, int localNameIndex) {
108        this.prefix = prefix;
109        this.namespaceName = namespaceName;
110        this.localName = localName;
111        this.qName = qName;
112        this.index = index;
113        this.prefixIndex = prefixIndex + 1;
114        this.namespaceNameIndex = namespaceNameIndex + 1;
115        this.localNameIndex = localNameIndex;
116        this.qNameObject = null;
117        return this;
118    }
119
120    public QualifiedName(String prefix, String namespaceName, String localName) {
121        this.prefix = prefix;
122        this.namespaceName = namespaceName;
123        this.localName = localName;
124        this.qName = createQNameString(prefix, localName);
125        this.index = -1;
126        this.prefixIndex = 0;
127        this.namespaceNameIndex = 0;
128        this.localNameIndex = -1;
129    }
130
131    public final QualifiedName set(String prefix, String namespaceName, String localName) {
132        this.prefix = prefix;
133        this.namespaceName = namespaceName;
134        this.localName = localName;
135        this.qName = createQNameString(prefix, localName);
136        this.index = -1;
137        this.prefixIndex = 0;
138        this.namespaceNameIndex = 0;
139        this.localNameIndex = -1;
140        this.qNameObject = null;
141        return this;
142    }
143
144    public QualifiedName(String prefix, String namespaceName, String localName,
145            int prefixIndex, int namespaceNameIndex, int localNameIndex,
146            char[] charBuffer) {
147        this.prefix = prefix;
148        this.namespaceName = namespaceName;
149        this.localName = localName;
150
151        if (charBuffer != null) {
152            final int l1 = prefix.length();
153            final int l2 = localName.length();
154            final int total = l1 + l2 + 1;
155            if (total < charBuffer.length) {
156                prefix.getChars(0, l1, charBuffer, 0);
157                charBuffer[l1] = ':';
158                localName.getChars(0, l2, charBuffer, l1 + 1);
159                this.qName = new String(charBuffer, 0, total);
160            } else {
161                this.qName = createQNameString(prefix, localName);
162            }
163        } else {
164            this.qName = this.localName;
165        }
166
167        this.prefixIndex = prefixIndex + 1;
168        this.namespaceNameIndex = namespaceNameIndex + 1;
169        this.localNameIndex = localNameIndex;
170        this.index = -1;
171    }
172
173    public final QualifiedName set(String prefix, String namespaceName, String localName,
174            int prefixIndex, int namespaceNameIndex, int localNameIndex,
175            char[] charBuffer) {
176        this.prefix = prefix;
177        this.namespaceName = namespaceName;
178        this.localName = localName;
179
180        if (charBuffer != null) {
181            final int l1 = prefix.length();
182            final int l2 = localName.length();
183            final int total = l1 + l2 + 1;
184            if (total < charBuffer.length) {
185                prefix.getChars(0, l1, charBuffer, 0);
186                charBuffer[l1] = ':';
187                localName.getChars(0, l2, charBuffer, l1 + 1);
188                this.qName = new String(charBuffer, 0, total);
189            } else {
190                this.qName = createQNameString(prefix, localName);
191            }
192        } else {
193            this.qName = this.localName;
194        }
195
196        this.prefixIndex = prefixIndex + 1;
197        this.namespaceNameIndex = namespaceNameIndex + 1;
198        this.localNameIndex = localNameIndex;
199        this.index = -1;
200        this.qNameObject = null;
201        return this;
202    }
203
204    public QualifiedName(String prefix, String namespaceName, String localName, int index) {
205        this.prefix = prefix;
206        this.namespaceName = namespaceName;
207        this.localName = localName;
208        this.qName = createQNameString(prefix, localName);
209        this.index = index;
210        this.prefixIndex = 0;
211        this.namespaceNameIndex = 0;
212        this.localNameIndex = -1;
213    }
214
215    public final QualifiedName set(String prefix, String namespaceName, String localName, int index) {
216        this.prefix = prefix;
217        this.namespaceName = namespaceName;
218        this.localName = localName;
219        this.qName = createQNameString(prefix, localName);
220        this.index = index;
221        this.prefixIndex = 0;
222        this.namespaceNameIndex = 0;
223        this.localNameIndex = -1;
224        this.qNameObject = null;
225        return this;
226    }
227
228    public QualifiedName(String prefix, String namespaceName, String localName, int index,
229            int prefixIndex, int namespaceNameIndex, int localNameIndex) {
230        this.prefix = prefix;
231        this.namespaceName = namespaceName;
232        this.localName = localName;
233        this.qName = createQNameString(prefix, localName);
234        this.index = index;
235        this.prefixIndex = prefixIndex + 1;
236        this.namespaceNameIndex = namespaceNameIndex + 1;
237        this.localNameIndex = localNameIndex;
238    }
239
240    public final QualifiedName set(String prefix, String namespaceName, String localName, int index,
241            int prefixIndex, int namespaceNameIndex, int localNameIndex) {
242        this.prefix = prefix;
243        this.namespaceName = namespaceName;
244        this.localName = localName;
245        this.qName = createQNameString(prefix, localName);
246        this.index = index;
247        this.prefixIndex = prefixIndex + 1;
248        this.namespaceNameIndex = namespaceNameIndex + 1;
249        this.localNameIndex = localNameIndex;
250        this.qNameObject = null;
251        return this;
252    }
253
254    // Qualified Name as a Namespace Name
255    public QualifiedName(String prefix, String namespaceName) {
256        this.prefix = prefix;
257        this.namespaceName = namespaceName;
258        this.localName = "";
259        this.qName = "";
260        this.index = -1;
261        this.prefixIndex = 0;
262        this.namespaceNameIndex = 0;
263        this.localNameIndex = -1;
264    }
265
266    public final QualifiedName set(String prefix, String namespaceName) {
267        this.prefix = prefix;
268        this.namespaceName = namespaceName;
269        this.localName = "";
270        this.qName = "";
271        this.index = -1;
272        this.prefixIndex = 0;
273        this.namespaceNameIndex = 0;
274        this.localNameIndex = -1;
275        this.qNameObject = null;
276        return this;
277    }
278
279    public final QName getQName() {
280        if (qNameObject == null) {
281            qNameObject = new QName(namespaceName, localName, prefix);
282        }
283
284        return qNameObject;
285    }
286
287    public final String getQNameString() {
288        if (this.qName != "") {
289            return this.qName;
290        }
291
292        return this.qName = createQNameString(prefix, localName);
293    }
294
295    public final void createAttributeValues(int size) {
296        attributeId = localNameIndex | (namespaceNameIndex << 20);
297        attributeHash = localNameIndex % size;
298    }
299
300    private final String createQNameString(String p, String l) {
301        if (p != null && p.length() > 0) {
302            final StringBuffer b = new StringBuffer(p);
303            b.append(':');
304            b.append(l);
305            return b.toString();
306        } else {
307            return l;
308        }
309    }
310}
311