diff -r 000000000000 -r 373ffda63c9a src/share/jaxws_classes/javax/xml/bind/annotation/XmlElementDecl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/jaxws_classes/javax/xml/bind/annotation/XmlElementDecl.java Wed Apr 27 01:27:09 2016 +0800 @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.xml.bind.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static java.lang.annotation.ElementType.METHOD; + +/** + * Maps a factory method to a XML element. + * + *
Usage
+ * + * The annotation creates a mapping between an XML schema element + * declaration and a element factory method that returns a + * JAXBElement instance representing the element + * declaration. Typically, the element factory method is generated + * (and annotated) from a schema into the ObjectFactory class in a + * Java package that represents the binding of the element + * declaration's target namespace. Thus, while the annotation syntax + * allows @XmlElementDecl to be used on any method, semantically + * its use is restricted to annotation of element factory method. + * + * The usage is subject to the following constraints: + * + *Example 1: Annotation on a factory method + *
+ * // Example: code fragment + * @XmlRegistry + * class ObjectFactory { + * @XmlElementDecl(name="foo") + * JAXBElement<String> createFoo(String s) { ... } + * } + *+ *
+ * <!-- XML input --> + * <foo>string + * + * // Example: code fragment corresponding to XML input + * JAXBElement+ * + *o = + * (JAXBElement )unmarshaller.unmarshal(aboveDocument); + * // print JAXBElement instance to show values + * System.out.println(o.getName()); // prints "{}foo" + * System.out.println(o.getValue()); // prints "string" + * System.out.println(o.getValue().getClass()); // prints "java.lang.String" + * + * <!-- Example: XML schema definition --> + * <xs:element name="foo" type="xs:string"/> + *
Example 2: Element declaration with non local scope + *
+ * The following example illustrates the use of scope annotation + * parameter in binding of element declaration in schema derived + * code. + *
+ * The following example may be replaced in a future revision of + * this javadoc. + * + *
+ * <!-- Example: XML schema definition --> + * <xs:schema> + * <xs:complexType name="pea"> + * <xs:choice maxOccurs="unbounded"> + * <xs:element name="foo" type="xs:string"/> + * <xs:element name="bar" type="xs:string"/> + * </xs:choice> + * </xs:complexType> + * <xs:element name="foo" type="xs:int"/> + * </xs:schema> + *+ *
+ * // Example: expected default binding + * class Pea { + * @XmlElementRefs({ + * @XmlElementRef(name="foo",type=JAXBElement.class) + * @XmlElementRef(name="bar",type=JAXBElement.class) + * }) + * List<JAXBElement<String>> fooOrBar; + * } + * + * @XmlRegistry + * class ObjectFactory { + * @XmlElementDecl(scope=Pea.class,name="foo") + * JAXBElement+ * Without scope createFoo and createPeaFoo would become ambiguous + * since both of them map to a XML schema element with the same local + * name "foo". + * + * @see XmlRegistry + * @since JAXB 2.0 + */ +@Retention(RUNTIME) +@Target({METHOD}) +public @interface XmlElementDecl { + /** + * scope of the mapping. + * + *createPeaFoo(String s); + * + * @XmlElementDecl(scope=Pea.class,name="bar") + * JAXBElement createPeaBar(String s); + * + * @XmlElementDecl(name="foo") + * JAXBElement createFoo(Integer i); + * } + * + *
+ * If this is not {@link XmlElementDecl.GLOBAL}, then this element + * declaration mapping is only active within the specified class. + */ + Class scope() default GLOBAL.class; + + /** + * namespace name of the XML element. + *
+ * If the value is "##default", then the value is the namespace + * name for the package of the class containing this factory method. + * + * @see #name() + */ + String namespace() default "##default"; + + /** + * local name of the XML element. + * + *
+ * Note to reviewers: There is no default name; since + * the annotation is on a factory method, it is not clear that the + * method name can be derived from the factory method name. + * @see #namespace() + */ + String name(); + + /** + * namespace name of a substitution group's head XML element. + *
+ * This specifies the namespace name of the XML element whose local + * name is specified by substitutionHeadName(). + *
+ * If susbtitutionHeadName() is "", then this + * value can only be "##default". But the value is ignored since + * since this element is not part of susbtitution group when the + * value of susbstitutionHeadName() is "". + *
+ * If susbtitutionHeadName() is not "" and the value is + * "##default", then the namespace name is the namespace name to + * which the package of the containing class, marked with {@link + * XmlRegistry }, is mapped. + *
+ * If susbtitutionHeadName() is not "" and the value is + * not "##default", then the value is the namespace name. + * + * @see #substitutionHeadName() + */ + String substitutionHeadNamespace() default "##default"; + + /** + * XML local name of a substitution group's head element. + *
+ * If the value is "", then this element is not part of any + * substitution group. + * + * @see #substitutionHeadNamespace() + */ + String substitutionHeadName() default ""; + + /** + * Default value of this element. + * + *
+ * The
'\u0000'value specified as a default of this annotation element + * is used as a poor-man's substitute for null to allow implementations + * to recognize the 'no default value' state. + */ + String defaultValue() default "\u0000"; + + /** + * Used in {@link XmlElementDecl#scope()} to + * signal that the declaration is in the global scope. + */ + public final class GLOBAL {} +}