diff -r 000000000000 -r 373ffda63c9a src/share/jaxws_classes/javax/xml/bind/annotation/XmlType.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/jaxws_classes/javax/xml/bind/annotation/XmlType.java Wed Apr 27 01:27:09 2016 +0800 @@ -0,0 +1,452 @@ +/* + * 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 static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + *

+ * Maps a class or an enum type to a XML Schema type. + * + *

Usage

+ *

The @XmlType annnotation can be used with the following program + * elements: + *

+ * + *

See "Package Specification" in javax.xml.bind.package javadoc for + * additional common information.

+ * + *

Mapping a Class

+ *

+ * A class maps to a XML Schema type. A class is a data container for + * values represented by properties and fields. A schema type is a + * data container for values represented by schema components within a + * schema type's content model (e.g. model groups, attributes etc). + *

To be mapped, a class must either have a public no-arg + * constructor or a static no-arg factory method. The static factory + * method can be specified in factoryMethod() and + * factoryClass() annotation elements. The static factory + * method or the no-arg constructor is used during unmarshalling to + * create an instance of this class. If both are present, the static + * factory method overrides the no-arg constructor. + *

+ * A class maps to either a XML Schema complex type or a XML Schema simple + * type. The XML Schema type is derived based on the + * mapping of JavaBean properties and fields contained within the + * class. The schema type to which the class is mapped can either be + * named or anonymous. A class can be mapped to an anonymous schema + * type by annotating the class with @XmlType(name=""). + *

+ * Either a global element, local element or a local attribute can be + * associated with an anonymous type as follows: + *

+ * Mapping to XML Schema Complex Type + * + * + *

+ * Mapping class to XML Schema simple type + *

+ * A class can be mapped to a XML Schema simple type using the + * @XmlValue annotation. For additional details and examples, + * see @{@link XmlValue} annotation type. + *

+ * The following table shows the mapping of the class to a XML Schema + * complex type or simple type. The notational symbols used in the table are: + *

+ *
+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TargetpropOrderClassBodyComplexTypeSimpleType
Class{}[property]+ -> elementscomplexcontent
xs:all
Classnon empty[property]+ -> elementscomplexcontent
xs:sequence
ClassXno property -> elementcomplexcontent
empty sequence
ClassX1 [ @XmlValue property] &&
[property]+ + * ->attributes
simplecontent
ClassX1 [ @XmlValue property ]&&
no properties + * -> attribute
simpletype
+ *
+ * + *

Mapping an enum type

+ * + * An enum type maps to a XML schema simple type with enumeration + * facets. The following annotation elements are ignored since they + * are not meaningful: propOrder() , factoryMethod() , + * factoryClass() . + * + *

Usage with other annotations

+ *

This annotation can be used with the following annotations: + * {@link XmlRootElement}, {@link XmlAccessorOrder}, {@link XmlAccessorType}, + * {@link XmlEnum}. However, {@link + * XmlAccessorOrder} and {@link XmlAccessorType} are ignored when this + * annotation is used on an enum type. + * + *

Example 1: Map a class to a complex type with + * xs:sequence with a customized ordering of JavaBean properties. + *

+ * + *
+ *   @XmlType(propOrder={"street", "city" , "state", "zip", "name" })
+ *   public class USAddress {
+ *     String getName() {..};
+ *     void setName(String) {..};
+ *
+ *     String getStreet() {..};
+ *     void setStreet(String) {..};
+ *
+ *     String getCity() {..};
+ *     void setCity(String) {..};
+ *
+ *     String getState() {..};
+ *     void setState(String) {..};
+ *
+ *     java.math.BigDecimal getZip() {..};
+ *     void setZip(java.math.BigDecimal) {..};
+ *   }
+ *
+ *   <!-- XML Schema mapping for USAddress -->
+ *   <xs:complexType name="USAddress">
+ *     <xs:sequence>
+ *       <xs:element name="street" type="xs:string"/>
+ *       <xs:element name="city" type="xs:string"/>
+ *       <xs:element name="state" type="xs:string"/>
+ *       <xs:element name="zip" type="xs:decimal"/>
+ *       <xs:element name="name" type="xs:string"/>
+ *     </xs:all>
+ *   </xs:complexType>
+ * 
+ *

Example 2: Map a class to a complex type with + * xs:all

+ *
+ * @XmlType(propOrder={})
+ * public class USAddress { ...}
+ *
+ * <!-- XML Schema mapping for USAddress -->
+ * <xs:complexType name="USAddress">
+ *   <xs:all>
+ *     <xs:element name="name" type="xs:string"/>
+ *     <xs:element name="street" type="xs:string"/>
+ *     <xs:element name="city" type="xs:string"/>
+ *     <xs:element name="state" type="xs:string"/>
+ *     <xs:element name="zip" type="xs:decimal"/>
+ *   </xs:sequence>
+ * </xs:complexType>
+ *
+ *

Example 3: Map a class to a global element with an + * anonymous type. + *

+ *
+ *   @XmlRootElement
+ *   @XmlType(name="")
+ *   public class USAddress { ...}
+ *
+ *   <!-- XML Schema mapping for USAddress -->
+ *   <xs:element name="USAddress">
+ *     <xs:complexType>
+ *       <xs:sequence>
+ *         <xs:element name="name" type="xs:string"/>
+ *         <xs:element name="street" type="xs:string"/>
+ *         <xs:element name="city" type="xs:string"/>
+ *         <xs:element name="state" type="xs:string"/>
+ *         <xs:element name="zip" type="xs:decimal"/>
+ *       </xs:sequence>
+ *     </xs:complexType>
+ *   </xs:element>
+ * 
+ * + *

Example 4: Map a property to a local element with + * anonmyous type. + *

+ *   //Example: Code fragment
+ *   public class Invoice {
+ *       USAddress addr;
+ *           ...
+ *       }
+ *
+ *   @XmlType(name="")
+ *   public class USAddress { ... }
+ *   }
+ *
+ *   <!-- XML Schema mapping for USAddress -->
+ *   <xs:complexType name="Invoice">
+ *     <xs:sequence>
+ *       <xs:element name="addr">
+ *         <xs:complexType>
+ *           <xs:element name="name", type="xs:string"/>
+ *           <xs:element name="city", type="xs:string"/>
+ *           <xs:element name="city" type="xs:string"/>
+ *           <xs:element name="state" type="xs:string"/>
+ *           <xs:element name="zip" type="xs:decimal"/>
+ *         </xs:complexType>
+ *       ...
+ *     </xs:sequence>
+ *   </xs:complexType>
+ * 
+ * + *

Example 5: Map a property to an attribute with + * anonymous type. + * + *

+ *
+ *     //Example: Code fragment
+ *     public class Item {
+ *         public String name;
+ *         @XmlAttribute
+ *         public USPrice price;
+ *     }
+ *
+ *     // map class to anonymous simple type.
+ *     @XmlType(name="")
+ *     public class USPrice {
+ *         @XmlValue
+ *         public java.math.BigDecimal price;
+ *     }
+ *
+ *     <!-- Example: XML Schema fragment -->
+ *     <xs:complexType name="Item">
+ *       <xs:sequence>
+ *         <xs:element name="name" type="xs:string"/>
+ *         <xs:attribute name="price">
+ *           <xs:simpleType>
+ *             <xs:restriction base="xs:decimal"/>
+ *           </xs:simpleType>
+ *         </xs:attribute>
+ *       </xs:sequence>
+ *     </xs:complexType>
+ * 
+ * + *

Example 6: Define a factoryClass and factoryMethod + * + *

+ *      @XmlType(name="USAddressType", factoryClass=USAddressFactory.class,
+ *      factoryMethod="getUSAddress")
+ *      public class USAddress {
+ *
+ *          private String city;
+ *          private String name;
+ *          private String state;
+ *          private String street;
+ *          private int    zip;
+ *
+ *      public USAddress(String name, String street, String city,
+ *          String state, int zip) {
+ *          this.name = name;
+ *          this.street = street;
+ *          this.city = city;
+ *          this.state = state;
+ *          this.zip = zip;
+ *      }
+ *  }
+ *
+ *  public class USAddressFactory {
+ *      public static USAddress getUSAddress(){
+ *       return new USAddress("Mark Baker", "23 Elm St",
+ *          "Dayton", "OH", 90952);
+ *  }
+ *
+ * 
+ * + *

Example 7: Define factoryMethod and use the default factoryClass + * + *

+ *      @XmlType(name="USAddressType", factoryMethod="getNewInstance")
+ *      public class USAddress {
+ *
+ *          private String city;
+ *          private String name;
+ *          private String state;
+ *          private String street;
+ *          private int    zip;
+ *
+ *          private USAddress() {}
+ *
+ *          public static USAddress getNewInstance(){
+ *              return new USAddress();
+ *          }
+ *      }
+ * 
+ * + * @author Sekhar Vajjhala, Sun Microsystems, Inc. + * @see XmlElement + * @see XmlAttribute + * @see XmlValue + * @see XmlSchema + * @since JAXB2.0 + */ + +@Retention(RUNTIME) @Target({TYPE}) +public @interface XmlType { + /** + * Name of the XML Schema type which the class is mapped. + */ + String name() default "##default" ; + + /** + * Specifies the order for XML Schema elements when class is + * mapped to a XML Schema complex type. + * + *

Refer to the table for how the propOrder affects the + * mapping of class

+ * + *

The propOrder is a list of names of JavaBean properties in + * the class. Each name in the list is the name of a Java + * identifier of the JavaBean property. The order in which + * JavaBean properties are listed is the order of XML Schema + * elements to which the JavaBean properties are mapped.

+ *

All of the JavaBean properties being mapped to XML Schema elements + * must be listed. + *

A JavaBean property or field listed in propOrder must not + * be transient or annotated with @XmlTransient. + *

The default ordering of JavaBean properties is determined + * by @{@link XmlAccessorOrder}. + */ + String[] propOrder() default {""}; + + /** + * Name of the target namespace of the XML Schema type. By + * default, this is the target namespace to which the package + * containing the class is mapped. + */ + String namespace() default "##default" ; + + /** + * Class containing a no-arg factory method for creating an + * instance of this class. The default is this class. + * + *

If factoryClass is DEFAULT.class and + * factoryMethod is "", then there is no static factory + * method. + * + *

If factoryClass is DEFAULT.class and + * factoryMethod is not "", then + * factoryMethod is the name of a static factory method + * in this class. + * + *

If factoryClass is not DEFAULT.class, then + * factoryMethod must not be "" and must be the name of + * a static factory method specified in factoryClass. + */ + Class factoryClass() default DEFAULT.class; + + /** + * Used in {@link XmlType#factoryClass()} to + * signal that either factory mehod is not used or + * that it's in the class with this {@link XmlType} itself. + */ + static final class DEFAULT {} + + /** + * Name of a no-arg factory method in the class specified in + * factoryClass factoryClass(). + * + */ + String factoryMethod() default ""; +}