NameImpl.java revision 759:311b931e5485
1145519Sdarrenr/*
2145510Sdarrenr * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
322514Sdarrenr * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
453024Sguido *
522514Sdarrenr * This code is free software; you can redistribute it and/or modify it
680486Sdarrenr * under the terms of the GNU General Public License version 2 only, as
7145510Sdarrenr * published by the Free Software Foundation.  Oracle designates this
822514Sdarrenr * particular file as subject to the "Classpath" exception as provided
931183Speter * by Oracle in the LICENSE file that accompanied this code.
1031183Speter *
11145510Sdarrenr * This code is distributed in the hope that it will be useful, but WITHOUT
1222514Sdarrenr * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13145510Sdarrenr * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1422514Sdarrenr * version 2 for more details (a copy is included in the LICENSE file that
1522514Sdarrenr * accompanied this code).
1622514Sdarrenr *
1722514Sdarrenr * You should have received a copy of the GNU General Public License version
1822514Sdarrenr * 2 along with this work; if not, write to the Free Software Foundation,
1922514Sdarrenr * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20145510Sdarrenr *
21145510Sdarrenr * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22145510Sdarrenr * or visit www.oracle.com if you need additional information or have any
2322514Sdarrenr * questions.
2453024Sguido */
2553024Sguido
2653024Sguidopackage com.sun.xml.internal.messaging.saaj.soap.name;
2722514Sdarrenr
2822514Sdarrenrimport java.util.logging.Level;
2922514Sdarrenrimport java.util.logging.Logger;
3022514Sdarrenr
3122514Sdarrenrimport javax.xml.namespace.QName;
32145510Sdarrenrimport javax.xml.soap.Name;
3322514Sdarrenrimport javax.xml.soap.SOAPConstants;
3422514Sdarrenr
3522514Sdarrenr//import com.sun.org.apache.xerces.internal.xni.NamespaceContext;
3622514Sdarrenrimport org.w3c.dom.Element;
3722514Sdarrenrimport com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
3822514Sdarrenr
3922514Sdarrenrpublic class NameImpl implements Name {
4022514Sdarrenr    public static final String XML_NAMESPACE_PREFIX = "xml";
4122514Sdarrenr    public static final String XML_SCHEMA_NAMESPACE_PREFIX = "xs";
4222514Sdarrenr    public static final String SOAP_ENVELOPE_PREFIX = "SOAP-ENV";
4322514Sdarrenr
4422514Sdarrenr    public static final String XML_NAMESPACE =
4522514Sdarrenr        "http://www.w3.org/XML/1998/namespace";
4622514Sdarrenr    public static final String SOAP11_NAMESPACE =
4722514Sdarrenr        SOAPConstants.URI_NS_SOAP_ENVELOPE;
4822514Sdarrenr    public static final String SOAP12_NAMESPACE =
4922514Sdarrenr        SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE;
5022514Sdarrenr    public static final String XML_SCHEMA_NAMESPACE =
5122514Sdarrenr        "http://www.w3.org/2001/XMLSchema";
5222514Sdarrenr
5322514Sdarrenr    protected String uri = "";
5422514Sdarrenr    protected String localName = "";
5522514Sdarrenr    protected String prefix = "";
5622514Sdarrenr    private String qualifiedName = null;
5722514Sdarrenr
5822514Sdarrenr    protected static final Logger log =
5922514Sdarrenr        Logger.getLogger(LogDomainConstants.NAMING_DOMAIN,
6022514Sdarrenr                         "com.sun.xml.internal.messaging.saaj.soap.name.LocalStrings");
6122514Sdarrenr
6222514Sdarrenr    /**
6322514Sdarrenr     * XML Information Set REC
6422514Sdarrenr     * all namespace attributes (including those named xmlns,
6522514Sdarrenr     * whose [prefix] property has no value) have a namespace URI of http://www.w3.org/2000/xmlns/
6622514Sdarrenr     */
6753024Sguido    public final static String XMLNS_URI = "http://www.w3.org/2000/xmlns/".intern();
6853024Sguido
6953024Sguido    protected NameImpl(String name) {
7053024Sguido        this.localName = name == null ? "" : name;
7122514Sdarrenr    }
7222514Sdarrenr
7322514Sdarrenr    protected NameImpl(String name, String prefix, String uri) {
7422514Sdarrenr        this.uri = uri == null ? "" : uri;
7522514Sdarrenr        this.localName = name == null ? "" : name;
7622514Sdarrenr        this.prefix = prefix == null ? "" : prefix;
7722514Sdarrenr
7822514Sdarrenr        if (this.prefix.equals("xmlns") && this.uri.equals("")) {
7922514Sdarrenr            this.uri = XMLNS_URI;
8022514Sdarrenr        }
8122514Sdarrenr        if (this.uri.equals(XMLNS_URI) && this.prefix.equals("")) {
8222514Sdarrenr            this.prefix = "xmlns";
8322514Sdarrenr        }
8422514Sdarrenr    }
8522514Sdarrenr
8622514Sdarrenr    public static Name convertToName(QName qname) {
8722514Sdarrenr        return new NameImpl(qname.getLocalPart(),
8822514Sdarrenr                            qname.getPrefix(),
8922514Sdarrenr                            qname.getNamespaceURI());
9022514Sdarrenr    }
9122514Sdarrenr
9222514Sdarrenr    public static QName convertToQName(Name name) {
9322514Sdarrenr        return new QName(name.getURI(),
94                         name.getLocalName(),
95                         name.getPrefix());
96    }
97
98    public static NameImpl createFromUnqualifiedName(String name) {
99        return new NameImpl(name);
100    }
101
102    public static Name createFromTagName(String tagName) {
103        return createFromTagAndUri(tagName, "");
104    }
105
106    public static Name createFromQualifiedName(
107        String qualifiedName,
108        String uri) {
109        return createFromTagAndUri(qualifiedName, uri);
110    }
111
112    protected static Name createFromTagAndUri(String tagName, String uri) {
113        if (tagName == null) {
114            log.severe("SAAJ0201.name.not.created.from.null.tag");
115            throw new IllegalArgumentException("Cannot create a name from a null tag.");
116        }
117        int index = tagName.indexOf(':');
118        if (index < 0) {
119            return new NameImpl(tagName, "", uri);
120        } else {
121            return new NameImpl(
122                tagName.substring(index + 1),
123                tagName.substring(0, index),
124                uri);
125        }
126    }
127
128    protected static int getPrefixSeparatorIndex(String qualifiedName) {
129        int index = qualifiedName.indexOf(':');
130        if (index < 0) {
131            log.log(
132                Level.SEVERE,
133                "SAAJ0202.name.invalid.arg.format",
134                new String[] { qualifiedName });
135            throw new IllegalArgumentException(
136                "Argument \""
137                    + qualifiedName
138                    + "\" must be of the form: \"prefix:localName\"");
139        }
140        return index;
141    }
142
143    public static String getPrefixFromQualifiedName(String qualifiedName) {
144        return qualifiedName.substring(
145            0,
146            getPrefixSeparatorIndex(qualifiedName));
147    }
148
149    public static String getLocalNameFromQualifiedName(String qualifiedName) {
150        return qualifiedName.substring(
151            getPrefixSeparatorIndex(qualifiedName) + 1);
152    }
153
154    public static String getPrefixFromTagName(String tagName) {
155        if (isQualified(tagName)) {
156            return getPrefixFromQualifiedName(tagName);
157        }
158        return "";
159    }
160
161    public static String getLocalNameFromTagName(String tagName) {
162        if (isQualified(tagName)) {
163            return getLocalNameFromQualifiedName(tagName);
164        }
165        return tagName;
166    }
167
168    public static boolean isQualified(String tagName) {
169        return tagName.indexOf(':') >= 0;
170    }
171
172    public static NameImpl create(String name, String prefix, String uri) {
173        if (prefix == null)
174            prefix = "";
175        if (uri == null)
176            uri = "";
177        if (name == null)
178            name = "";
179
180        if (!uri.equals("") && !name.equals("")) {
181            if (uri.equals(NameImpl.SOAP11_NAMESPACE)) {
182                if (name.equalsIgnoreCase("Envelope"))
183                    return createEnvelope1_1Name(prefix);
184                else if (name.equalsIgnoreCase("Header"))
185                    return createHeader1_1Name(prefix);
186                else if (name.equalsIgnoreCase("Body"))
187                    return createBody1_1Name(prefix);
188                else if (name.equalsIgnoreCase("Fault"))
189                    return createFault1_1Name(prefix);
190                else
191                    return new SOAP1_1Name(name, prefix);
192            } else if (uri.equals(SOAP12_NAMESPACE)) {
193                if (name.equalsIgnoreCase("Envelope"))
194                    return createEnvelope1_2Name(prefix);
195                else if (name.equalsIgnoreCase("Header"))
196                    return createHeader1_2Name(prefix);
197                else if (name.equalsIgnoreCase("Body"))
198                    return createBody1_2Name(prefix);
199                else if (
200                    name.equals("Fault")
201                        || name.equals("Reason")
202                        || name.equals("Detail"))
203                    return createFault1_2Name(name, prefix);
204                else if (name.equals("Code") || name.equals("Subcode"))
205                    return createCodeSubcode1_2Name(prefix, name);
206                else
207                    return new SOAP1_2Name(name, prefix);
208            }
209
210        }
211        return new NameImpl(name, prefix, uri);
212    }
213
214    public static String createQName(String prefix, String localName) {
215        if (prefix == null || prefix.equals("")) {
216            return localName;
217        }
218        return prefix + ":" + localName;
219    }
220
221    @Override
222    public boolean equals(Object obj) {
223        if (!(obj instanceof Name)) {
224            return false;
225        }
226
227        Name otherName = (Name) obj;
228
229        if (!uri.equals(otherName.getURI())) {
230            return false;
231        }
232
233        if (!localName.equals(otherName.getLocalName())) {
234            return false;
235        }
236
237        return true;
238    }
239
240    @Override
241    public int hashCode() {
242        return localName.hashCode();
243    }
244
245    /**
246     * Get the local name part of this XML Name.
247     *
248     * @return a string for the local name.
249     */
250    @Override
251    public String getLocalName() {
252        return localName;
253    }
254
255    /* getQualifiedName is inherited from QName */
256
257    /**
258     * Returns the prefix associated with the namespace of the name.
259     *
260     * @return the prefix as a string.
261     */
262    @Override
263    public String getPrefix() {
264        return prefix;
265    }
266
267    /**
268     * Returns the URI associated of the namespace.
269     *
270     * @return the uri as a string.
271     */
272    @Override
273    public String getURI() {
274        return uri;
275    }
276
277    /**
278     * Returns a String version of the name suitable for use in an XML document.
279     */
280    @Override
281    public String getQualifiedName() {
282        if (qualifiedName == null) {
283            if (prefix != null && prefix.length() > 0) {
284                qualifiedName = prefix + ":" + localName;
285            } else {
286                qualifiedName = localName;
287            }
288        }
289        return qualifiedName;
290    }
291
292    /**
293     * Create a name object for a SOAP1.1 Envelope.
294     *
295     * @param prefix prefix
296     * @return Envelope Name
297     */
298    public static NameImpl createEnvelope1_1Name(String prefix) {
299        return new Envelope1_1Name(prefix);
300    }
301
302    /**
303     * Create a name object for a SOAP1.2 Envelope.
304     *
305     * @param prefix prefix
306     * @return Envelope Name
307     */
308    public static NameImpl createEnvelope1_2Name(String prefix) {
309        return new Envelope1_2Name(prefix);
310    }
311
312    /**
313     * Create a name object for a SOAP1.1 Header.
314     *
315     * @param prefix prefix
316     * @return Header Name
317     */
318    public static NameImpl createHeader1_1Name(String prefix) {
319        return new Header1_1Name(prefix);
320    }
321
322    /**
323     * Create a name object for a SOAP1.2 Header.
324     *
325     * @param prefix prefix
326     * @return Header Name
327     */
328    public static NameImpl createHeader1_2Name(String prefix) {
329        return new Header1_2Name(prefix);
330    }
331
332    /**
333     * Create a name object for a SOAP1.1 Body.
334     *
335     * @param prefix prefix
336     * @return Body Name
337     */
338    public static NameImpl createBody1_1Name(String prefix) {
339        return new Body1_1Name(prefix);
340    }
341
342    /**
343     * Create a name object for a SOAP1.2 Body.
344     *
345     * @param prefix prefix
346     * @return Body Name
347     */
348    public static NameImpl createBody1_2Name(String prefix) {
349        return new Body1_2Name(prefix);
350    }
351
352    /**
353     * Create a name object for a SOAP1.1 Fault.
354     *
355     * @param prefix prefix
356     * @return Fault Name
357     */
358    public static NameImpl createFault1_1Name(String prefix) {
359        return new Fault1_1Name(prefix);
360    }
361
362    /**
363     * Create a name object for a SOAP1.2 NotUnderstood element.
364     *
365     * @param prefix prefix
366     * @return NotUnderstood Name
367     */
368    public static NameImpl createNotUnderstood1_2Name(String prefix) {
369        return new NotUnderstood1_2Name(prefix);
370    }
371
372    /**
373     * Create a name object for a SOAP1.2 Upgrade element.
374     *
375     * @param prefix prefix
376     * @return Upgrade Name
377     */
378    public static NameImpl createUpgrade1_2Name(String prefix) {
379        return new Upgrade1_2Name(prefix);
380    }
381
382    /**
383     * Create a name object for a SOAP1.2 SupportedEnvelope Upgrade element.
384     *
385     * @param prefix prefix
386     * @return Supported Envelope Name
387     */
388    public static NameImpl createSupportedEnvelope1_2Name(String prefix) {
389        return new SupportedEnvelope1_2Name(prefix);
390    }
391
392    /**
393     * Create a name object for a SOAP1.2
394     * Fault, Reason or Detail.
395     *
396     * @param localName Local Name of element
397     * @param prefix prefix
398     * @return Fault Name
399     */
400    public static NameImpl createFault1_2Name(
401        String localName,
402        String prefix) {
403        return new Fault1_2Name(localName, prefix);
404    }
405
406    /**
407     * Create a name object for a SOAP1.2 Fault/Code or Subcode.
408     *
409     * @param localName Either "Code" or "Subcode"
410     * @param prefix prefix
411     * @return CodeSubcode Name
412     */
413    public static NameImpl createCodeSubcode1_2Name(
414        String prefix,
415        String localName) {
416        return new CodeSubcode1_2Name(localName, prefix);
417    }
418
419    /**
420     * Create a name object for a SOAP1.1 Fault Detail.
421     *
422     * @return Detail Name
423     */
424    public static NameImpl createDetail1_1Name() {
425        return new Detail1_1Name();
426    }
427
428    public static NameImpl createDetail1_1Name(String prefix) {
429        return new Detail1_1Name(prefix);
430    }
431
432    public static NameImpl createFaultElement1_1Name(String localName) {
433        return new FaultElement1_1Name(localName);
434    }
435
436    public static NameImpl createFaultElement1_1Name(String localName,
437                                                     String prefix) {
438        return new FaultElement1_1Name(localName, prefix);
439    }
440
441    public static NameImpl createSOAP11Name(String string) {
442        return new SOAP1_1Name(string, null);
443    }
444    public static NameImpl createSOAP12Name(String string) {
445        return new SOAP1_2Name(string, null);
446    }
447
448    public static NameImpl createSOAP12Name(String localName, String prefix) {
449        return new SOAP1_2Name(localName, prefix);
450    }
451
452    public static NameImpl createXmlName(String localName) {
453        return new NameImpl(localName, XML_NAMESPACE_PREFIX, XML_NAMESPACE);
454    }
455
456    public static Name copyElementName(Element element) {
457        String localName = element.getLocalName();
458        String prefix = element.getPrefix();
459        String uri = element.getNamespaceURI();
460        return create(localName, prefix, uri);
461    }
462
463
464static class SOAP1_1Name extends NameImpl {
465    SOAP1_1Name(String name, String prefix) {
466        super(
467            name,
468            (prefix == null || prefix.equals(""))
469                ? NameImpl.SOAP_ENVELOPE_PREFIX
470                : prefix,
471            NameImpl.SOAP11_NAMESPACE);
472    }
473}
474
475static class Envelope1_1Name extends SOAP1_1Name {
476    Envelope1_1Name(String prefix) {
477        super("Envelope", prefix);
478    }
479}
480
481static class Header1_1Name extends SOAP1_1Name {
482    Header1_1Name(String prefix) {
483        super("Header", prefix);
484    }
485}
486
487static class Body1_1Name extends SOAP1_1Name {
488    Body1_1Name(String prefix) {
489        super("Body", prefix);
490    }
491}
492
493static class Fault1_1Name extends NameImpl {
494    Fault1_1Name(String prefix) {
495        super(
496            "Fault",
497            (prefix == null || prefix.equals(""))
498                ? SOAP_ENVELOPE_PREFIX
499                : prefix,
500            SOAP11_NAMESPACE);
501    }
502}
503
504static class Detail1_1Name extends NameImpl {
505    Detail1_1Name() {
506        super("detail");
507    }
508
509    Detail1_1Name(String prefix) {
510        super("detail", prefix, "");
511    }
512}
513
514static class FaultElement1_1Name extends NameImpl {
515    FaultElement1_1Name(String localName) {
516        super(localName);
517    }
518
519    FaultElement1_1Name(String localName, String prefix) {
520        super(localName, prefix, "");
521    }
522}
523
524static class SOAP1_2Name extends NameImpl {
525    SOAP1_2Name(String name, String prefix) {
526        super(
527            name,
528            (prefix == null || prefix.equals(""))
529                ? SOAPConstants.SOAP_ENV_PREFIX
530                : prefix,
531            SOAP12_NAMESPACE);
532    }
533}
534
535static class Envelope1_2Name extends SOAP1_2Name {
536    Envelope1_2Name(String prefix) {
537        super("Envelope", prefix);
538    }
539}
540
541static class Header1_2Name extends SOAP1_2Name {
542    Header1_2Name(String prefix) {
543        super("Header", prefix);
544    }
545}
546
547static class Body1_2Name extends SOAP1_2Name {
548    Body1_2Name(String prefix) {
549        super("Body", prefix);
550    }
551}
552
553static class Fault1_2Name extends NameImpl {
554    Fault1_2Name(String name, String prefix) {
555        super(
556            (name == null || name.equals("")) ? "Fault" : name,
557            (prefix == null || prefix.equals(""))
558                ? SOAPConstants.SOAP_ENV_PREFIX
559                : prefix,
560            SOAP12_NAMESPACE);
561    }
562}
563
564static class NotUnderstood1_2Name extends NameImpl {
565    NotUnderstood1_2Name(String prefix) {
566        super(
567            "NotUnderstood",
568            (prefix == null || prefix.equals(""))
569                ? SOAPConstants.SOAP_ENV_PREFIX
570                : prefix,
571            SOAP12_NAMESPACE);
572    }
573}
574
575static class Upgrade1_2Name extends NameImpl {
576    Upgrade1_2Name(String prefix) {
577        super(
578            "Upgrade",
579            (prefix == null || prefix.equals(""))
580                ? SOAPConstants.SOAP_ENV_PREFIX
581                : prefix,
582            SOAP12_NAMESPACE);
583    }
584}
585
586static class SupportedEnvelope1_2Name extends NameImpl {
587    SupportedEnvelope1_2Name(String prefix) {
588        super(
589            "SupportedEnvelope",
590            (prefix == null || prefix.equals(""))
591                ? SOAPConstants.SOAP_ENV_PREFIX
592                : prefix,
593            SOAP12_NAMESPACE);
594    }
595}
596
597static class CodeSubcode1_2Name extends SOAP1_2Name {
598    CodeSubcode1_2Name(String prefix, String localName) {
599        super(prefix, localName);
600    }
601}
602
603}
604