Original specification document

Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/spec/src/main/asciidoc/XMLBinding.adoc b/spec/src/main/asciidoc/XMLBinding.adoc
new file mode 100644
index 0000000..ba42da3
--- /dev/null
+++ b/spec/src/main/asciidoc/XMLBinding.adoc
@@ -0,0 +1,17523 @@
+//
+// Copyright (c) 2020 Contributors to the Eclipse Foundation
+//
+
+:sectnums:
+= Jakarta XML Binding Specification, Version 2.1
+
+Copyright (c) 2006, 2019 Oracle and/or its affiliates. All rights reserved.
+
+Oracle and Java are registered trademarks of Oracle and/or its 
+affiliates. Other names may be trademarks of their respective owners. 
+
+== CHAPTER 1 - 
+
+[[a2]]Introduction
+
+XML is, essentially, a platform-independent
+means of structuring information. An XML document is a tree of
+_elements_ . An element may have a set of _attributes_ , in the form of
+key-value pairs, and may contain other elements, text, or a mixture
+thereof. An element may refer to other elements via _identifier_
+attributes or other types via _type_ attributes, thereby allowing
+arbitrary graph structures to be represented.
+
+An XML document need not follow any rules
+beyond the well-formedness criteria laid out in the XML 1.0
+specification. To exchange documents in a meaningful way, however,
+requires that their structure and content be described and constrained
+so that the various parties involved will interpret them correctly and
+consistently. This can be accomplished through the use of a _schema_ . A
+schema contains a set of rules that constrains the structure and content
+of a document’s components, _i.e._ , its elements, attributes, and text.
+A schema also describes, at least informally and often implicitly, the
+intended conceptual meaning of a document’s components. A schema is, in
+other words, a specification of the syntax and semantics of a
+(potentially infinite) set of XML documents. A document is said to be
+_valid_ with respect to a schema if, and only if, it satisfies the
+constraints specified in the schema.
+
+In what language is a schema defined? The XML
+specification itself describes a sublanguage for writing _document-type
+definitions_ , or DTDs. As schemas go, however, DTDs are fairly weak.
+They support the definition of simple constraints on structure and
+content, but provide no real facility for expressing datatypes or
+complex structural relationships. They have also prompted the creation
+of more sophisticated schema languages such as XDR, SOX, RELAX, TREX,
+and, most significantly, the XML Schema language defined by the World
+Wide Web Consortium. The XML Schema language has gained widespread
+acceptance. It is the schema language of choice for many of the XML
+related specifications authored by industry standard working groups.
+Therefore, the design center for this specification is W3C XML Schema
+language.
+
+=== Data binding
+
+Any nontrivial application of XML will, then,
+be based upon one or more schemas and will involve one or more programs
+that create, consume, and manipulate documents whose syntax and
+semantics are governed by those schemas. While it is certainly possible
+to write such programs using the low-level SAX parser API or the
+somewhat higher-level DOM parse-tree API, doing so is not easy. The
+resulting code is also difficult to maintain as the schemas evolve.
+While useful to some, many applications access and manipulate XML
+content within a document; its document structure is less relevant.
+
+It would be much easier to write XML-enabled
+programs if we could simply map the components of an XML document to
+in-memory objects that represent, in an obvious and useful way, the
+document’s intended meaning according to its schema. Of what classes
+should these objects be instances? In some cases there will be an
+obvious mapping from schema components to existing classes, especially
+for common types such as _String_ , _Date_ , _Vector_ , and so forth. In
+general, however, classes specific to the schema being used will be
+required.
+
+Classes specific to a schema may be derived or
+may already exist. In some application scenarios e.g. web services, a
+data model composed using user authored classes may already exist. A
+schema is derived from existing classes. In-memory objects are instances
+of existing classes. In other application scenarios, a data model is
+composed by authoring a schema. In such cases, rather than burden
+developers with having to write classes specific to schema, we can
+generate the classes directly from the schema. In all application
+scenarios, we create a Java object-level _binding_ of the schema.
+
+But even applications manipulating documents
+at conceptual object level, may desire to access or manipulate
+structural information in a document, e.g. element names. Therefore, the
+ability for an application to relate between the XML document
+representation and the Java object-level binding enables the use of XML
+operations over the XML document representation, e.g. Xpath.to bind XML
+content to an object model such as DOM is useful.
+
+An _XML data-binding facility_ therefore
+contains a _schema compiler and a schema generator._ A schema compiler
+can consume a schema and generate schema derived classes specific to the
+schema. A schema generator consumes a set of existing classes and
+generates a schema.
+
+A schema compiler binds components of a
+_source schema_ to schema-derived Java value classes. Each value class
+provides access to the content of the corresponding schema component via
+a set of JavaBeans-style access ( _i.e._ , _get_ and _set_ ) methods.
+_Binding_ declarations provides a capability to customize the binding
+from schema components to Java representation.
+
+A schema generator binds existing classes to
+schema components. Each class containing Java Beans-style access (
+_i.e._ , _get_ and _set_ ) methods is bound to a corresponding schema
+component. Program annotations provide a capability to customize the
+binding from existing classes to derived schema components. Access to
+content is through in-memory representation of existing classes.
+
+Such a facility also provides a _binding
+framework_ , a runtime API that, in conjunction with the derived or
+existing classes, supports three primary operations:
+
+* The _unmarshalling_ of an XML document into
+a tree of interrelated instances of both existing and schema-derived
+classes,
+* The _marshalling_ of such _content trees_
+back into XML documents, and
+* The _binding,_ maintained by a _binder,_
+between an XML document representation and _content tree_ .
+
+The unmarshalling process has the capability
+to check incoming XML documents for validity with respect to the
+schema. +
+
+image:xmlb-2.png[image]
+
+=== Binding XML to Java objects
+
+To sum up: Schemas describe the structure and
+meaning of an XML document, in much the same way that a class describes
+an object in a program. To work with an XML document in a program we
+would like to map its components directly to a set of objects that
+reflect the document’s meaning according to its schema. We can achieve
+this by compiling the schema into a set of derived content classes or by
+compiling a set of existing classes into a schema and marshalling,
+unmarshalling and validating XML documents that follow the schema. Data
+binding thus allows XML-enabled programs to be written at the same
+conceptual level as the documents they manipulate, rather than at the
+more primitive level of parser events or parse trees.
+
+Schema evolution in response to changing
+application requirements, is inevitable. A document therefore might not
+always necessarily follow the complete schema, rather a part of a
+versioned schema. Dealing with schema evolution requires both a
+versioning strategy as well as more flexible marshalling, unmarshalling
+and validation operations.
+
+XML applications, such as workflow
+applications, consist of distributed, cooperative components
+interoperating using XML documents for data exchange. Each distributed
+component may need to access and update only a part of the XML document
+relevant to itself, while retaining the fidelity of the rest of the XML
+document. This is also more robust in the face of schema evolution,
+since the changes in schema may not impact the part of the document
+relevant to the application. The _binder_ enables _partial binding_ of
+the relevant parts of the XML document to a content tree and
+_marshalling_ updates __ back to the original XML document.
+
+=== [[a23]]Goals
+
+The JAXB architecture is designed with the
+goals outlined here in mind.
+
+. [[a25]]Full W3C XML Schema
+support
+
+Support for XML Schema features not required
+to be supported in JAXB 1.0 has been added in this version.
+
+. [[a27]]Binding existing Java
+classes to generated XML schema
+
+This addresses application scenarios where
+design begins with Java classes rather than an XML schema. One such
+example is an application that exports itself as a web service that
+communicates using SOAP and XML as a transport mechanism. The
+marshalling of Java object graph is according to program annotations,
+either explicit or defaulted, on the existing Java classes.
+
+. Meet data binding
+requirements for The Java API for XML Web Services(JAX-WS) 2.0
+
+JAX-WS 2.0 will use the XML data binding
+facility defined by JAXB 2.0. Hence, JAXB 2.0 will meet all data binding
+requirements of JAX-WS 2.0.
+
+. Ease of Development: Leverage J2SE 5.0
+Language Extensions
+
+For ease of development, J2SE 5.0 introduces
+additional language language extensions.The language extensions include
+generics (JSR 14), typesafe enums (JSR201), annotations (JSR 175). Use
+of the language extensions in binding of XML schema components to Java
+representation will result in a better and simpler binding, thus making
+the application development easier.
+
+.  _Container Managed Environments_
+
+A container managed environment separates
+development from the deployment phases. This enables choice of
+generation of artifacts such as derived classes or derived schema at
+either development or deployment time.
+
+Any requirements related to the deployment of
+components using JAXB in a container managed environment will be
+addressed.
+
+.  _Schema evolution_ 
+
+Schema evolution is a complex and difficult
+area; it is also an important area. It is particularly important in data
+centric applications such as Web services, where distributed
+applications interact using XML as a data interchange format but are
+designed with different versions of the schema. It is also important in
+document centric applications where schemas are designed for
+extensibility. Strategies to address both application scenarios will be
+investigated and support added accordingly.
+
+. Application specific
+behavior
+
+There should be a way to associate application
+specific behavior with schema derived code in a portable manner.
+
+.  _Partial mapping of XML document relevant
+to application_ 
+
+In some application scenarios, only a subset
+of the data within a XML document may be relevant to the application.
+
+.  _Integration with other Java technologies_
+
+Integration or relationship with the following
+Java technologies will be clarified.
+
+. Streaming API For XML (JSR 173) (StAX)
+. Relationship to XML related specifications
+
+XML related specifications will be surveyed to
+determine their relationship to JAXB.
+
+. Portability of JAXB mapped classes
+
+An architecture that provides for a fully
+portable JAXB 2.0 applications written to the J2SE platform will be
+defined. JAXB 2.0 is targeted for inclusion in a future version of J2SE.
+Application portability is a key requirement for inclusion in J2SE.
+
+JAXB annotated classes must be source level
+and binary compatible with any other JAXB 2.0 binding framework
+implementation. As in JAXB 1.0, schema-derived interfaces/implementation
+classes are only required to be source code compatible with other JAXB
+implementations of the same version.
+
+.  _Preserving equivalence - Round tripping
+(Java to XML to Java)_
+
+Transforming a Java content tree to XML
+content and back to Java content again should result in an equivalent
+Java content tree before and after the transformation.
+
+.  _Preserving equivalence - Round tripping
+(XML to Java to XML)_
+
+While JAXB 1.0 specification did not require
+the preservation of the XML information set when round tripping from XML
+document to Java representation and back to XML document again, it did
+not forbid the preservation either. The same applies to this version of
+the specification.
+
+. Unmarshalling invalid XML content
+
+Unmarshalling of invalid content was out of
+scope for JAXB 1.0. Simple binding rules and unmarshalling mechanisms
+that specify the handling of invalid content will be defined.
+
+.  _Ease of Use - Manipulation of XML
+documents in Java_
+
+Lower the barrier to entry to manipulating XML
+documents within Java programs. Programmers should be able to access and
+modify XML documents via a Java binding of the data, not via SAX or DOM.
+It should be possible for a developer who knows little about XML to
+compile a simple schema and immediately start making use of the classes
+that are produced. +
+ +
+Rather than not supporting XML Schema extensibility concepts that can
+not be statically bound, such as unconstrained wildcard content, these
+concepts should be exposed directly as DOM or some other XML infoset
+preserving representation since there is no other satisfactory static
+Java binding representation for them.
+
+. Customization
+
+Applications sometimes require customization
+to meet their data binding requirements. Customization support will
+include:
+
+* XML to Java:
+
+A standard way to customize the binding of
+existing XML schema components to Java representation will be provided.
+JAXB 1.0 provided customization mechanisms for the subset of XML Schema
+components supported in JAXB 1.0. Customization support will be extended
+to additional XML Schema features to be supported in this version of the
+specification link:jaxb.html#a25[See Full W3C XML Schema
+support].
+
+* Java to XML:
+
+A standard way to customize the binding of
+existing Java classes to XML schema will be added,
+link:jaxb.html#a27[See Binding existing Java classes to
+generated XML schema].
+
+. Schema derived classes should be natural
+
+Insofar as possible, derived classes should
+observe standard Java API design guidelines and naming conventions. If
+new conventions are required then they should mesh well with existing
+conventions. A developer should not be astonished when trying to use a
+derived class.
+
+. Schema derived classes should match
+conceptual level of source schema
+
+It should be straightforward to examine any
+content-bearing component of the source schema and identify the
+corresponding Java language construct in the derived classes.
+
+=== Non-Goals
+
+* Support for Java versions prior to J2SE 5.0
+
+JAXB 2.0 relies on many of the Java language
+features added in J2SE 5.0. It is not a goal to support JAXB 2.0 on Java
+versions prior to J2SE 5.0.
+
+*  _Explicit support for specifying the
+binding of DTD to a Java representation_ .
+
+While it was desired to explicitly support
+binding DTD to a Java representation, it became impractical to describe
+both XML Schema binding and DTD binding. The existence of several
+conversion tools that automate the conversion of a DTD to XML Schema
+allows DTD users to be able to take advantage of JAXB technology by
+converting their existing DTDs to XML Schema.
+
+* XML Schema Extensions
+
+XML Schema specification allows the annotation
+of schemas and schema components with appinfo elements. JAXB 1.0
+specifies the use of appinfo elements to customize the generated code.
+For this version of the specification, use of appinfo elements for
+customization of generated code continues to be in scope. However, use
+of appinfo element to introduce validation constraints beyond those
+already described in XML Schema 1.0 specification is out of scope.
+
+* Support for SOAP Encoding
+
+SOAP Encoding is out of scope. Use of the SOAP
+encoding is essentially deprecated in the web services community, e.g.
+the WS-I Basic Profile[WSIBP] excludes SOAP encoding.
+
+* Support for validation on demand by schema
+derived classes
+
+While working with a content tree
+corresponding to an XML document it is often necessary to validate the
+tree against the constraints in the source schema. JAXB 1.0 made it
+possible to do this at any time, without the user having to first
+marshal the tree into XML. However it is a non goal in JAXB 2.0, which
+leverages the JAXP 1.3 validation API.
+
+*  _Object graph traversal_
+
+Portable mechanisms to traverse a graph of
+JavaBean objects will not be addressed in JAXB 2.0.
+
+*  _Mapping any existing Java classes to any
+existing XML schema_ 
+
+The JAXB annotation mechanism is not
+sophisticated enough to enable mapping an arbitrary class to all XML
+schema concepts.
+
+=== Conventions
+
+Within normative prose in this specification,
+the words _should_ and _must_ are defined as follows:
+
+*  _should +
+_ Conforming implementations are permitted to but need not behave as
+described.
+*  _must +
+_ Conforming implementations are required to behave as described;
+otherwise they are in error.
+
+Throughout the document, the XML namespace
+prefix _xs:_ and _xsd:_ refers to schema components in W3C XML Schema
+namespace as specified in [XSD Part 1] and [XSD Part 2]. The XML
+namespace prefix _xsi:_ refers to the XML instance namespace defined in
+[XSD Part 1]. Additionally, the XML namespace prefix _jaxb_ : refers to
+the JAXB namespace, _http://java.sun.com/xml/ns/jaxb_ . The XML
+namespace prefix _ref:_ refers to the namespace
+_http://ws-i.org/profiles/basic/1.1/xsd_ as defined in [WSIBP] and
+[WSIAP].
+
+All examples in the specification are for
+illustrative purposes to assist in understanding concepts and are
+non-normative. If an example conflicts with the normative prose, the
+normative prose always takes precedence over the example.
+
+=== Expert Group Members
+
+The following people have contributed to this
+specification.
+
+[width="100%",cols="50%,50%",]
+|===
+|Chavdar Baikov |SAP
+AG
+
+|David Bau |
+
+|Arnaud Blandin |
+
+|Stephen Brodsky
+|IBM
+
+|Russell Butek |IBM
+
+|Jongjin Choi |TMAX
+
+|Glen Daniels |Sonic
+Software
+
+|Blaise Doughan
+|Oracle
+
+|Christopher Fry
+|BEA Systems
+
+|Stanley Guan
+|Oracle
+
+|Mette Hedin |
+
+|Kohsuke Kawaguchi
+|Sun Microsystems, Inc.
+
+|Sravan Kumar
+|Pramati Technologies
+
+|Changshin Lee |Tmax
+Soft, Inc.
+
+|Anjana Manian
+|Oracle
+
+|Ed Merks |IBM
+
+|Steve Perry
+|Fidelity Information Services
+
+|Radu Preotiuc-Pietro
+|BEA
+
+|Srividya Rajagopalan
+|Nokia Corporation
+
+|Yann Raoul |
+
+|Bjarne Rasmussen
+|Novell, Inc.
+
+|Adinarayana Sakala
+|IONA Technologies PLC
+
+|Dennis M. Sosnoski
+|
+
+|Keith Visco |
+
+|Stefan Wachter |
+
+|Umit Yalcinalp |
+
+|Scott Ziegler |BEA
+Systems
+
+|Zulfi Umrani
+|Novell, Inc.
+|===
+
+=== Acknowledgements
+
+This document is a derivative work of concepts
+and an initial draft initially led by Mark Reinhold of Sun Microsystems.
+Our thanks to all who were involved in pioneering that initial effort.
+The feedback from the Java User community on the initial JAXB technology
+prototype greatly assisted in identifying requirements and directions.
+
+The data binding experiences of the expert
+group members have been instrumental in identifying the proper blend of
+the countless data binding techniques that we have considered in the
+course of writing this specification. We thank them for their
+contributions and their review feedback.
+
+Kohsuke Kawaguchi and Ryan Shoemaker have
+directly contributed content to the specification and wrote the
+companion javadoc. The following JAXB technology team members have been
+invaluable in keeping the specification effort on the right track: Tom
+Amiro, Leonid Arbouzov, Evgueni Astigueevitch, Jennifer Ball, Carla
+Carlson, Patrick Curran, Scott Fordin, Omar Fung, Peter Kacandes, Dmitry
+Khukhro, Tom Kincaid, K. Ari Krupnikov, Ramesh Mandava, Bhakti Mehta, Ed
+Mooney, Ilya Neverov, Oleg Oleinik, Brian Ogata, Vivek Pandey, Cecilia
+Peltier, Evgueni Rouban and Leslie Schwenk. The following people, all
+from Sun Microsystems, have provided valuable input to this effort:
+Roberto Chinnici, Chris Ferris, Mark Hapner, Eve Maler, Farrukh Najmi,
+Eduardo Pelegri-llopart, Bill Shannon and Rahul Sharma.
+
+The JAXB TCK software team would like to
+acknowledge that the NIST XML Schema test suite [NIST] has greatly
+assisted the conformance testing of this specification.
+
+=== Acknowledgements for JAXB 2.0
+
+Version 2.0 of this specification was created
+under the Java Community Process as JSR-222. This specification is
+shaped by valuable input from expert group members, people with Sun, and
+Java User community feedback based on their experience with JAXB 1.0.
+
+
+
+The data binding experience of the expert
+group has been very instrumental in identifying usage scenarios
+(including those from web services),design and evaluation of different
+databinding techniques. We thank them for their contributions and review
+feedback.
+
+
+
+The following people, all from Sun
+Microsystems, have provided valuable input. The experiences of the
+reference implementation team, led by Kohsuke Kawaguchi, has been
+influential in identifying data binding solutions. Kohsuke Kawaguchi and
+Ryan Shoemaker have directly contributed content to the companion
+javadoc.Addtional feedback was provided by the following JAXB technology
+team members: Bhakti Mehta, Ed Mooney, Ryan Shoemaker, Karthikeyan
+Krishnamurthy, Tom Amiro, Leonid Arbouzov, Leonid Kuskov, Dmitry
+Fazunenko, Dmitry Lepekhin, Alexey Vishentsev, Omar Fung, and Anita
+Jindal. Valuable input was provided by the following people from Sun:
+Eduardo Pelegri-Llopart, Graham Hamilton, Mark Hapner, Bill Shannon.
+
+
+
+The JAXB TCK software team would like to
+acknowledge that the NIST XML Schema test suite [NIST] has greatly
+assisted the conformance testing of this specification.
+
+
+
+== CHAPTER 2 - 
+
+[[a151]]Requirements
+
+This chapter specifies the scope and
+requirements for this version of the specification.
+
+=== XML Schema to Java
+
+=== W3C XML Schema support
+
+The mapping of the following XML Schema
+components must be specified.
+
+* type substitution ( _@xsi:type_ )
+* element substitution group ( _<xs:element
+@substitutionGroup_ >)
+* wildcard support( _xs:any_ and
+_xs:anyAttribute_ )
+* identity constraints ( _xs:key_ ,
+_xs:keyref_ and _xs:unique_ )
+* redefinition of declaration ( _xs:redefine_
+)
+* NOTATION
+
+For binding builtin XML Schema datatypes which
+do not map naturally to Java datatypes, Java datatypes specified by JAXP
+1.3 (JSR 206) must be used.
+
+=== Default Bindings
+
+There must be a detailed, unambiguous
+description of the default mapping of schema components to Java
+representations in order to satisfy the portability goal.
+
+=== [[a165]]Customized Binding Schema
+
+A binding schema language and its formats must
+be specified. There must be a means to describe the binding without
+requiring modification to the original schema. Additionally, the same
+XML Schema language must be used for the two different mechanisms for
+expressing a binding declaration.
+
+=== Overriding default binding behavior
+
+Given the diverse styles that can be used to
+design a schema, it is daunting to identify a single ideal default
+binding solution. For situations where several equally good binding
+alternatives exist, the specification will describe the alternatives and
+select one to be the default (see link:jaxb.html#a165[See
+Customized Binding Schema]).
+
+The binding schema must provide a means to
+specify an alternative binding for the scope of an entire schema. This
+mechanism ensures that if the default binding is not sufficient, it can
+easily be overridden in a portable manner.
+
+=== JAX-WS 2.0
+
+=== Backward Compatibility
+
+Mapping of XML Schema to schema derived Java
+classes as specified in versions of JAX-RPC 1.x either by default or by
+customization is out of scope.
+
+=== Binding XML Schema to schema derived classes
+
+A binding of XML Schema constructs to schema
+derived classes must be specified. JAXB 1.0 specified the binding of XML
+Schema constructs to schema derived interfaces. However, JAX-RPC 1.x
+specified the binding of XML Schema constructs to schema derived
+classes, not interfaces. To provide continued support for JAX-RPC 1.x
+programming model, a customization to enable the binding of XML Schema
+constructs to schema derived classes will be added.
+
+=== Accessing MIME content stored as an attachment
+
+The W3C XMLP MTOM/XOP document and WS-I AP
+1.0[WSIAP] both provide mechanisms for embedding references to SOAP
+attachments in SOAP messages. It is desirable to bind these to suitable
+Java types (e.g. Image or DataHandler) rather than just provide URI
+refs.
+
+=== Serializable
+
+A customization must be specified to enable
+schema derived classes to implement the _java.io.Serializable_
+interface. This capability enables the schema derived instance to be
+passed as EJB method parameter and to any other API that requires
+Serializable instances.
+
+=== [[a179]]Disabling Databinding
+
+A customization to disable databinding must be
+specified. When databinding is disabled, an XML Schema component is
+bound to an XML fragment representation rather than a strongly typed
+datatype determined by mapping rules. Binding to XML fragment allows the
+use of alternative binding technologies for example to perform XML
+operations.
+
+=== Java to XML Schema
+
+=== [[a182]]Default Mapping
+
+A default mapping Java constructs to XML
+Schema must be specified. The default mapping may be overridden by
+customizations described in link:jaxb.html#a184[See Customized
+Mapping]”.
+
+=== [[a184]]Customized Mapping
+
+A customization mechanism to override default
+mapping of Java constructs to XML Schema constructs must be specified.
+Since XML Schema provides a much richer feature set than Java language
+for defining data models, the scope of customizations will be restricted
+to enable mapping to commonly used XML Schema constructs.
+
+Support for the following mechanism must be
+specified:
+
+* customization mechanism using the JSR175
+program annotation facility.
+
+=== JAX-WS 2.0
+
+=== WSDL <types>
+
+The WSDL <types> is generated using Java
+constructs to XML Schema mapping. The latter should therefore define
+customizations that enable mapping to XML Schema constructs commonly
+used in web services, subject to the requirements in
+link:jaxb.html#a184[See Customized Mapping]” and
+link:jaxb.html#a182[See Default Mapping]”.
+
+=== Backward Compatibility
+
+Mapping of existing Java constructs to XML
+Schema constructs as specified in JAX-RPC versions 1.x, either by
+default or through customization, is out of scope.
+
+=== Binding Framework
+
+=== Disabling schema validation
+
+The specification will provide an ability _to
+disable schema validation for unmarshal and marshal operations._
+
+There exist a significant number of scenarios
+that do not require validation and/or can not afford the overhead of
+schema validation. An application must be allowed to disable schema
+validation checking during unmarshal and marshal operations. The goal of
+this requirement is to provide the same flexibility and functionality
+that a SAX or DOM parser allows for.
+
+
+
+== CHAPTER 3 - 
+
+Architecture
+
+=== Introduction
+
+This chapter describes the architectural
+components, comprising the XML-databinding facility, that realize the
+goals outlined in link:jaxb.html#a23[See Goals]”. The scope of
+this version of specification covers many additional goals beyond those
+in JAXB 1.0. As a result, JAXB 1.0 architecture has been revised
+significantly.
+
+=== Overview
+
+The XML data-binding facility consists of the
+following architectural components:
+
+* schema compiler: A schema compiler binds a
+source schema to a set of schema derived program elements. The binding
+is described by an XML-based language, binding language.
+* schema generator: A schema generator maps a
+set of existing program elements to a derived schema. The mapping is
+described by program annotations.
+* binding runtime framework that provides two
+primary operations for accessing, manipulating and validating XML
+content using either schema derived or existing program elements:
+*  _Unmarshalling_ is the process of reading
+an XML document and constructing a tree of content objects. Each content
+object is an instance of either a schema derived or an existing program
+element mapped by the schema generator and corresponds to an instance in
+the XML document. Thus, the content tree reflects the document’s
+content. Validation can optionally be enabled as part of the
+unmarshalling process. _Validation_ is the process of verifying that an
+xml document meets all the constraints expressed in the schema.
+*  _Marshalling_ is the inverse of
+unmarshalling, i.e., it is the process of traversing a content tree and
+writing an XML document that reflects the tree’s content. Validation can
+optionally be enabled as part of the marshalling process.
+
+As used in this specification, the term
+_schema_ includes the W3C XML Schema as defined in the XML Schema 1.0
+Recommendation[XSD Part 1][XSD Part 2]. link:jaxb.html#a210[See
+Non-Normative JAXB 2.0 Architecture diagram] illustrates relationships
+between concepts introduced in this section.
+
+image:xmlb-3.png[image]
+
+=== [[a210]]Non-Normative JAXB 2.0 Architecture diagram
+
+JAXB-annotated classes are common to both
+binding schemes. They are either generated by a schema compiler or the
+result of a programmer adding JAXB annotations to existing Java classes.
+The universal unmarshal/marshal process is driven by the JAXB
+annotations on the portable JAXB-annotated classes.
+
+Note that the binding declarations object in
+the above diagram is logical. Binding declarations can either be inlined
+within the schema or they can appear in an external binding file that is
+associated with the source schema.
+
+=== JAXB 1.0 style binding of schema to interface/implementation classes.
+
+image:xmlb-4.png[image]
+
+Note that the application accesses only the
+schema-derived interfaces, factory methods and _javax.xml.bind_ APIs
+directly. This convention is necessary to enable switching between JAXB
+implementations.
+
+=== Java Representation
+
+The content tree contains instances of bound
+types, types that bind and provide access to XML content. Each bound
+type corresponds to one or more schema components. As much as possible,
+for type safety and ease of use, a bound type that constrains the values
+to match the schema constraints of the schema components. The different
+bound types, which may be either schema derived or authored by a user,
+are described below.
+
+Value Class A coarse grained schema
+component, such as a complex type definition, is bound to a Value class.
+The Java class hierarchy is used to preserve XML Schema’s “derived by
+extension” type definition hierarchy. JAXB-annotated classes are
+portable and in comparison to schema derived interfaces/implementation
+classes, result in a smaller number of classes.
+
+Property A fine-grained schema component,
+such as an attribute declaration or an element declaration with a simple
+type, is bound directly to a _property_ or a field within a value class.
+
+A property is _realized_ in a value class by
+a set of JavaBeans-style _access methods_ . These methods include the
+usual _get_ and _set_ methods for retrieving and modifying a property’s
+value; they also provide for the deletion and, if appropriate, the
+re-initialization of a property’s value.
+
+Properties are also used for references from
+one content instance to another. If an instance of a schema component
+_X_ can occur within, or be referenced from, an instance of some other
+component _Y_ then the content class derived from _Y_ will define a
+property that can contain instances of _X_ .
+
+Binding a fine-grained schema component to a
+field is useful when a bound type does not follow the JavaBeans
+patterns. It makes it possible to map such types to a schema without the
+need to refactor them.
+
+Interface JAXB 1.0 bound schema components
+(XML content) to schema derived content interfaces and implementation
+classes. The interface/implementation classes tightly couple the schema
+derived implementation classes to the JAXB implementation runtime
+framework and are thus not portable. The binding of schema components to
+schema derived interfaces continues to be supported in JAXB 2.0.
+
+* 
+
+Enum type J2SE 5.0 platform introduced
+linguistic support for type safe enumeration types. Enum type are used
+to represent values of schema types with enumeration values.
+
+Collection type Collections are used to
+represent content models. Where possible, for type safety, parametric
+lists are used for homogeneous collections. For e.g. a repeating element
+in content model is bound to a parametric list.
+
+DOM node In some cases, binding XML content
+to a DOM or DOM like representation rather than a collection of types is
+more natural to a programmer. One example is an open content model that
+allows elements whose types are not statically constrained by the
+schema.
+
+Content tree can be created by unmarshalling
+of an XML document or by programmatic construction. Each bound type in
+the content tree is created as follows:
+
+* schema derived implementation classes that
+implement schema derived interfaces can be created using factory methods
+generated by the schema compiler.
+* schema derived value classes can be created
+using a constructor or a factory method generated by the schema
+compiler.
+* existing types, authored by users, are
+required to provide a no arg constructor. The no arg constructor is used
+by an unmarshaller during unmarshalling to create an instance of the
+type.
+
+=== Binding Declarations
+
+A particular binding of a given source schema
+is defined by a set of _binding declarations_ . Binding declarations are
+written in a _binding language_ , which is itself an application of XML.
+A binding declaration can occur within the annotation _appinfo_ of each
+XML Schema component. Alternatively, binding declarations can occur in
+an auxiliary file. Each binding declaration within the auxiliary file is
+associated to a schema component in the source schema. It was necessary
+to support binding declarations external to the source schema in order
+to allow for customization of an XML Schemas that one prefers not to
+modify. The schema compiler hence actually requires two inputs, a source
+schema and a set of binding declarations.
+
+Binding declarations enable one to override
+default binding rules, thereby allowing for user customization of the
+schema-derived value class. Additionally, binding declarations allow for
+further refinements to be introduced into the binding to Java
+representation that could not be derived from the schema alone.
+
+The binding declarations need not define
+every last detail of a binding. The schema compiler assumes _default
+binding declarations_ for those components of the source schema that are
+not mentioned explicitly by binding declarations. Default declarations
+both reduce the verbosity of the customization and make it more robust
+to the evolution of the source schema. The defaulting rules are
+sufficiently powerful that in many cases a usable binding can be
+produced with no binding declarations at all. By defining a standardized
+format for the binding declarations, it is envisioned that tools will be
+built to greatly aid the process of customizing the binding from schema
+components to a Java representation.
+
+=== Mapping Annotations
+
+A mapping annotation defines the mapping of a
+program element to one or more schema components. A mapping annotation
+typically contains one or more annotation members to allow customized
+binding. An annotation member can be required or optional. A mapping
+annotation can be collocated with the program element in the source. The
+schema generator hence actually requires both inputs: a set of classes
+and a set of mapping annotations.
+
+Defaults make it easy to use the mapping
+annotations. In the absence of a mapping annotation on a program
+element, the schema generator assumes, when required by a mapping rule,
+a default mapping annotation. This, together with an appropriate choice
+of default values for optional annotation members makes it possible to
+produce in many cases a usable mapping with minimal mapping annotations.
+Thus mapping annotations provide a powerful yet easy to use
+customization mechanism
+
+=== Annotations
+
+Many of the architectural components are
+driven by program annotations defined by this specification, mapping
+annotations.
+
+Java to Schema Mapping Mapping annotations
+provide meta data that describe or customize the mapping of existing
+classes to a derived schema.
+
+Portable Value Classes Mapping annotations
+provide information for unmarshalling and marshalling of an XML instance
+into a content tree representing the XML content without the need for a
+schema at run time. Thus schema derived code annotated with mapping
+annotations are portable i.e. they are capable of being marshalled and
+unmarshalled by a universal marshaller and unmarshaller written by a
+JAXB vendor implementation.
+
+Adding application specific behavior and data
+Applications can choose to add either behavior or data to schema derived
+code. link:jaxb.html#a1459[See Modifying Schema-Derived Code]”
+specifies how the mapping annotation, _@javax.annotation.Generated_ ,
+should be used by a developer to denote developer added/modified code
+from schema-derived code. This information can be utilized by tools to
+preserve application specific code across regenerations of schema
+derived code.
+
+=== Binding Framework
+
+The binding framework has been revised
+significantly since JAXB 1.0. Significant changes include:
+
+* support for unmarshalling of invalid XML
+content.
+* deprecation of on-demand validation.
+* unmarshal/marshal time validation deferring
+to JAXP 1.3 validation.
+
+=== Unmarshalling
+
+=== Invalid XML Content
+
+Rationale: Invalid XML content can arise for
+many reasons:
+
+* When the cost of validation needs to be
+avoided.
+* When the schema for the XML has evolved.
+* When the XML is from a non-schema-aware
+processor.
+* When the schema is not authoritative.
+
+Support for invalid XML content required
+changes to JAXB 1.0 schema to java binding rules as well as the
+introduction of a flexible unmarshalling mode. These changes are
+described in link:jaxb.html#a379[See Unmarshalling Modes]”.
+
+=== [[a256]]Validation
+
+The constraints expressed in a schema fall
+into three general categories:
+
+* A _type_ constraint imposes requirements
+upon the values that may be provided by constraint facets in simple type
+definitions.
+* A _local structural_ constraint imposes
+requirements upon every instance of a given element type, e.g., that
+required attributes are given values and that a complex element’s
+content matches its content specification.
+* A _global structural_ constraint imposes
+requirements upon an entire document, e.g., that _ID_ values are unique
+and that for every _IDREF_ attribute value there exists an element with
+the corresponding _ID_ attribute value.
+
+A _document_ is valid if, and only if, all of
+the constraints expressed in its schema are satisfied. The manner in
+which constraints are enforced in a set of derived classes has a
+significant impact upon the usability of those classes. All constraints
+could, in principle, be checked only during unmarshalling. This approach
+would, however, yield classes that violate the _fail-fast_ principle of
+API design: errors should, if feasible, be reported as soon as they are
+detected. In the context of schema-derived classes, this principle
+ensures that violations of schema constraints are signalled when they
+occur rather than later on when they may be more difficult to diagnose.
+
+With this principle in mind we see that schema
+constraints can, in general, be enforced in three ways:
+
+*  _Static_ enforcement leverages the type
+system of the Java programming language to ensure that a schema
+constraint is checked at application’s compilation time. Type
+constraints are often good candidates for static enforcement. If an
+attribute is constrained by a schema to have a boolean value, e.g., then
+the access methods for that attribute’s property can simply accept and
+return values of type _boolean_ .
+*  _Simple dynamic_ enforcement performs a
+trivial run-time check and throws an appropriate exception upon failure.
+Type constraints that do not easily map directly to Java classes or
+primitive types are best enforced in this way. If an attribute is
+constrained to have an integer value between zero and 100, e.g., then
+the corresponding property’s access methods can accept and return _int_
+values and its mutation method can throw a run-time exception if its
+argument is out of range.
+*  _Complex dynamic_ enforcement performs a
+potentially costly run-time check, usually involving more than one
+content object, and throwing an appropriate exception upon failure.
+Local structural constraints are usually enforced in this way: the
+structure of a complex element’s content, e.g., can in general only be
+checked by examining the types of its children and ensuring that they
+match the schema’s content model for that element. Global structural
+constraints must be enforced in this way: the uniqueness of _ID_ values,
+e.g., can only be checked by examining the entire content tree.
+
+It is straightforward to implement both static
+and simple dynamic checks so as to satisfy the fail-fast principle.
+Constraints that require complex dynamic checks could, in theory, also
+be implemented so as to fail as soon as possible. The resulting classes
+would be rather clumsy to use, however, because it is often convenient
+to violate structural constraints on a temporary basis while
+constructing or manipulating a content tree.
+
+Consider, e.g., a complex type definition
+whose content specification is very complex. Suppose that an instance of
+the corresponding value class is to be modified, and that the only way
+to achieve the desired result involves a sequence of changes during
+which the content specification would be violated. If the content
+instance were to check continuously that its content is valid, then the
+only way to modify the content would be to copy it, modify the copy, and
+then install the new copy in place of the old content. It would be much
+more convenient to be able to modify the content in place.
+
+A similar analysis applies to most other sorts
+of structural constraints, and especially to global structural
+constraints. Schema-derived classes have the ability to enable or
+disable a mode that verifies type constraints. JAXB mapped classes can
+optionally be validated at unmarshal and marshal time.
+
+=== Validation Re architecture
+
+The detection of complex schema constraint
+violations has been redesigned to have a JAXB 2.0 implementation to
+delegate to the validation API in JAXP 1.3. JAXP 1.3 defines a standard
+validation API ( _javax.xml.validation_ package) for validating XML
+content against constraints within a schema. Furthermore, JAXP 1.3 has
+been incorporated into J2SE 5.0 platform. Any JAXB 2.0 implementation
+that takes advantage of the validation API will result in a smaller
+footprint.
+
+=== Unmarshal validation
+
+When the unmarshalling process incorporates
+validation and it successfully completes without any validation errors,
+both the input document and the resulting content tree are guaranteed to
+be valid.
+
+However, always requiring validation during
+unmarshalling proves to be too rigid and restrictive a requirement.
+Since existing XML parsers allow schema validation to be disabled, there
+exist a significant number of XML processing uses that disable schema
+validation to improve processing speed and/or to be able to process
+documents containing invalid or incomplete content. To enable the JAXB
+architecture to be used in these processing scenarios, the binding
+framework makes validation optional.
+
+=== Marshal Validation
+
+Validation may also be optionally performed
+at marshal time. This is new for JAXB 2.0. Validation of object graph
+while marshalling is useful in web services where the marshalled output
+must conform to schema constraints specified in a WSDL document. This
+could provide a valuable debugging aid for dealing with any
+interoperability problems
+
+=== Handling Validation Failures
+
+While it would be possible to notify a JAXB
+application that a validation error has occurred by throwing a
+_JAXBException_ when the error is detected, this means of communicating
+a validation error results in only one failure at a time being handled.
+Potentially, the validation operation would have to be called as many
+times as there are validation errors. Both in terms of validation
+processing and for the application’s benefit, it is better to detect as
+many errors and warnings as possible during a single validation pass. To
+allow for multiple validation errors to be processed in one pass, each
+validation error is mapped to a validation error event. A validation
+error event relates the validation error or warning encountered to the
+location of the text or object(s) involved with the error. The stream of
+potential validation error events can be communicated to the application
+either through a registered validation event handler at the time the
+validation error is encountered, or via a collection of validation
+failure events that the application can request after the operation has
+completed.
+
+Unmarshalling and marshalling are the two
+operations that can result in multiple validation failures. The same
+mechanism is used to handle both failure scenarios. See
+link:jaxb.html#a326[See General Validation Processing] for
+further details.
+
+=== An example
+
+Throughout this specification we will refer
+and build upon the familiar schema from [XSD Part 0], which describes a
+purchase order, as a running example to illustrate various binding
+concepts as they are defined. Note that all schema name attributes with
+values in _this font_ are bound by JAXB technology to either a Java
+interface or JavaBean-like property. Please note that the derived Java
+code in the example only approximates the default binding of the
+schema-to-Java representation.
+
+<xsd:schema
+xmlns:xsd="http://www.w3.org/2001/XMLSchema"> +
+<xsd:element name= _"purchaseOrder"_ type= _"PurchaseOrderType"_ /> +
+<xsd:element name= _"comment"_ type=" _xsd:string"_ /> +
+<xsd:complexType name= _"PurchaseOrderType"_ > +
+<xsd:sequence> +
+<xsd:element name= _"shipTo"_ type="USAddress"/> +
+<xsd:element name= _"billTo"_ type="USAddress"/> +
+<xsd:element ref= _"comment"_ minOccurs="0"/> +
+<xsd:element name= _"items"_ type="Items"/> +
+</xsd:sequence> +
+<xsd:attribute name= _"orderDate"_ type="xsd:date"/> +
+</xsd:complexType> +
+ +
+<xsd:complexType name= _"USAddress"_ > +
+<xsd:sequence> +
+<xsd:element name= _"name"_ type="xsd:string"/> +
+<xsd:element name= _"street"_ type="xsd:string"/> +
+<xsd:element name= _"city"_ type="xsd:string"/> +
+<xsd:element name= _"state"_ __ type="xsd:string"/> +
+<xsd:element name= _"zip"_ type="xsd:decimal"/> +
+</xsd:sequence> +
+<xsd:attribute name= _"country"_ type="xsd:NMTOKEN" fixed="US"/> +
+</xsd:complexType> +
+ +
+<xsd:complexType name= _"Items"_ > +
+<xsd:sequence> +
+<xsd:element name= _"item"_ minOccurs="1" maxOccurs="unbounded"> +
+<xsd:complexType>
+
+ <xsd:sequence> +
+<xsd:element name= _"productName"_ type="xsd:string"/> +
+<xsd:element name= _"quantity"_ > +
+<xsd:simpleType> +
+<xsd:restriction base="xsd:positiveInteger"> +
+<xsd:maxExclusive value="100"/> +
+</xsd:restriction> +
+</xsd:simpleType> +
+</xsd:element> +
+<xsd:element name= _"USPrice"_ type="xsd:decimal"/> +
+<xsd:element ref= _"comment"_ minOccurs="0"/> +
+<xsd:element name= _"shipDate"_ type="xsd:date" minOccurs="0"/> +
+</xsd:sequence> +
+<xsd:attribute name= _"partNum"_ type="SKU" use="required"/> +
+</xsd:complexType> +
+</xsd:element> +
+</xsd:sequence> +
+</xsd:complexType>
+
+ +
+<!-- Stock Keeping Unit, a code for identifying products --> +
+<xsd:simpleType name= _"SKU"_ > +
+<xsd:restriction base="xsd:string"> +
+<xsd:pattern value="\d\{3}-[A-Z]\{2}"/> +
+</xsd:restriction> +
+</xsd:simpleType> +
+</xsd:schema>
+
+Binding of purchase order schema to a Java
+representationlink:#a5352[1]:
+
+import
+javax.xml.datatype.XMLGregorianCalendar; import java.util.List; +
+public class _PurchaseOrderType_ _\{ +
+_ USAddress get _ShipTo_ ()\{...} void set _ShipTo_ (USAddress)\{...} +
+USAddress get _BillTo_ ()\{...} void set _BillTo_ (USAddress)\{...} +
+/** Optional to set Comment property. */ +
+String get _Comment_ ()\{...} void set _Comment_ (String)\{...} +
+Items get _Items_ ()\{...} void set _Items_ (Items)\{...} +
+XMLGregorianCalendar get _OrderDate_ () void set _OrderDate_
+(XMLGregorianCalendar) +
+}; +
+public class _USAddress \{ +
+_ String get _Name_ ()\{...} void set _Name_ (String)\{...} +
+String get _Street_ ()\{...} void set _Street_ (String) \{...} +
+String get _City_ ()\{...} void set _City_ (String)\{...} +
+String get _State_ ()\{...} void set _State_ (String)\{...} +
+int get _Zip_ ()\{...} void set _Zip_ (int)\{...} +
+static final String _COUNTRY_ =”USA”;link:#a5353[2] +
+}; +
+public class _Items_ \{ +
+public class _ItemType_ \{ +
+String get _ProductName_ _()\{...}_ void set _ProductName_
+(String)\{...} +
+/** Type constraint on Quantity setter value
+0..99.link:#a5354[3]*/ +
+int get _Quantity_ ()\{...} void set _Quantity_ (int)\{...} +
+float get _USPrice_ ()\{...} void set _USPrice_ (float)\{...} +
+/** Optional to set Comment property. */ +
+String get _Comment_ ()\{...} void set _Comment_ (String)\{...} +
+XMLGregorianCalendar get _ShipDate_ (); void set _ShipDate_
+(XMLGregorianCalendar); +
+/** Type constraint on PartNum setter value "\d\{3}-[A-Z]\{2}".2*/ +
+String get _PartNum_ ()\{...} void set _PartNum_ (String)\{...} +
+}; +
+ +
+/** Local structural constraint 1 or more instances of _Items.ItemType_
+.*/ +
+List<Items.ItemType> get _Item_ ()\{...} +
+} +
+public class ObjectFactory \{ +
+// type factories +
+Object newInstance(Class javaInterface)\{...} +
+PurchaseOrderType create _PurchaseOrderType_ ()\{...} +
+USAddress create _USAddress_ ()\{...} +
+Items create _Items_ ()\{...} +
+Items.ItemType create _ItemsItemType_ ()\{...} +
+// element factories +
+JAXBElement<PurchaseOrderType> create _PurchaseOrder_
+(PurchaseOrderType)\{...} +
+JAXBElement<String> create _Comment_ (String value)\{...} +
+}
+
+The purchase order schema does not describe
+any global structural constraints.
+
+The coming chapters will identify how these
+XML Schema concepts were bound to a Java representation. Just as in [XSD
+Part 0], additions will be made to the schema example to illustrate the
+binding concepts being discussed.
+
+== CHAPTER 4 - 
+
+The Binding Framework
+
+ The _binding framework_ defines APIs to
+access unmarshalling, validation and marshalling operations for
+manipulating XML data and JAXB mapped objects. The framework is
+presented here in overview; its full specification is available in the
+javadoc for the package _javax.xml.bind_ .
+
+The binding framework resides in two main
+packages. The _javax.xml.bind_ package defines abstract classes and
+interfaces that are used directly with content classes. The
+_javax.xml.bindlink:#a5355[4]_ package defines the
+_Unmarshaller, Marshaller_ and _Binder_ classes, which are auxiliary
+objects for providing their respective operations.
+
+The _JAXBContext_ class is the entry point
+for a Java application into the JAXB framework. A _JAXBContext_ instance
+manages the binding relationship between XML element names to Java value
+class for a JAXB implementation to be used by the unmarshal, marshal and
+binder operations. The _javax.xml.bind.helper_ package provides partial
+default implementations for some of the _javax.xml.bind_ interfaces.
+Implementations of JAXB technology can extend these classes and
+implement the abstract methods. These APIs are not intended to be used
+directly by applications using the JAXB architecture. A third package,
+_javax.xml.bind.util_ , contains utility classes that may be used
+directly by client applications.
+
+The binding framework defines a hierarchy of
+exception and validation event classes for use when
+marshalling/unmarshalling errors occur, when constraints are violated,
+and when other types of errors are detected.
+
+
+
+=== Annotation-driven Binding Framework
+
+The portability of JAXB annotated classes is
+achieved via an annotation-driven architecture. The program annotations,
+specified in Section 8, describe the mapping from the Java program
+elements to XML Schema components. This information is used by the
+binding framework to unmarshal and marshal to XML content into/from
+JAXB-annotated classes. All JAXB schema binding compilers must be able
+to generate portable schema-derived JAXB-annotated classes following the
+constraints described in Section 6, link:jaxb.html#a694[See
+Binding XML Schema to Java
+Representations]link:jaxb.html#a694[See Binding XML Schema to
+Java Representations]link:jaxb.html#a694[See Binding XML Schema
+to Java Representations]”. All binding runtime frameworks are required
+to be able to marshal and unmarshal portable JAXB-annotated classes
+generated by other JAXB 2.0 schema binding compiler.
+
+It is not possible to require portability of
+the interface/implementation binding from JAXB 1.0. For backwards
+compatibility with existing implementations, that binding remains a
+tight coupling between the schema-derived implementation classes and the
+JAXB implementation’s runtime framework. Users are required to
+regenerate the schema-derived implementation classes when changing JAXB
+implementations.
+
+=== [[a298]]JAXBContext
+
+The _JAXBContext_ class provides the client’s
+entry point to the JAXB API. It provides an abstraction for managing the
+XML/Java binding information necessary to implement the JAXB binding
+framework operations: unmarshal and marshal.
+
+The following summarizes the _JAXBContext_
+class defined in package _javax.xml.bind_ .
+
+public abstract class JAXBContext \{
+
+ static final String JAXB_CONTEXT_FACTORY;
+
+ static JAXBContext newInstance(String
+contextPath);
+
+ static JAXBContext newInstance(String
+contextPath, +
+ClassLoader contextPathCL);
+
+ static JAXBContext newInstance(Class...
+classesToBeBound); +
+abstract Unmarshaller createUnmarshaller();
+
+ abstract Marshaller createMarshaller();
+
+ abstract JAXBIntrospector
+createJAXBIntrospector(); +
+<T> Binder<T> createBinder(Class<T> domType); +
+Binder<org.w3c.dom.Node> createBinder(); +
+void generateSchema(SchemaOutputResolver);
+
+}
+
+To avoid the overhead involved in creating a
+JAXBContext instance, a JAXB application is encouraged to reuse a
+JAXBContext instance. An implementation of abstract class JAXBContext is
+required to be thread-safe, thus, multiple threads in an application can
+share the same JAXBContext instance.
+
+A client application configures a JAXBContext
+using the _JAXBContext.newInstance(String contextPath)_ factory method.
+
+JAXBContext jc =
+
+ JAXBContext.newInstance(
+“com.acme.foo:com.acme.bar” );
+
+The above example initializes a _JAXBContext_
+with the schema-derived Java packages _com.acme.foo_ and _com.acme.bar_
+. A _jaxb.index_ resource file, described in more detail in the javadoc,
+list the non-schema-derived classes, namely the java to schema binding,
+in a package to register with _JAXBContext_ . Additionally, in each
+specified directory, if an optional resource filelink:#a5356[5]
+containing package level mapping annotations exist, it is incorporated
+into the JAXBContext representation.
+
+An alternative mechanism that could be more
+convenient when binding Java classes to Schema is to initialize
+JAXBContext by passing JAXB-annotated class objects.
+
+ JAXBContext jc = +
+JAXBContext.newInstance( POElement.class );
+
+The classes specified as parameters to
+_newInstance_ and all classes that are directly/indirectly referenced
+statically from the specified classes are included into the returned
+_JAXBContext_ instance. For each directory of all the classes imported
+into JAXBContext, if an optional resource file2 containing package level
+mapping annotations exists, it is incorporated into the JAXBContext
+representation.
+
+For example, given the following Java
+classes:
+
+@XmlRootElementlink:#a5357[6] class
+Foo \{ Bar b;} +
+@XmlType class Bar \{ FooBar fb;}
+
+@XmlType class FooBar \{ int x; }
+
+The invocation of
+_JAXBContext.newInstance(Foo.class)_ registers Foo and the statically
+referenced classes, _Bar_ and _FooBar_ .
+
+Note that the jaxb.index resource file is not
+necessary when an application uses
+_JAXBContenxt.newInstances(Class...classesToBeBound)_ .
+
+
+
+For either scenario, the values of these
+parameters initialize the JAXBContext object so that it is capable of
+managing the JAXB mapped classes.
+
+See the javadoc for _JAXBContext_ for more
+details on using this class.
+
+* 
+
+=== [[a326]]General Validation Processing
+
+Three identifiable forms of validation exist
+within the JAXB architecture include:
+
+*  _Unmarshal-time validation_
+
+This form of validation enables a client
+application to be notified of validation errors and warnings detected
+while unmarshalling XML data into a Java content tree and is completely
+orthogonal to the other types of validation. See
+javax.xml.bind.Unmarshaller javadoc for a description on how to enable
+this feature.
+
+*  _On-demand validation_
+
+This mode of validation is deprecated in JAXB
+2.0. See link:jaxb.html#a5094[See On-demand Validation]” for the
+JAXB 1.0 description of this functionality.
+
+*  _Fail-fast validation_
+
+This form of validation enables a client
+application to receive immediate feedback about a modification to the
+Java content tree that violates a type constraint of a Java property. An
+unchecked exception is thrown if the value provided to a set method is
+invalid based on the constraint facets specified for the basetype of the
+property. This style of validation is optional in this version of the
+specification. Of the JAXB implementations that do support this type of
+validation, it is customization-time decision to enable or disable
+fail-fast validation when setting a property. __
+
+Unmarshal-time uses an event-driven mechanism
+to enable multiple validation errors and warnings to be processed during
+a single operation invocation. If the validation or unmarshal operation
+terminates with an exception upon encountering the first validation
+warning or error, subsequent validation errors and warnings would not be
+discovered until the first reported error is corrected. Thus, the
+validation event notification mechanism provides the application a more
+powerful means to evaluate validation warnings and errors as they occur
+and gives the application the ability to determine when a validation
+warning or error should abort the current operation (such as a value
+outside of the legal value space). Thus, an application could allow
+locally constrained validation problems to not terminate validation
+processing.
+
+If the client application does not set an
+event handler on a _Unmarshaller_ or _Marshaller_ instance prior to
+invoking the _unmarshal_ or _marshal_ operations, then a default event
+handler will receive notification of any errors or fatal errors
+encountered and stop processing the XML data. In other words, the
+default event handler will fail on the first error that is encountered.
+
+There are three ways to handle validation
+events encountered during the unmarshal and marshal operations:
+
+*  _Rely on the default validation event
+handler +
+_ The default handler will fail on the first error or fatal error
+encountered.
+*  _Implement and register a custom
+validation event handler +
+_ Client applications that require sophisticated event processing can
+implement the _ValidationEventHandler_ interface and register it with
+the Validator or Unmarshaller instance respectively.
+*  _Request an error/warning event list after
+the operation completes +
+_ By registering the _ValidationEventCollector_ helper, a specialized
+event handler, with the _setEventHandler_ method, the _ValidationEvent_
+objects created during the unmarshal and marshal operations are
+collected. The client application can then request the list after the
+operation completes.
+
+Validation events are handled differently
+depending on how the client application is configured to process them as
+described previously. However, there are certain cases where a JAXB
+implementation may need to indicate that it is no longer able to
+reliably detect and report errors. In these cases, the JAXB
+implementation will set the severity of the _ValidationEvent_ to
+_FATAL_ERROR_ to indicate that the _unmarshal_ or _validate_ operation
+should be terminated. The default event handler and
+_ValidationEventCollector_ helper class must terminate processing after
+being notified of a fatal error. Client applications that supply their
+own _ValidationEventHandler_ should also terminate processing after
+being notified of a fatal error. If not, unexpected behavior may occur.
+
+=== Unmarshalling
+
+The _Unmarshaller_ class governs the process
+of deserializing XML data into a Java content tree, capable of
+validating the XML data as it is unmarshalled. It provides the basic
+unmarshalling methods:
+
+public interface Unmarshaller \{
+
+ ValidationEventHandler _getEventHandler_ ()
+
+ void _setEventHandler_
+(ValidationEventHandler)
+
+
+
+ java.lang.Object
+_getProperty_ (java.lang.String name) +
+void _setProperty_ (java.lang.String name,
+java.lang.Object value) +
+ +
+void setSchema(javax.xml.validation.Schema schema)
+
+ javax.xml.validation.Schema getSchema()
+
+
+
+ UnmarshallerHandler _getUnmarshallerHandler_
+() +
+ +
+void setListener(Unmarshaller.Listener); +
+Unmarshaller.Listener getListener();
+
+ +
+java.lang.Object _unmarshal_ (java.io.File)
+
+ java.lang.Object _unmarshal_ (java.net.URL)
+
+ java.lang.Object
+unmarshal(java.io.InputStream) +
+java.lang.Object _unmarshal_ (org.xml.sax.InputSource) +
+java.lang.Object _unmarshal_ (org.w3c.dom.Node) +
+ +
+ java.lang.Object
+_unmarshal_ (javax.xml.transform.Source) +
+java.lang.Object _unmarshal_ (javax.xml.stream.XMLStreamReader) +
+java.lang.Object _unmarshal_ (javax.xml.stream.XMLEventReader) +
+ +
+<T> JAXBElement<T> _unmarshal_ (org.w3c.dom.Node, +
+Class<T> declaredType) +
+<T> JAXBElement<T> _unmarshal_ (javax.xml.transform.Source, +
+Class<T> declaredType) +
+<T> JAXBElement<T> _unmarshal_ (javax.xml.stream.XMLStreamReader, +
+Class<T> declaredType) +
+<T> JAXBElement<T> _unmarshal_ (javax.xml.stream.XMLEventReader, +
+Class<T> declaredType) +
+}
+
+The _JAXBContext_ class contains a factory to
+create an _Unmarshaller_ instance. The _JAXBContext_ instance manages
+the XML/Java binding data that is used by unmarshalling. If the
+_JAXBContext_ object that was used to create an _Unmarshaller_ does not
+know how to unmarshal the XML content from a specified input source,
+then the _unmarshal_ operation will abort immediately by throwing an
+_UnmarshalException_ . There are six convenience methods for
+unmarshalling from various input sources.
+
+An application can enable or disable
+unmarshal-time validation by enabling JAXP 1.3 validation via the
+_setSchema(javax.xml.validation.Schema)_ method. The application has the
+option to customize validation error handling by overriding the default
+event handler using the _setEventHandler(ValidationEventHandler)._ The
+default event handler aborts the unmarshalling process when the first
+validation error event is encountered. Validation processing options are
+presented in more detail in link:jaxb.html#a326[See General
+Validation Processing].”
+
+An application has the ability to specify a
+SAX 2.0 parser to be used by the _unmarshal_ operation using the
+_unmarshal(javax.xml.transform.Source)_ method. Even though the JAXB
+provider’s default parser is not required to be SAX2.0 compliant, all
+providers are required to allow an application to specify their own
+SAX2.0 parser. Some providers may require the application to specify the
+SAX2.0 parser at binding compile time. See the method javadoc
+_unmarshal(Source)_ for more detail on how an application can specify
+its own SAX 2.0 parser.
+
+The _getProperty_ / _setProperty_ methods
+introduce a mechanism to associate implementation specific
+property/value pairs to the unmarshalling process. At this time there
+are no standard JAXB properties specified for the unmarshalling process.
+
+=== Unmarshal event callbacks
+
+The _Unmarshaller_ provides two styles of
+callback mechanisms that allow application specific processing during
+key points in the unmarshalling process. In 'class-defined' event
+callbacks, application specific code placed in JAXB mapped classes is
+triggered during unmarshalling. External listeners allow for centralized
+processing of unmarshal events in one callback method rather than by
+type event callbacks. The 'class defined' and external listener event
+callback methods are independent of each other, both can be called for
+one event. The invocation ordering when both listener callback methods
+exist is defined in _javax.xml.bind.Unmarshaller.Listener_ javadoc.
+
+Event callback methods should be written with
+following considerations. Each event callback invocation contributes to
+the overall unmarshal time. An event callback method throwing an
+exception terminates the current unmarshal process.
+
+=== Class-defined
+
+A JAXB mapped class can optionally implement
+the following unmarshal event callback methods.
+
+ _private void
+beforeUnmarshal(Unmarshaller, +
+Object parent)_
+
+This method is called immediately after the
+object is created and before the unmarshalling of this object begins.The
+callback provides an opportunity to initialize JavaBean properties prior
+to unmarshalling.
+
+ _Parameters:_
+
+ unmarshaller - unmarshal context.
+
+parent - points to the parent object to which
+this object will be set. Parent is null when this object is the root
+object.
+
+ _private void afterUnmarshal(Unmarshaller, +
+Object parent)_
+
+This method is called after all the
+properties (except IDREF) are unmarshalled for this object, but before
+this object is set to the parent object.
+
+ _Parameters:_
+
+ unmarshaller - unmarshal context.
+
+parent - points to the parent object to which
+this object will be set. Parent is null when this object is the root
+object.
+
+These callback methods allow an object to
+perform additional processing at certain key point in the unmarshalling
+operation.
+
+=== External Listener
+
+The external listener callback mechanism
+enables the registration of a _Unmarshaller.Listener_ instance with an
+_Unmarshaller.setListener(Unmarshaller.Listener)_ . The external
+listener receives all callback events, allowing for more centralized
+processing than per class defined callback methods. The external
+listener receives events when unmarshalling to a JAXB element or to JAXB
+mapped class.
+
+=== [[a379]]Unmarshalling Modes
+
+There exist numerous use cases requiring the
+ability to unmarshal invalid XML content. A flexible unmarshalling mode
+is described in this version of the specification to enable predictable
+unmarshalling of invalid content. The previous unmarshalling mode
+implied by JAXB 1.0 specification is named structural unmarshalling.
+This unmarshalling mode was well defined for the unmarshalling of valid
+XML content and allowed an implementation to handle invalid XML content
+in anyway that it choose to.
+
+Both of these modes have benefits and
+drawbacks based on an application’s xml processing needs.
+
+=== Structural Unmarshalling
+
+Some of the XML Schema to Java bindings in
+JAXB 1.0 implied that an unmarshaller had to maintain a state machine,
+implying that the order of elements had to match up exactly as described
+by the schema or unmarshaller would work unpredictably. When this
+unmarshalling process detects a structural inconsistency that it is
+unable to recover from, it should abort the unmarshal process by
+throwing Un _marshalException_ .
+
+For example, it was valid for a JAXB
+implementation to rigidly give up unmarshalling an invalid XML document
+once it came across an unexpected element/attribute or missed a required
+element or attribute. This mode appeals to users who prefer to be
+notified that an xml document is deviating from the schema.
+
+XML Schema to Java binding for interfaces and
+implementation classes, link:jaxb.html#a536[See Java Content
+Interface], can implement either structural unmarshalling or flexible
+unmarshalling.
+
+=== [[a386]]Flexible Unmarshalling
+
+To address the rigidness of structural
+unmarshalling, flexible unmarshalling mode is specified to enable
+greater predictability in unmarshalling invalid XML content. It
+unmarshals xml content by element name, rather than strictly on the
+position of the element within a content model. This allows this mode to
+handle the following cases:
+
+* elements being out of order in a content
+model
+* recovering from required
+elements/attributes missing from an xml document
+* ignoring unexpected elements/attributes in
+an xml document
+
+In order to enable this mode, the following
+JAXB 1.0 customized bindings that required state-driven unmarshalling
+have been removed from this specification.
+
+* Binding a model group or model group
+definition to a Java class. +
+Since there is no XML infoset information denoting these schema
+components, a model group can only be inferred by applying positional
+schema constraints to a valid XML document, tracking position within a
+valid content model.
+* Multiple occurrences of an element name in
+a content model can no longer be mapped to different JAXB properties.
+Instead the entire content model is bound to a general content model.
+
+The removal of these bindings greatly assists
+the error recovery for structural unmarshalling mode.
+
+Flexible unmarshalling appeals to those who
+need to be able to perform best match unmarshalling of invalid xml
+documents.
+
+The flexible unmarshalling process is
+annotation driven. This process is specified in
+link:jaxb.html#a3855[See Appendix],
+link:jaxb.html#a3856[See Runtime Processing]”. Flexible
+unmarshalling is required for JAXB annotated classes.
+
+=== [[a397]]Marshalling
+
+The _Marshaller_ class is responsible for
+governing the process of serializing a Java content tree into XML data.
+It provides the basic marshalling methods:
+
+interface Marshaller \{
+
+ static final string JAXB_ENCODING;
+
+ static final string JAXB_FORMATTED_OUTPUT;
+
+ static final string JAXB_SCHEMA_LOCATION;
+
+ static final string
+JAXB_NO_NAMESPACE_SCHEMA_LOCATION; +
+static final string JAXB_FRAGMENT;
+
+
+
+ <PROTENTIALLY MORE PROPERTIES...> +
+ +
+java.lang.Object
+_getProperty_ (java.lang.String name) +
+void _setProperty_
+(java.lang.String name, java.lang.Object value) +
+
+ void _setEventHandler_
+(ValidationEventHandler handler)
+
+ ValidationEventHandler _getEventHandler_ ()
+
+
+
+ void setSchema(javax.xml.validation.Schema
+schema)
+
+ javax.xml.validation.Schema getSchema()
+
+ +
+void setListener(Unmarshaller.Listener) +
+Unmarshaller.Listener getListener()
+
+ +
+void _marshal_ (java.lang.Object e, java.io.Writer writer) +
+void _marshal_ (java.lang.Object e, java.io.OutputStream os) +
+void _marshal_ (java.lang.Object e, org.xml.sax.ContentHandler)
+
+
+void _marshal_ (java.lang.Object e, javax.xml.transform.Result)
+
+
+void _marshal_ (java.lang.Object e, org.w3c.dom.Node) +
+void _marshal_ (java.lang.Object e, +
+javax.xml.stream.XMLStreamWriter writer)
+
+
+
+ org.w3c.dom.Node _getNode_ (java.lang.Object
+contentTree) +
+}
+
+The _JAXBContext_ class contains a factory to
+create a _Marshaller_ instance. Convenience method overloading of the
+_marshal()_ method allow for marshalling a content tree to common Java
+output targets and to common XML output targets of a stream of SAX2
+events or a DOM parse tree.
+
+Although each of the marshal methods accepts
+a _java.lang.Object_ as its first parameter, JAXB implementations are
+not required to be able to marshal any arbitrary _java.lang.Object_ . If
+the first parameter is not a JAXB element, as determined by
+_JAXBIntrospector.isElement()_ method, the marshal operation must throw
+a _MarshalException_ . There exist two mechanisms to enable marshalling
+an instance that is not a JAXB element. One method is to wrap the
+instance as the value of a _javax.xml.bind.JAXBElement_ instance, and
+pass the wrapper element as the first parameter to a _marshal_ method.
+For java to schema binding, it is also possible to simply annotate the
+instance's class with the appropriate program annotation,
+_@XmlElementRoot_ , specified in Section 8.
+
+The marshalling process can optionally be
+configured to validate the content tree being marshalled. An application
+can enable or disable marshal-time validation by enabling JAXP 1.3
+validation via the _setSchema(javax.xml.validation.Schema)_ method. The
+application has the option to customize validation error handling by
+overriding the default event handler using the
+_setEventHandler(ValidationEventHandler)._ The default event handler
+aborts the marshalling process when the first validation error event is
+encountered. Validation processing options are presented in more detail
+in link:jaxb.html#a326[See General Validation Processing].”
+
+There is no requirement that the Java content
+tree be valid with respect to its original schema in order to marshal it
+back into XML data. If the marshalling process detects a structural
+inconsistency during its process that it is unable to recover from, it
+should abort the marshal process by throwing _MarshalException_ . The
+marshalling process of a JAXB-annotated class is annotation driven. This
+process is specified in link:jaxb.html#a3855[See Appendix],
+link:jaxb.html#a3856[See Runtime Processing]”.
+
+=== Marshal event callbacks
+
+The Marshaller provides two styles of
+callback mechanisms that allow application specific processing during
+key points in the marshalling process. In class-defined event callbacks,
+application specific code placed in JAXB mapped classes is triggered
+during marshalling. External listeners allow for centralized processing
+of marshal events in one callback method rather than by type event
+callbacks. The invocation ordering when both listener callback methods
+exist is defined in _javax.xml.bind.Marshaller.Listener_ javadoc.
+
+Event callback methods should be written with
+following considerations. Each event callback invocation contributes to
+the overall marshal time. An event callback method throwing an exception
+terminates the current marshal process.
+
+=== Class-defined
+
+A JAXB mapped class can optionally implement
+the following marshal event callback methods.
+
+ _private void beforeMarshal(Marshaller)_
+
+This method is called before the marshalling
+of this object starts.
+
+ _Parameters:_
+
+ marshaller - marshal context.
+
+ _private void afterMarshal(Marshaller)_
+
+This method is called after the marshalling
+of this object (and all its descendants) has finished.
+
+ _Parameters:_
+
+ marshaller - marshal context.
+
+These callback methods allow the
+customization of an JAXB mapped class to perform additional processing
+at certain key point in the marshalling operation. The 'class defined'
+and external listener event callback methods are independent of each
+other, both can be called for one event.
+
+An event callback method throwing an
+exception terminates the current marshal process.
+
+=== External Listener
+
+The external listener callback mechanism
+enables the registration of a _Marshaller_ . _Listener_ instance with a
+_Marshaller.setListener(Marshaller.Listener)_ . The external listener
+receives all callback events, allowing for more centralized processing
+than per class-defined callback methods.
+
+=== Marshalling Properties
+
+The following subsection highlights
+properties that can be used to control the marshalling process. These
+properties must be set prior to the start of a marshalling operation:
+the behavior is undefined if these attributes are altered in the middle
+of a marshalling operation. The following standard properties have been
+identified:
+
+*  _jaxb.encoding_ _:_ output character
+encoding. If the property is not specified, it defaults to "UTF-8".
+*  _jaxb.formatted.output_ : +
+_true_ - human readable indented xml data +
+_false_ - unformatted xml data +
+If the property is not specified, it defaults to _false_ .
+*  _jaxb.schemaLocation +
+_ This property allows the client application to specify an
+_xsi:schemaLocation_ attribute in the generated XML data.
+*  _jaxb.noNamespaceSchemaLocation +
+_ This property allows the client application to specify an
+_xsi:noNamespaceSchemaLocation_ attribute in the generated XML data.
+*  _jaxb.fragment +
+_ Its value must be a java.lang.Boolean. This property determines
+whether or not document level events will be generated by the
+Marshaller. If this property is not defined, it defaults to _false_ .
+
+=== JAXBIntrospector
+
+This class provides access to key XML mapping
+information of a JAXB mapped instance.
+
+public abstract class JAXBIntrospector \{ +
+public boolean isElement(Object jaxbObj); +
+public QName getElementName(Object jaxbElement);
+
+ public static Object getValue(Object
+jaxbElement);
+
+}
+
+The JAXB 2.0 architecture has two uniquely
+different ways to represent an XML element.The XML Schema to Java
+binding for an XML element declaration is described in
+link:jaxb.html#a642[See Java Element Representation]”. The Java
+to XML Schema binding for an XML element declaration is described in
+Section 8.8.2, “@XmlRootElement.“
+
+Use JAXBInstrospector.isElement(Object)
+method to determine if an instance of a JAXB mapped class represents an
+XML element. One can get the xml element tag name associated with a JAXB
+element using _JAXBIntrospector.getElementName_ method.One can an xml
+element’s value using getValue method. The getValue method normalizes
+access of JAXB element, hiding whether the JAXB element is an instance
+of javax.xml.bind.JAXBElement or if it is an JAXB element via an
+@XmlRootElement class annotation.
+
+=== Validation Handling
+
+Methods defined in the binding framework can
+cause validation events to be delivered to the client application’s
+_ValidationEventHandler_ . _Setter_ methods generated in schema-derived
+classes are capable of throwing _TypeConstraintExceptions_ , all of
+which are defined in the binding framework.
+
+The following list describes the primary
+event and constraint-exception classes:
+
+* An instance of a _TypeConstraintException_
+subclass is thrown when a violation of a dynamically-checked type
+constraint is detected. Such exceptions will be thrown by property-set
+methods, for which it would be inconvenient to have to handle checked
+exceptions; type-constraint exceptions are therefore unchecked, _i.e_ ,
+this class extends _java.lang.RuntimeException_ . The constraint check
+is always performed prior to the property-set method updating the value
+of the property, thus if the exception is thrown, the property is
+guaranteed to retain the value it had prior to the invocation of the
+property-set method with an invalid value. This functionality is
+optional to implement in this version of the specification.
+Additionally, a customization mechanism is provided to control enabling
+and disabling this feature.
+* An instance of a _ValidationEvent_ is
+delivered whenever a violation is detected during optionally enabled
+unmarshal/marshal validation. Additionally, _ValidationEvents_ can be
+discovered during marshalling such as ID/IDREF violations and print
+conversion failures. These violations may indicate local and global
+structural constraint violations, type conversion violations, type
+constraint violations, etc.
+* Since the unmarshal operation involves
+reading an input document, lexical well-formedness errors may be
+detected or an I/O error may occur. In these cases, an
+_UnmarshalException_ will be thrown to indicate that the JAXB provider
+is unable to continue the unmarshal operation.
+* During the marshal operation, the JAXB
+provider may encounter errors in the Java content tree that prevent it
+from being able to complete. In these cases, a _MarshalException_ will
+be thrown to indicate that the marshal operation can not be completed.
+
+=== DOM and Java representation Binding
+
+The Binder class is responsible for
+maintaining the relationship between a infoset preserving view of an XML
+document with a possibly partial binding of the XML document to a JAXB
+representation. Modifications can be made to either the infoset
+preserving view or the JAXB representation of the document while the
+other view remains unmodified. The binder is able to synchronize the
+changes made in the modified view back into the read-only view. When
+synchronizing changes to JAXB view back to related xml infoset
+preserving view, every effort is made to preserve XML concepts that are
+not bound to JAXB objects, such as XML infoset comments, processing
+instructions, namespace prefix mappings, etc.
+
+=== Use Cases
+
+* Read-only partial binding. +
+ +
+Application only needs to manipulate a small part of a rather large XML
+document. It suffices to only map the small of the large document to the
+JAXB Java representation. +
+* Updateable partial binding +
+ +
+The application receives an XML document that follows a later version of
+the schema than the application is aware of. The parts of the schema
+that the application needs to read and/or modify have not changed. Thus,
+the document can be read into an infoset preserving representation, such
+as DOM, only bind the part of the document that it does still have the
+correct schema for into the JAXB Java representation of the fragment of
+the document using Binder.unmarshal from the DOM to the JAXB view.
+Modify the partial Java representation of the document and then
+synchronize the modified parts of the Java representation back to the
+DOM view using _Binder.updateXML_ method.
+* XPATH navigation +
+ +
+Given that binder maintains a relationship between XML infoset view of
+document and JAXB representation, one can use JAXP 1.3 XPATH on the XML
+infoset view and use the binder’s associative mapping to get from the
+infoset node to JAXB representation.
+
+=== javax.xml.bind.Binder
+
+The class _javax.xml.bind.Binder_ associates
+an infoset preserving representation of the entire XML document with a
+potentially partial binding to a Java representation. The binder
+provides operations to synchronize between the two views that it is
+binding.
+
+
+
+public abstract class Binder<XmlNode> \{ +
+_// Create two views of XML content, infoset view and JAXB view +
+_ public abstract Object unmarshal(XmlNode) +
+<T> JAXBElement<T> unmarshal(org.w3c.dom.Node, +
+Class<T> declaredType)
+
+ public abstract void marshal(Object
+jaxbObjcet, XmlNode) +
+ +
+_//Navigation between xml infoset view and JAXB view. +
+_ public abstract XmlNode getXMLNode(Object jaxbObject ); +
+public abstract Object getJAXBNode(XmlNode); +
+ +
+_// Synchronization methods_
+
+ public abstract XmlNode updateXML(Object
+jaxbObject ) +
+public abstract XmlNode updateXML(Object jaxbObject, XmlNode)
+
+ throws JAXBException; +
+public abstract Object updateJAXB( XmlNode) +
+throws JAXBException; +
+ +
+_// Enable optional validation +
+_ public abstract void setSchema(Schema); +
+public abstract Schema getSchema(); +
+public abstract void setEventHandler( ValidationEventHandler) +
+throws JAXBException; +
+public abstract ValidationEventHandler getEventHandler() +
+throws JAXBException; +
+ +
+_// Marshal/Unmarshal properties +
+_ public abstract void setProperty(String name, Object value) +
+throws PropertyException; +
+public abstract Object getProperty(String name) +
+throws PropertyException;
+
+}
+
+
+
+== CHAPTER 5 - 
+
+Java
+Representation of XML Content
+
+This section defines the basic binding
+representation of package, value class, element classes, properties and
+enum type within the Java programming language. Each section briefly
+states the XML Schema components that could be bound to the Java
+representation. A more rigorous and thorough description of possible
+bindings and default bindings occurs in link:jaxb.html#a694[See
+Binding XML Schema to Java Representations]” and in
+link:jaxb.html#a1498[See Customizing XML Schema to Java
+Representation Binding].”
+
+=== Mapping between XML Names and Java Identifiers
+
+XML schema languages use _XML names_ , _i.e._
+, strings that match the Name production defined in XML 1.0 (Second
+Edition) to label schema components. This set of strings is much larger
+than the set of valid Java class, method, and constant identifiers.
+link:jaxb.html#a4649[See Appendix], “Binding XML Names to Java
+Identifiers,” specifies an algorithm for mapping XML names to Java
+identifiers in a way that adheres to standard Java API design
+guidelines, generates identifiers that retain obvious connections to the
+corresponding schema, and results in as few collisions as possible. It
+is necessary to rigorously define a standard way to perform this mapping
+so all implementations of this specification perform the mapping in the
+same compatible manner.
+
+=== [[a482]]Java Package
+
+Just as the target XML namespace provides a
+naming context for the named type definitions, named model groups,
+global element declarations and global attribute declarations for a
+schema vocabulary, the Java package provides a naming context for Java
+interfaces and classes. Therefore, it is natural to map the target
+namespace of a schema to be the package that contains the Java value
+class representing the structural content model of the document.
+
+A package consists of:
+
+* A _name_ , which is either derived directly
+from the XML namespace URI as specified in
+link:jaxb.html#a4788[See Generating a Java package name]” or
+specified by a binding customization of the XML namespace URI as
+described in link:jaxb.html#a1674[See package].”
+* A set of Java value class representing the
+content models declared within the schema.
+* A set of Java element classes representing
+element declarations occurring within the schema.
+link:jaxb.html#a642[See Java Element Representation]” describes
+this binding in more detail.
+* A public class _ObjectFactory_ contains:
+* An instance factory method signature for
+each Java content within the package. +
+ +
+Given Java value class named Foo, here is the derived factory method:
+
+ +
+public Foo createFoo();
+
+* An element instance factory method
+signature for each bound element declaration.
+
+ +
+public JAXBElement<T> createFoo(T elementValue);
+
+* Dynamic instance factory allocator method
+signature:
+
+ +
+public Object newInstance(Class javaContentInterface); +
+
+* Property setter/getter +
+Provide the ability to associate implementation specific property/value
+pairs with the instance creation process.
+
+ java.lang.Object _getProperty_ (String
+name); +
+void _setProperty_ (String name, Object value);
+
+* A set of enum types.
+* Package javadoc.
+
+=== Example:
+
+Purchase Order Schema fragment with
+_targetNamespace_ :
+
+<xs:schema
+xmlns:xs="http://www.w3.org/2001/XMLSchema" +
+xmlns:po="http://www.example.com/PO1" +
+targetNamespace="http://www.example.com/PO1"> +
+<xs:element name="purchaseOrder" type="po:PurchaseOrderType"/> +
+<xs:element name="comment" type="xs:string"/> +
+<xs:complexType name="PurchaseOrderType"/> +
+... +
+</xs:schema>
+
+Default derived Java code:
+
+import javax.xml.bind.JAXBElement; +
+package com.example.PO1; +
+public class PurchaseOrderType \{ .... }; +
+public Comment \{ String getValue()\{...} void setValue(String)\{...}
+} +
+... +
+public class ObjectFactory \{ +
+PurchaseOrderType createPurchaseOrderType(); +
+JAXBElement<PurchaseOrderType>
+
+createPurchaseOrder(PurchaseOrderType
+elementValue); +
+Comment createComment(String value); +
+... +
+}
+
+=== Enum Type
+
+A simple type definition whose value space is
+constrained by enumeration facets can be bound to a Java enum type. Enum
+type was introduced in J2SE 5.0 and is described in Section 8.9 of
+[JLS]. Enum type is a significant enhancement over the typesafe enum
+design pattern that it was designed to replace. If an application wishes
+to refer to the values of a class by descriptive constants and
+manipulate those constants in a type safe manner, it should consider
+binding the XML component containing enumeration facets to an enum type.
+
+An enum type consists of:
+
+* A _name_ , which is either computed
+directly from an XML name or specified by a binding customization for
+the schema component.
+* A package name, which is either computed
+from the target namespace of the schema component or specified within a
+binding declaration as a customization of the target namespace or a
+specified package name for components that are scoped to no target
+namespace.
+* Outer Class Names is “ _._ ” separated list
+of outer class names.
+
+By default, if the XML component containing a
+typesafe enum class to be generated is scoped within a complex type as
+opposed to a global scope, the typesafe enum class should occur as a
+nested class within the Java value class representing the complex type
+scope. +
+Absolute class name is PackageName.[OuterClassNames.]Name. +
+Note: Outer Class Name is null if class is a top-level class. +
+ +
+The schema customization <jaxb:globalBindings localScoping=”toplevel”/>,
+specified in Section link:jaxb.html#a1582[See Usage], disables
+the generation of schema-derived nested classes and can be used to
+override the default binding of a nested schema component binding to
+nested Java class.
+
+* A set of enum constants.
+* Class javadoc is a combination of a
+documentation annotation from the schema component and/or javadoc
+specified by customization.
+
+An enum constant consists of:
+
+* A name, which is either computed from the
+enumeration facet value or specified by customization.
+* A _value_ for the constant. Optimally, the
+_name_ is the same as the _value_ . This optimization is not possible
+when the enumeration facet value is not a valid Java identifier.
+* A datatype for the constant’s value.
+* Javadoc for the constant field is a
+combination of a documentation annotation for an enumeration value facet
+and/or javadoc specified by customization.
+
+=== Content Representation
+
+A complex type definition is bound to either
+a Java value class or a content interface, depending on the value of the
+global binding customization _[jaxb:globalBinding]_
+_@generateValueClass_ , specified in link:jaxb.html#a1582[See
+Usage]”. Value classes are generated by default. The attributes and
+children element content of a complex type definition are represented as
+properties of the Java content representation. Property representations
+are introduced in link:jaxb.html#a541[See Properties].
+
+=== [[a521]]Value Class
+
+A value class consists of:
+
+* A _name_ , which is either computed
+directly from an XML name or specified by a binding customization for
+the schema component.
+* A package name, which is either computed
+from the target namespace of the schema component or specified by a
+binding customization of the target namespace or a specified package
+name for components that are scoped to no target namespace.
+* The _outer class name_ context, a
+dot-separated list of Java class names.
+
+By default, if the XML schema component for
+which a Java value class is to be generated is scoped within a complex
+type as opposed to globally, the complex class should occur as a nested
+class within the Java value class representing the complex type scope.
+The schema customization <jaxb:globalBindings localScoping=”toplevel”/>,
+specified in Section link:jaxb.html#a1582[See Usage], disables
+the generation of schema-derived nested classes and all classes are
+generated as toplevel classes.
+
+The absolute class name is
+PackageName.[OuterClassNames.]Name. +
+Note: The OuterClassNames is null if the class is a top-level class.
+
+* A base class that this class extends. See
+link:jaxb.html#a917[See Complex Type Definition] for further
+details.
+* A set of Java properties providing access
+and modification to the complex type definition’s attributes and content
+model represented by the value class.
+* Class-level javadoc is a combination of a
+documentation annotation from the schema component and/or javadoc
+specified within customization.
+* Creation
+* A value class supports creation via a
+public constructor, either an explicit one or the default no-arg
+constructor.
+* A factory method in the package’s
+_ObjectFactory_ class (introduced in link:jaxb.html#a482[See
+Java Package]”). The factory method returns the type of the Java value
+class. The name of the factory method is generated by concatenating the
+following components: +
+- The string constant _create_ . +
+- If the Java value class is nested within another value class, +
+then the concatenation of all outer Java class names. +
+- The _name_ of the Java value class.
+
+For example, a Java value class named _Foo_
+that is nested within Java value class _Bar_ would have the following
+factory method signature generated in the containing Java package’s
+_ObjectFactory_ class:
+
+ Bar.Foo createBarFoo() \{...}
+
+=== [[a536]]Java Content Interface
+
+JAXB 1.0 bound a complex type definition to a
+content interface. This binding is similar to the value class binding
+with the following differences.
+
+* A content interface is a public interface
+while a value class is a public class.
+* A content interface can only be created
+with an ObjectFactory method whereas a value class can be created using
+a public constructor. The factory method signature is the same for both
+value class and content interface binding to ease switching between the
+two binding styles.
+* A content interface contains the method
+signatures for the set of properties it contains, while a value class
+contains method implementations.
+
+=== [[a541]]Properties
+
+The schema compiler binds local schema
+components to _properties_ within a Java value class.
+
+A property is defined by:
+
+* A _name_ , which is either computed from
+the XML name or specified by a binding customization for the schema
+component.
+* A _base type_ , which may be a Java
+primitive type ( _e.g._ , _int_ ) or a reference type.
+* An optional _predicate_ , which is a
+mechanism that tests values of the base type for validity and throws a
+_TypeConstraintException_ if a type constraint expressed in the source
+schema is violated. link:#a5358[7]
+* An optional _collection type_ , which is
+used for properties whose values may be composed of more than one value.
+* A _default value_ . Schema component has a
+schema specified default value which is used when property’s value is
+not set and not nil.
+* Is _nillable_ . A property is nillable when
+it represents a nillable element declaration.
+
+A property is _realized_ by a set of _access
+methods_ . Several property models are identified in the following
+subsections; each adds additional functionally to the basic set of
+access methods.
+
+A property’s access methods are named in the
+standard JavaBeans style: the name-mapping algorithm is applied to the
+property name and then each method name is constructed by prefixing the
+appropriate verb ( _get_ , _set_ , etc.).
+
+[[a552]]A property is
+said to have a set value if that value was assigned to it during
+unmarshallinglink:#a5359[8] or by invoking its mutation method.
+The _value_ of a property is its set value, if defined; otherwise, it is
+the property’s schema specified default value, if any; otherwise, it is
+the default initial value for the property’s base type as it would be
+assigned for an uninitialized field within a Java
+classlink:#a5360[9]. link:jaxb.html#50536473_21325[See All other
+property kinds rely on the invocation of their set method with a value
+of null to discard the set value of its property. Since this is not
+possible for primitive types or a List property, the additional method
+is generated for these cases illustrate the method invocations that
+result in transitions between the possible states of a JAXB property
+value.] link:jaxb.html#a623[See States of a Property
+Value]link:jaxb.html#a623[See States of a Property Value]
+illustrates the states of a JAXB property and the invocations that
+result in state changes.
+
+=== Simple Property
+
+A non-collection property _prop_ with a base
+type _Type_ is realized by the two methods
+
+[width="100%",cols="100%",options="header",]
+|===
+|public Type get _Id_ ();
+|public void set _Id_ (Type value);
+|===
+
+where _Id_ is a metavariable that represents
+the Java method identifier computed by applying the name mapping
+algorithm described in link:jaxb.html#a4656[See The Name to
+Identifier Mapping Algorithm]” to prop. There is one exception to this
+general rule in order to support the boolean property described in
+[BEANS]. When _Type_ is boolean, the get _Id_ method specified above is
+replaced by the method signature, _boolean_ is _Id_ ().
+
+* The _get_ or _is_ method returns the
+property’s value as specified in the previous subsection. If null is
+returned, the property is considered to be absent from the XML content
+that it represents.
+* The _set_ method defines the property’s set
+value to be the argument _value_ . If the argument value is _null_ , the
+property’s set value is discarded. Prior to setting the property’s value
+when TypeConstraint validation is enabledlink:#a5361[10], a non-
+_null_ value is validated by applying the property’s predicate _._ If
+_TypeConstraintException_ is thrown, the property retains the value it
+had prior to the _set_ method invocation.
+
+
+
+When the base type for a property is a
+primitive non-reference type and the property’s value is optional, the
+corresponding Java wrapper class can be used as the base type to enable
+discarding the property’s set value by invoking the set method with a
+null parameter. link:jaxb.html#a610[See isSet Property
+Modifier] describes an alternative to using a wrapper class for this
+purpose. The _[jaxb:globalBinding]_ customization _@optionalProperty_
+controls the binding of an optional primitive property as described in
+link:jaxb.html#a1582[See Usage].
+
+=== Example
+
+In the purchase order schema, the _partNum_
+attribute of the _item_ element definition is declared:
+
+<xs:attribute name="partNum" type="SKU"
+use="required"/>
+
+This element declaration is bound to a simple
+property with the base type _java.lang.String_ :
+
+public String getPartNum(); +
+public void setPartNum(String x);
+
+The _setPartNum_ method could apply a
+predicate to its argument to ensure that the new value is legal, _i.e._
+, that it is a string value that complies with the constraints for the
+simple type definition, SKU _,_ and that derives by restriction from
+_xs:string_ and restricts the string value to match the regular
+expression pattern _"\d\{3}-[A-Z]\{2}"_ .
+
+It is legal to pass _null_ to the
+_setPartNum_ method even though the _partNum_ attribute declaration’s
+attribute _use_ is specified as required. The determination if _partNum_
+content actually has a value is a local structural constraint rather
+than a type constraint, so it is checked during validation rather than
+during mutation.
+
+=== Collection Property
+
+A collection property may take the form of an
+_indexed property_ or a _list property_ . The base type of an indexed
+property may be either a primitive type or a reference type, while that
+of a list property must be a reference type.
+
+A collection consists of a group of
+collection items. If one of the collection items can represent a
+nillable element declaration, setting a collection item to _null_ is
+semantically equivalent to inserting a nil element, _xsi:nil=”true”_ ,
+into the collection property. If none of the collection items can ever
+represent a nillable element declaration, setting a collection item to
+_null_ is the semantic equivalent of removing an optional element from
+the collection property.
+
+=== [[a572]]Indexed Property
+
+This property follows the indexed property
+design pattern for a multi-valued property from the JavaBean
+specification. An indexed property _prop_ with base type _Type_ is
+realized by the five methods
+
+[width="100%",cols="100%",options="header",]
+|===
+|public _Type_ [] get _Id_ ();
+|public void set _Id_ __ ( _Type_ [] value);
+
+|public void set _Id_ (int index, _Type_
+value);
+
+|public _Type_ get _Id_ (int index); +
+public int get _Id_ Length();
+|===
+
+regardless of whether _Type_ is a primitive
+type or a reference type. _Id_ is computed from _prop_ as it was defined
+in simple property. An array item is a specialization of the collection
+item abstraction introduced in the collection property overview.
+
+* get _Id_ () +
+The array _getter_ method returns an array containing the property’s
+value. If the property’s value has not set, then _null_ is returned.
+* set _Id_ ( _Type_ [] _) +
+_ The _array setter_ method defines the property’s set value. If the
+argument itself is _null_ then the property’s set value, if any, is
+discarded. If the argument is not _null_ and _TypeConstraint_ validation
+is enabled link:#a5362[11] then the sequence of values in the
+array are first validated by applying the property’s predicate, which
+may throw a _TypeConstraintException_ . If the _TypeConstraintException_
+is thrown, the property retains the value it had prior to the _set_
+method invocation. The property’s value is only modified after the
+_TypeConstraint_ validation step.
+* set _Id_ (int, _Type_ ) +
+The indexed _set_ ter method allows one to set a value within the array.
+The runtime exception _java.lang.ArrayIndexOutOfBoundsException_ may be
+thrown if the index is used outside the current array bounds. If the
+value argument is non-null and TypeConstraint validation is enabled5,
+the value is validated against the property’s predicate, which may throw
+an unchecked _TypeConstraintException_ . If _TypeConstraintException_ is
+thrown, the array index remains set to the same value it had before the
+invocation of the indexed _setter_ method. When the array item
+represents a nillable element declaration and the indexed setter value
+parameter is null, it is semantically equivalent to inserting a nil
+element into the array.
+* get _Id_ (int) +
+The indexed _get_ ter method returns a single element from the array.
+The runtime exception _java.lang.ArrayIndexOutOfBoundsException_ may be
+thrown if the index is used outside the current array bounds. In order
+to change the size of the array, you must use the array set method to
+set a new (or updated) array.
+* get _Id_ Length() +
+The indexed length method returns the length of the array. This method
+enables you to iterate over all the items within the indexed property
+using the indexed mutators exclusively. Exclusive use of indexed
+mutators and this method enable you to avoid the allocation overhead
+associated with array _getter_ and _setter_ methods.
+
+The arrays returned and taken by these
+methods are not part of the content object’s state. When an array
+_getter_ method is invoked, it creates a new array to hold the returned
+values. Similarly, when the corresponding array _setter_ method is
+invoked, it copies the values from the argument array.
+
+To test whether an indexed property has a set
+value, invoke its _array getter_ method and check that the result is not
+_null_ . To discard an indexed property’s set value, invoke its array
+_setter_ method with an argument of _null_ .
+
+See the customization attribute
+_collectionType_ in link:jaxb.html#a1580[See <globalBindings>
+Declaration]” and link:jaxb.html#a1783[See <property>
+Declaration]” on how to enable the generation of indexed property
+methods for a collection property.
+
+=== Example
+
+In the purchase order schema, we have the
+following repeating element occurrence of element _item_ within
+_complexType_ _Items_ .
+
+<xs:complexType name= _"Items"_ >
+
+ <xs:sequence>
+
+ <xs:element name= _"item"_ minOccurs="1"
+maxOccurs="unbounded"> +
+<xs:complexType>...</xs:complexType> +
+</xs:element> +
+</xs:complexType>
+
+The content specification of this element
+type could be bound to an array property realized by these five methods:
+
+public Items.ItemType[] getItem();
+
+public void setItem(Items.ItemType[]
+value); +
+public void setItem(int index, Items.ItemType value); +
+public Items.ItemType getItem(int index); +
+public int getItemLength();
+
+=== [[a595]]List Property
+
+A list property _prop_ with base type _Type_
+is realized by the method where _List_ is the interface _java.util.List_
+, _Id_ is defined as above. If base type is a primitive type, the
+appropriate wrapper class is used in its place.
+
+[width="100%",cols="100%",]
+|===
+|public List<Type> get _Id_ ();
+|===
+
+* The _get_ method returns an object that
+implements the _List<Type>_ interface, is mutable, and contains the
+values of type _Type_ that constitute the property’s value. If the
+property does not have a set value or a schema default value, a zero
+length _java.util.List_ instance is returned.
+
+The _List_ returned by the _get_ method is a
+component of the content object’s state. Modifications made to this list
+will, in effect, be modifications to the content object. If
+_TypeConstraint_ validation is enabled, the list’s mutation methods
+apply the property’s predicate to any non- _null_ value before adding
+that value to the list or replacing an existing element’s value with
+that value; the predicate may throw a _TypeConstraintException_ . The
+collection property overview discussion on setting a collection item to
+null specifies the meaning of inserting a null into a List.
+
+The _unset_ method introduced in
+link:jaxb.html#a610[See isSet Property Modifier] enables one to
+discard the set value for a List property.
+
+* 
+
+=== Example
+
+The content specification of the _item_
+element type could alternatively be bound to a list property realized by
+one method:
+
+public List<Item> getItem();
+
+The list returned by the _getItem_ method
+would be guaranteed only to contain instances of the _Item_ class. As
+before, its length would be checked only during validation, since the
+requirement that there be at least one _item_ in an element instance of
+complex type definition _Items_ is a structural constraint rather than a
+type constraint.
+
+=== Constant Property
+
+An attribute use named prop with a schema
+specified fixed value can be bound to a Java constant value. _Id_ is
+computed from _prop_ as it was defined in simple property. The value of
+the fixed attribute of the attribute use provides the _<fixedValue>_
+constant value.
+
+[width="100%",cols="100%",]
+|===
+|static final public _Type_ ID =
+<fixedValue>;
+|===
+
+The binding customization attribute
+_fixedAttributeToConstantProperty_ enables this binding style.
+link:jaxb.html#a1580[See <globalBindings> Declaration]” and
+link:jaxb.html#a1783[See <property> Declaration]” describe how
+to use this attribute.
+
+=== [[a610]] _isSet_ Property Modifier
+
+This optional modifier augments a modifiable
+property to enable the manipulation of the property’s value as a set
+value or a defaulted value. Since this functionality is above and beyond
+the typical JavaBean pattern for a property, the method(s) associated
+with this modifier are not generated by default.
+link:jaxb.html#a1498[See Customizing XML Schema to Java
+Representation Binding]” describes how to enable this customization
+using the _generateIsSetMethod_ attribute.
+
+The method signatures for the _isSet_
+property modifier are the following:
+
+[width="100%",cols="100%",]
+|===
+|public boolean _isSetId_ ();
+|===
+
+where _Id_ is defined as it was for simple
+and collection property.
+
+* The _isSet_ method returns _true_ if the
+property has been set during unmarshalling or by invocation of the
+mutation method _setId_ with a non- _null_ value.
+link:#a5363[12]
+
+To aid the understanding of what _isSet_
+method implies, note that the unmarshalling process only unmarshals set
+values into XML content.
+
+A list property and a simple property with a
+non-reference base type require an additional method to enable you to
+discard the set value for a property:
+
+[width="100%",cols="100%",]
+|===
+|public void _unsetId_ ();
+|===
+
+* The _unset_ method marks the property as
+having no set value. A subsequent call to _getId_ method returns the
+schema-specified default if it existed; otherwise, it returns the Java
+default initial value for _Type_ .
+
+All other property kinds rely on the
+invocation of their set method with a value of null to discard the set
+value of its property. Since this is not possible for primitive types or
+a List property, the additional method is generated for these
+caseslink:jaxb.html#a621[See All other property kinds rely on
+the invocation of their set method with a value of null to discard the
+set value of its property. Since this is not possible for primitive
+types or a List property, the additional method is generated for these
+cases illustrate the method invocations that result in transitions
+between the possible states of a JAXB property value.] illustrate the
+method invocations that result in transitions between the possible
+states of a JAXB property
+value.link:jaxb.html#a552[See A property is said to
+have a set value if that value was assigned to it during unmarshalling
+or by invoking its mutation method. The value of a property is its set
+value, if defined; otherwise, it is the property’s schema specified
+default value, if any; otherwise, it is the default initial value for
+the property’s base type as it would be assigned for an uninitialized
+field within a Java class. Figure 5.1 illustrates the states of a JAXB
+property and the invocations that result in state
+changes.][[a621]]
+
+
+
+image:xmlb-8.png[image]
+
+=== [[a623]]States of a Property Value
+
+=== Example
+
+In the purchase order schema, the _partNum_
+attribute of the element _item_ ’s anonymous complex type is declared:
+
+<xs:attribute name="partNum" type = "SKU"
+use="required"/>
+
+This attribute could be bound to a _isSet_
+simple property realized by these four methods:
+
+public String getPartNum(); +
+public void setPartNum(String skuValue); +
+public boolean isSetPartNum(); +
+public void unsetPartNum();
+
+It is legal to invoke the _unsetPartNum_
+method even though the attribute’s _use_ is _“required”_ in the XML
+Schema. That the attribute actually has a value is a local structural
+constraint rather than a type constraint, so it is checked during
+validation rather than during mutation.
+
+=== [[a630]]Element Property
+
+This property pattern enables the dynamic
+association of an element name for a JAXB property. Typically, the
+element name is statically associated with a JAXB property based on the
+schema’s element name. Element substitution groups and wildcard content
+allow an XML document author to use Element names that were not
+statically specified in the content model of the schema. To support
+these extensibility features, an application uses element property
+setters/getters to dynamically introduce element names at runtime.
+
+The method signatures for the _Element_
+property pattern are the following:
+
+[width="100%",cols="100%",]
+|===
+|public void set _Id_ ( _JAXBElement_ <?
+extends _Type_ > value); +
+public _JAXBElement_ <? extends _Type_ > get _Id_ ();
+|===
+
+where _Id_ and _Type_ are defined as they
+were for simple and collection property. The fully qualified Java name
+for _JAXBElement_ _<T>_ is _javax.xml.bind.JAXBElement<T>_ . The generic
+types in the method signatures are expressed as a bounded wildcard to
+support element substitution group, see details in
+link:jaxb.html#a1023[See Element Declaration]”.
+
+=== Property Summary
+
+The following core properties have been
+defined:
+
+* Simple property - JavaBean design pattern
+for single value property
+* Indexed property - JavaBean design pattern
+for multi-valued property
+* List property - Leverages
+java.util.Collection
+* Constant property
+
+The methods generated for these four core
+property kinds are sufficient for most applications. Configuration-level
+binding schema declarations enable an application to request finer
+control than provided by the core properties. For example, the _isSet_
+property modifier enables an application to determine if a property’s
+value is set or not.
+
+=== [[a642]]Java Element Representation
+
+Based on rationale and criteria described in
+link:jaxb.html#a1023[See Element Declaration], the schema
+compiler binds an element declaration to a Java instance that implements
+_javax.xml.bind.JAXBElement<T>_ . _JAXBElement<T>_ class provides access
+to the basic properties of an XML element: its name, the value of the
+element’s datatype, and whether the element’s content model is set to
+nil, i.e. _xsi:nil=”true”_ . Optional properties for an Xml element that
+corresponds to an element declaration from a known schema include the
+element declaration’s declared type and scope.
+
+The enhanced, default binding for an element
+declaration only generates a element instance factory method and is
+described in link:jaxb.html#a645[See Named Java Element
+instance]”.link:#a5364[13] The customized binding that generates
+a schema-dervied Element class for an element declaration is described
+in link:jaxb.html#a657[See Java Element Class]”.
+
+=== [[a645]]Named Java Element instance
+
+Based on the normative binding details
+described in link:jaxb.html#a1040[See Bind to JAXBElement<T>
+Instance], the schema compiler binds an element declaration to an
+element instance factory method.
+
+The following is a generic element factory
+signature.
+
+package _elementDeclarationTargetNamespace_ ;
+
+class ObjectFactory \{
+
+ javax.xml.bind.JAXBElement< _ElementType_ >
+
+create _ElementName_ ( _ElementType_ __
+value);
+
+}
+
+The element factory method enables an
+application to work with elements without having to directly know the
+precise _javax.xml.namespace.QName_ . The element factory method
+abstraction sets the Xml element name with the Java representation of
+the element, thus shielding the JAXB user from the complexities of
+manipulating namespaces and QNames.
+
+=== Binding of global element declaration to element factory
+
+ +
+<xs:schema targetNamespace=”a” xmlns:a=”a”/> +
+<xs:element name=”Foo” type=”xsd:int”/>
+
+ +
+class ObjectFactory \{ +
+// returns JAXBElement with its name set to QName(“a”, “Foo”). +
+JAXBElement<Integer> createFoo(Integer value); +
+}
+
+=== [[a657]]Java Element Class
+
+Based on criteria to be identified in
+link:jaxb.html#a1068[See Bind to Element Class], the schema
+compiler binds an element declaration to a Java element class. An
+element class is defined in terms of the properties of the
+link:jaxb.html#a4937[See Element Declaration Schema Component]
+as follows:
+
+* An element class name is generated from the
+element declaration’s name using the XML Name to Java identifier name
+mapping algorithm specified in link:jaxb.html#a4656[See The Name
+to Identifier Mapping Algorithm].
+* Scope of element class
+* Global element declarations are declared in
+package scope.
+* By default, local element declarations
+occur in the scope of the first ancestor complex type definition that
+contains the declaration. The schema customization <jaxb:globalBindings
+localScoping=”toplevel”/>, specified in Section
+link:jaxb.html#a1582[See Usage], disables the generation of
+schema-derived nested classes and all classes are generated as toplevel
+classes.
+* Each generated Element class must extend
+the Java class _javax.xml.bind.JAXBElement<T>_ . The type T of the
+_JAXBElement<T>_ is derived from the element declaration’s type.
+Anonymous type definition binding is a special case that is specified in
+link:jaxb.html#a1084[See Binding of an anonymous complex type
+definition]
+* A factory method is generated in the
+package’s _ObjectFactory_ class introduced in
+link:jaxb.html#a482[See Java Package].” The factory method
+returns JAXBElement _<T>_ . The factory method has one parameter that is
+of type _T_ . The name of the factory method is generated by
+concatenating the following components:
+* The string constant _create_ .
+* If the Java element class is nested within
+a value class, then the concatenation of all outer Java class names.
+* The _name_ of the Java value class.
+
+The returned instance has the Xml Element
+name property set to the QName representing the element declaration’s
+name.
+
+For example, a Java element class named _Foo_
+that is nested within Java value class _Bar_ would have the following
+factory method generated in the containing Java package’s
+_ObjectFactory_ class:
+
+ JAXBElement<Integer> createBarFoo(Integer
+value)
+
+* A public no-arg constructor is generated. +
+The constructor must set the appropriate Xml element name, just as the
+element factory method does.
+* The Java element representation extends
+JAXBElement _<T>_ class, its properties provide the capability to
+manipulate
+* the value of the element’s content +
+Xml Schema’s type substitution capability is enabled by this property.
+* whether the element’s content model is
+_nil_
+
+=== Example:
+
+Given a complex type definition with mixed
+content:
+
+<xs:complexType name="AComplexType"
+mixed=”true”>link:#a5364[14] +
+<xs:sequence> +
+<xs:element name="ASimpleElement"
+type="xs:int"/>link:#a5366[15] +
+</xs:sequence> +
+</xs:complexType>
+
+Its Java representation:
+
+public value class AComplexType \{ +
+public class ASimpleElement extends +
+javax.xml.bind.JAXBElement<Integer> \{ +
+} +
+... +
+}; +
+class ObjectFactory \{ +
+AComplexType createAComplexType(); +
+JAXBElement<Integer> +
+createAComplexTypeASimpleElement(Integer value); +
+... +
+}
+
+=== [[a680]]Java Element Representation Summary
+
+Element declaration binding evolved in JAXB
+v2.0 to support XML Schema type substitution. The following diagrams
+illustrate the binding changes for the following schema fragment:
+
+<xs:element name=”foo” type=”fooType”/>
+
+=== JAXB 1.0 : isA Relationship between generated element interface and its type
+
+image:xmlb-9.png[image]
+
+=== JAXB 2.0: hasA Relationship between element instance and its type as described in link:jaxb.html#a645[See Named Java Element instance]”
+
+image:xmlb-10.png[image]
+
+=== JAXB 2.0: hasA Relationship between generated element class and its type as described in link:jaxb.html#a657[See Java Element Class]”
+
+image:xmlb-11.png[image]
+
+While a JAXB v1.0 Element interface
+implemented its type’s interface, a JAXB v2.0 Element instance has a
+composition relationship to the value of the element declaration’s type,
+accessible via the _javax.xml.bind.JAXBElement<T>_ property _Value_ .
+This change reflects the relationship that type substitution allows an
+element declaration to be associated with many different datatypes, not
+just the datatype that was defined statically within the schema.
+
+An added benefit to the default binding
+change is to reduce the overhead associated with always generating Java
+Element classes for every global element declaration.In JAXB 1.0, an
+interface was generated for every complex type definition and global
+element declaration. In JAXB 2.0, a value class is generated for every
+complex type definition and only a factory method needs to be generated
+for each global element declaration.
+
+=== Summary
+
+The composition and relationships between the
+Java components introduced in this section are reflected in the
+following diagram.
+
+=== UML diagram of Java Representationlink:#a5367[16]
+
+image:xmlb-12.png[image]
+
+=== UML diagram when xs:element is bound to schema-derived Element class
+
+image:xmlb-13.png[image]
+
+See also link:jaxb.html#UNKNOWN[See
+Summarize default XSD to Java binding for Figure 5.1 and Figure 5.2].
+
+== CHAPTER 6 - 
+
+[[a694]]Binding
+XML Schema to Java Representations
+
+This chapter describes binding of XML schema
+components to Java representations. The default binding is identified in
+this chapter and the next chapter specifies the customizations that
+override default binding.
+
+=== Overview
+
+The abstract model described in [XSD Part 1]
+is used to discuss the default binding of each schema component type.
+Each schema component is described as a list of properties and their
+semantics. References to properties of a schema component as defined in
+[XSD Part 1] are denoted using the notation \{schema property}
+throughout this section. References to properties of information items
+as defined in [XML-Infoset] are denoted by the notation [property].
+
+All JAXB implementations are required to
+implement the default bindings specified in this chapter. However, users
+and JAXB implementors can use the global configuration capabilities of
+the custom binding mechanism to override the defaults in a portable
+manner.
+
+For each binding of a schema component to its
+Java representation, there is a description of Java mapping
+annotation(s), described in link:jaxb.html#a2236[See Java Types
+To XML]“, to be generated with the Java representation. The
+standardization of these mapping annotations assist in specifying the
+portability of a schema-derived JAXB-annotated classes. All JAXB
+implementations are required to be able to unmarshal/marshal another
+implementation’s schema-derived Java value classes by interpreting the
+specified mapping annotations. Note that each mapping annotation is
+described independent of whether it is the default mapping or a
+customized mapping, JAXB implementations are allowed to optimize away
+redundant mapping annotations that are the default mapping annotation.
+
+* 
+
+All examples are non-normative. Note that in
+the examples, the schema-derived code does not list all required mapping
+annotations. In the interest of being terse, only the mapping
+annotations directly connected to the schema component being discussed
+are listed in its example.
+
+=== [[a702]]Simple Type Definition
+
+A schema component using a simple type
+definition typically binds to a Java property. Since there are different
+kinds of such schema components, the following Java property attributes
+(common to the schema components) are specified here and include:
+
+* base type
+* collection type if any
+* predicate
+
+The rest of the Java property attributes are
+specified in the schema component using the simple type definition.
+
+While not necessary to perform by default,
+this section illustrates how a simple type definition is bound to a JAXB
+mapped class. This binding is necessary to preserve a simple type
+definition referred to by _xsi:type_ attribute in an Xml instance
+document. See link:jaxb.html#a1582[See Usage]“for the
+customization that enables this binding.
+
+=== Type Categorization
+
+The simple type definitions can be
+categorized as:
+
+* schema built-in datatypes [XSD PART2]
+* user-derived datatypes
+
+Conceptually, there is no difference between
+the two. A schema built-in datatype can be a primitive datatype. But it
+can also, like a user-derived datatype, be derived from a schema
+built-in datatype. Hence no distinction is made between the schema
+built-in and user-derived datatypes.
+
+The specification of simple type definitions
+is based on the abstract model described in Section 4.1, “Simple Type
+Definition” [XSD PART2]. The abstract model defines three varieties of
+simple type definitions: atomic, list, union. The Java property
+attributes for each of these are described next.
+
+=== [[a715]]Atomic Datatype
+
+If an atomic datatype has been derived by
+restriction using an “enumeration” facet, the Java property attributes
+are defined by link:jaxb.html#a829[See Enum Type].” Otherwise
+they are defined as described here.
+
+The base type is derived upon the XML
+built-in type hierarchy [XSD PART2, Section 3] reproduced below.
+
+
+
+image:xmlb-15.png[image]
+
+=== XML Built-In Type Hierarchy
+
+The above diagram is the same as the one in
+[XSD PART2] except for the following:
+
+* Only schema built-in atomic datatypes
+derived by restriction have been shown.
+* The schema built-in atomic datatypes have
+been annotated with Java data types from the “Java Mapping for XML
+Schema Built-in Types” table below.
+* 
+
+The following is a mapping for subset of the
+XML schema built-in data types to Java data types. This table is used to
+specify the base type later.
+
+=== [[a725]]Java Mapping for XML Schema Built-in Types
+
+XML Schema Datatype
+
+Java Datatype
+
+ _xsd:string_
+
+ _java.lang.String_
+
+ _xsd:integer_
+
+ _java.math.BigInteger_
+
+ _xsd:int_
+
+ _int_
+
+ _xsd.long_
+
+ _long_
+
+ _xsd:short_
+
+ _short_
+
+ _xsd:decimal_
+
+ _java.math.BigDecimal_
+
+ _xsd:float_
+
+ _float_
+
+ _xsd:double_
+
+ _double_
+
+ _xsd:boolean_
+
+ _boolean_
+
+ _xsd:byte_
+
+ _byte_
+
+ _xsd:QName_
+
+ _javax.xml.namespace.QName_ 1
+
+ _xsd:dateTime_
+
+javax.xml.datatype.XMLGregorianCalendar 1
+
+ _xsd:base64Binary_
+
+ _byte[]_
+
+ _xsd:hexBinary_
+
+ _byte[]_
+
+xsd:unsignedInt
+
+long
+
+xsd:unsignedShort
+
+int
+
+xsd:unsignedByte
+
+short
+
+xsd:time
+
+javax.xml.datatype.XMLGregorianCalendar 1.
+
+xsd:date
+
+javax.xml.datatype.XMLGregorianCalendar 1.
+
+xsd:g*
+
+javax.xml.datatype.XMLGregorianCalendar 1.
+
+{empty}xsd:anySimpleType +
+(for xsd:element of this type)link:#a5368[17]
+
+java.lang.Object
+
+xsd:anySimpleType +
+(for xsd:attribute of this type)
+
+java.lang.String
+
+xsd:duration
+
+javax.xml.datatype.Duration 1
+
+xsd:NOTATION
+
+javax.xml.namespace.QName 1
+
+1. JAXP 1.3 defines package
+_javax.xml.datatype_ and _javax.xml.namespace_
+
+The base type is determined as follows:
+
+. Map by value space bounding facets +
+If the simple type derives from or is _xsd:integer_ and has either a
+constraining lower and/or upper bounds facet(s) or totalDigits facet,
+check if the following optimized binding is possible:
+. If the simple type derives from or is
+_xsd:short_ , _xsd:byte_ or _xsd:unsignedByte_ , go to step 2.
+. If the value space for the simple type is
+representable in the range of _java.lang.Integer.MIN_VALUE_ and
+_java.lang.Integer.MAX_VALUE_ , map to java primitive type, _int_ .
+. If the value space for the simple type is
+representable in the range of _java.lang.Long.MIN_VALUE_ and
+_java.lang.Long.MAX_VALUE_ , map to java primitive type, _long_ .
+. Else go to step 2.
+. Map by datatype +
+If a mapping is defined for the simple type in Table 6.1, the base type
+defaults to its defined Java datatype.
+. Map by base datatype +
+Otherwise, the base type must be the result obtained by repeating the
+step 1 and 2 using the \{base type definition}. For schema datatypes
+derived by restriction, the \{base type definition} represents the
+simple type definition from which it is derived. Therefore, repeating
+step 1 with \{base type definition} essentially walks up the XML Schema
+built-in type hierarchy until a simple type definition which is mapped
+to a Java datatype is found.
+
+The Java property predicate must be as
+specified in “Simple Type Definition Validation Rules,” Section
+4.1.4[XSD PART2].
+
+=== Example:
+
+The following schema fragment (taken from
+Section 4.3.1, “Length” [XSD PART2]):
+
+<xs:simpleType name="productCode"> +
+<xs:restriction base="xs:string"> +
+<xs:length value="8" fixed="true"/> +
+</xs:restriction> +
+</xs:simpleType>
+
+The facet “length” constrains the length of a
+product code (represented by _productCode_ ) to 8 characters (see
+section 4.3.1 [XSD PART2] for details).
+
+The Java property attributes corresponding to
+the above schema fragment are:
+
+* There is no Java datatype mapping for
+_productCode._ So the Java datatype is determined by walking up the
+built-in type hierarchy.
+* The _\{base type definition}_ of
+_productCode_ is _xs:string. xs:string_ is mapped to _java.lang.String_
+(as indicated in the table, and assuming no customization). Therefore,
+_productCode_ is mapped to the Java datatype _java.lang.String_ .
+* The predicate enforces the constraints on
+the length.
+
+=== Notation
+
+Given that the value space of _xsd:NOTATION_
+is the set of _xsd:QName_ , bind _xsd:NOTATION_ type to
+_javax.xml.namespace.QName_ .
+
+ For example, the following schema:
+
+<xs:schema targetNamespace="http://e.org"
+xmlns:e="http://e.org" +
+xmlns:xs="http://www.w3.org/2001/XMLSchema"> +
+<xs:notation name="jpeg" public="image/jpeg" system="jpeg.exe"/>
+<xs:notation name="png" public="image/png" system="png.exe"/> +
+<xs:simpleType name="pictureType"> +
+<xs:restriction base="xs:NOTATION"> +
+<xs:enumeration value="e:jpeg"/> +
+<xs:enumeration value="e:png"/> +
+</xs:restriction> +
+</xs:simpleType> +
+<xs:complexType name="Picture"> +
+<xs:simpleContent> +
+<xs:extension base="xs:hexBinary"> +
+<xs:attribute name="format" type="e:pictureType"/>
+
+ </xs:extension> +
+</xs:simpleContent> +
+</xs:complexType> +
+</xs:schema>
+
+ is mapped to the following Java code:
+
+package org.e; +
+import javax.xml.namespace.QName; +
+public class Picture \{ +
+void setValue(byte[] value) \{...} +
+byte[] getValue() \{...} +
+void setFormat(QName value)\{...} +
+QName getFormat()\{...} +
+}
+
+With the following usage scenario:
+
+Picture pic = ...; +
+pic.setFormat(new QName("http://e.org","jpeg"));
+
+=== [[a803]]Bind to a JAXB mapped class
+
+By default, a named simple type definition is
+not bound to a Java class. This binding is only necessary to enable the
+precise type of an _xsi:type_ substitution to be preserved as described
+in link:jaxb.html#a1158[See Type Substitution of a Simple Type
+Definition]“. This binding is enabled via the global binding
+customization attribute _@mapSimpleTypeDef_ specified in
+link:jaxb.html#a1582[See Usage]“.
+
+The binding of a named simple type definition
+to a Java value class is based on the abstract model properties in
+link:jaxb.html#a4867[See Simple Type Definition Schema
+Component]. The Java value class must be defined as specified here,
+unless the ref attribute is specified on the _<jaxb:class>_ declaration,
+in which case the schema compiler will simply assume that the nominated
+class is already bound to this simple type.
+
+*  _name:_ name is the Java identifier
+obtained by mapping the XML name _\{name}_ using the name mapping
+algorithm, specified in link:jaxb.html#a4656[See The Name to
+Identifier Mapping Algorithm]. Note that anonymous simple type
+definition’s are never bound to a Java value class.
+*  _package:_
+* The schema-derived Java value class is
+generated into the Java package that represents the binding of \{target
+namespace}
+*  _outer class name:_
+* There is no outer class name for a global
+simple type definition.
+*  _base class:_
+* Due to a constraint specified for @XmlValue
+in Section 8, this class can not extend any other class. The derivation
+by restriction hierarchy for simple type definitions can not be captured
+in the schema-derived Java value class.
+*  _value property:_
+* Same as the binding of simple content in
+link:jaxb.html#a973[See Simple Content Binding] to an @XmlValue
+annotated JAXB property.
+
+The next two examples illustrate the binding
+of a simple type definition to a Java value class when the appropriate
+JAXB schema customization is enabled.
+
+=== [[a816]]Simple type definition
+
+<xs:simpleType name="productCode"> +
+<xs:restriction base="xs:string"> +
+<xs:length value="8" fixed="true"/> +
+</xs:restriction> +
+</xs:simpleType>
+
+=== Binding of link:jaxb.html#a816[See Simple type definition]“
+
+@XmlType(name="productCode") +
+public class ProductCode \{ +
+@XmlValue +
+String getValue(); +
+void setValue(String value); +
+}
+
+=== [[a820]]Annotations for standard XML datatypes
+
+By default, a schema-derived JAXB property
+bound from one of the following standard XML datatypes is annotated with
+the specified mapping annotation.
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+| _Schema Type_ |
+_JAXB Property Annotation_
+|xsd:ID |@XmlID
+
+|xsd:IDREF
+|@XmlIDREF
+
+|ref:swaRef
+|@XmlAttachmentRef
+|===
+
+Note that JAXB schema customizations could
+override these default binding.
+
+=== [[a829]]Enum Type
+
+The default mapping for a named atomic type
+that is derived by restriction with enumeration facet(s) and whose
+restriction base type (represented by \{base type definition}) is
+_xs:String_ link:#a5369[18] or derived from it is mapped to an
+enum type. The _[typesafeEnumBase]_ attribute customization described in
+link:jaxb.html#a1580[See <globalBindings> Declaration]," enables
+global configuration to alter what Xml built-in datatypes are bound by
+default to an enum type. An anonymous simple type definition is never
+bound to an enum class by default, but it can be customized as described
+in link:jaxb.html#a2090[See <typesafeEnum> Declaration]” to bind
+to an enum type.
+
+=== Example binding
+
+An example is provided first followed by a
+more formal specification.
+
+XML Schema fragment:
+
+<xs:simpleType name="USState"> +
+<xs:restriction base="xs:NCName"> +
+<xs:enumeration value="AK"/> +
+<xs:enumeration value="AL"/> +
+</xs:restriction> +
+</xs:simpleType>
+
+The corresponding enum type binding is:
+
+public enum USState \{ +
+AK, AL; +
+public String value() \{ return name(); } +
+public static USState fromValue(String value) \{ ... } +
+};
+
+=== Enum type binding
+
+The characteristics of an _enum type_ are
+derived in terms of the properties of the
+link:jaxb.html#a4867[See Simple Type Definition Schema
+Component] as follows:
+
+The enum type binding is defined as follows:
+
+* name: The default name of the enum type,
+enumType, is computed by applying the XML Name to Java identifier
+mapping algorithm to the _\{name}_ of the simple type definition. There
+is no mechanism to derive a name for an anonymous simple type
+definition, the customization must provide the _name_ .
+* package name: The package name is
+determined from the _\{targetname space}_ of the schema that directly
+contains the simple type definition.
+*  _outer class name:_
+* There is no _outer class name_ for a global
+simple type definition.
+* There is no _outer class name_ when schema
+customization, _[jaxb:globalBindings]_ _@localScoping_ , specified in
+Section link:jaxb.html#a1582[See Usage], has a value of
+_toplevel_ .
+* The _outer class name_ for an anonymous
+simple type definition is computed by traversing up the anonymous simple
+type definition’s ancestor tree until the first ancestor is found that
+is: +
+- an XML component that is mapped to a Java value class, the _outer
+class name_ is composed of the concatenation of this Java value class’s
+_outer class name_ , “.” _,_ and its _name_ . +
+- a global declaration or definition is reached. There is no _outer
+class name_ for this case.
+*  _enum constants_ : Specified in next
+section.
+
+Note that since a Java enum type is
+essentially a final class, it is not possible for it to be subclassed.
+Thus, any derivations of a simple type definition bound to an enum type
+can not be captured by an equivalent Java inheritance relationship.
+
+The schema-derived enum is annotated, either
+explicitly or by default mapping annotations, with the mapping
+annotation @XmlEnum, specified in Section 8. The @XmlEnum annotation
+elements are derived in terms of the abstract model properties for a
+simple type definition summarized in link:jaxb.html#a4867[See
+Simple Type Definition Schema Component] as follows:
+
+=== Annotate enum type with @XmlEnum element-value pairs
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlEnum element
+|@XmlEnum value
+|name |simple type
+definition's \{name}
+
+|namespace
+|\{target namespace}
+
+|value |the java
+type binding of the simple type definition’s _\{base type definition}_
+|===
+
+=== Enum Constant
+
+An enum constant is derived for each
+enumeration facet of the atomic type definition. The characteristics of
+an enum constant of the enum type are derived in terms of the properties
+of the link:jaxb.html#a4899[See Enumeration Facet Schema
+Component] as follows:
+
+*  name: The name is either specified via
+customization, _jaxb:typesafeEnumMember_ described in
+link:jaxb.html#a2092[See Usage]“, or the name is computed as
+specified in link:jaxb.html#a863[See XML Enumvalue-to-Java
+Identifier Mapping]“.
+* type: The Java type binding of the simple
+type definition’s \{base_type_definition}.
+*  _value_ : The conversion of string
+_\{value}_ to _type_ . _Value_ is manipulated via the following
+generated enum type methods:
+
+ _public_ _type_ value(); +
+public static _enumTypeName_ fromValue( _type_ value);
+
+To assist an application in manipulating the
+enum constants that comprise an enum type, all enum types have the
+following two implicitly declared static methods as specified in Section
+8.9 in [JLS3]. The enum type’s static method _values()_ returns an array
+of all enum constants. The static method _valueOf(String name)_ returns
+the enum constant represented by the name parameter.
+
+=== XML Enumvalue-[[a863]]to-Java Identifier Mapping
+
+The default name for the enum constant is
+based on mapping of the XML enumeration value to a Java identifier as
+described below.
+
+The XML enumeration value _\{value}_ is
+mapped to a Java Identifier using the algorithm specified in
+link:jaxb.html#a4773[See Deriving a legal Java identifier from
+an enum facet value]“.If there is a collision among the generated
+constant fields _name_ or if it is not possible to generate a legal Java
+identifier for one or more of the generated constant field names, see
+link:jaxb.html#a1633[See @typesafeEnumMemberName]“for
+customization options to resolve this error case.
+
+=== Enum Constant Name differs from its Value
+
+For all cases where there exist at least one
+enumeration constant name that is not the same as the enumeration
+constant’s value, the generated enum type must have a final value field
+that is set by the enum type’s constructor. The code generation template
+is the following:
+
+=== At least one enum constant name differs from its value.
+
+ public enum _enumType_ \{ +
+_EnumConstantName_ _1_ ( _EnumConstantValue_ _1_ ), +
+... +
+_EnumConstantName_ _X_ ( _EnumConstantValue_ _X)_ _; +
+_ public _EnumConstantValueType_ value() \{ return value;} +
+public static _enumType_ fromValue( _EnumConstantValueType_ val) +
+\{ ... } +
+ +
+final private _EnumConstantValueType_ value; +
+private _enumType_ ( _EnumConstantValueType_ value) \{ +
+this.value = value; +
+} +
+}
+
+=== Code template when enum constant name is same as its enum constant value.
+
+ public enum _enumType_ \{ +
+_EnumConstantName1_ , ..., _EnumConstantNameX_ ; +
+public _Stringlink:#a5370[19]_ value() \{ return name();} +
+public static _enumType_ fromValue( _String_ 1 value) \{ ... } +
+}
+
+The schema-derived enum constant is
+annotated, either explicitly or by default mapping annotations, with the
+mapping annotation specified in Section 8. The _@XmlEnumValue_
+annotation elements are derived in terms of the abstract model
+properties for a enumerated facet summarized in
+link:jaxb.html#a4899[See Enumeration Facet Schema Component] as
+follows:
+
+=== Annotate enum constant with @XmlEnumValue element-value pairs
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlEnumValue element
+|@XmlEnumValue value
+|value
+|Enumeration facet’s \{value}
+|===
+
+=== Schema-derived enum type when enumeration facet’s value does not match enum constant name.
+
+Given following schema fragment:
+
+<xs:simpleType name="Coin"> +
+<!-- Assume jaxb customization that binds Coin to an enumType--> +
+<xs:restriction base="xs:int"> +
+<!--Assume jaxb customization specifying enumConstantName--> +
+<xs:enumeration value="1"/> <!-- name="penny"--> +
+<xs:enumeration value="5"/> <!-- name="nickel"--> +
+<xs:enumeration value="10"/><!-- name="dime"--> +
+<xs:enumeration value="25"/><!-- name="quarter--> +
+</xs:restriction> +
+</xs:simpleType>
+
+Schema-derived enum type:
+
+@XmlEnum(value="java.lang.Integer.class") +
+public enum Coin \{ +
+@XmlEnumValue("1") PENNY(1), +
+@XmlEnumValue("5") NICKEL(5), +
+@XmlEnumValue("10") DIME(10), +
+@XmlEnumValue("25") QUARTER(25); +
+public int value()\{ return value; } +
+public static Coin fromValue(int value) \{ ... } +
+ +
+final private Integer value; +
+Coin(int value) \{ this.value = value; } +
+}
+
+=== [[a883]]List
+
+A list simple type definition can only
+contain list items of atomic or union datatypes. The item type within
+the list is represented by the schema property \{item type definition}.
+
+The Java property attributes for a list
+simple type definition are:
+
+* The _base type_ is derived from the \{item
+type definition} as follows. If the Java datatype for \{item type
+definition} is a Java primitive type, then the base type is the wrapper
+class for the Java primitive type. Otherwise, the Java datatype is
+derived from the XML datatype as specified in
+link:jaxb.html#a715[See Atomic Datatype]” and
+link:jaxb.html#a829[See Enum Type].”
+* The _collection type_ defaults to an
+implementation of _java.util.List_ . Note that this specification does
+not specify the default implementation for the interface
+_java.util.List_ , it is implementation dependent.
+* The _predicate_ is derived from the “Simple
+Type Definition Validation Rules,” in section 4.1.4,[XSD PART2].
+
+=== Example:
+
+For the following schema fragment:
+
+<xs:simpleType name="xs:USStateList">
+
+ <xs:list itemType="xs:string"/>
+
+</xs:simpleType>
+
+The corresponding Java property attributes
+are:
+
+* The _base type_ is derived from \{item type
+definition} which is XML datatype, _“xs:string”_ , thus the Java
+datatype is _java.util.String_ as specified in __
+link:jaxb.html#a725[See Java Mapping for XML Schema Built-in
+Types] _.”_
+* The _collection type_ defaults to an
+implementation of _java.util.List_ .
+* The _predicate_ only allows instances of
+_base type_ to be inserted into the list. When failfast check is being
+performedlink:#a5370[20], the list’s mutation methods apply the
+property’s predicate to any non- _null_ value before adding that value
+to the list or replacing an existing element’s value with that value;
+the predicate may throw a _TypeConstraintException_ .
+
+The schema-derived property is annotated,
+either explicitly or by default mapping annotations, with the mapping
+annotation @XmlList, specified in Section 8.
+
+=== [[a899]]Union Property
+
+A union property _prop_ is used to bind a
+union simple type definition schema component. A union simple type
+definition schema component consists of union members which are schema
+datatypes. A union property, is therefore, realized by:
+
+[width="100%",cols="100%",options="header",]
+|===
+|public Type get _Id_ ();
+|public void set _Id_ (Type value);
+|===
+
+where _Id_ is a metavariable that represents
+the Java method identifier computed by applying the name mapping
+algorithm described in link:jaxb.html#a4656[See The Name to
+Identifier Mapping Algorithm] to _prop_ .
+
+The _base type_ is String. If one of the
+member types is derived by list, then the Union property is represented
+as the appropriate collection property as specified by the customization
+_<jaxb:globalBindings>_ _@collectionType_ value, specified in
+link:jaxb.html#a1582[See Usage].”
+
+* The _getId_ method returns the set value.
+If the property has no set value then the value _null_ is returned. The
+value returned is Type.
+* The _setId_ method sets the set value. +
+If value is _null_ , the property’s set value is discarded. Prior to
+setting the property’s value when TypeConstraint validation is enabled,
+a non- _null_ value is validated by applying the property’s predicate,
+which may throw a _TypeConstraintException._ No setter is generated if
+the union is represented as a collection property.
+
+=== Example: Default Binding: Union
+
+The following schema fragment:
+
+<xs:complexType name="CTType"> +
+<xs:attribute name="state" type="ZipOrName"/> +
+</xs:complexType> +
+<xs:simpleType name="ZipOrName" +
+memberTypes="xs:integer xs:string"/>
+
+ +
+is bound to the following Java representation.
+
+public class CTType \{ +
+String getState() \{...} +
+void setState(String value) \{...} +
+}
+
+=== Union
+
+A simple type definition derived by a union
+is bound using the union property with the following Java property
+attributes:
+
+* the _base type_ as specified in
+link:jaxb.html#a899[See Union Property].”
+* if one of the member types is derived by
+_<xs:list>_ , then the union is bound as a Collection property.
+* The _predicate_ is the schema constraints
+specified in “Simple Type Definition Validation Rules,” Section 4.1.4
+[XSD PART2].
+
+=== [[a917]]Complex Type Definition
+
+=== [[a918]]Aggregation of Java Representation
+
+A Java representation for the entire schema
+is built based on aggregation. A schema component aggregates the Java
+representation of all the schema components that it references. This
+process is done until all the Java representation for the entire schema
+is built. Hence a general model for aggregation is specified here once
+and referred to in different parts of the specification.
+
+The model assumes that there is a schema
+component _SP_ which references another schema component _SC_ . The Java
+representation of _SP_ needs to aggregate the Java representation of
+_SC_ . There are two possibilities:
+
+*  _SC_ is bound to a property set.
+*  _SC_ is bound to a Java datatype or a Java
+value class.
+
+Each of these is described below.
+
+=== Aggregation of Datatype/Class
+
+If a schema component _SC_ is bound to a Java
+datatype or a Java value class, then _SP_ aggregates _SC’s_ Java
+representation as a simple property defined by:
+
+*  _name:_ the name is the class/interface
+name or the Java datatype or a name determined by SP. The name of the
+property is therefore defined by the schema component which is
+performing the aggregation.
+*  _base type:_ If SC is bound to a Java
+datatype, the base type is the Java datatype. If SC is bound to a Java
+value class, then the base type is the class name, including a dot
+separated list of class names within which SC is nested.
+*  _collection type:_ There is no collection
+type.
+*  _predicate:_ There is no predicate.
+
+=== [[a930]]Aggregation of Property Set
+
+If _SC_ is bound to a property set, then _SP_
+aggregates by adding _SC’s_ property set to its own property set.
+
+Aggregation of property sets can result in
+name collisions. A name collision can arise if two property names are
+identical. A binding compiler must generate an error on name collision.
+Name collisions can be resolved by using customization to change a
+property name.
+
+=== [[a933]]Java value class
+
+{empty}The binding of a complex type
+definition to a Java value class is based on the abstract model
+properties in link:jaxb.html#a4907[See Complex Type Definition
+Schema Component]. The Java value class must be defined as specified
+here, unless the ref attribute is specified on the _<jaxb:class>_
+customization, in which case the schema compiler will simply assume that
+the nominated class is already bound to this complex
+type.link:#a5372[21]
+
+*  _name:_ name is the Java identifier
+obtained by mapping the XML name _\{name}_ using the name mapping
+algorithm, specified in link:jaxb.html#a4656[See The Name to
+Identifier Mapping Algorithm]. For the handling of an anonymous complex
+type definition, see link:jaxb.html#a1084[See Binding of an
+anonymous complex type definition]” for how a _name_ value is derived
+from its parent element declaration.
+*  _package:_
+* For a global complex type definition, the
+derived Java value class is generated into the Java package that
+represents the binding of \{target namespace}
+* For the value of _package_ for an anonymous
+complex type definition, see link:jaxb.html#a1084[See Binding of
+an anonymous complex type definition]".
+*  _outer class name:_
+* There is no outer class name for a global
+complex type definition.
+* link:jaxb.html#a1084[See Binding of
+an anonymous complex type definition]" defines how to derive this
+property from the element declaration that contains the anonymous
+complex type definition.
+*  _base class:_ A complex type definition
+can derive by restriction or extension (i.e. _\{derivation method}_ is
+either “extension” or “restriction”). However, since there is no concept
+in Java programming similar to restriction, both are handled the same.
+If the _\{base type definition}_ is itself mapped to a Java value class
+(Ci2), then the base class must be Ci2. This must be realized as: +
+
+ public class Ci1 extends Ci2 \{ +
+..... +
+}
+
+See example of derivation by extension at the
+end of this section.
+
+* abstract: The generated Java class is
+abstract when the complex type definition’s _\{abstract}_ property is
+_true_ .
+*  _property set:_ The Java representation of
+each of the following must be aggregated into Java value class’s
+property set (link:jaxb.html#a918[See Aggregation of Java
+Representation]”).
+* A subset of _\{attribute uses}_ is
+constructed. The subset must include the schema attributes corresponding
+to the _<xs:attribute>_ children and the _\{attribute uses}_ of the
+schema attribute groups resolved by the <ref> attribute. Every
+attribute’s Java representation (link:jaxb.html#a1252[See
+Attribute use]”) in the set of attributes computed above must be
+aggregated.
+* If the optional _\{attribute wildcard}_ is
+present, either directly or indirectly, a property defined by
+link:jaxb.html#a1306[See Attribute Wildcard]“is generated.
+* The Java representation for _\{content
+type}_ must be aggregated.
+
+For a “Complex Type Definition with complex
+content,” the Java representation for _\{content type}_ is specified in
+link:jaxb.html#a1332[See Content Model - Particle, Model Group,
+Wildcard].” +
+For a complex type definition which is a “Simple Type Definition with
+simple content,” the Java representation for _\{content type}_ is
+specified in link:jaxb.html#a973[See Simple Content Binding].”
+
+* If a complex type derives by restriction,
+there is no requirement that Java properties representing the attributes
+or elements removed by the restriction to be disabled. This is because
+(as noted earlier), derivation by restriction is handled the same as
+derivation by extension.
+* When the complex type definition’s
+_\{abstract}_ property is _false_ , a factory method is generated in the
+package’s _ObjectFactory_ class introduced in
+link:jaxb.html#a482[See Java Package].” The factory method
+returns the type of the Java value class. The name of the factory method
+is generated by concatenating the following components:
+* The string constant _create_ .
+* The _name_ of the Java value class.
+
+The schema-derived Java value class is
+annotated, either explicitly or by default mapping annotations, with the
+mapping annotation @XmlType, specified in Section
+link:jaxb.html#a2578[See @XmlType]. The @XmlType annotation
+elements are derived in terms of the abstract model properties for a
+complex type definition summarized in link:jaxb.html#a4907[See
+Complex Type Definition Schema Component] as follows:
+
+=== [[a956]]Annotate Java value class with @XmlType element-value pairs
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlType element
+|@XmlType value
+|name |complex
+type definition's \{name}
+
+|namespace
+|\{target namespace}
+
+|propOrder a|
+When \{content type} is element-only
+\{content model} and top-level \{compositor} is xs:sequence, ordered
+list of JAXB property names representing order of xs:elements in
+\{content model}.
+
+ +
+All other cases do not need to set propOrder.
+
+|===
+
+=== Example: Complex Type: Derivation by Extension
+
+XML Schema Fragment (from XSD PART 0 primer):
+
+<xs:complexType name="Address"> +
+<xs:sequence> +
+<xs:element name="name" type="xs:string"/> +
+<xs:element name="street" type="xs:string"/> +
+<xs:element name="city" type="xs:string"/> +
+</xs:sequence> +
+</xs:complexType>
+
+<xs:complexType name="USAddress"> +
+<xs:complexContent> +
+<xs:extension base="ipo:Address"> +
+<xs:sequence> +
+<xs:element name="state" type="xs:string"/> +
+<xs:element name="zip" type="xs:integer"/> +
+</xs:sequence> +
+</xs:extension> +
+</xs:complexContent> +
+</xs:complexType>
+
+Default Java binding:
+
+public class Address \{ +
+String getName() \{...} +
+void setName(String) \{...} +
+String getStreet() \{...} +
+void setStreet(String) \{...} +
+void getCity() \{...} +
+void setCity(String) \{...} +
+}
+
+ +
+import java.math.BigInteger;
+
+public class USAdress extends Address \{ +
+String getState() \{...} +
+void setState(String) \{...}\{ +
+BigInteger getZip() \{...} +
+void setZip(BigInteger) \{...} +
+} +
+ +
+class ObjectFactory \{ +
+Address createAddress() \{...} +
+USAddress createUSAddress() \{...} +
+}
+
+=== [[a973]]Simple Content Binding
+
+=== Binding to Property
+
+By default, a complex type definition with
+simple content is bound to a Java property defined by:
+
+*  _name:_ The property name must be “
+_value_ ”.
+*  _base type, predicate, collection type:_
+As specified in [XSD Part 1], when a complex type has simple content,
+the content type (\{content type}) is always a simple type schema
+component. And a simple type component always maps to a Java datatype
+(link:jaxb.html#a702[See Simple Type Definition]”). Values of
+the following three properties are copied from that Java type:
+* base type
+* predicate
+* collection type
+
+The schema-derived JAXB property representing
+simple content is annotated, either explicitly or by default mapping
+annotations, with the mapping annotation @XmlValue, specified in Section
+link:jaxb.html#a3331[See @XmlValue].
+
+=== Example: Simple Content: Binding To Property
+
+XML Schema fragment:
+
+<xs:complexType name="internationalPrice"> +
+<xs:simpleContent> +
+<xs:extension base="xs:decimal"> +
+<xs:attribute name="currency" type="xs:string"/> +
+</xs:extension> +
+</xs:simpleContent> +
+</xs:complexType>
+
+Default Java binding:
+
+class InternationalPrice \{ +
+/** Java property for simple content */ +
+@XmlValue +
+java.math.BigDecimal getValue() \{...} +
+void setValue(java.math.BigDecimal value) \{...} +
+ +
+/** Java property for attribute*/ +
+String getCurrency() \{...} +
+void setCurrency(String) \{...} +
+}
+
+=== xsd:anyType
+
+ _xsd:anyType_ is the root of the type
+definition hierarchy for a schema. All complex type definitions in a
+schema implicitly derive from _xsd:anyType_ . Given that the JAXB 2.0
+architecture does not define a common base class for all JAXB class
+bindings of complex type definitions, the only possible binding property
+base type binding for _xsd:anyType_ is to _java.lang.Object_ . This
+binding enables all possible type and element substitutions for an
+element of type _xsd:anyType_ .
+
+=== Binding of element with type _xsd:anyType_
+
+ +
+<xs:element name="anyContent/> <!-- _@type_ defaults to _xs:anyType_
+--> +
+<xs:complexType name="base"> +
+<xs:sequence>
+
+ <xs:element ref="anyContent/> +
+<xs:element name="anyContentAgain" type="xs:anyType"/> +
+</xs:sequence> +
+</xs:complexType> +
+ +
+public class Base \{ +
+void setAnyContent(Object obj); +
+Object getAnyContent(); +
+void setAnyContentAgain(Object obj); +
+Object getAnyContentAgain(); +
+}
+
+A schema author defines an element to be of
+type _xs:anyType_ to defer constraining an element to a particular type
+to the xml document author. Through the use of _xsi:type_ attribute or
+element substitution, an xml document author provides constraints for an
+element defined as _xs:anyType_ . The JAXB unmarshaller is able to
+unmarshal a schema defined _xsd:anyType_ element that has been
+constrained within the xml document to an easy to access JAXB mapped
+class. However, when the xml document does not constrain the
+_xs:anyType_ element, JAXB unmarshals the unconstrained content to an
+element node instance of a supported DOM API.
+
+Type substitution is covered in more detail
+in Section link:jaxb.html#a1148[See Type Substitution of a
+Complex Type Definition] and link:jaxb.html#a1158[See Type
+Substitution of a Simple Type Definition]. Element substitution is
+covered in more detail in Section link:jaxb.html#a1223[See Bind
+to a Simple Element property].
+
+=== Attribute Group Definition
+
+There is no default mapping for an attribute
+group definition. When an attribute group is referenced, each attribute
+in the attribute group definition becomes a part of the [attribute uses]
+property of the referencing complex type definition. Each attribute is
+mapped to a Java property as described in
+link:jaxb.html#a1252[See Attribute use]“. If the attribute group
+definition contains an attribute wildcard, denoted by the
+_xs:anyAttribute_ element, then the referencing complex type definition
+will contain a property providing access to wildcard attributes as
+described in link:jaxb.html#a1306[See Attribute Wildcard]“.
+
+=== [[a996]]Model Group Definition
+
+When a named model group definition is
+referenced, the JAXB property set representing its content model is
+aggregated into the Java value class representing the complex type
+definition that referenced the named model group definition as
+illustrated in link:jaxb.html#a999[See Binding for a reference
+to a model group definition.]”
+
+
+
+image:xmlb-16.png[image]
+
+=== [[a999]]Binding for a reference to a model group definition.
+
+This binding style results in the same
+properties occurring within both Java value class’s A and C to represent
+the referenced Model Group B’s content model.
+
+When a model group definition’s content model
+contains an XML Schema component that is to be bound to a Java value
+class, element class or enum type, it is desirable to only create a
+single Java representation, not one for each complex content that
+references the named model group definition. This default binding from a
+model group definition’s content model is defined in
+link:jaxb.html#a1012[See Deriving Class Names for Named Model
+Group Descendants]."
+
+To meet the JAXB 2.0 goal of predictable
+unmarshalling of invalid XML content, the JAXB 1.0 customization for
+binding a model group to a JAXB mapped class is no longer supported.
+link:jaxb.html#a386[See Flexible Unmarshalling]“details the
+rationale behind this change.
+
+=== Bind to a set of properties
+
+A non-repeating reference to a model group
+definition, when the particle referencing the group has _\{max occurs}_
+equal to one, results in a set of content properties being generated to
+represent the content model. link:jaxb.html#a1332[See Content
+Model - Particle, Model Group, Wildcard]” describes how a content model
+is bound to a set of properties and has examples of the binding.
+
+=== Bind to a list property
+
+A reference to a model group definition from
+a particle with a repeating occurrence is bound by default as specified
+in link:jaxb.html#a1402[See Bind a repeating occurrence model
+group]“.
+
+=== Example:
+
+Schema fragment contains a particle that
+references the model group definition has a _\{maxOccurs}_ value greater
+than one.
+
+<xs:group name="AModelGroup"> +
+<xs:choice> +
+<xs:element name="A" type="xs:int"/> +
+<xs:element name="B" type="xs:float"/> +
+</xs:choice> +
+</xs:group> +
+ +
+<xs:complexType name="foo"> +
+<xs:sequence> +
+<xs:group ref="AModelGroup" maxOccurs="unbounded"/> +
+<xs:element name="C" type="xs:float"/> +
+</xs:sequence> +
+</xs:complexType>
+
+Derived Java representation:
+
+ public class Foo \{ +
+/** A valid general content property of AModelGroup content +
+model.*/ +
+@XmlElements(\{@XmlElement(type=Integer.class, name="A"), +
+@XmlElement(type=Float.class, name="B")}) +
+java.util.List<Object> getAModelGroup() \{...} +
+ +
+float getC() \{...} +
+void setC(float value) \{...} +
+};
+
+=== [[a1012]]Deriving Class Names for Named Model Group Descendants
+
+When a model group definition’s content model
+contains XML Schema components that need to be bound to a Java class or
+interface, this section describes how to derive the package and name for
+the Java value class, enum type or element class derived from the
+content model of the model group definition. The binding of XML Schema
+components to Java classes/interfaces is only performed once when the
+model group definition is processed, not each time the model group
+definition is referenced as is done for the property set of the model
+group definition.
+
+XML Schema components occurring within a
+model group definition’s content model that are specified by this
+chapter and the customization chapter to be bound to a Java value class,
+interface or typesafe enum class are bound as specified with the
+following naming exceptions:
+
+*  _package_ : The element class, Java value
+class or typesafe enum class is bound in the Java package that
+represents the target namespace containing the model group definition.
+*  _name_ : The name of the interface or
+class is generated as previously specified with one additional step to
+promote uniqueness between interfaces/classes promoted from a model
+group definition to be bound to a top-level class within a Java package.
+By default, a prefix for the interface/class name is computed from the
+model group definition’s _\{name}_ using the XML name to Java identifier
+algorithm.If the schema customization _[jaxb:globalBindings]_ @
+_localScoping_ has a value of _toplevel_ , then a prefix is not
+generated from the model group definition’s _\{name}_ .
+
+For example, given a model group definition
+named _Foo_ containing an element declaration named _bar_ with an
+anonymous complex type definition, the anonymous complex type definition
+is bound to a Java value class with the name _FooBar_ . The following
+figure illustrates this example.
+
+
+
+image:xmlb-17.png[image]
+
+=== Default binding for anonymous type def within a model group definition.
+
+Note that even customization specified Java
+value class, interface or typesafe enum class names are prepended with
+the model group definition’s name. Thus, if a model group definition
+named _Foo_ contains an anonymous simple type definition with a typesafe
+enum class customization name of _Colors,_ the enum type name is
+_FooColors_ .
+
+=== Attribute Declaration
+
+An attribute declaration is bound to a Java
+property when it is referenced or declared, as described in
+link:jaxb.html#a1252[See Attribute use],” from a complex type
+definition.
+
+=== [[a1023]]Element Declaration
+
+This section describes the binding of an XML
+element declaration to a Java representation. For a description of how
+this binding has changed since the previous version, see
+link:jaxb.html#a680[See Java Element Representation Summary]“.
+This section introduces why a JAXB technology user has to use instances
+of JAXB element as opposed to instances of Java datatypes or Java value
+class when manipulating XML content.
+
+An XML element declaration is composed of the
+following key components:
+
+* its qualified name is \{target namespace}
+and \{name}
+* its value is an instance of the Java class
+binding of its \{type definition}
+* whether the element’s content is
+_\{nillable}_
+
+Typically, an instance of
+_javax.xml.bind.JAXBElement<T>_ , returned by an element factory method,
+__ represents an element declaration’s key components. An instance of a
+Java value class or content interface represents only the value of an
+element. Commonly in JAXB binding, the Java representation of XML
+content enables one to manipulate just the value of an XML element, not
+an actual element instance. The binding compiler statically associates
+the XML element qualified name to a content property and this
+information is used at unmarshal/marshal time. For cases where the
+element name can be dynamically altered at runtime, the JAXB user needs
+to manipulate elements, not element values. The following schema/derived
+Java code example illustrates this point.
+
+=== Example:
+
+Given the XML Schema fragment:
+
+<xs:complexType name="chair_kind"> +
+<xs:sequence> +
+<xs:element name="has_arm_rest" type="xs:boolean"/> +
+</xs:sequence> +
+</xs:complexType> +
+
+Schema-derived Java value class:
+
+public class ChairKind \{ +
+boolean isHasArmRest() \{...} +
+void setHasArmRest(boolean value) \{...} +
+}
+
+A user of the Java value class _ChairKind_
+never has to create a Java instance that both has the value of local
+element _has_arm_rest_ and knows that its XML element name is
+_has_arm_rest_ . The user only provides the value of the element to the
+content-property _hasArmRest_ . A JAXB implementation associates the
+content-property _hasArmRest_ with XML element name _has_arm_rest_ when
+marshalling an instance of _ChairKind_ .
+
+The next schema/derived Java code example
+illustrates when XML element information can not be inferred by the
+derived Java representation of the XML content. Note that this example
+relies on binding described in link:jaxb.html#a1384[See Bind
+wildcard schema component].”
+
+=== Example:
+
+<xs:complexType name="chair_kind"> +
+<xs:sequence> +
+<xs:any/> +
+</xs:sequence> +
+</xs:complexType> +
+ +
+public class ChairKind \{ +
+@XmlAnyElement(lax="true") +
+java.lang.Object getAny() \{...} +
+void setAny(java.lang.Object elementOrValue) \{...} +
+}
+
+For this example, the user can provide an
+Element instance to the _any_ content-property that contains both the
+value of an XML element and the XML element name since the XML element
+name could not be statically associated with the content-property _any_
+when the Java representation was derived from its XML Schema
+representation. The XML element information is dynamically provided by
+the application for this case. link:jaxb.html#a1332[See Content
+Model - Particle, Model Group, Wildcard] cover additional circumstances
+when one can use JAXB elements.
+
+=== [[a1040]]Bind to _JAXBElement<T>_ Instance
+
+The characteristics of the generated
+ObjectFactory element factory method that returns an _JAXBElement<T>_
+instance are derived in terms of the properties of the
+link:jaxb.html#a4937[See Element Declaration Schema Component]
+as follows:
+
+* The element factory method is generated
+into the _ObjectFactory_ class in the Java package that represents the
+binding of the element declaration’s \{target namespace}.
+* The element factory method returns an
+instance of _javax.xml.bind.JAXBElement<T>_ , where _T_ is the Java
+value class representing the _\{type definition}_ of the element
+declaration. The factory method sets the element name of the returned
+instance to the element declaration’s fully qualified name.
+* The element factory method has a single
+parameter that is an instance of type _T_ , where T is the Java value
+class representing the _\{type definition}_ of the element declaration.
+* The name of the factory method is generated
+by concatenating the following components:
+* The string constant _create_ .
+* By default, if the element declaration is
+nested within another XML Schema component, then the concatenation of
+all outer Java class names representing those XML Schema components. If
+the schema customization _[jaxb:globalBindings]_ @ _localScoping_ has a
+value of toplevel, skip this step.
+* A name that is generated from the element
+declaration’s _\{name}_ using the XML Name to Java identifier name
+mapping algorithm specified in link:jaxb.html#a4656[See The Name
+to Identifier Mapping Algorithm].
+* The _JAXBElement<T>_ property for nil __
+test whether an element’s content model is _xsi:nil="true"_ .
+
+For example, an element declaration named
+_Foo_ __ with a type of __ _xs:int_ __ that is nested within the content
+model of complex type definition _Bar_ would have the following factory
+method generated in the containing Java package’s _ObjectFactory_ class:
+
+JAXBElement<Integer> createBarFoo(Integer
+value) \{...}
+
+Default binding rules require an element
+declaration to be bound to element factory method under the following
+conditions:
+
+* All non-abstract, named element
+declarations with global \{scope} are bound to an element factory method
+that returns an _JAXBElement<T>_ instance. The rationale is that any
+global element declaration can occur within a wildcard context and one
+might want to provide element instances, not instances of the element’s
+type, the element’s value, for this case.
+* All local element declarations, having a
+\{scope} of a complex type definition, occurring within content that is
+mapped to a general content property of JAXB elements must have an
+element factory method generated. General content property is specified
+in link:jaxb.html#a1344[See General content property]” An
+example of when a content model is mapped to a general content property,
+forcing the generation of element declarations is at
+link:jaxb.html#a1359[See Examples].”
+
+The schema-derived element factory method is
+annotated, either explicitly or by default mapping annotations, with the
+mapping annotation _@XmlElementDecl_ , specified in Section 8. The
+_@XmlElementDecl_ annotation elements are derived in terms of the
+abstract model properties for an element declaration summarized in
+link:jaxb.html#a4937[See Element Declaration Schema Component]
+as follows:
+
+=== Annotate element instance factory with @XmlElementDecl element-value pairs.
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlElementDecl element
+|@XmlElementDecl value
+|name |element
+declaration’s _\{name}_
+
+|namespace |
+_\{target namespace}_
+
+|scope |If
+_\{scope}_ is _global_ , _JAXBElement.GlobalScope.class_ . else the JAXB
+Java value class representing the _\{scope}_ ing complex type
+definition.
+
+|substitutionHeadName
+|If optional _\{substitution group
+affiliation}_ exists, its local name.
+
+|substitutionHeadNamespace
+|If optional _\{substitution group
+affiliation}_ exists, its namespace.
+|===
+
+The element declaration’s _\{type}_ can
+result in additional JAXB annotations being generated on the element
+instance factory. For more details, see link:jaxb.html#a820[See
+Annotations for standard XML datatypes]“and @XmlList in
+link:jaxb.html#a883[See List]“.
+
+The schema-derived ObjectFactory class
+containing the @XmlElementDecl annotations is annotated with
+@XmlRegistry annotation.
+
+=== [[a1068]]Bind to Element Class
+
+link:jaxb.html#a1698[See <class>
+Declaration]“customization enables the binding of an element declaration
+with a named type definition to a schema-derived Element class. The
+characteristics of the schema-derived Element class are derived in terms
+of the properties of the link:jaxb.html#a4937[See Element
+Declaration Schema Component] as follows:
+
+* The name of the generated Java Element
+class is derived from the element declaration \{name} using the XML Name
+to Java identifier mapping algorithm for class names.
+* Each generated Element class must extend
+the Java value class _javax.xml.bind.JAXBElement_ <T>. The next bullet
+specifies the schema-derived Java class name to use for generic
+parameter _T_ .
+* If the element declaration’s \{type
+definition} is
+* Anonymous
+
+Generic parameter _T_ from the second bullet
+is set to the schema-derived class represented the anonymous type
+definition generated as specified in Section 6.7.3.
+
+* Named
+
+Generic parameter T from the second bullet is
+set to the Java class representing the element declaration’s \{type
+definition}.
+
+The _ObjectFactory_ method to create an
+instance of name has a single parameter that is an instance of type _T_
+. By default, the name of the ObjectFactory method is derived by
+concatenating outerClassNames and name. When schema customization,
+_[jaxb:globalBindings]_ _@localScoping,_ specified in Section
+_link:jaxb.html#a1582[See Usage],_ has a value of _toplevel_ ,
+then the outer Classnames are ommitted from the factory method name.
+
+* If \{scope} is
+*  _Global:_ The derived Element class is
+generated into the Java package that represents the binding of \{target
+namespace}.
+*  _A Complex Type Definition:_ By default,
+the derived Element class is generated within the Java value class
+represented by the complex type definition value of \{scope}. When
+_@localScoping_ is _toplevel_ , the derived element class is generated
+as a toplevel class.
+* The property for nil __ test whether
+element’s content model is _xsi:nil="true"_ .
+* Optional \{value constraint} property with
+pair of _default_ or _fixed_ and a value. +
+If a default or fixed value is specified, the data binding system must
+substitute the default or fixed value if an empty tag for the element
+declaration occurs in the XML content.
+
+A global binding customization,
+_@generateElementClass,_ specified in link:jaxb.html#a1580[See
+<globalBindings> Declaration]“enables this binding over the default
+binding specified in the previous subsection.
+
+=== [[a1084]]Binding of an anonymous complex type definition
+
+An anonymous complex type definition is bound
+to a generated schema-derived Java value class by default.
+
+The naming characteristics of the generated
+Java value class is derived in terms of the properties of the
+link:jaxb.html#a4937[See Element Declaration Schema Component]
+as follows:
+
+* The name of the generated Java value class
+is derived from the element declaration \{name} using the XML Name to
+Java identifier
+* The _package_ of the generated Java value
+class is the same as the package derived from the element declaration’s
+_\{target namespace}_ .
+* The _outer class names_ of the generated
+Java value class is determined by the element declaration’s _\{scope}._
+If _\{scope}_ is:
+* Global +
+There is no outer class name.
+* A Complex Type Definition +
+By default, the derived Java value class is generated nested within the
+Java value class represented by the complex type definition value of
+\{scope}. The derived Java value is not generated nested when schema
+customization _[globalBindings]_ has attribute _@localScoping_ with a
+value of _toplevel_ _._
+*  _base class:_ Same as defined in
+link:jaxb.html#a933[See Java value class]“.
+*  _property set:_ As defined in
+link:jaxb.html#a933[See Java value class]“.
+* A type factory method is generated in the
+package’s _ObjectFactory_ class introduced in
+link:jaxb.html#a482[See Java Package].” The factory method
+returns the type of the Java value class. The name of the factory method
+is generated by concatenating the following components:
+* The string constant _create_ .
+* If the element declaration containing the
+anonymous complex type definition is nested within another complex type
+definition representing a value class and [globalBindings] @localScoping
+has a value of _nested_ , then the concatenation of all outer Java class
+names. This step is skipped when @localScoping has a value of _toplevel_
+.
+* The _name_ of the Java value class.
+
+The schema-derived value class is annotated
+with the mapping annotation _@XmlType_ , specified in Section
+link:jaxb.html#a2578[See @XmlType]. The _@XmlType_ annotation
+elements are set as described in link:jaxb.html#a956[See
+Annotate Java value class with @XmlType element-value pairs] with one
+exception: _@XmlType.name()_ is set to the empty string.
+
+As long as the element declaration is not one
+of the exception cases specified in link:jaxb.html#a1113[See
+Bind Element Declaration to JAXBElement]", the schema-derived value
+class is annotated with the mapping annotation _@XmlRootElement_
+specified in Section 8. The _@XmlRootElement_ annotation elements are
+derived in terms of the abstract model properties for the referenced
+global element declaration summarized in
+link:jaxb.html#a4937[See Element Declaration Schema Component]
+as follows:
+
+=== Annotate JAXB Mapped Class with @XmlRootElement element-value pairs
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlRootElement element
+|@XmlRootElement value
+|namespace a|
+When element declaration _\{target
+namespace}_ is absent, +
+(i.e. unqualified local element declaration), @XmlElement.namespace() is
+not set. +
+
+Otherwise, set @XmlElement.namespace() to
+value of _\{target namespace}_ . (either a qualified local element
+declaration or a reference to a global element)
+
+Note: same result could be achieved with
+package level annotation of @XmlSchema and not setting
+@XmlElement.namespace.
+
+|name |element
+declaration _\{name}_
+|===
+
+=== Example:
+
+Given XML Schema fragment:
+
+<xs:element name="foo"> +
+<xs:complexType> +
+<xs:sequence> +
+<xs:element name="bar" type="xs:int"/> +
+</xs:sequence> +
+</xs:complexType> +
+</xs:element>
+
+Derived Java code:
+
+/*Value class representing element
+declaration with an anonymous complex type definition.*/ +
+@XmlType(name="") +
+@XmlRootElement(namespace="", name="foo") +
+public class Foo \{ +
+int getBar() \{...} +
+void setBar(int value) \{...} +
+}; +
+
+=== [[a1113]]Bind Element Declaration to JAXBElement
+
+An element declaration with an anonymous
+complex type definition is not bound to a _@XmlRootElement_ ,annotated
+schema-derived class when the element declaration is:
+
+* nillable
+* the head element or a member of a
+substitution group
+* non-global (i.e. declared within a complex
+type definition)
+
+When one or more of the above conditions are
+met, the schema-derived class representing the anonymous complex type
+definition must not be annotated with _@XmlRootElement_ . Instead, an
+element factory that returns _JAXBElement<_ _anonymousTypeValueClass_
+_>_ may be generated as specified in link:jaxb.html#a1040[See
+Bind to JAXBElement<T> Instance]“.
+
+=== Example:
+
+Given XML Schema fragment:
+
+ +
+<xs:element name="foo" nillable="true"> +
+<xs:complexType> +
+<xs:sequence> +
+<xs:element name="bar" type="xs:int"/> +
+</xs:sequence> +
+</xs:complexType> +
+</xs:element> +
+
+Derived Java code:
+
+/*Value class representing anonymous complex
+type definition.*/ +
+@XmlType(name="") +
+public class Foo \{ +
+int getBar() \{...} +
+void setBar(int value) \{...} +
+}; +
+@XmlRegistry +
+class ObjectFactory \{ +
+// type factory method +
+Foo createFoo() \{...} +
+// element factory method +
+@XmlElementDecl(name="foo", namespace="", nillable="true") +
+JAXBElement<Foo> createFoo(Foo value) \{...} +
+}
+
+=== Bind to a Property
+
+A local element declaration is bound by
+default to a Java property as described in
+link:jaxb.html#a541[See Properties]. The characteristics of the
+Java property are derived in terms of the properties of the
+link:jaxb.html#a4937[See Element Declaration Schema Component]
+and link:jaxb.html#a5022[See Particle Schema Component] as
+follows:
+
+* The name of the Java property is derived
+from the \{element declaration} property’s \{name} property using the
+XML Name to Java Identifier mapping algorithm described in
+link:jaxb.html#a4656[See The Name to Identifier Mapping
+Algorithm].
+* A _base type_ for the Java property is
+derived from the _\{element declaration}_ property’s _\{type
+definition}_ property as described in binding of Simple Type Definition
+in _link:jaxb.html#a702[See Simple Type Definition]_ .” or
+link:jaxb.html#a917[See Complex Type Definition]". If the base
+type is initially a primitive type and this JAXB property is _optional_
+, the _[jaxb:globalBinding]_ customization _@optionalProperty_ controls
+the binding of an optional primitive property as described in
+link:jaxb.html#a1582[See Usage]“.
+* An optional _predicate_ for the Java
+property is constructed from the _\{element declaration}_ property’s
+_\{type definition}_ property as described in the binding of simple type
+definition to a Java representation.
+* An optional _collection type_ for the Java
+property is derived from:
+*  _\{element declaration}_ property’s
+_\{type definition}_ property as described in the binding of simple type
+definition to a Java representation
+* the \{particle} property’s \{max occurs}
+value being greater than one.
+* Element defaulting +
+The default value is derived from the element declaration’s \{value
+constraint} property’s value. Unlike attribute defaulting, an element
+only defaults when there is an empty element tag in an xml document. The
+element’s default value is captured by mapping annotation
+_@XmlElement.defaultValue()_ . The unmarshaller sets the property to
+this default value when it encounters an empty element tag. The
+marshaller can output an empty element tag whenever the element’s
+_@XmlValue_ property value is the same as its defaulted value..
+* A local element declaration that binds to a
+JAXB property with a primitive base type is bound as an _optional_ JAXB
+property if the element declaration is a member of a choice model group
+or the element declaration’s particle has optional occurrence, \{ _min
+occurs} value is "0",_ or belongs to a model group that has optional
+occurrence. By default, the optional JAXB property binds the property’s
+base type to the Java wrapper class for the primitive type. One can test
+and set the absence of an optional property using null. The
+_[jaxb:globalBinding]_ customization _@optionalProperty_ controls
+alternative bindings of an optional primitive property as described in
+link:jaxb.html#a1582[See Usage]“.
+* If the element declaration’s \{nillable}
+property is _“true”_ , the base type for the Java property is mapped to
+the corresponding Java wrapper class for the Java primitive type.
+Setting the property to the _null_ value indicates that the property has
+been set to the XML Schema concept of @xs: _nil=’true_ ’.
+
+This Java property is a member of the Java
+value class that represents the binding of the complex type definition
+containing the local element declaration or reference to global element.
+
+The schema-derived JAXB property getter
+method is annotated, either explicitly or by default mapping
+annotations, with the mapping annotation _@XmlElement_ , specified in
+Section 8, “@XmlElement”. The _@XmlElement_ annotation elements are
+derived in terms of the abstract model properties for the referenced
+global element declaration summarized in
+link:jaxb.html#a4937[See Element Declaration Schema Component]
+as follows:
+
+=== Annotate JAXB Property with @XmlElement element-value pairs
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlElement element
+|@XmlElement value
+|namespace a|
+When element declaration _\{target
+namespace}_ is absent, +
+(i.e. unqualified local element declaration), @XmlElement.namespace() is
+not set. +
+
+Otherwise, set @XmlElement.namespace() to
+value of _\{target namespace}_ . (either a qualified local element
+declaration or a reference to a global element)
+
+Note: same result could be achieved with
+package level annotation of @XmlSchema and not setting
+@XmlElement.namespace.
+
+|name |element
+declaration _\{name}_
+
+|nillable |element
+declaration _\{nillable}_
+
+|defaultValue |if
+element declaration _\{value constraint}_ is not absent, set
+defaultValue() to _\{value constraint}_ ’s value.
+|===
+
+link:jaxb.html#a1240[See Xml Schema
+example containing an element substitution group]illustrates how to
+define an element substitution group and to reference the head element
+of the substitution group within an Xml Schema.
+link:jaxb.html#a1242[See avo binding of Xml Schema from CODE
+EXAMPLE 6-5] illustrates the Java bindings of the element substation
+enabled schema. link:jaxb.html#a1244[See Element substitution
+using Java bindings from CODE EXAMPLE 6-6] demonstrates element
+substitution using the JAXB API.link:jaxb.html#a1246[See Invalid
+element substitution using Java bindings from CODE EXAMPLE 6-6]
+illustrates invalid element substitution handling.
+
+=== [[a1148]]Type Substitution of a Complex Type Definition
+
+link:jaxb.html#a917[See Complex Type
+Definition]“describes that when a complex type definition is mapped to
+Java value class that the type definition derivation hierarchy is
+preserved in the Java class hierarchy. This preservation makes it quite
+natural for Java to support the Xml Schema mechanism type substitution
+across all complex type definitions.
+
+Performing an invalid type substitution is
+not detected as a fail-fast check when setting the JAXB property or
+checked as part of marshalling the element declaration. Invalid type
+substitution can be checked by optional validation that can be enabled
+as part of unmarshalling or marshalling process.
+
+The following three code examples illustrate
+how type substitution is supported in JAXB 2.0 for a complex type
+definition hierarchy.
+
+=== [[a1152]]Xml Schema example containing type derivation hierarchy
+
+ +
+<xs:schema targetNamespace="travel:acme" xmlns:a="travel:acme"> +
+ +
+<!-- Define type definition derivation hierarchy --> +
+<xs:complexType name=" _TransportType_ ">...<\xs:complexType> +
+<xs:complexType name=" _PlaneType_ "> +
+<xs:extension base="a:TransportType">...<\xs:complexType> +
+<xs:complexType name=" _AutoType_ "> +
+<xs:extension base="a:TransportType">...<\xs:complexType> +
+<<xs:complexType name=" _SUV_ "> +
+<xs:extension base="a:AutoType">...<\xs:complexType> +
+ +
+<xs:complexType name=" _itinerary_ "> +
+<xs:sequence> +
+<!-- Type substitution possible for " _transport"._ -->. +
+<xs:element name=" _transport_ " type=" _TransportType_ "/> +
+</xs:sequence> +
+</xs:complexType> +
+</xs:schema> +
+
+=== [[a1154]]Java binding of Xml Schema from link:jaxb.html#a1240[See Xml Schema example containing an element substitution group]
+
+package travel.acme; +
+ +
+// Type derivation hierarchy from schema is preserved in Java binding. +
+public class _TransportType_ \{ ... } +
+public class _PlaneType_ extends TransportType \{ ... } +
+public class _AutoType_ extends TransportType \{ ... } +
+public class _SUV_ extends AutoType \{ ... } +
+ +
+public class ObjectFactory \{ +
+// Type Factories +
+TransportType createTransportType()\{...} +
+AutoType createAutoType()\{...} +
+PlaneType createPlaneType()\{...} +
+TrainType createSUV()\{...} +
+} +
+ +
+public class Itinerary \{ +
+// Simple property supports type substitution. +
+_TransportType_ getTransport()\{...} +
+void setTransport( _TransportType_ value) +
+}
+
+=== Type substitution using Java bindings from link:jaxb.html#a1242[See avo binding of Xml Schema from CODE EXAMPLE 6-5]
+
+ +
+ObjectFactory of = ...; +
+Itinerary itinerary = of.createItinerary(); +
+itinerary.setTransport(of.createTransportType); // Typical Use +
+ +
+// Type Substitution +
+// transport marshalled as <e:transport xsi:type="e:AutoType">> +
+itinerary.setTransport(of.createAutoType()); +
+ +
+// transport marshalled as <e:transport xsi:type="e:PlaneType">> +
+itinerary.setTransport(of.createPlaneType());
+
+=== [[a1158]]Type Substitution of a Simple Type Definition
+
+An XML element declaration having a simple
+type definition is bound most naturally to a JAXB property with a base
+type that is a primitive Java datatype. Unfortunately, this strongly
+typed binding conflicts with fully supporting type substitution of a
+simple type definition. Unlike the JAXB binding of complex type
+definitions, the simple type derivation hierarchy is not preserved when
+binding builtin XML Schema simple type definitions to corresponding Java
+datatypes as specified in link:jaxb.html#a715[See Atomic
+Datatype]“. Since there is not a natural Java inheritance hierarchy to
+support simple type substitution, a JAXB property customization is
+required to enable optimal support of simple type substitution.
+
+For example, the most natural binding of an
+XML Schema built-in datatype _xs:int_ is to the Java primitive datatype,
+_int_ . However, simple type substitution implies that an _xs:short_ or
+a complex type definition that derives by extension from _xs:int_ can be
+type substituted for an _xs:int_ within an XML document using the
+_xsi:type_ attribute. The strongly typed JAXB property with Java type
+_int_ would never allow for a Java value class for the complex type to
+be assigned to a JAXB property of type _int_ .
+
+By default, unmarshalling handles simple type
+substitution by assigning the relevant part of the type substituted
+content to the JAXB property. When the value of the xsi:type attribute
+resolves to:
+
+* a type that derives by restriction from the
+element’s schema type. +
+The substituted value is always parsable into a legal value of the base
+type of the JAXB property being type substituted.
+* a complex type that derives by extension
+from element’s schema type. +
+The JAXB binding of the substituted complex type definition must have
+one JAXB property annotated with an _@XmlValue_ that is assignable to
+the type substituted JAXB property’s base type. Attribute(s) associated
+with the complex type definition can not be preserved by the default
+binding.
+
+The rationale behind the default binding is
+that substitution of a simple type definition occurs rarely. The default
+JAXB binding is more convenient and precise for programmer to use. Its
+one drawback is that it does not faithfully preserve _xsi:type_
+occurring in an XML document.
+
+To enable more comprehensive support of
+simple type substituting of an XML element with a simple type
+definition, the JAXB property customization specified in
+link:jaxb.html#a1809[See Generalize/Specialize baseType with
+attribute @name]“enables setting the property’s base type to the more
+general type of _java.lang.Object._ This binding allows for retention of
+the XML document _xsi:type_ and attributes associated with complex type
+definition substituted for an XML element with a simple type definition.
+When an _xsi:type_ value refers to a type definition not registered with
+_JAXBContext_ instance, the content is unmarshalled as the element’s
+schema type.
+
+To preserve an application-defined simple
+type definition involved in simple type substitution, it must be mapped
+to a JAXB mapped class as described in link:jaxb.html#a803[See
+Bind to a JAXB mapped class]“. This can be achieved for all simple type
+definitions in a schema using the customization _<jaxb:globalBinding
+mapSimpleTypeDefs="true"/>_ or it can be achieved per simple type
+definition using <jaxb:class> customization. An invalid simple type
+substitution can be detected by JAXP 1.3 validation enabled at unmarshal
+or marshal time
+
+Below are examples of the type substitution
+of an XML element’s simple type definition for the default and
+customized binding.
+
+=== [[a1168]]Schema fragment to illustrate simple type substitution
+
+<xsd:element name="Price"> +
+<xsd:complexType> +
+<xsd:sequence> +
+<xsd:element name="name" type="xsd:string"/> +
+_<!-- element price subject to type substitution-> +
+_ <xsd:element name="price" type="xsd:int"/> +
+</xsd:sequence> +
+</xsd:complexType> +
+</xsd:element> +
+<xsd:complexType name="AmountType"> +
+<xsd:simpleContent> _<!-- type substitutable for xs:int --> +
+_ <xsd:extension base="xsd:int"> +
+<xsd:attribute name="currency" type="xsd:string"/> +
+</xsd:extension> +
+</xsd:simpleContent> +
+</xsd:complexType> +
+<xsd:simpleType name="AppInt"> +
+<xsd:restriction base="xsd:int"/> +
+</xsd:simpleType>
+
+=== [[a1170]]XML documents with simple type substitution
+
+<product> +
+<name>hotdog</name><price>3</price> +
+</product>
+
+<product> +
+<name>peanuts</name> +
+<price _xsi:type="short_ ">4</price> +
+</product>
+
+<product> +
+<name>popcorn</name> +
+<price _xsi:type="AppInt_ ">5</price> +
+</product>
+
+<product> +
+<name>sushi</name> +
+<price _xsi:type="AmountType"_ currency="yen">500</price> +
+</product>
+
+=== Default Handling of Simple Type Substitution
+
+=== [[a1176]]Default JAXB binding of link:jaxb.html#a1168[See Schema fragment to illustrate simple type substitution]
+
+public class AmountType \{ +
+@XmlValue +
+int getValue()\{...} void setValue(int value) \{...} +
+String getCurrency() \{...} void setCurrency(String value) \{...} +
+} +
+@XmlRootElement(namespace="", name="product") +
+public class Product \{ +
+int getPrice()\{...} void setPrice(int value) \{ ...} +
+int getName() \{...} void setName(String value) \{...} +
+}
+
+Unmarshalling XML document fragments from
+link:jaxb.html#a1170[See XML documents with simple type
+substitution] into link:jaxb.html#a1176[See Default JAXB binding
+of CODE EXAMPLE 6-1] JAXB binding of element _product_ results in the
+_xsi:type_ and attributes associated with JAXB mapped class _Price_
+being lost as part of the unmarshal process. This loss is illustrated by
+comparing link:jaxb.html#a1179[See Product instances from
+unmarshalling XML docs from CODE EXAMPLE 6-2] with
+link:jaxb.html#a1204[See Product instances from unmarshalling
+XML docs from CODE EXAMPLE 6-2].
+
+=== [[a1179]]Product instances from unmarshalling XML docs from link:jaxb.html#a1170[See XML documents with simple type substitution]
+
+[width="100%",cols="20%,20%,20%,20%,20%",options="header",]
+|===
+|document xsi:type
+| _Product.name +
+value_ | _Product.price +
+value_ | _Product.price +
+type_ | _marshal Product.price xsi:type_
+| |hotdog
+|3 |int
+|
+
+|xs:short |peanuts
+|4 |int
+|
+
+|AppInt |popcorn
+|5 |int
+|
+
+|AmountType |sushi
+|500 |int
+|
+|===
+
+=== Simple Type Substitution enabled by JAXB customizations.
+
+The simple type definition _AppInt_ is mapped
+to a JAXB class either by _<jaxb:class>_ customization or by
+_<jaxb:globalBindings mapSimpleTypeDef="true"/>_ . The JAXB property
+_Product.Price_ is mapped to a JAXB property with a general base type of
+_java.lang.Object_ with following external JAXB schema customization:
+
+<jaxb:bindings
+schemaLocation="link:jaxb.html#a1168[See Schema fragment to
+illustrate simple type substitution]" +
+node="//xsd:element[@name=’price’]"> +
+<jaxb:property> +
+<jaxb:baseType name="java.lang.Object"/> +
+</jaxb:property> +
+</jaxb:bindings>
+
+specified in link:jaxb.html#a1809[See
+Generalize/Specialize baseType with attribute @name]“.
+
+=== [[a1201]]Customized JAXB binding of link:jaxb.html#a1168[See Schema fragment to illustrate simple type substitution]
+
+public class AmountType \{ +
+@XmlValue +
+int getValue()\{...} void setValue(int value) \{...} +
+String getCurrency() \{...} void setCurrency(String value) \{...} +
+} +
+public class AppInt \{ +
+@XmlValue +
+int getValue() \{...} void setValue(int value) \{...} +
+} +
+public class Product \{ +
+// enable simple type substitution with base type of Object +
+@XmlElement(type=java.lang.Integer.class) +
+Object getPrice()\{...} void setPrice(Object value) \{ ...} +
+int getName() \{...} void setName(String value) \{...} +
+}
+
+Unmarshalling XML document fragments from
+link:jaxb.html#a1170[See XML documents with simple type
+substitution] into link:jaxb.html#a1201[See Customized JAXB
+binding of CODE EXAMPLE 6-1] JAXB binding of element _product_ preserves
+the _xsi:type_ and attributes associated with JAXB mapped class
+_AmountType_ is illustrated in link:jaxb.html#a1204[See Product
+instances from unmarshalling XML docs from CODE EXAMPLE 6-2].
+
+=== [[a1204]]Product instances from unmarshalling XML docs from link:jaxb.html#a1170[See XML documents with simple type substitution]
+
+[width="100%",cols="20%,20%,20%,20%,20%",options="header",]
+|===
+|document xsi:type
+| _Product.name +
+value_ | _Product. +
+price +
+value_ | _Product. +
+price +
+Java type_ | _Marshal +
+Product. +
+price +
+_ _xsi:type_
+| |hotdog
+|3 |Integer
+|
+
+|xs:short |peanuts
+|4 |Short
+|xs:short
+
+|AppInt |popcorn
+|5 |AppInt
+|AppInt
+
+|AmountType |sushi
+|\{value=500, +
+currency=”yen”} |AmountType
+|AmountType
+|===
+
+=== [[a1223]]Bind to a Simple Element property
+
+Element substitution group is an Xml Schema
+mechanism that enables the substitution of one named element for
+another. This section uses terms and concepts described in Section 4.6
+of [XSD Part 0] and normatively defined in Section 2.2.2.2 of [XSD Part
+1].
+
+The following constraints assist in defining
+the Java binding that enables element substitution group:
+
+. Element substitution is only possible for a
+reference to a global element.
+. Assuming the absence of the Xml Schema
+constraints on substitution, any global element can be made the head
+element of a substitution group.
+. All elements in a substitution group must
+derive from or have the same type definition as the head element.
+
+{empty}To support element substitution, for
+each global element reference to a head element of a substitution group
+or to an abstract element, it is necessary to generate the Element
+property bindings defined in link:jaxb.html#a630[See Element
+Property].link:#a5373[22] This property enables the overriding
+of the schema-specified element name bound to a JAXB property by setting
+and getting the JAXB element representation,
+_javax.xml.bind.JAXBElement<T>_ . The name property of the JAXBElement
+_<T>_ instance overrides the schema specified element declaration name.
+To enable the passing of any element that could be part of the element
+substitution group, it is necessary to accept any JAXBElement derivation
+that extends Java binding of the head element’s type definition. Using
+the upper bounded wildcard notation for a generic JAXBElement container,
+_JAXBElement<? extends T>_ , the element property is able to get and set
+any element that has an element value that is a subtype of T. Compile
+time checking will not allow invalid JAXBElement derivations to be
+passed to the Element property setter. When the element type is correct
+but the element name is not part of the substitution group, this invalid
+scenario can only be caught at runtime by validation or optional
+fail-fast checking by the element property
+setter.link:#a5374[23]
+
+The schema-derived Element property getter
+method is annotated, either explicitly or by default mapping
+annotations, with the mapping annotation _@XmlElementRef_ , specified in
+Section 8.10.3, “@XmlElementRef”. The _@XmlElementRef_ annotation
+elements are derived in terms of the abstract model properties for the
+referenced global element declaration summarized in
+link:jaxb.html#a4937[See Element Declaration Schema Component]
+as follows:
+
+=== Annotate Element Property with @XmlElementRef element-value pairs
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlElementRef element
+|@XmlElementRef value
+|value
+|javax.xml.bind.JAXBElement.class
+
+|namespace
+|referenced element declaration _\{target
+namespace}_
+
+|name |referenced
+element declaration _\{name}_
+|===
+
+link:jaxb.html#a1240[See Xml Schema
+example containing an element substitution group]illustrates how to
+define an element substitution group and to reference the head element
+of the substitution group within an Xml Schema.
+link:jaxb.html#a1242[See avo binding of Xml Schema from CODE
+EXAMPLE 6-5] illustrates the Java bindings of the element substation
+enabled schema. link:jaxb.html#a1244[See Element substitution
+using Java bindings from CODE EXAMPLE 6-6] demonstrates element
+substitution using the JAXB API.link:jaxb.html#a1246[See Invalid
+element substitution using Java bindings from CODE EXAMPLE 6-6]
+illustrates invalid element substitution handling.
+
+=== [[a1240]]Xml Schema example containing an element substitution group
+
+<xs:schema targetNamespace="travel:acme"
+xmlns:a="travel:acme"> +
+ +
+<!-- See type definition derivation hierarchy defined in
+link:jaxb.html#a1152[See Xml Schema example containing type
+derivation hierarchy]for +
+complexType definitions TransportType, PlaneType, AutoType and SUV.--> +
+< +
+<!-- Define element substitution group. a:transport is head
+element.--> +
+<xs:element name="transport" type="a:TransportType"/> +
+<xs:element name="plane" type="a:PlaneType"
+substitutionGroup="a:transport"/> +
+<xs:element name="auto" type="a:AutoType"
+substitutionGroup="a:transport"/><!- +
+ +
+<xs:complexType name="itinerary"> +
+<xs:sequence> +
+<!-- Global element reference. +
+References head element of element substitution group. --> +
+<xs:element ref="a:transport"/> +
+</xs:sequence> +
+</xs:complexType> +
+<\xs:schema>
+
+=== [[a1242]]avo binding of Xml Schema from link:jaxb.html#a1240[See Xml Schema example containing an element substitution group]
+
+ppackage travel.acme; +
+public class ObjectFactory \{ +
+// Type Factories +
+TransportType createTransportType(); +
+AutoType createAutoType(); +
+PlaneType createPlaneType(); +
+TrainType createSUVType(); +
+ +
+// Element Instance Factories +
+JAXBElement<AutoType> createAuto(AutoType value); +
+JAXBElement<PlaneType> createPlane(PlaneType value); +
+JAXBElement<TransportType> createTrain(TransportType value); +
+} +
+ +
+// See Java binding of type derivation hierarchy in
+link:jaxb.html#a1154[See Java binding of Xml Schema from CODE
+EXAMPLE 6-5] +
+ +
+public class Itinerary \{ +
+// Element substitution supported by link:jaxb.html#a630[See
+Element Property]" +
+JAXBElement<? extends TransportType> getTransport(); +
+void setTransport(JAXBElement<? extends TransportType> value); +
+}
+
+=== [[a1244]]Element substitution using Java bindings from link:jaxb.html#a1242[See avo binding of Xml Schema from CODE EXAMPLE 6-5]
+
+ +
+ObjectFactory of = ...; +
+Itinerary itinerary = of.createItinerary(); +
+itinerary.setTransport(of.createTransportType()); // Typical use. +
+ +
+// Element substitution: +
+// Substitute <e:auto> for schema specified <e:transport>. +
+itinerary.setTransport(of.createAuto(of.createAutoType())); +
+ +
+// Substitute <e:plane> for schema specified <e:transport>> +
+itinerary.setTransport(of.createPlane(of.createPlaneType())); +
+ +
+// Combination of element and type substitution: +
+_// Substitutes <e:auto xsi:type="e:SUV"> for <e:transport>> +
+_ itinerary.setTransport(of.createAuto(of.createSUV()));
+
+=== [[a1246]]Invalid element substitution using Java bindings from link:jaxb.html#a1242[See avo binding of Xml Schema from CODE EXAMPLE 6-5]
+
+ +
+<!-- Add elements not part of element substitution group. --> +
+<xs:element name="apple" type="xsd:string"/> +
+<xs:complexType name="spaceShuttle"> +
+<xs:extension base="a:TransportType">...<\xs:complexType> +
+<xs:element name="spaceShuttle" type="a:spaceShuttleType"> +
+ +
+ObjectFactory of = ...; +
+Itinerary itinerary = of.createItinerary(); +
+// Invalid element substitution +
+// compile time error: method not found +
+//Element apple of type JAXBElement<String> does not match +
+//bounded wildcard JAXBElement<? extends TransportType>. +
+itinerary.setTransport(of.createApple("granny smith")); +
+ +
+//Invalid element substitution detected by validation. +
+// Element spaceShuttle not part of substitution group. +
+// Adding _substitutionGroup="transport"_ to line 4 fixes this. +
+itinerary.setTranport( +
+of.createSpaceShuttle(of.createSpaceShuttleType()));
+
+=== Bind to an Element Collection property
+
+A repeating occurrence element declaration
+that is element substitutable binds solely to a JAXB Collection property
+of JAXBElement.
+
+=== Bind repeating occurrence element substitution variant of link:jaxb.html#a1240[See Xml Schema example containing an element substitution group]
+
+<!--deleted schema that remains same --> +
+<xs:complexType name="itinerary"> +
+<xs:sequence> +
+<!-- Repeating occurance to substitutable global element reference.
+--> +
+<xs:element ref="a:transport" _maxOccurs="unbounded"_ /> +
+</xs:sequence> +
+</xs:complexType> +
+<\xs:schema> +
+ +
+Java Binding: +
+public class Itinerary \{ +
+List<JAXBElement<? extends TransportType>> getTransport(); +
+}
+
+=== [[a1252]]Attribute use
+
+A ‘required’ or ‘optional’ attribute use is
+bound by default to a Java property as described in
+link:jaxb.html#a541[See Properties]. The characteristics of the
+Java property are derived in terms of the properties of the
+link:jaxb.html#a5012[See Attribute Use Schema Component] and
+link:jaxb.html#a4965[See Attribute Declaration Schema Component]
+as follows:
+
+* The name of the Java property is derived
+from the \{attribute declaration} property’s \{name} property using the
+XML Name to Java Identifier mapping algorithm described in
+link:jaxb.html#a4656[See The Name to Identifier Mapping
+Algorithm].
+* A _base type_ for the Java property is
+derived from the _\{attribute declaration}_ property’s _\{type
+definition}_ property as described in binding of Simple Type Definition
+in _link:jaxb.html#a702[See Simple Type Definition]_ .”. If the
+base type is initially a primitive type and this JAXB property is
+_optional_ , the _[jaxb:globalBinding]_ customization
+_@optionalProperty_ controls the binding of an optional primitive
+property as described in link:jaxb.html#a1582[See Usage]“.
+* An optional _predicate_ for the Java
+property is constructed from the _\{attribute declaration}_ property’s
+_\{type definition}_ property as described in the binding of simple type
+definition to a Java representation.
+* An optional _collection type_ for the Java
+property is derived from the _\{attribute declaration}_ property’s
+_\{type definition}_ property as described in the binding of simple type
+definition to a Java representation.
+* The _default value_ for the Java property
+is the value from the attribute use’s \{value constraint} property. If
+the optional \{value constraint} is absent, the default value for the
+Java property is the Java default value for the base type.
+* The JAXB property is _optional_ when the
+attribute use’s _\{required}_ property is _false_ .
+
+This Java property is a member of the Java
+value class that represents the binding of the complex type definition
+containing the attribute use
+
+The JAXB property getter for this attribute
+is annotated, either explicitly or via default mapping, with the mapping
+annotation @XmlAttribute, specified in Section
+link:jaxb.html#a3230[See @XmlAttribute]. The @XmlAttribute
+element values are derived in terms of the properties of the
+link:jaxb.html#a5012[See Attribute Use Schema Component] and
+link:jaxb.html#a4965[See Attribute Declaration Schema Component]
+as follows:
+
+=== [[a1262]]Annotate Attribute property getter method with @XmlAttribute annotation
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlAttribute element
+|@XmlAttribute value
+|name |attribute
+declaration's \{name}
+
+|namespace a|
+if attribute declaration’s \{target
+namespace} absent, set to “”
+
+otherwise, set to \{target namespace}
+
+|required
+|attribute use's \{required}
+|===
+
+* 
+
+=== Example:
+
+Given XML Schema fragment:
+
+<xs:complexType name="USAddress"> +
+<xs:attribute name="country" type="xs:string"/> +
+</xs:complexType>
+
+Default derived Java code:
+
+public class USAddress \{ +
+@XmlAttribute(name="country", targetNamespace="", +
+required="false"); +
+public String getCountry() \{...} +
+public void setCountry(String value) \{...} +
+}
+
+=== [[a1277]]Bind to a Java Constant property
+
+Rather than binding to a read/write JAXB
+property, an attribute use with a _fixed_ \{value constraint} property
+can be bound to a Java Constant property. This mapping is not performed
+by default since _fixed_ is only a validation constraint. The user must
+set the binding declaration attribute _fixedAttributeToConstantProperty_
+on _<jaxb:globalBinding>_ element as specified in
+link:jaxb.html#a1582[See Usage] or on _<jaxb:property>_ element
+as specified in link:jaxb.html#a1786[See Usage] to enable this
+mapping.
+
+=== Example:
+
+Given XML Schema fragment:
+
+<xs:annotation><xs:appinfo>
+
+ <jaxb:globalBindings
+fixedAttributeAsConstantProperty="true"/>
+
+</xs:appinfo></xs:annotation> +
+<xs:complexType name="USAddress"> +
+<xs:attribute name="country" type="xs:NMTOKEN" fixed="US"/> +
+</xs:complexType>
+
+If the appropriate binding schema
+customization enables mapping a fixed XML value to Java constant
+property, the following Java code fragment is generated.
+
+public class USAddress \{ +
+@XmlAttribute +
+public static final String COUNTRY="US"; +
+... +
+}
+
+The schema-derived constant for this fixed
+attribute is annotated, either explicitly or via default mapping, with
+the mapping annotation _@XmlAttribute._ The elements of _@XmlAttribute_
+are set as described in _link:jaxb.html#a1262[See Annotate
+Attribute property getter method with @XmlAttribute annotation]_
+
+Note that if derivation by restriction
+constrains an existing attribute declaration to be fixed, this
+refinement must not be bound to a constant property. The initial binding
+of the attribute to a JAXB property remains the only binding of the
+attribute in the Java class hierarchy.
+
+=== Contributions to Local Structural Constraint
+
+If the attribute use’s \{required} property
+is true, the local structural constraint for an instance of the Java
+value class requires that the corresponding Java property to be set when
+the Java value class instance is validated.
+
+=== [[a1290]]Binding an IDREF component to a Java property
+
+An element or attribute with a type of
+_xs:IDREF_ refers to the element in the instance document that has an
+attribute with a type of _xs:ID_ or derived from type _xs:ID_ with the
+same value as the _xs:IDREF_ value. Rather than expose the Java
+programmer to this XML Schema concept, the default binding of an
+_xs:IDREF_ component maps it to a Java property with a base type of
+_java.lang.Object_ . The caller of the property setter method must be
+sure that its parameter is identifiable. An object is considered
+identifiable if one of its properties is derived from an element or
+attribute that is or derives from type _xs:ID_ . The JAXB mapped class
+must have one property annotated with an @XmlID program annotation as it
+is specified in Section 8. There is an expectation that all instances
+provided as values for properties’ representing an _xs:IDREF_ should
+have the Java property representing the _xs:ID_ of the instances set
+before the content tree containing both the _xs:ID_ and _xs:IDREF_ is
+marshalled. If a property representing an _xs:IDREF_ is set with an
+object that does not have its _xs:ID_ set, the _NotIdentifiableEvent_ is
+reported by marshalling.
+
+* The name of the Java property is derived
+from the \{name} property of the attribute or element using the XML Name
+to Java Identifier mapping algorithm described in
+link:jaxb.html#a4656[See The Name to Identifier Mapping
+Algorithm].
+* A _base type_ for the Java property is
+java.lang.Object.
+* There is no _predicate_ for a property
+representing an _xs:IDREF_ .
+* An optional _collection type_
+* Default and fixed values can not be
+supported for an attribute with type _xs:IDREF_ .
+
+The schema-derived JAXB property representing
+xs:IDREF(s) is annotated, either explicitly or by default mapping
+annotations, with the mapping annotation @XmlIDREF, specified in Section
+8.
+
+=== Example:
+
+Given XML Schema fragment:
+
+<xs:complexType name="Book"> +
+<xs:sequence> +
+_<xs:element name="author" type="xs:IDREF"/> +
+_ <!-- ... --> +
+</xs:sequence> +
+</xs:complexType> +
+<xs:complexType name="AuthorBio"> +
+<xs:sequence><!-- ... --> </xs:sequence> +
+_<xs:attribute name="name" type="xs:ID"/> +
+_ </xs:complexType>
+
+Schema-derived Java value class:
+
+public class Book \{ +
+@XmlIDREF +
+java.lang.Object getAuthor() \{...} +
+ +
+/** Parameter referencedObj should have an attribute or +
+* child element with base type of xs:ID by validation +
+* or marshal time. +
+*/ +
+void setAuthor(java.lang.Object referencedObj)\{...} +
+} +
+public class AuthorBio\{ +
+@XmlID +
+String getName()\{...} +
+void setName(String value)\{...} +
+}
+
+Demonstration of a Java content instance
+referencing another instance:
+
+Book book = ...; +
+AuthorBio authorBio = ...; +
+book.setAuthor(authorBio); +
+authorBio.setName("<some author’s name>"); +
+// The content instance root used to validate or marshal book must +
+// also include "authorBio" as a child element somewhere. +
+// A Java content instance is not included
+
+Note that _ID_ and _IDREF_ mechanisms do not
+incorporate type definitions that can be referenced. To generate
+stronger typing for a JAXB property representing an IDREF, the schema
+customization described in link:jaxb.html#a1809[See
+Generalize/Specialize baseType with attribute @name]" can be used to
+specialize the binding.. link:jaxb.html#a1820[See Specialize
+binding of an IDREF via customization] illustrates the generation of
+stronger typing for the above example.
+
+=== [[a1306]]Attribute Wildcard
+
+Attribute wildcard is an extensibility
+feature in XML Schema. It enables an XML document author to introduce
+attribute(s) to an element that were not statically associated with the
+element’s complex type definition. Obviously, it is not possible to bind
+such an attribute to a strongly typed JAXB property as the previous
+section describes for attribute use schema component. The JAXB binding
+of a complex type definition that contains an attribute wildcard,
+directly or indirectly, provides dynamic access to the wildcard
+attributes via the following property:
+
+// Return, by reference, a mapping of
+attribute QName and String. +
+Map<QName, String> getOtherAttributes();
+
+The returned attribute map provides dynamic
+access to wildcard attributes associated with a complex type definition.
+The key to the map is the attribute’s QName and the key’s value is the
+String value of the attribute.
+
+The schema-derived property getter method is
+annotated, either explicitly or by default mapping annotations, with the
+mapping annotation _@XmlAnyAttribute_ , specified in Section 8.
+
+The following code examples show the JAXB
+binding for xs:anyAttribute and how to manipulate wildcard attributes
+using this binding.
+
+=== Bind anyAttribute to a JAXB property
+
+ +
+<xs:schema targetNamespace="http://a.org"> +
+<xs:complexType name=" _widget_ "> +
+<xs:anyAttribute/> +
+<xs:attribute name="color" type="xs:string"/> +
+</xs:complexType> +
+</xs:schema> +
+ +
+package org.a; +
+importjavax.xml.namespace.QName; +
+import java.util.Map; +
+public class _Widget_ \{ +
+String getColor()\{...} +
+void setColor(String value)\{...} +
+@XmlAnyAttribute Map<QName, String> _getOtherAttributes_ ()\{...} +
+}
+
+=== Dynamic access to wildcard attribute and attribute use
+
+ +
+import javax.xml.bind.DatatypeConverter; +
+Widget w = ...; +
+Map attrs = w.getOtherAttributes(); +
+ +
+// access schema-defined global attribute associated with +
+// complexType defintion widget via attribute wildcard. +
+QName IS_OPEN=new QName("http://example.org", "isOpen"); +
+boolean isOpen = DatatypeConverter.parseBoolean(attrs.get(IS_OPEN)); +
+ +
+// set wildcard attribute value +
+attrs.put(IS_OPEN, DatatypeConverter.printBoolean(false)); +
+ +
+// semantically the same results setting attribute use via +
+// dynamic or static setter for attribute use. +
+attrs.put(new QName("color"), "red"); +
+ +
+// iterate over wildcard attributes +
+for (Map.Entry<QName,String> e: attrs.entrySet()) \{ +
+System.out.println("Attribute: " + e.getKey() + +
+" Value:" + e.getValue()); +
+}
+
+=== [[a1316]]Redefine
+
+Redefinition allows an existing XML Schema
+component to be “renamed” and its new definition takes the place of the
+old one. The binding of the redefined schema components, simple and
+complex type definitions and model and attribute group declarations, are
+described in the following subsections.
+
+=== Bind Redefined Simple Type Definition
+
+As introduced in
+link:jaxb.html#a702[See Simple Type Definition]“, a schema
+component using a simple type definition typically binds to a JAXB
+property. The base type, collection type and predicate of the JAXB
+property are derived from the simple type definition. Thus, the redefine
+of a simple type definition results in the redefinition of the simple
+type definition being used to derive the base type, collection type and
+predicate of the JAXB property.
+
+The one exception to this binding is that a
+simple type definition with enum facets is sometimes bound to an enum
+type. A redefined simple type definition that binds to an enum type, as
+described in link:jaxb.html#a829[See Enum Type]“, is not bound
+to a Java representation, only the redefinition is bound to an enum
+type.
+
+=== Bind Redefined Complex Type Definition
+
+A redefinition of a type definition must use
+the original type definition as its base type definition. The redefined
+complex type definition is bound to a Java value class or interface name
+that prepends “_” to the class name. The redefinition complex type
+definition is bound to a class that extends the JAXB class that
+represents the redefined complex type definition.
+
+=== Binding of a redefined complex type definition
+
+File: v1.xsd: +
+<!-- Extracted from Section 4.2.2 of [XSD1] --> +
+<xs:complexType name="personName"> +
+<xs:sequence> +
+<xs:element name="title" type="xs:string" minOccurs="0"/> +
+<xs:element name="forename" type="xs:string" +
+minOccurs="0" maxOccurs="unbounded"/> +
+</xs:sequence> +
+</xs:complexType>
+
+File: v2.xsd: +
+<xs:redefine schemaLocation="v1.xsd"> +
+<xs:complexType name="personName"> +
+<xs:complexContent> +
+<xs:extension base="personName"> +
+<xs:sequence> +
+<xs:element name="generation" minOccurs="0"/> +
+</xs:sequence> +
+</xs:extension> +
+</xs:complexContent> +
+</xs:complexType> +
+</xs:redefine>
+
+Java binding: +
+// binding of file v1.xsd complex type definition for personName +
+@XmlType(name="_PersonName") +
+public class _PersonName \{ +
+void setTitle(String value); String getTitle(); +
+List<String> getForename(); +
+} +
+// binding of v2.xsd redefinition for complex type personName +
+@XmlType(name="PersonName") +
+public class PersonName extends _PersonName \{ +
+void setGeneration(Object value); Object getGeneration(); +
+
+=== Bind Redefined Group Definition
+
+The attribute or model group redefinition is
+used instead of the initial group definition to construct the property
+set of the content model(s) that reference the redefined attribute or
+model group definition. The construction of a property set is described
+in link:jaxb.html#a933[See Java value class]“.
+
+Since there is no binding of an attribute or
+model group definition to a Java representation, no other special case
+handling is required for this binding.
+
+=== Identity Constraint
+
+An identity constraint does not represent any
+data, it represents a constraint that is enforced by validation. These
+constraints can be checked by optional validation that can be enabled at
+either unmarshal and/or marshal time.
+
+=== [[a1332]]Content Model - Particle, Model Group, Wildcard
+
+This section describes the possible Java
+bindings for the content model of a complex type definition schema
+component with a \{content type} property of _mixed_ or _element-only_ .
+The possible element content(s) and the valid ordering between those
+contents are constrained by the \{particles} describing the complex type
+definition’s content model. The Java binding of a content model is
+realized by the derivation of one or more content-properties to
+represent the element content constrained by the model group. Section
+6.12.1 through 6.12.7 describes the _element binding_ of a content
+model.
+
+=== Element binding style
+
+The ideal Java binding would be to map each
+uniquely named element declaration occurring within a content model to a
+single JAXB property. The model group schema component constraint,
+element declarations consistent, specified in [XSD-Part 1] ensures that
+all element declarations/references having the same \{target namespace}
+and \{name} must have the same top-level type definition. This model
+allows the JAXB technology user to specify only the content and the JAXB
+implementation infers the valid ordering between the element content
+based on the \{particles} constraints in the source schema. However,
+there do exist numerous scenarios that this ideal binding is not
+possible for parts of the content model or potentially the entire
+content model. For these cases, default binding has a fallback position
+of representing the element content and the ordering between the content
+using a _general content model_ . The scenarios where one must fallback
+to the general content model will be identified later in this
+subsection.
+
+=== Bind each element declaration name to a JAXB property
+
+This approach relies on the fact that a model
+group merely provide constraints on the ordering between children
+elements and the user merely wishes to provide the content. It is
+easiest to introduce this concept without allowing for repeating
+occurrences of model groups within a content model. Conceptually, this
+approach presents all element declarations within a content model as a
+set of element declaration \{name}’s. Each one of the \{name}’s is
+mapped to a content-property. Based on the element content that is set
+by the JAXB application via setting content-properties, the JAXB
+implementation can compute the order between the element content using
+the following methods.
+
+Computing the ordering between element
+content within [children] of an element information item
+
+* Schema constrained fixed ordering or
+semantically insignificant ordering
+
+The sequence in the schema represents an
+ordering between children elements that is completely fixed by the
+schema. Schema-constrained ordering is not exposed to the Java
+programmer when mapping each element in the sequence to a Java property.
+However, it is necessary for the marshal/unmarshal process to know the
+ordering. No new ordering constraints between children elements can be
+introduced by an XML document or Java application for this case.
+Additionally, the Java application does not need to know the ordering
+between children elements. When the compositor is _all_ , the ordering
+between element content is not specified semantically and any ordering
+is okay. So this additional case can be handled the same way.
+
+* Schema only constrains content and does not
+significantly constrain ordering
+
+If the ordering between the children elements
+is significant and must be accessible to the Java application, then the
+ordering is naturally preserved in Java representation via a collection.
+Below are examples where schema provides very little help in
+constraining order based on content.
+
+ <xs:choice maxOccurs="unbounded"> ...
+</xs:choice> +
+<xs:sequence maxOccurs="unbounded"> ... </xs:sequence>
+
+=== [[a1344]]General content property
+
+A general content property is, as its name
+implies, the most general of all content properties. Such a property can
+be used with any content specification, no matter how complex. A general
+content property is represented as a List property as introduced in
+link:jaxb.html#a595[See List Property]. Unlike the prior
+approach where the JAXB implementation must infer ordering between the
+element content, this approach always requires the JAXB technology user
+to specify a valid ordering of element and text content. This approach
+has the benefit of providing the application with more control over
+setting and knowing the order between element content.
+
+A general content property is capable of
+representing both element information items and character data items
+occurring within [children] of an element information item. Character
+data is inserted into the list as java.lang.String values. Element data
+is added to the list as instances of JAXB element. To support wildcard
+content occurring as part of a general content property, xml data
+content with no static Java binding is added and accessed from the list
+as instances of _org.w3c.org.dom.Node_ .
+
+The schema-derived Collection property getter
+method is annotated, either explicitly or by default mapping
+annotations, with the mapping annotations reflecting what content is
+within the Collection.
+
+* If the content model is mixed, the property
+is annotated as _@XmlMixed_ . See link:jaxb.html#a1369[See Bind
+mixed content]“for details.
+* link:jaxb.html#a1351[See Collection
+of Element types]“describes an optimized binding of a collection of
+element values, instead of a collection of JAXB elements annotated with
+_@XmlElementRefs(@XmlElementRef, ...)_ .
+* If optimized binding can not be used, each
+element in the content model is represented by an _@XmlElementRef_ ,
+described in link:jaxb.html#a1223[See Bind to a Simple Element
+property]“. If there is more than one element annotations needed, they
+must occur as elements in the map annotation _@XmlElementRefs_ specified
+in Section 8.10.3, “@XmlElementRef”.
+
+=== [[a1351]]Collection of Element types
+
+If the content model for a general content
+property meets all of the following constraints, the collection can be
+optimized to be a list of value classes instead of a list of JAXB
+elements.
+
+* If the content model is not mixed and does
+not contain a wildcard.
+* If none of the element declarations in the
+content model are abstract or the head of an element substitution group.
+* If none of the element declarations in the
+content model have a xml datatype that is or derives from xs:list or
+xs:IDREF.
+* For all element declarations in the content
+model, there does not exist two distinct element declarations whose
+types bind to the same Java datatype.
+* If not more than one element declaration in
+the content model is nillable.
+
+Such a collection is annotated with @
+_XmlElements_ annotation, specified in Section 8, that contains a
+_@XmlElement_ annotation for each unique Java datatype within the
+collection. The _@XmlElement_ annotation associates an element name with
+each unique Java datatype in the collection
+
+=== [[a1359]]Examples
+
+=== Example 1: Complex content model of Elements with primitive types
+
+<xs:complexType name="Base"> +
+<xs:choice maxOccurs="unbounded"> +
+<xs:element name="A" type="xs:string"/> +
+<xs:element name="B" type="xs:string"/> +
+<xs:element name="C" type="xs:int"/> +
+</xs:choice> +
+</xs:complexType> +
+public class ObjectFactory \{ +
+// Element instance factories. +
+JAXBElement<String> createBaseA(String value)\{...} +
+JAXBElement<String> createBaseB(String value)\{...} +
+JAXBElement<Integer> createBaseC(Integer value)\{...} +
+// Type factories +
+Base createBase()\{...} +
+} +
+public class Base \{ +
+ +
+/** +
+* A general content list that can contain +
+* element instances representing A, B and/or C. +
+*/ +
+@XmlElementRefs(\{ @XmlElementRef(name="A", value=JAXBElement.class), +
+@XmlElementRef(name="B", value=JAXBElement.class), +
+@XmlElementRef(name="C", value=JAXBElement.class)}) +
+List<JAXBElement> getAOrBOrC()\{...} +
+}
+
+=== Example 2: Optimized Binding to a Collection of Element Types
+
+XML Schema fragment:
+
+<xs:complexType name="AType"/> +
+<xs:complexType name="BType"/> +
+<xs:complexType name="FooBar"> +
+<xs:choice maxOccurs="unbounded"> +
+<xs:element name="foo" type="AType"/> +
+<xs:element name="bar" type="BType"/> +
+</xs:choice> +
+</xs:complexType>
+
+ Default derived Java code:
+
+public class AType \{ ... } +
+public class BType \{ ... } +
+ +
+class ObjectFactory \{
+
+ // element instance factories only +
+JAXBElement<AType> createFooBarFoo(AType value); +
+JAXBElement<BType> createFooBarBar(BType value); +
+} +
+ +
+public class FooBar \{
+
+ /** +
+‘* Collection of element types: AType and BType. */ +
+@XmlElements(\{@XmlElement(value=AType.class, name="Foo"), +
+@XmlElement(value=BType.class, name="Bar")}) +
+List<Object> getFooOrBar() \{...} +
+};
+
+=== [[a1369]]Bind mixed content
+
+When a complex type definition’s _\{content
+type}_ is “mixed,” its character and element information content is
+bound to general content list as described in
+link:jaxb.html#a1344[See General content property].” Character
+information data is inserted as instances of _java.lang.String_ into a
+JAXB collection property.
+
+The schema-derived Collection property getter
+method is annotated, either explicitly or by default mapping
+annotations, with the mapping annotation _@XmlMixed_ , specified in
+Section 8.
+
+=== Example:
+
+Schema fragment loosely derived from mixed
+content example from +
+[XSD Part 0].
+
+<xs:element name="letterBody"> +
+<xs:complexType mixed="true"> +
+<xs:sequence> +
+<xs:element name="name" type="xs:string"/> +
+<xs:element name="quantity" type="xs:positiveInteger"/> +
+<xs:element name="productName" type="xs:string"/> +
+<!-- etc. --> +
+</xs:sequence> +
+</xs:complexType> +
+</xs:element>
+
+Derived Java code:
+
+import java.math.BigInteger; +
+class ObjectFactory \{
+
+ // element instance factories only +
+JAXBElement<LetterBody> createLetterBody(LetterBody value); +
+JAXBElement<String> createLetterBodyName(String value); +
+JAXBElement<BigInteger> +
+createLetterBodyQuantity(BigInteger value); +
+JAXBElement<String> +
+createLetterBodyProductName(String value); +
+} +
+public class LetterBody implements JAXBElement<LetterBody> \{ +
+ +
+/** Mixed content can contain instances of Element classes +
+Name, Quantity and ProductName. Text data is represented as +
+java.util.String for text. +
+*/ +
+@XmlMixed +
+@XmlElementRefs(\{ +
+@XmlElementRef(name="productName", type=JAXBElement.class), +
+@XmlElementRef(name="quantity", type=JAXBElement.class), +
+@XmlElementRef(name="name", type=JAXBElement.class)}) +
+List getContent()\{...} +
+}
+
+The following instance document
+
+<letterBody> +
+Dear Mr.<name>Robert Smith</name> +
+Your order of <quantity>1</quantity> <productName>Baby +
+Monitor</productName> shipped from our warehouse. .... +
+</letterBody>
+
+could be constructed using JAXB API.
+
+LetterBody lb =
+ObjectFactory.createLetterBody(null); +
+List gcl = lb.getContent(); +
+gcl.add("Dear Mr."); +
+gcl.add(ObjectFactory.createLetterBodyName("Robert Smith")); +
+gcl.add("Your order of "); +
+gcl.add(ObjectFactory.
+
+ createLetterBodyQuantity(new
+BigInteger("1"))); +
+gcl.add(ObjectFactory.createLetterBodyProductName("Baby Monitor")); +
+gcl.add("shipped from our warehouse");
+
+Note that if any element instance is placed
+into the general content list, _gcl_ , that is not an instance of
+_LetterBody.Name_ , _LetterBody.Quantity_ or _LetterBody.ProductName_ ,
+validation would detect the invalid content model. With the fail fast
+customization enabled, element instances of the wrong type are detected
+when being added to the general content list, _gcl_ .
+
+=== Bind wildcard schema component[[a1384]]
+
+A wildcard is mapped to a simple
+content-property with:
+
+* Content-property name set to the constant “
+_any_ ”. A binding schema customization could provide a more
+semantically meaningful content-property name.
+* Content-property base type set to
+_java.lang.Object_ by default.
+
+Wildcard content is represented as one of the
+following:
+
+. JAXB element +
+Either an instance of _javax.xml.bind.JAXBElement<T>_ or a JAXB class
+annotated with _@XmlRootElement. +
+_ Corresponds to a recognized global element tag name registered with
+the instance _javax.xml.bind.JAXBContext_ , meaning the schema(s)
+describing the element content is registered with the _JAXBContext_
+instance, see link:jaxb.html#a298[See JAXBContext] on how
+bindings are registered with a _JAXBContext_ instance.,
+. instance of _javax.xml.bind.JAXBElement. +
+_ Corresponds to an unknown element name but a recognized type
+definition specified by _@xsi:type_ on the element. JAXBElement
+_declaredType_ is set to _java.lang.Object_ since the unknown element
+declaration’s default type is _xs:anyType_ .
+. element node instance of a supported xml
+infoset API +
+Necessary to represent Xml data content that does not have a schema
+defined element or type definition. Such content is allowed by element
+_xs:any_ with attribute _@processContents=”lax”_ or _"skip"_ .
+. See content-property predicate for a
+wildcard.
+. If the _maxOccurs_ is greater than one, the
+content property is mapped to a collection property. The default
+collection property is a List property of base type java.lang.Object.
+. These is no default value.
+
+Since the schema does not contain any
+information about the element content of a wildcard content, even the
+content-property, by default, can not infer an XML element tag for
+wildcard element content.
+
+The schema-derived property getter method for
+representing wildcard content is annotated, either explicitly or by
+default mapping annotations, with the mapping annotation
+_@XmlAnyElement_ , specified in Section 8. The @XmlAnyElement annotation
+element values are derived in terms of the abstract model properties for
+wildcard summarized in link:jaxb.html#a5032[See Wildcard Schema
+Component] as follows:
+
+=== Annotate JAXB property with @XmlAnyElement element-value pairs
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlAnyElement element
+|@XmlAnyElement element value
+|lax |If wildcard
+schema component’s _\{process contents}_ is _lax_ or _strict_ , +
+set _@XmlAnyElement.lax()_ to _true_ . +
+ +
+else if _\{process contents}_ is _skip_ , set _@XmlAnyElement.lax()_ to
+_false_ .
+
+|value |
+_javax.xml.bind.annotation. +
+W3CDomHandler.class_
+|===
+
+=== [[a1402]]Bind a repeating occurrence model group
+
+A choice or sequence model group, containing
+more than one member, with a repeating occurrence, _maxOccurs_ attribute
+greater than one, is bound to a general content property in the
+following manner:
+
+* Content-property name is derived in
+following ways:
+* If a named model group definition is being
+referenced, the value of its \{name} property is mapped to a Java
+identifier for a method using the algorithm specified in
+link:jaxb.html#a4656[See The Name to Identifier Mapping
+Algorithm].
+* To derive a content property name for
+unnamed model group, see link:jaxb.html#a4780[See Deriving an
+identifier for a model group].
+* Content-property base type set to
+_java.lang.Object_ . A binding schema customization could provide a more
+specialized java class.
+* Content-property predicate validates the
+order between element instances in the list and whether the occurrence
+constraints for each element instance type is valid according to the
+schema.
+* Since the _maxOccurs_ is always greater
+than one, the content property is mapped to a collection property. The
+default collection property is a List property.
+* These is no default value.
+
+The schema-derived collection property is
+annotated as specified in link:jaxb.html#a1344[See General
+content property]“and link:jaxb.html#a1351[See Collection of
+Element types]“.
+
+=== Local structural Constraints
+
+The list content property’s value must
+satisfy the content specification of the model group. The ordering and
+element contents must satisfy the constraints specified by the model
+group.
+
+=== [[a1414]]Content Model Default Binding
+
+The following rules define _element_ binding
+style for a complex type definition’s content model.
+
+. If \{content type} is mixed, bind the
+entire content model to a general content property with the
+content-property name “ _content_ ”. See
+link:jaxb.html#a1369[See Bind mixed content]” for more details.
+. If (1) a particle has \{max occurs} >1 and
+(2) its \{term} is a model group and (3) all the particles in the model
+group have \{terms} that bind to different Java datatypes, bind to a
+collection of element types. See complete list of constraints required
+to perform this optimized binding in link:jaxb.html#a1351[See
+Collection of Element types]“.
+. If (1) a particle has \{max occurs} >1 and
+(2) its \{term} is a model group, then that particle and its descendants
+are mapped to one general content property that represents them. See
+link:jaxb.html#a1402[See Bind a repeating occurrence model
+group]” for details.
+. Process all the remaining particles (1)
+whose \{term} are wildcard particles and (2) that did not belong to a
+repeating occurrence model group bound in step. 2. If there is only one
+wildcard, bind it as specified in link:jaxb.html#a1384[See Bind
+wildcard schema component].” If there is more than one, then fallback to
+representing the entire content model as a single general content
+property. See link:jaxb.html#a1344[See General content
+property]).
+. Process all particles (1) whose \{term} are
+element declarations and (2) that do not belong to a repeating
+occurrence model group bound in step.2.
+
+First, we say a particle has a label L if it
+refers to an element declaration whose \{name} is L. Then, for all the
+possible pair of particles P and P’ in this set, if the following
+constraints are not met:
+
+. If P and P’ have the same label, then they
+must refer to the same element declaration.
+. If P and P’ refer to the same element
+reference, then its closest common ancestor particle may not have
+sequence as its \{term}.
+
+If either of the above constraints are
+violated, it is not possible to map each element declaration to a unique
+content property. Fallback to representing the entire content model as a
+single general content property.
+
+Otherwise, create a content property for each
+label L as follows:
+
+* The content property name is derived from
+label name L.
+* The base type will be the Java type to
+which the referenced element declaration maps.
+* The content property predicate reflects the
+occurrence constraint.
+* The content property collection type
+defaults to ‘ _list_ ’ if there exist a particle with label L that has
+\{maxOccurs} > 1.
+* For the default value, if all particles
+with label L has a \{term} with the same \{value constraint} default or
+fixed value, then this value. Otherwise none.
+
+Below is an example demonstrating of not
+meeting the uniqueness constraints of 5(a) and 5(b) specified above.
+
+ +
+<xs:sequence> +
+<xs:choice> +
+<xs:element ref="ns1:bar"/> (A) +
+<xs:element ref="ns2:bar"/> (B) +
+</xs:choice> +
+<xs:element ref="ns1:bar"/> (C) +
+</xs:sequence>
+
+The pair (A,B) violates the first clause
+because they both have the label “bar” but they refer to different
+element declarations. The pair (A,C) violates the second clause because
+their nearest common ancestor particle is the outermost _<sequence>_ .
+This model group fragment is bound to a general content property.
+
+=== Default binding of content model “derived by extension”
+
+If a content-property naming collision occurs
+between a content-property that exists in an base complex type
+definition and a content-property introduced by a “derive by extension”
+derived complex type definition, the content-properties from the
+colliding property on are represented by a general content property with
+the default property name _rest_ .
+
+=== Example: +
+derivation by extension content model with a content-property collision.
+
+Given XML Schema fragment:
+
+<xs:complexType name="Base"> +
+<xs:sequence> +
+<xs:element name="A" type="xs:int"/> +
+<xs:element name="B" type="xs:int"/> +
+</xs:sequence> +
+</xs:complexType> +
+ +
+<xs:complexType name="Derived"> +
+<xs:complexContent> +
+<xs:extension base="Base"> +
+<xs:sequence> +
+<xs:element name="A" type="xs:int"/> +
+</xs:sequence> +
+</xs:extension>
+
+ </xs:complexContent> +
+</xs:complexType>
+
+Default binding derived Java code:
+
+public class Base \{ +
+int getA()\{...} void setA(int)\{...} +
+int getB()\{...} void setB(int)\{...} +
+} +
+ +
+public class Derived extends Base \{ +
+/** +
+* Instances of Derived.A must be placed in this general +
+* content propert that represents the rest of the content +
+* model. link:#a5375[24] */ +
+List getRest()\{...} +
+} +
+class ObjectFactory \{ +
+// element instance factories only +
+JAXBElement<Integer> createDerivedA(Integer value)\{...} +
+}
+
+=== [[a1442]]Bind single occurrence choice group to a choice content property
+
+Setting the _choiceContentProperty_ attribute
+of _<jaxb:globalBindings>_ as specified in
+link:jaxb.html#a1582[See Usage] enables this customized binding
+option.
+
+A non-repeating choice model group is bound
+to a simple property. The simple choice content property is derived from
+a choice model group as follows:
+
+* The choice content property name is either
+the referenced model group definition _\{name}_ or obtained using the
+algorithm specified in link:jaxb.html#a4780[See Deriving an
+identifier for a model group].
+* The choice content property _base type_ is
+the first common supertype of all items within the choice model group,
+with _java.lang.Object_ always being a common root for all Java
+objects.link:#a5376[25]
+* The predicate
+* The collection type defaults to List if one
+or more items in the choice model group bind to List.
+* No default value.
+
+A choice property consists of the following
+methods:
+
+* The _getChoiceID_ method returns the set
+value. If the property has no set value then the value _null_ is
+returned. Note that a set value of a primitive Java type is returned as
+an instance of the corresponding Java wrapper class.
+* The _setChoiceID_ method has a single
+parameter that is the type of the choice content property _base type_ .
+
+The _globalBindings_ and property
+customization attribute, _choiceContentProperty,_ enables this
+customized binding _._ The customization is specified in
+link:jaxb.html#a1580[See <globalBindings> Declaration].”
+
+=== Example:
+
+XML Schema representation of a choice model
+group.
+
+<xs:choice> +
+<xs:element name="foo" type="xs:int"/> +
+<xs:element name="bar" type="xs:string"/> +
+</xs:choice>
+
+Derived choice content property method
+signatures:
+
+ void setFooOrBar(Object)\{...} +
+Object getFooOrBar()\{...}
+
+=== [[a1459]]Modifying Schema-Derived Code
+
+There exist a number of use cases on why a
+developer would find it beneficial to modify schema-derived classes.
+Here are some of those use cases.
+
+* Add functionality to schema-derived
+classes. +
+Since schema-derived classes are derived from a data description
+language, the derived classes only represent data and have no
+object-level functionality.
+* Add polymorphic methods to Java class
+hierarchy generated from XML Schema type definition derivation
+hierarchy.
+* Initialize a JAXB property or field
+representing an XML element with a default value. Regretfully, XML
+Schema element defaulting is insufficient to accomplish this. Note that
+XML Schema attribute defaulting is sufficient and does not require this
+approach.
+
+The JAXB 2.0 schema-derived class was
+designed to be easily understandable and modifiable by a developer. For
+many development environments, it is not sufficient to only run the
+schema compiler once due to modification of the schema-derived classes.
+Since schemas evolve over time, it is desirable to have the ability to
+regenerate schema-derived classes from an updated schema while
+preserving modification made by a developer. Given the complexities of
+supporting this capability, a JAXB implementation is not required to
+support regeneration from a schema into previously modified
+schema-derived classes. External tools, such as an IDE, could assist in
+supporting the sophisticated task of regeneration of a modified
+schema-derived class in the future. To enable tools to support
+regeneration, a JAXB implementation is required to have an option for
+generating an annotation that enables a portable means for
+distinguishing between developer code and generated code in a
+schema-derived class.The next section describes the portable format for
+distinguishing between generated and developer added/modified methods
+and /or fields in a schema-derived class.
+
+=== Distinguish between generated and user added code
+
+A schema compiler must have an option to
+generate the Common Annotation, _@javax.annotation.Generated_
+annotation, specified in [CA], on every generated class, method and
+field. If a developer does modify an _@Generated_ annotated method or
+field, they must denote this modification by deleting the _@Generated_
+annotation. If a developer adds a new method or field, it will not have
+an _@Generated_ annotation on it. Based on these conventions, a JAXB
+implementation in conjunction with an IDE or other external tool, would
+be able to support regeneration of schema-derived code while preserving
+developer additions/modifications to methods and fields in a
+schema-derived class.
+
+When schema compiler option to generate
+_@Generated_ annotation is selected, the table describes the annotation
+to be generated.
+
+=== Annotate generated class, field and property with @Generated element-value pairs
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@Generated element
+|@Generated element value
+|value |fully
+qualified class name of schema compiler
+
+|date |date of
+generation of schema-derived class. Value must follow the ISO 8601
+standard.
+
+|comment
+|optional. Is implementation specific.
+|===
+
+=== Default Binding Rule Summary
+
+Note that this summary is non-normative and
+all default binding rules specified previously in the chapter take
+precedence over this summary.
+
+* Bind the following to Java package:
+*  XML Namespace URI
+* Bind the following XML Schema components to
+Java value class:
+* Named complex type
+* Bind to typesafe enum class:
+* A named simple type definition with a
+basetype that derives from “ _xs:NCName_ ” and has enumeration facets.
+* Bind the following XML Schema components to
+an element instance factory that returns _javax.xml.bind.JAXBElement<T>_
+* A global element declaration with a named
+type definition.
+* Local element declaration with a named type
+definition that can be inserted into a general content list.
+* Bind the following XML Schema components to
+a Java Element class
+* A global element declaration with anonymous
+type definition to a Java value class.
+* Local element declaration with anonymous
+type definition that can be inserted into a general content list.
+* Bind to Java property
+* Attribute use
+* Particle with a term that is an element
+reference or local element declaration.
+
+Additionally, generate an element property
+for an element reference to the head element of a substitution group.
+
+* Bind to JAXB property: +
+_getOtherAttributes(): java.util.Map<QName, String>_
+* Attribute Wildcard occurring directly or
+indirectly via an attribute group reference in a complex type
+definition.
+* Bind model group and wildcard content with
+a repeating occurrence and complex type definitions with _mixed_
+\{content type} to:
+* A general content property - a List
+content-property that holds Java instances representing element
+information items and character data items. To support dynamic Xml
+content that validates against xs:any processContents=”lax” or “skip”,
+allow instances of org.w3c.dom.Node into the list.
+
+== CHAPTER 7 - 
+
+[[a1498]]Customizing XML Schema to
+Java Representation Binding
+
+The default binding of source schema
+components to derived Java representation by a binding compiler
+sometimes may not meet the requirements of a JAXB application. In such
+cases, the default binding can be customized using a binding
+declaration. Binding declarations are specified by a _binding language_
+, the syntax and semantics of which are defined in this chapter.
+
+All JAXB implementations are required to
+provide customization support specified here unless explicitly stated as
+optional.
+
+=== Binding Language
+
+The binding language is an XML based language
+which defines constructs referred to as binding declarations. A binding
+declaration can be used to customize the default binding between an XML
+schema component and its Java representation.
+
+http://java.sun.com./xml/ns/jaxb[The schema
+for binding declarations is defined in the namespace]
+_http://java.sun.com/xml/ns/jaxb_ . This specification uses the
+namespace prefix “ _jaxb_ ” to refer to the namespace of binding
+declarations. For example,
+
+<jaxb: binding declaration>
+
+A binding compiler interprets the binding
+declaration relative to the source schema and a set of default bindings
+for that schema. Therefore a source schema need not contain a binding
+declarations for every schema component. This makes the job of a JAXB
+application developer easier.
+
+There are two ways to associate a binding
+declaration with a schema element:
+
+* as part of the source schema (inline
+annotated schema)
+* external to the source schema in an
+external binding declaration.
+
+The syntax and semantics of the binding
+declaration is the same regardless of which of the above two methods is
+used for customization.
+
+A binding declaration itself does not
+identify the schema component to which it applies. A schema component
+can be identified in several ways:
+
+* explicitly - e.g. QName, XPath expressions
+etc.
+* implicitly - based on the context in which
+the declaration occurs.
+
+It is this separation which allows the
+binding declaration syntax to be shared between inline annotated schema
+and the external binding.
+
+=== Extending the Binding Language
+
+In recognition that there will exist a need
+for additional binding declarations than those currently specified in
+this specification, a formal mechanism is introduced so all JAXB
+processors are able to identify _extension binding declarations_ . An
+extension binding declaration is not specified in the _jaxb:_ namespace,
+is implementation specific and its use will impact portability.
+Therefore, binding customization that must be portable between JAXB
+implementations should not rely on particular customization extensions
+being available.
+
+The namespaces containing extension binding
+declarations are specified to a JAXB processor by the occurrence of the
+global attribute _<jaxb:extensionBindingPrefixes>_ within an instance of
+_<xs:schema>_ element. The value of this attribute is a
+whitespace-separated list of namespace prefixes. The namespace bound to
+each of the prefixes is designated as a customization declaration
+namespace. Prefixes are resolved on the _<xs:schema>_ element that
+carries this attribute. It is an error if the prefix fails to resolve.
+This feature is quite similar to the extension-element-prefixes
+attribute in [XSLT 1.0] _http://www.w3.org/TR/xslt10/#extension_ ,
+introduces extension namespaces for extension instructions and functions
+for XSLT 1.0.
+
+This specification does not define any
+mechanism for creating or processing extension binding declarations and
+does not require that implementations support any such mechanism. Such
+mechanisms, if they exist, are implementation-defined.
+
+=== Inline Annotated Schema
+
+This method of customization utilizes on the
+_<appinfo>_ element specified by the XML Schema [XSD PART 1]. A binding
+declaration is embedded within the _<appinfo>_ element as illustrated
+below.
+
+<xs:annotation> +
+<xs:appinfo> +
+_<binding declaration> +
+_ </xs:appinfo> +
+</xs:annotation>
+
+The inline annotation where the binding
+declaration is used identifies the schema component.
+
+=== External Binding Declaration
+
+The external binding declaration format
+enables customized binding without requiring modification of the source
+schema. Unlike inline annotation, the remote schema component to which
+the binding declaration applies must be identified explicitly. The
+_<jaxb:bindings>_ element enables the specification of a remote schema
+context to associate its binding declaration(s) with. Minimally, an
+external binding declaration follows the following format.
+
+<jaxb:bindings [schemaLocation =
+"xs:anyURI"]> +
+<jaxb:bindings [node = "xs:string"]>* +
+<binding declaration> +
+<jaxb:bindings> +
+</jaxb:bindings>
+
+The schemaLocation attribute is optional for
+specifying _<jaxb:globalBindings>_ , and The node attribute is optional
+for specifying _<jaxb:schemaBindings>_ . The attributes _schemaLocation_
+and _node_ are used to construct a reference to a node in a remote
+schema. The binding declaration is applied to this node by the binding
+compiler as if the binding declaration was embedded in the node’s
+_<xs:appinfo>_ element. The attribute values are interpreted as follows:
+
+*  _schemaLocation -_ It is a URI reference
+to a remote schema.
+*  _node_ - It is an XPath 1.0 expression
+that identifies the schema node within schemaLocation to associate
+binding declarations with.
+
+An example external binding declaration can
+be found in link:jaxb.html#a4821[See Example].”
+
+=== Restrictions
+
+* The external binding element
+_<jaxb:bindings>_ is only recognized for processing by a JAXB processor
+when its parent is an _<xs:appinfo>_ element, it is an ancestor of
+another _<jaxb:bindings>_ element, or when it is root element of a
+document. An XML document that has a _<jaxb:bindings>_ element as its
+root is referred to as an external binding declaration file.
+* The top-most _<jaxb:binding>_ element
+within an _<xs:appinfo>_ element or the root element of an external
+binding file must have its _schemaLocation_ attribute set.
+
+=== Version Attribute
+
+The normative binding schema specifies a
+global _version_ attribute. It is used to identify the version of the
+binding declarations. For example, a future version of this
+specification may use the version attribute to specify backward
+compatibility. To indicate this version of the specification, the
+_version should_ be _"2.0"._ It is also valid for @version to be “1.0”.
+If any other version is specified, it must result in an invalid
+customization as specified in link:jaxb.html#a1544[See Invalid
+Customizations].”
+
+The _version_ attribute must be specified in
+one of the following ways:
+
+* If customizations are specified in inline
+annotations, the _version_ attribute must be specified in _<xs:schema>_
+element of the source schema. For example,
+
+
+
+ <xs:schema jaxb:version="2.0">
+
+* If customizations are specified in an
+external binding file, then the _jaxb:version_ attribute must be
+specified in the root element _<jaxb:bindings>_ in the external binding
+file. Alternately, a local _version_ attribute may be used. Thus the
+version can be specified either as
+
+
+
+ <jaxb:bindings version="2.0" ... />
+
+or
+
+ <jaxb:bindings jaxb:version="2.0" ... />
+
+Specification of both _version_ and
+_<jaxb:version>_ must result in an invalid customization as specified in
+link:jaxb.html#a1544[See Invalid Customizations].”
+
+=== [[a1544]]Invalid Customizations
+
+A non conforming binding declaration is a
+binding declaration in the _jaxb_ namespace but does not conform to this
+specification. A non conforming binding declaration results in a
+customization error. The binding compiler must report the customization
+error. The exact error is not specified here. For additional
+requirements see link:jaxb.html#a3815[See Compatibility].”
+
+The rest of this chapter assumes that non
+conforming binding declarations are processed as indicated above and
+their semantics are not explicitly specified in the descriptions of
+individual binding declarations.
+
+=== Notation
+
+The source and binding-schema fragments shown
+in this chapter are meant to be illustrative rather than normative. The
+normative syntax for the binding language is specified in
+link:jaxb.html#a4270[See Normative Binding Schema Syntax].” in
+addition to the other normative text within this chapter. All examples
+are non-normative.
+
+* Metavariables are in italics.
+* Optional attributes are enclosed in _[
+square="bracket" ]_ .
+* Optional elements are enclosed in _[
+<elementA> ... </elementA> ]_ .
+* Other symbols: ‘ _,_ ” denotes a sequence,
+‘ _|_ ’ denotes a choice, ‘ _+_ ’ denotes one or more, ‘ _*_ ’ denotes
+zero or more.
+* The prefix _xs:_ is used to refer to schema
+components in W3C XML Schema namespace.
+* In examples, the binding declarations as
+well as the customized code are shown in bold like this: <appinfo>
+<annotation> or getAddress().
+
+=== Naming Conventions
+
+The naming convention for XML names in the
+binding language schema are:
+
+* The first letter of the first word in a
+multi word name is in lower case.
+* The first letter of every word except the
+first one is in upper case.
+
+For example, the XML name for the Java
+property basetype is baseType.
+
+=== Customization Overview
+
+A binding declaration customizes the default
+binding of a schema element to a Java representation. The binding
+declaration defines one or more customization values each of which
+customizes a part of Java representation.
+
+=== Scope
+
+When a customization value is defined in a
+binding declaration, it is associated with a scope. A scope of a
+customization value is the set of schema elements to which it applies.
+If a customization value applies to a schema element, then the schema
+element is said to be covered by the scope of the customization value.
+The scopes are:
+
+* global scope: A customization value defined
+in _<globalBindings>_ has global scope. A global scope covers all the
+schema elements in the source schema and (recursively) any schemas that
+are included or imported by the source schema.
+* schema scope: A customization value defined
+in <schemaBindings> has schema scope. A schema scope covers all the
+schema elements in the target namespace of a schema.
+* definition scope: A customization value in
+binding declarations of a type definition or global declaration has
+definition scope. A definition scope covers all schema elements that
+reference the type definition or the global declaration. This is more
+precisely specified in the context of binding declarations later on in
+this chapter.
+* component scope: A customization value in a
+binding declaration has component scope if the customization value
+applies only to the schema element that was annotated with the binding
+declaration.
+
+image:xmlb-18.png[image]
+
+=== Scoping Inheritance and Overriding For Binding Declarations
+
+The different scopes form a taxonomy. The
+taxonomy defines both the inheritance and overriding semantics of
+customization values. A customization value defined in one scope is
+inherited for use in a binding declaration covered by another scope as
+shown by the following inheritance hierarchy:
+
+* a schema element in schema scope inherits a
+customization value defined in global scope.
+* a schema element in definition scope
+inherits a customization value defined in schema or global scope.
+* a schema element in component scope
+inherits a customization value defined in definition, schema or global
+scope.
+
+Likewise, a customization value defined in
+one scope can override a customization value inherited from another
+scope as shown below:
+
+* value in schema scope overrides a value
+inherited from global scope.
+* value in definition scope overrides a value
+inherited from schema scope or global scope.
+* value in component scope overrides a value
+inherited from definition, schema or global scope.
+
+=== XML Schema Parsing
+
+Chapter 5 specified the bindings using the
+abstract schema model. Customization, on the other hand, is specified in
+terms of XML syntax not abstract schema model. The XML Schema
+specification [XSD PART 1] specifies the parsing of schema elements into
+abstract schema components. This parsing is assumed for parsing of
+annotation elements specified here. In some cases, [XSD PART 1] is
+ambiguous with respect to the specification of annotation elements.
+link:jaxb.html#a2217[See Annotation Restrictions]” outlines how
+these are addressed.
+
+* 
+
+=== [[a1580]] _<globalBindings>_ Declaration
+
+The customization values in “<
+_globalBindings>_ ” binding declaration have global scope. This binding
+declaration is therefore useful for customizing at a global level.
+
+=== [[a1582]]Usage
+
+<globalBindings +
+[ collectionType = "collectionType" ] +
+[ fixedAttributeAsConstantProperty = "true" | "false" | "1" | "0" ] +
+[ generateIsSetMethod = "true" | "false" | "1" | "0" ] +
+[ enableFailFastCheck = "true" | "false" | "1" | "0" ] +
+[ choiceContentProperty = "true" | "false" | "1" | "0" ] +
+[ underscoreBinding = "asWordSeparator" | "asCharInWord" ] +
+[ typesafeEnumBase = "typesafeEnumBase" ] +
+[ typesafeEnumMemberName = "skipGeneration" | +
+"generateName" | "generateError" ] +
+[ typesafeEnumMaxMembers = “xxxx”] +
+[ enableJavaNamingConventions = "true" | "false" | "1" | "0" ] +
+[ generateElementClass = "false" | "true" | "0" | "1" ] +
+[ generateElementProperty = "false" | "true" | "0" | "1" ] +
+[ generateValueClass = "true" | "true" | "0" | "1" ] +
+[ optionalProperty = "wrapper" | "primitive" | "isSet" ] +
+[ mapSimpleTypeDef = "true" | "false" | "1" | "0" ] +
+[ localScoping = "nested" | "toplevel" ] > +
+[ <javaType> ... </javaType> ]* +
+[ <serializable uid=”xxxx”/> ]* +
+</globalBindings>
+
+The following customization values are
+defined in global scope:
+
+*  _collectionType_ if specified, must be
+either “ _indexed"_ or any fully qualified class name that implements
+_java.util.List._ The default value is to any fully qualified class name
+that implements _java.util.List_ .
+*  _fixedAttributeAsConstantProperty_ if
+specified , defines the customization value
+_fixedAttributeAsConstantProperty_ . The value must be one of _"true",
+false", "1" or"0"._ The default value is _"false"_ .
+*  _generateIsSetMethod_ if specified,
+defines the customization value of _generateIsSetMethod._ The value must
+be one of _"true", false", "1" or"0"._ The default value is _"false"_ .
+Consider customizing using the newly introduced _optionalProperty_
+before using this JAXB 1.0 customization.
+*  _enableFailFastCheck_ if specified,
+defines the customization value _enableFailFastCheck._ The value must be
+one of _"true", "false", "1" or"0"._ If enableFailFastCheck is "true" or
+"1" and the JAXB implementation supports this optional checking, type
+constraint checking when setting a property is performed as described in
+link:jaxb.html#a541[See Properties]". The default value is
+_"false"_ .
+*  _choiceContentProperty_ if
+specified,defines the customization value _choiceContentProperty_ . The
+value must be one of _"true", false", "1" or"0"._ The default value is
+_"false"_ .
+*  _underscoreBinding_ if specified, defines
+the customization value _underscoreBinding_ . The value must be one of
+_"asWordSeparator" or "asCharInWord"._ The default value is
+_"asWordSeparator"_ .
+*  _enableJavaNamingConventions_ if
+specified, defines the customization value _enableJavaNamingConventions_
+. The value must be one of _"true", false", "1" or"0"._ The default
+value is _"true"_ .
+*  _typesafeEnumBase_ if specified, defines
+the customization value _typesafeEnumBase._ The value must be a list of
+QNames, each of which must resolve to a simple type definition. Only
+simple type definitions with an enumeration facet and a restriction base
+type listed in _typesafeEnumBase_ or derived from a type listed in
+_typesafeEnumBase_ is bound to a _typesafeEnumClass_ by default as
+specified in link:jaxb.html#a829[See Enum Type]". The default
+value of _typesafeEnumBase_ is _“xs:string”._
+
+The _typesafeEnumBase_ cannot contain the
+following simple types and therefore a JAXB implementation is not
+required to support the binding of the these types to typesafe
+enumeration class: _"xs:QName", "xs:NOTATIION”, xs:base64Binary",
+"xs:hexBinary", "xs:date", "xs:time", "xs:dateTime", "xs:duration",
+"xs:gDay", "xs:gMonth", "xs:gYear", "xs:gMonthDay", "xs:gYearMonth",
+“xs:IDREF”, “xs:ID”._ If any of them are specified, it must result in an
+invalid customization as specified in link:jaxb.html#a1544[See
+Invalid Customizations].” JAXB implementation must be capable of binding
+any other simple type listed in _typesafeEnumBase_ to a typesafe
+enumeration class.
+
+*  _typesafeEnumMemberName_ if specified,
+defines the customization value _typesafeEnumMemberName._ The value must
+be one of _skipGeneration_ , _generateError_ or _generateName._ The
+default value is _skipGeneration_ . See link:jaxb.html#a1633[See
+@typesafeEnumMemberName]” for details.
+*  _typesafeEnumMaxMembers_ if specified,
+defines the maximum number of enum facets that a simple type definition
+can have and be consider to binding to an enum type by default. The
+attributes type is _xs:int_ and its default value is _256_ .
+*  _generateElementClass_ if specified as
+true, a schema-derived Element class, as specified in
+link:jaxb.html#a657[See Java Element Class]”, is generated for
+each element declaration that has an element factory method generated
+for it. Its default value is false.
+*  _generateElementProperty_ if specified as
+true, controls the generation of JAXBElement property. The value must be
+one of "true", "false", "1", or "0". The default is absence of the
+value.
+*  _generateValueClass_
+ if specified as true, a
+schema-derived Java value class is generated for each complex type
+definiton.Value class is specified in link:jaxb.html#a521[See
+Value Class]. If generateValueClass is specified as false, a
+schema-derived interface and implementation class is generated for each
+complex type definition as specified in link:jaxb.html#a536[See
+Java Content Interface]”. The attribute’s default value is true. See
+examples of this binding in link:jaxb.html#a1617[See
+generateElementClass and generateValueClass]”.
+* zero or more _javaType_ binding
+declarations. Each binding declaration must be specified as described in
+link:jaxb.html#a1981[See <javaType> Declaration].”
+* zero or one serializable binding
+declaration.
+*  _optionalProperty_
+ controls how a JAXB property with a
+primitive base type that represents an optional non-nillable
+element/attribute is bound. If the attribute has the value "wrapper",
+then the base type of the JAXB property is the wrapper class for the
+primitive type. A user can indicate that this optional property is not
+set by calling the setter with “null” value. If the attribute’s value is
+"primitive", it binds as it did in JAXB 1.0. If the attribute’s value is
+“isSet”, it binds the optional property using the primitive base type
+and also the isSet/unset methods are generated for the optional
+property. The attribute’s default value is “wrapper”.
+*  _mapSimpleTypeDef_ controls whether a JAXB
+mapped class should be generated for each simple type definition as
+specified in link:jaxb.html#a803[See Bind to a JAXB mapped
+class]”. This attribute’s default value is _false_ . This customization
+eases preserving simple type substituting precisely as described in
+link:jaxb.html#a1158[See Type Substitution of a Simple Type
+Definition]”.
+*  _localScoping_ attribute can have the
+value of either _nested_ or _toplevel_ . This attribute describes the
+JAXB binding of nested XML schema component to either a _nested_
+schema-derived JAXB class or a _toplevel_ schema-derived JAXB class. To
+avoid naming collisions between nested components, the default value for
+this attribute is _nested_ . A developer can customize _localScoping_ to
+_toplevel_ w hen schema components nest too deeply or an application
+would prefer to not work with nested classes.
+
+The semantics of the above customization
+values, if not specified above, are specified when they are actually
+used in the binding declarations.
+
+For inline annotation, a _<globalBindings>_
+is valid only in the annotation element of the _<schema>_ element. There
+must only be a single instance of a _<globalBindings>_ declaration in
+the annotation element of the _<schema>_ element.
+
+=== [[a1608]]Customized Name Mapping
+
+A customization value can be used to specify
+a name for a Java object (e.g. class name, package name etc.). In this
+case, a customization value is referred to as a customization name.
+
+A customization name is always a legal Java
+identifier (this is formally specified in each binding declaration where
+the name is specified). Since customization deals with customization of
+a Java representation to which an XML schema element is bound, requiring
+a customization name to be a legal Java identifier rather than an XML
+name is considered more meaningful.
+
+A customization name may or may not conform
+to the recommended Java language naming conventions. [JLS - Java
+Language Specification, Second Edition, Section 6.8, “Naming
+Conventions”]. The customization value enableJavaNamingConventions
+determines if a customization name is mapped to a Java identifier that
+follows Java language naming conventions or not.
+
+If enableJavaNamingConventions is defined and
+the value is _"true"_ or _"1",_ then the customization name (except for
+constant name) specified in the section from where this section is
+referenced must be mapped to Java identifier which follows the Java
+language naming conventions as specified in
+link:jaxb.html#a4816[See Conforming Java Identifier Algorithm]”;
+otherwise the customized name must be used as is.
+
+=== [[a1613]]Underscore Handling
+
+The _[jaxb:globalBindings]_ attribute
+customization _underscoreBinding_ allows for the preservation of
+underscore(s) occurring in an XML name when deriving a a Java identifier
+from it.
+
+The default value for _@underscoreBinding_ is
+_"asWordSeparator"_ and categorizes underscore, ‘_’, as a punctuation
+mark in the XML name to Java identifier algorithm specified in Appendix
+link:jaxb.html#a4656[See The Name to Identifier Mapping
+Algorithm]. The resulting algorithm transforms one or more consecutive
+underscores in an XML name to camel case separated words in the derived
+Java class and method names. Examples of this mapping are in
+link:jaxb.html#a4734[See XML Names and derived Java Class,
+Method, and Constant Names].
+
+When @ _underscoreBinding_ is
+_"asCharInWord",_ underscore (‘_’) is considered a special letter within
+a word. The result is that all underscore characters from the original
+XML name are preserved in the derived Java identifier. Example of this
+mapping are in link:jaxb.html#a4755[See XML Names and derived
+Java Class, Method, and Constant Names when <jaxb:globalBindings
+underscoreHandling=”asCharInWord”>].
+
+=== [[a1617]]generateElementClass and generateValueClass
+
+The following code examples illustrate
+default binding to value class and customization to bind to
+interface/implementation classes.
+
+=== Default Binding to a value class.
+
+Schema fragment:
+
+<xs:complexType name=”USAddress”> +
+<xs:attribute name=”City” type=”xs:string”/>
+
+</xs:complexType>
+
+ Default Value Class:
+
+public class USAddress \{ +
+public USAddress() \{... } +
+public String getCity() \{....} +
+public void setCity(String value) \{...} +
+... +
+}
+
+Customization _<jaxb:globalBinding
+generateValueClass=”false”>_ generates following interface instead of
+default value class:
+
+=== Customized binding to an interface.
+
+public interface USAddress \{ +
+String getCity(); +
+void setCity(String value); +
+}
+
+=== Generation of an Element Class
+
+Schema fragment:
+
+<xs:element name=”Address”
+type=”USAddress”/> +
+ +
+// Default Java binding of global element to element instance factory +
+public ObjectFactory \{ +
+JAXBElement<USAddress> createAddress(USAddress value); +
+}
+
+ _<jaxb:globalBinding
+generateElementClass=”true”/>_ results in generation of following
+Element class:
+
+ +
+public class Address extends JAXBElement<USAddress> \{ +
+}
+
+=== [[a1633]]@typesafeEnumMemberName
+
+.If there is a collision among the generated
+constant fields _name_ or if it is not possible to generate a legal Java
+identifier for one or more of the generated constant field names, then
+the binding is determined based on the value of @
+_typesafeEnumMemberName_ of element _[jaxb:globalBindings]_ .
+
+*  _skipGeneration +
+_ An enum type is not generated. This is the default behavior if
+_typesafeEnumMemberName_ has not been specified. A binding compiler may
+report a warning on why the simple type definition was not bound to an
+enum type.
+*  _generateName +
+_ The constant fields _name_ is “ _VALUE__ _<N>_ _"_ where _<N>_ is 1
+for the first enumeration value and increments by 1 to represent each
+value within the XML enumeration.
+*  _generateError +
+_ An error must be reported.
+
+=== <serializable> Declaration
+
+When the serializable customization is
+specified, all schema-derived classes implement _java.io.Serializable_ .
+Each class is generated with a _serialVersionUID_ field set to the value
+specified by _@uid_ .
+
+private static final long serialVersionUID =
+_<value of @uid>_ ;
+
+The JAXB user is required to identify when
+schema-derived classes do not follow
+_http://java.sun.com/j2se/1.4.2/docs/guide/serialization/spec/version.html#wp4602[Java
+serialization class evolution rules]_ and change the generated
+_serialVersionUID_ field by changing the [serializable] element’s
+attribute _@uid_ value.
+
+=== @generateElementProperty
+
+Some schemas use both minOccurs="0" on
+element as well as nillable="true", causing the generation of
+JAXBElement. This customization lets you control this behavior. This
+attribute may take two values:
+
+*  _true: +
+_ Always generate properties to use JAXBElement, unless overriden by
+_<jaxb:property generateElementProperty=”false”/>_ on individual
+property.
+*  _false: +
+_ When generating properties from _<element nillable=”true”
+minOccurs=”0”/>_ , generate a property not to use JAXBElement, as if the
+element declaration were just _<element nillable=”true” />_ , unless
+overriden by _<jaxb:property generateElementProperty=”true”/>_ on
+individual property. It is an error to specify this customization, when
+the property is required to be JAXBElement (such as when a property
+contains multiple elements with different names but of the same type.)
+
+===  _<schemaBindings>_ Declaration
+
+The customization values in
+_<schemaBindings>_ binding declaration have schema scope. This binding
+declaration is therefore useful for customizing at a schema level.
+
+=== Usage
+
+<schemaBindings [ map="boolean" ] >
+
+{empty} [ <package> package </package> ]
+
+ [ <nameXmlTransform> ... </nameXmlTransform>
+]*
+
+</schemaBindings>
+
+
+
+{empty}<package [ name = "packageName" ]
+
+{empty} [ <javadoc> ... </javadoc> ]
+
+</package>
+
+
+
+<nameXmlTransform>
+
+{empty} [ <typeName [ suffix="suffix" ]
+
+{empty} [ prefix="prefix" ] /> ]
+
+{empty} [ <elementName [ suffix="suffix" ]
+
+{empty} [ prefix="prefix" ] /> ]
+
+{empty} [ <modelGroupName [ suffix="suffix" ]
+
+{empty} [ prefix="prefix" ] /> ]
+
+{empty} [ <anonymousTypeName [
+suffix="suffix" ]
+
+{empty} [ prefix="prefix" ] /> ]
+
+</nameXmlTransform>
+
+For readability, the _<nameXmlTransform>_ and
+_<package>_ elements are shown separately. However, they are local
+elements within the _<schemaBindings>_ element.
+
+The following customizations are defined in
+the schema scope:
+
+*  _map_ if specified, prevents the classes
+from being generated from this schema. When the value is “0” or “false”,
+then no class/interface/enum will be generated from this package. map
+defaults to true.
+
+The semantics of the customization value, if
+not specified above, are specified when they are actually used in the
+binding declarations.
+
+For inline annotation, a _<schemaBindings>_
+is valid only in the annotation element of the _<schema>_ element. There
+must only be a single instance of a _<schemaBindings>_ declaration in
+the annotation element of the _<schema>_ element.
+
+If one source schema includes (via the
+include mechanism specified by XSD PART 1) a second source schema, then
+the _<schemaBindings>_ declaration must be declared in the first
+including source schema. It should be noted that there is no such
+restriction on _<schemaBindings>_ declarations when one source schema
+imports another schema since the scope of _<schemaBindings>_ binding
+declaration is schema scope.
+
+=== package __ [[a1674]]
+
+Usage
+
+*  _name_ if specified, defines the
+customization value _packageName_ . _packageName_ must be a valid Java
+package name.
+* < _javadoc>_ if specified, customizes the
+package level Javadoc. < _javadoc>_ must be specified as described in
+link:jaxb.html#a2142[See <javadoc> Declaration].” The Javadoc
+must be generated as specified in link:jaxb.html#a2163[See
+Javadoc Customization].” The Javadoc section customized is the _package
+section._
+* 
+
+The semantics of the _packageName_ is
+specified in the context where it is used. If neither _packageName_ nor
+the < _javadoc>_ element is specified, then the binding declaration has
+no effect.
+
+=== Example: Customizing Package Name
+
+<jaxb:schemaBindings>
+
+ <jaxb:package name = "org.example.po" />
+
+</jaxb:schemaBindings>
+
+specifies “ _org.example.po_ ” as the package
+to be associated with the schema.
+
+===  _nameXmlTransform_
+
+The use case for this declaration is the UDDI
+Version 2.0 schema. The UDDI Version 2.0 schema contains many
+declarations of the following nature:
+
+<xs:element name="bindingTemplate"
+type="uddi:bindingTemplate"/>
+
+The above declaration results in a name
+collision since both the element and type names are the same - although
+in different XML Schema symbol spaces. Normally, collisions are supposed
+to be resolved using customization. However, since there are many
+collisions for the UDDI V2.0 schema, this is not a convenient solution.
+Hence the binding declaration _nameXmlTransform_ is being provided to
+automate name collision resolution.
+
+The _nameXmlTransform_ allows a _suffix_ and
+a _prefix_ to be specified on a per symbol space basis. The following
+symbol spaces are supported:
+
+*  _<typeName>_ for the symbol space “type
+definitions”
+*  _<elementName>_ for the symbol space
+“element definitions”
+*  _<modelGroupName>_ for the symbol space
+“model group definitions.”
+*  _<anonymousTypeName>_ for customizing Java
+value class to which an anonymous type is bound.link:#a5377[26]
+
+If _suffix_ is specified, it must be appended
+to all the default XML names in the symbol space. The _prefix_ if
+specified, must be prepended to the default XML name. Furthermore, this
+XML name transformation must be done after the XML name to Java
+Identifier algorithm is applied to map the XML name to a Java
+identifier. The XML name transformation must not be performed on
+customization names.
+
+By using a different _prefix_ and/or _suffix_
+for each symbol space, identical names in different symbol spaces can be
+transformed into non-colliding XML names.
+
+ _anonymousTypeName_
+
+The _<anonymousTypeName>_ declaration can be
+used to customize the suffix and prefix for the Java value class. If
+_prefix_ is specified, then it must be prepended to the Java value class
+name for the anonymous type. If suffix is specified, it must be
+appended.
+
+===  _<class>_ [[a1698]] Declaration
+
+This binding declaration can be used to
+customize the binding of a schema component to an element class, value
+class or interface/implementation class. The customizations can be used
+to specify:
+
+* a name for the derived Java class.
+* an alternative implementation of
+interface/implementation binding.
+
+Specification of an alternate implementation
+for an interface allows implementations generated by a tool (e.g. based
+on UML) to be used in place of the default implementation generated by a
+JAXB provider.
+
+The implementation class may have a
+dependency upon the runtime of the binding framework. Since a runtime
+was not specified for JAXB 1.0 interface/implementation binding, the
+implementation class may not be portable across JAXB provider
+implementations. Hence one JAXB provider implementation is not required
+to support the implementation class from another JAXB provider.
+
+=== Usage
+
+{empty}<class [ name = " _className_ " ]
+
+{empty} [ implClass = " _implClass_ " ]> +
+[ ref = " _className_ " ]
+
+{empty} [ <javadoc> _..._ </javadoc> ]
+
+</class>
+
+*  _className_ is the name of the derived
+value class, if specified. It must be a legal Java class name and must
+not contain a package prefix. The package prefix is inherited from the
+current value of package _._
+*  _implClass_ if specified, is the name of
+the implementation class for _className_ and must include the complete
+package name. Note that this customization only impacts the return value
+for _className_ ’s factory method. This customization is ignored when
+_new_ is used to create instances of a schema-derived Value class.
+*  _ref_ if specified, is the name of the
+value class that is provided outside the schema compiler. This
+customization causes a schema compiler to refer to this external class,
+as opposed to generate a definition. It must include the complete
+package name. This attribute is mutually exclusive with the _className_
+attribute and the _implClass_ attribute.
+*  _<javadoc>_ element, if specified
+customizes the Javadoc for the derived value class. _<javadoc>_ must be
+specified as described in link:jaxb.html#a2142[See <javadoc>
+Declaration].”
+
+=== [[a1713]]Customization Overrides
+
+When binding a schema element’s Java
+representation to a value class or a Java Element class, the following
+customization values override the defaults specified in Chapter 5. It is
+specified in a common section here and referenced from
+link:jaxb.html#a1718[See Customizable Schema Elements].”
+
+* name: The name is _className_ if specified.
+* package name: The name of the package is
+_packageName_ inherited from a scope that covers this schema element. +
+ +
+NOTE: The _packageName_ is only set in the <package> declaration. The
+scope of _packageName_ is schema scope and is thus inherited by all
+schema elements within the schema.
+* javadoc: The Javadoc must be generated as
+specified in section link:jaxb.html#a2163[See Javadoc
+Customization].” The Javadoc section customized is the _class/interface
+section._
+
+=== [[a1718]]Customizable Schema Elements
+
+=== Complex Type Definition
+
+When _<class>_ customization specified in the
+annotation element of the complex type definition, the complex type
+definition must be bound to a Java value class as specified in
+link:jaxb.html#a933[See Java value class]” applying the
+customization overrides as specified in link:jaxb.html#a1713[See
+Customization Overrides].”
+
+=== Example: Class Customization: Complex Type Definition To Java value class
+
+XML Schema fragment:
+
+<xs:complexType name="USAddress"> +
+<xs:annotation> <xs:appinfo> +
+<jaxb:class name="MyAddress" /> +
+</xs:appinfo></xs:annotation> +
+<xs:sequence>...</xs:sequence> +
+<xs:attribute name="country" type="xs:string"/> +
+</xs:complexType>
+
+Customized code:
+
+// public class USAddress \{ // Default Code
+
+public class MyAddress \{ // Customized Code
+
+ public String getCountry()\{...}
+
+ public void setCountry(String value)\{...}
+
+ ...
+
+}
+
+=== Simple Type Definition
+
+When _<class>_ customization specified in the
+annotation element of a simple type definition, the simple type
+definition must be bound to a Java value class as specified in
+link:jaxb.html#a803[See Bind to a JAXB mapped class]” applying
+the customization overrides as specified in
+link:jaxb.html#a1713[See Customization Overrides].”
+
+=== Example: Class Customization: Simple Type Definition To Java value class
+
+XML Schema fragment:
+
+<xs:simpleType name="SKU"> +
+<xs:annotation> <xs:appinfo> +
+<jaxb:class/> +
+</xs:appinfo></xs:annotation> +
+<xs:restriction base=”xs:int”/> +
+</xs:simpleType>
+
+Customized code:
+
+public class SKU \{ +
+@XmlValue +
+public int getValue()\{...} +
+public void setValue(int value)\{...} +
+... +
+}
+
+=== Model Group Definition
+
+It is invalid to place a _<jaxb:class>_
+customization on a model group.
+
+=== Model Group
+
+It is invalid to place a _<jaxb:class>_
+customization on an unnamed model group.
+
+=== Global Element Declaration
+
+A < _class_ > declaration is allowed in the
+annotation element of the global element declaration. However, the
+_implClass_ attribute is not allowed. The global element declaration
+must be bound as specified in link:jaxb.html#a1068[See Bind to
+Element Class]” applying the customization overrides specified in
+link:jaxb.html#a1713[See Customization Overrides].”
+
+=== Example: Class Customization: Global Element to Class
+
+XML Schema Fragment:
+
+<xs:complexType name="AComplexType">
+
+ <xs:sequence>
+
+ <xs:element name="A" type="xs:int"/>
+
+ <xs:element name="B" type="xs:string"/>
+
+ </xs:sequence>
+
+</xs:complexType>
+
+<xs:element name="AnElement"
+type="AComplexType">
+
+ <xs:annotation><xs:appinfo>
+
+ <jaxb:class name="MyElement"/>
+
+ </xs:appinfo></xs:annotation>
+
+</xs:element>
+
+Customized code:
+
+// following class is generated because of
+customization
+
+public class AComplexType \{ +
+void setA(int value) \{...}
+
+ int getA()\{...}
+
+ void setB(String value)\{...}
+
+ String getB()\{...}
+
+}
+
+public class MyElement extends
+JAXBElement<AComplexType> \{...}
+
+public class ObjectFactory \{
+
+ // Default code
+
+ // JAXBElement<AnElement>
+createAnElement(AnElement)\{...} +
+ +
+// Customized code
+
+ MyElement createMyElement(AnElement)\{...} +
+... other factory methods ...
+
+}
+
+=== Local Element
+
+A local element is a schema element that
+occurs within a complex type definition. A local element is one of:
+
+* local element reference (using the “ref”
+attribute) to a global element declaration.
+* local element declaration (“ref” attribute
+is not used).
+
+A _<class>_ declaration is allowed in the
+annotation element of a local element. link:jaxb.html#a2217[See
+Annotation Restrictions]” contains more information regarding the
+annotation element for a local element reference. However, the
+_implClass_ attribute is not allowed.
+
+A _<class>_ customization on local element
+reference must result in an invalid customization as specified in
+link:jaxb.html#a1544[See Invalid Customizations]” since a local
+element reference is never bound to a Java Element class.
+
+A _<class>_ customization on local element
+declaration applies only when a local element declaration is bound to a
+Java Element class. Otherwise it must result in an invalid customization
+as specified in link:jaxb.html#a1544[See Invalid
+Customizations].” If applicable, a local element must be bound as
+specified in link:jaxb.html#a1040[See Bind to JAXBElement<T>
+Instance]” applying the customization overrides as specified in
+link:jaxb.html#a1713[See Customization Overrides].”
+
+=== Example: Class Customization: Local Element Declaration To Java Element
+
+The following example is from
+link:jaxb.html#a1359[See Examples].”
+
+XML Schema fragment:
+
+<xs:complexType name="Base"> +
+<xs:choice maxOccurs="unbounded"> +
+<xs:element name="A" type="xs:string"> +
+<xs:annotation><xs:appinfo> +
+<jaxb:class name="Bar"/> +
+< _/xs:appinfo></xs:annotation> +
+_ </xs:element> +
+<xs:element name="B" type="xs:string"/> +
+<xs:element name="C" type="xs:int"/> +
+</xs:choice> +
+</xs:complexType>
+
+Customized code:
+
+import javax.xml.bind.JAXBElement; +
+public class ObjectFactory \{ +
+// element instance factories only +
+// JAXBElement<String> createBaseA(String value); //default code +
+JAXBElement<String> createBaseBar(String value); //Customized +
+JAXBElement<String> createBaseB(String value); +
+JAXBElement<Integer> createBaseC(Integer value); +
+} +
+public class Base \{ +
+static public class Bar extends JAXBElement<String> \{...}// Customized
+code +
+/** +
+* A general content list that can contain element +
+* instances of JAXBElement<String> or JAXBElement<Integer>. +
+*/ +
+List<Object> getBarOrBOrC()\{...} +
+}
+
+=== [[a1783]] _<property>_ Declaration
+
+This binding declaration allows the
+customization of a binding of an XML schema element to its Java
+representation as a property. This section identifies all XML schema
+elements that can be bound to a Java property and how to customize that
+binding.
+
+The scope of customization value can either
+be definition scope or component scope depending upon which XML schema
+element the < _property>_ binding declaration is specified.
+
+=== [[a1786]]Usage
+
+<property [ name = "propertyName" ] +
+[ collectionType = " _propertyCollectionType_ " ] +
+[ fixedAttributeAsConstantProperty = "true" | "false" | "1" | "0" ] +
+[ generateIsSetMethod = "true" | "false" | "1" | "0" ] +
+[ enableFailFastCheck="true" | "false" | "1" | "0" ] +
+[ generateElementProperty= “true” | “false” | “1” | “0” ] +
+[ attachmentRef = “resolve” | “doNotResolve” | “default” ] +
+[ <baseType name=”fully qualified Java class”> ... </baseType> ] +
+[ <javadoc> ... </javadoc> ] +
+</property> +
+ +
+<baseType name=”fully qualified Java class”> +
+<javaType> ... </javaType> +
+</baseType>
+
+For readability, the _<baseType>_ element is
+shown separately. However, it can be used only as a local element within
+the _<property>_ element.
+
+The use of this declaration is subject to the
+constraints specified in link:jaxb.html#a1825[See Usage
+Constraints].”
+
+The customization values defined are:
+
+*  _name_ if specified , defines the
+customization value _propertyName;_ it must be a legal Java identifier.
+*  _collectionType_ if specified, defines the
+customization value _propertyCollectionType_ which is the collection
+type for the property. _propertyCollectionType_ if specified, must be
+either “ _indexed"_ or any fully qualified class name that implements
+_java.util.List._
+*  _fixedAttributeAsConstantProperty_ if
+specified , defines the customization value
+_fixedAttributeAsConstantProperty_ . The value must be one of _"true",
+false", "1" or"0"._
+*  _generateIsSetMethod_ if specified,
+defines the customization value of _generateIsSetMethod._ The value must
+be one of _"true", false", "1" or"0"._
+*  _enableFailFastCheck_ if specified,
+defines the customization value _enableFailFastCheck._ The value must be
+one of _"true", false", "1" or"0"._
+*  _@generateElementProperty_ if specified,
+controls the generation of JAXBElement property. The value must be one
+of "true", "false", "1", or "0". The default is absence of the value. It
+is an error for this attribute to be present if this customization is
+attached to local or global attribute declarations. This customization
+affects the binding as follows. It is an error to specify this
+customization, when the property is required to be _JAXBElement_ (such
+as when a property contains multiple elements with different names but
+of the same type.)
+*  _true_ : Always generate properties to use
+_JAXBElement_ .
+*  _false_ : When generating properties from
+_<element nillable="true" minOccurs="0" />_ , generate a property not to
+use JAXBElement, as if the element declaration were just _<element
+nillable="true"/>_ .
+*  _@attachmentRef_ has a default value of
+“default”. This mode defers to default processing as specified in
+link:jaxb.html#a5147[See Binding WS-I Attachment Profile
+ref:swaRef]”. +
+ +
+When _@attachmentRef_ value is _resolve_ and the property’s base type is
+or derives from _xsd:anyURI_ , the schema-derived JAXB property has a
+base type of _javax.activation.DataHandler_ and the property is
+annotated with _@XmlAttachmentRef_ . +
+ +
+Disabling autoresolving an element/attribute of type _ref:swaRef_ : +
+When _@attachmentRef_ value is _doNotResolve_ and the property’s base
+type derives from standard schema type _ref:swaRef,_ the schema-derived
+JAXB property has the base type _String_ , derived from _xsd:anyURI,_
+and _@XmlAttachmentRef_ is not generated for the property.
+*  _<javadoc>_ element, if specified
+customizes the Javadoc for the property’s getter method. _<javadoc>_
+must be specified as described in link:jaxb.html#a2142[See
+<javadoc> Declaration].”
+
+===  _baseType_ [[a1801]]
+
+The _<baseType>_ element is intended to allow
+the customization of a base type for a JAXB property. This element can
+only be a child of <jaxb:property> element.
+
+<baseType name=”fully qualified Java
+class”> +
+<javaType> ... </javaType> +
+</baseType>
+
+
+
+The _@name_ attribute enables either the
+specialization or generalization of the default base type binding for a
+JAXB property. Child element _<javaType>_ is used to convert the default
+base type to a Java class. These two mutual exclusive usages of the
+<baseType> customization are described below.
+
+=== Conversion using Child element <javaType>
+
+Optional child element < _javaType>_ , if
+specified, defines the customization value _javaType_ and must be
+specified as defined in link:jaxb.html#a1981[See <javaType>
+Declaration].” The customization value defined has component scope. This
+customization converts the default base type’s value for a simple type
+definition to the Java class specified by <javaType> name.
+
+The schema-derived JAXB property is annotated
+with _@XmlJavaTypeAdapter_ specified in Section 8.
+_@XmlJavaTypeAdapter.value()_ is set to a generated
+classlink:#a5378[27] that extends
+_javax.xml.bind.annotation.adapter.XmlAdapter_ . The generated class’
+_unmarshal_ method must call the <javaType> customization’s parse
+method, which is specified in link:jaxb.html#a1981[See
+<javaType> Declaration]. The generated class’ _marshal_ method must call
+the <javaType> customization’s print method.
+
+=== [[a1809]]Generalize/Specialize baseType with attribute @name
+
+The _name_ attribute for _<baseType>_ enables
+more precise control over the actual base type for a JAXB property. This
+customization enables specifying an alternative base type than the
+property’s default base type. The alternative base type must still be in
+the same class inheritance hierarchy as the default base type. The
+alternative base type must be either a super interface/class or subclass
+of the default Java base type for the property. The customization
+enables one to specialize or generalize the properties binding.
+
+The _name_ attribute value must be a fully
+qualified Java class name. When the default base type is a primitive
+type, consider the default Java base type to be the Java wrapper class
+of that primitive type.
+
+Generalizing the basetype using this
+customization enables simple type substitution for a JAXB property
+representing with too restrictive of a default base type. To enable all
+possible valid type substitutions, the _name_ attribute should be
+_java.lang.Object_ . However, if for example, it is known that all type
+substitutions will share a more specific Java super interface/class than
+_java.lang.Object_ , that Java class name can be used achieve a stronger
+typed binding. With this customization, the JAXB annotation generated
+for the property’s _@XmlElement.type()_ or _@XmlAttribute.type()_ is
+still the default Java datatype for the element/attribute’s
+schema-defined type.
+
+The schema-derived customized JAXB property
+is annotated, either explicitly or by default mapping annotations, with
+the mapping annotation _@XmlElement_ , specified in Section 8.10.1. The
+_@XmlElement_ annotation element type is derived in terms of the
+abstract model properties for a element type definition summarized in
+link:jaxb.html#a4937[See Element Declaration Schema Component]
+as follows:
+
+=== Annotate JAXB property with @XmlElement element-value pairs
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|@XmlElement element
+|@XmlElement value
+|type |the java
+type binding of the element declaration’s _\{type definition}_
+|===
+
+Note that the Java class for
+_@XmlElement.type()_ can differ from the recommended JAXB property’s
+base type to enable type substitution of java.lang.Object. This binding
+enables unmarshalling of the Element’s simple content when it is not
+qualified with an _xsi:type_ as the element’s schema-declared type.
+_@XmlElement.type()_ acts as the default _xsi:type_ for a JAXB property
+where the property’s base type was generalized to allow for type
+substitution of an element declaration with a simple type definition.
+
+Specializing the basetype using this
+customization generates stronger typing than default JAXB binding. For
+example, an XML element or attribute of _xs:IDREF_ binds to
+_java.lang.Object_ by default as specified in
+link:jaxb.html#a1290[See Binding an IDREF component to a Java
+property]”. If the schema only intends the reference to be to an element
+that binds to a specific type, the baseType @name schema customization
+can be used to specialize the binding.
+
+=== [[a1820]]Specialize binding of an IDREF via customization
+
+Given XML Schema fragment:
+
+<xs:complexType name="Book"> +
+<xs:sequence> +
+_<xs:element name="author" type="xs:IDREF"/> +
+_ _<xs:annotation><xs:appinfo> +
+<jaxb:property> +
+<jaxb:baseType name=”AuthorBio.class”/> +
+</jaxb:property> +
+</xs:appinfo></xs:annotation> +
+_ <!-- ... --> +
+</xs:sequence> +
+</xs:complexType> +
+<xs:complexType name="AuthorBio"> +
+<xs:sequence><!-- ... --> </xs:sequence> +
+_<xs:attribute name="name" type="xs:ID"/> +
+_ </xs:complexType>
+
+Schema-derived Java value class:
+
+public class Book \{ +
+@XmlIDREF +
+AuthorBio getAuthor() \{...} +
+void setAuthor(AuthorBio referencedObj)\{...} +
+} +
+public class AuthorBio\{ +
+@XmlID +
+String getName()\{...} +
+void setName(String value)\{...} +
+}
+
+=== [[a1825]]Usage Constraints
+
+The usage constraints on _<property>_ are
+specified below. Any constraint violation must result in an invalid
+customization as specified in link:jaxb.html#a1544[See Invalid
+Customizations].” The usage constraints are:
+
+. The _<baseType>_ is only allowed with the
+following XML schema elements from the link:jaxb.html#a1857[See
+Customizable Schema Elements]”:
+. Local Element,
+link:jaxb.html#a1913[See Local Element].”
+. Local Attribute,
+link:jaxb.html#a1861[See Local Attribute].”
+. ComplexType with simpleContent,
+link:jaxb.html#a1976[See ComplexType].”
+. <baseType> can either have a name attribute
+or a <javaType>, they both can not exist at the same time.
+. The _fixedAttributeAsConstantProperty_ is
+only allowed with a local attribute, link:jaxb.html#a1861[See
+Local Attribute]" , that is fixed.
+. If a _<property>_ declaration is associated
+with the _<complexType>_ , then a _<property>_ customization cannot be
+specified on the following schema elements that are scoped to
+_<complexType>_ :
+. Local Element
+. Model group
+. Model Group Reference
+
+The reason is that a _<property>_ declaration
+associated with a complex type binds the content model of the complex
+type to a general content property. If a _<property>_ declaration is
+associated with a schema element listed above, it would create a
+conflicting customization.
+
+* 
+
+=== Example: Property Customization: simple type customization
+
+<xs:complexType name="internationalPrice"> +
+.... +
+<xs:attribute name="currency" type="xs:string"> +
+<xs:annotation> <xs:appinfo> +
+<jaxb:property> +
+<jaxb:baseType> +
+<jaxb:javaType name="java.math.BigDecimal" +
+parseMethod="javax.xml.bind.DatatypeConverter.parseInteger" +
+printMethod="javax.xml.bind.DatatypeConverter.printInteger"/> +
+</jaxb:baseType> +
+</jaxb:property> +
+</xs:appinfo></xs:annotation> +
+</xs:attribute> +
+</xs:complexType>
+
+The code generated is:
+
+public class InternationalPrice \{
+
+ // String getCurrency(); default
+
+ java.math.BigDecimal getCurrency()\{...} //
+customized
+
+ public void setCurrency(java.math.BigDecimal
+val)\{...} // customized
+
+}
+
+=== [[a1847]]Customization Overrides
+
+When binding a schema element’s Java
+representation to a property, the following customization values
+override the defaults specified in Chapter 6. It is specified in a
+common section here and referenced from link:jaxb.html#a1857[See
+Customizable Schema Elements].”
+
+* name: If propertyName is defined, then it
+is the name obtained by mapping the name as specified in
+link:jaxb.html#a1608[See Customized Name Mapping].”
+* base type: The basetype is
+_propertyBaseType_ if defined. The propertyBaseType is defined by a XML
+schema element in link:jaxb.html#a1857[See Customizable Schema
+Elements].”
+* collection type: The collection type is
+_propertyCollectionType_ if specified; otherwise it is the
+_propertyCollectionType_ inherited from a scope that covers this schema
+element.
+* javadoc: The Javadoc must be generated as
+specified in section link:jaxb.html#a2163[See Javadoc
+Customization].” The Javadoc section customized is the _method section._
+* If _propertyBaseType_ is a Java primitive
+type and _propertyCollectionType_ is a class that implements
+java.util.List, then the primitive type must be mapped to its wrapper
+class.
+
+The following does not apply if local
+attribute is being bound to a constant property as specified in
+link:jaxb.html#a1861[See Local Attribute]”:
+
+* If generateIsSetMethod is “true” or “1”,
+then additional methods as specified in link:jaxb.html#a610[See
+isSet Property Modifier]” must be generated.
+* If enableFailFastCheck is “true” or “1”
+then the type constraint checking when setting a property is enforced by
+the JAXB implementation. Support for this feature is optional for a JAXB
+implementation in this version of the specification.
+
+=== [[a1857]]Customizable Schema Elements
+
+=== Global Attribute Declaration
+
+A < _property_ > declaration is allowed in
+the annotation element of the global attribute declaration.
+
+The binding declaration does not bind the
+global attribute declaration to a property. Instead it defines
+customization values that have definition scope. The definition scope
+covers all local attributes (link:jaxb.html#a1861[See Local
+Attribute]”) that can reference this global attribute declaration. This
+is useful since it allows the customization to be done once when a
+global attribute is defined instead of at each local attribute that
+references the global attribute declaration.
+
+=== [[a1861]]Local Attribute
+
+A local attribute is an attribute that occurs
+within an attribute group definition, model group definition or a
+complex type. A local attribute can either be a
+
+* local attribute reference (using the “ref”
+attribute) to a global attribute declaration.
+* local attribute declaration (“ref”
+attribute is not used).
+
+A < _property_ > declaration is allowed in
+the annotation element of a local
+attribute.link:jaxb.html#a2217[See Annotation Restrictions]”
+contains more information regarding the annotation element for a local
+attribute reference. The customization values must be defined as
+specified in link:jaxb.html#a1786[See Usage]” and have component
+scope.
+
+If _javaType_ is defined, then the
+_propertyBaseType_ is defined to be Java datatype specified in the
+_"name"_ attribute of the _javaType_ .
+
+* If _fixedAttributeAsConstantProperty_ is “
+_true"_ or “ _1"_ and the local attribute is a fixed, the local
+attribute must be bound to a Java Constant property as specified in
+link:jaxb.html#a1277[See Bind to a Java Constant property]”
+applying customization overrides as specified in
+link:jaxb.html#a1847[See Customization Overrides].” The
+generateIsSetMethod, choiceContentProperty and enableFailFastCheck must
+be considered to have been set to false.
+* Otherwise, it is bound to a Java property
+as specified in link:jaxb.html#a1252[See Attribute use]”
+applying customization overrides as specified in
+link:jaxb.html#a1847[See Customization Overrides].”
+
+=== Example: Customizing Java Constant Property
+
+XML Schema fragment:
+
+<xs:complexType name="USAddress">
+
+ <xs:attribute name="country"
+type="xs:NMTOKEN" fixed="US">
+
+ <xs:annotation><xs:appinfo>
+
+ <jaxb:property name="MY_COUNTRY"
+
+ fixedAttributeAsConstantProperty="true"/>
+
+ </xs:appinfo></xs:annotation>
+
+ </xs:attribute>
+
+</xs:complexType>
+
+Customized derived code:
+
+public class USAddress \{
+
+ public static final String MY_COUNTRY =
+"US"; // Customized Code
+
+}
+
+=== Example 2: Customizing to other Java Property
+
+XML Schema fragment:
+
+<xs:complexType name="USAddress"> +
+<xs:attribute name="country" type="xs:string">
+
+ <xs:annotation><xs:appinfo>
+
+ <jaxb:property name="MyCountry"/>
+
+ </xs:appinfo></xs:annotation>
+
+ </xs:attribute>
+
+</xs:complexType>
+
+Customized derived code:
+
+public class USAddress \{
+
+ // public getString getCountry(); // Default
+Code
+
+ // public void setCountry(string value);//
+Default Code
+
+ public String getMyCountry()\{...} //
+Customized Code
+
+ public void setMyCountry(String value)\{...}
+// Customized Code
+
+}
+
+=== Example 3: Generating IsSet Methods
+
+XML Schema fragment:
+
+<xs:attribute name="account" type = "xs:int">
+
+ <xs:annotation><xs:appinfo>
+
+ <jaxb:property generateIsSetMethod="true"/>
+
+ </xs:appinfo></xs:annotation>
+
+</xs:attribute>
+
+Customized code:
+
+public int getAccount();
+
+public void setAccount(int account);
+
+public boolean isSetAccount(); // Customized
+code
+
+public void unsetAccount(); // Customized
+code
+
+=== Global Element Declaration
+
+A _<property>_ declaration is allowed in the
+annotation element of a global element declaration. However, the usage
+is constrained as follows:
+
+The binding declaration does not bind the
+global element declaration to a property. Instead it defines
+customization values that have definition scope. The definition scope
+covers all local elements (link:jaxb.html#a1913[See Local
+Element]”) that can reference this global element declaration. This is
+useful since it allows the customization to be done once when a global
+element is defined instead of at each local element that references the
+global element declaration.
+
+=== [[a1913]]Local Element
+
+A local element is a schema element that
+occurs within a complex type definition. A local element is one of:
+
+* local element reference (using the “ref”
+attribute) to a global element declaration.
+* local element declaration (“ref” attribute
+is not used).
+
+A <property> declaration is allowed in the
+annotation element of a local element. link:jaxb.html#a2217[See
+Annotation Restrictions]” contains more information regarding the
+annotation element for a local element reference.
+
+The customization values must be defined as
+specified in link:jaxb.html#a1786[See Usage]” and have component
+scope.
+
+If _javaType_ is defined, then the
+_propertyBaseType_ is defined to be Java datatype specified in the
+_"name"_ attribute of the _javaType_ .
+
+The local element must be bound as specified
+in link:jaxb.html#a1414[See Content Model Default Binding]”
+applying customization overrides as specified in
+link:jaxb.html#a1847[See Customization Overrides].”
+
+See example in
+link:jaxb.html#a1966[See Example 3: Property Customization:
+Model Group To Content Property Set]” in section
+link:jaxb.html#a1944[See Model Group].”
+
+=== Wildcard
+
+A _<property>_ declaration is allowed in the
+annotation element of the wildcard schema component. The customization
+values must be defined as specified in link:jaxb.html#a1786[See
+Usage]” and have component scope.
+
+The wildcard schema component must be bound
+to a property as specified in link:jaxb.html#a1384[See Bind
+wildcard schema component]” applying customization overrides as
+specified in link:jaxb.html#a1847[See Customization Overrides].”
+
+Example: The following schema example is from
+UDDI V2.0
+
+<xs:complexType name="businessEntityExt">
+
+ <xs:sequence>
+
+ <xs:any namespace="##other"
+
+ processContents="strict"
+
+ minOccurs="1" maxOccurs="unbounded">
+
+ <xs:annotation><xs:appinfo>
+
+ <jaxb:property name="Extension"/>
+
+ </xs:appinfo></xs:annotation>
+
+ </xs:any>
+
+ ....
+
+ </xs:sequence>
+
+</xs:complexType>
+
+Customized derived code:
+
+public class BusinessEntityExt \{
+
+ ...
+
+ // List getAny(); // Default Code
+
+ List getExtension()\{...} // Customized Code
+
+}
+
+=== [[a1944]]Model Group
+
+A _<property>_ binding declaration is allowed
+in the annotation element of the compositor (i.e. _<choice>_ ,
+_<sequence>_ or _<all>_ ). The customization values must be defined as
+specified in link:jaxb.html#a1786[See Usage]” and have component
+scope.
+
+The customized binding of a model group is
+determined by the following:
+
+*  _choiceContentProperty_ attribute in
+_<globalBindings>_ .
+* If propertyBaseType is defined and a
+_<property>_ declaration is also present, then the customization
+overrides specified in link:jaxb.html#a1847[See Customization
+Overrides]” must be applied by the model group’s parent schema element
+to the property used to aggregate the Java value class.
+* If propertySet is defined, then the model
+group’s parent schema element must aggregate the property set as
+specified in link:jaxb.html#a930[See Aggregation of Property
+Set].”
+
+=== Example1: Property Customization: Model Group To ChoiceContent Property
+
+XML Schema fragment
+
+<xs:annotation><xs:appinfo> +
+<jaxb:globalBindings choiceContentProperty="true"/> +
+</xs:appinfo></xs:annotation>
+
+<xs:complexType name=”AType”> +
+<xs:choice>
+
+ <xs:element name="foo" type="xs:int"/>
+
+ <xs:element name="bar" type="xs:string"/>
+
+ </xs:choice> +
+</xs:complexType>
+
+Customized derived code:
+
+class ObjectFactory \{ +
+JAXBElement<Integer> createAtypeFoo(Integer value); +
+JAXBElement<String> createAtypeBar(String value);
+
+} +
+public class AType \{ +
+void setFooOrBar(Object o)\{...} //customized code +
+Object getFooOrBar()\{...} //customized code +
+}
+
+The _choiceContentProperty_ is required to
+bind the choice model group to a choice content property.
+
+=== Example 2: Property Customization: Model Group To General Content Property
+
+XML Schema fragment:
+
+<xs:complexType name="Base"> +
+<xs:choice maxOccurs="unbounded"> +
+<xs:annotation><xs:appinfo> +
+<jaxb:property name="items" /> +
+</xs:appinfo></xs:annotation> +
+<xs:element name="A" type="xs:string"/> +
+<xs:element name="B" type="xs:string"/> +
+<xs:element name="C" type="xs:int"/> +
+</xs:choice> +
+</xs:complexType>
+
+Customized derived code:
+
+public class Base \{ +
+/** +
+* A general content list that can contain +
+* instances of Base.A, Base.B and Base.C. +
+*/ +
+// List getAOrBOrC(); - default +
+List getItems()\{...} // Customized Code +
+}
+
+=== [[a1966]]Example 3: Property Customization: Model Group To Content Property Set
+
+XML Schema fragment:
+
+<xs:complexType name="USAddress"/> +
+<xs:complexType name="PurchaseOrderType"> +
+<xs:sequence> +
+<xs:choice> +
+<xs:group ref="shipAndBill"/> +
+<xs:element name="singleUSAddress" type="USAddress"> +
+<xs:annotation><xs:appinfo> +
+<jaxb:property name="address"/> +
+</xs:appinfo></xs:annotation> +
+</xs:element> +
+</xs:choice> +
+</xs:sequence> +
+</xs:complexType>
+
+<xs:group name="shipAndBill"> +
+<xs:sequence> +
+<xs:element name="shipTo" type="USAddress"> +
+<xs:annotation><xs:appinfo> +
+<jaxb:property name="shipAddress"/> +
+</appinfo></annotation> +
+</xs:element> +
+<xs:element name="billTo" type="USAddress"> +
+<xs:annotation><xs:appinfo> +
+<jaxb:property name="billAddress"/> +
+</xs:appinfo></xs:annotation> +
+</xs:element> +
+</xs:sequence> +
+</xs:group>
+
+Customized derived code:
+
+public interface PurchaseOrderType \{
+
+ USAddress getShipAddress(); void
+setShipAddress(USAddress); +
+USAddress getBillAddress(); void setBillAddress(USAddress); +
+USAddress getAddress(); void setAddress(USAddress); +
+}
+
+=== Model Group Reference
+
+A model group reference is a reference to a
+model group using the “ref” attribute. A property customization is
+allowed on the annotation property of the model group reference. Section
+link:jaxb.html#a2217[See Annotation Restrictions]” contains more
+information regarding the annotation element for a model group
+reference.
+
+The customization values must be defined as
+specified in link:jaxb.html#a1786[See Usage]” and have component
+scope. A model group reference is bound to a Java property set or a list
+property as specified in link:jaxb.html#a1414[See Content Model
+Default Binding]” applying customization overrides as specified in
+link:jaxb.html#a1847[See Customization Overrides].”
+
+=== [[a1976]]ComplexType
+
+A _<property>_ customization is allowed on
+the annotation element of a complex type. The customization values must
+be defined as specified in link:jaxb.html#a1786[See Usage]” and
+have component scope. The result of this customization depends upon the
+content type of the complex type.
+
+* If the content type of the content model is
+simple content, then the content model must be bound to a property as
+specified in link:jaxb.html#a973[See Simple Content Binding].”
+applying the customization overrides as specified in
+link:jaxb.html#a1847[See Customization Overrides].” If
+_javaType_ is defined, then the _propertyBaseType_ is defined to be Java
+datatype specified in the _"name"_ attribute of the _javaType_ .
+* For all other content types, the content
+model must be bound as specified in step 1. of
+link:jaxb.html#a1414[See Content Model Default Binding]”
+applying the customization overrides as specified in
+link:jaxb.html#a1847[See Customization Overrides]".
+* 
+
+=== [[a1981]] _<javaType>_ Declaration
+
+A _<javaType>_ declaration provides a way to
+customize the binding of an XML schema atomic datatype to a Java
+datatype, referred to as the target Java datatype. The target Java
+datatype can be a Java built-in data type or an application specific
+Java datatype. This declaration also provides two additional methods: a
+parse method and a print method.
+
+The parse method converts a lexical
+representation of the XML schema datatype into a value of the target
+Java datatype. The parse method is invoked by a JAXB provider’s
+implementation during unmarshalling.
+
+The print method converts a value of the
+target Java datatype into its lexical representation of the XML schema
+datatype. The print method is invoked by a JAXB provider’s
+implementation during marshalling.
+
+=== Usage
+
+<javaType name=" _javaType_ "
+
+{empty} [ xmlType=" _xmlType_ " ]
+
+{empty} [ parseMethod="parseMethod" ]
+
+ [ printMethod="printMethod" ]>
+
+The binding declaration can be used in one of
+the following:
+
+* a _<globalBindings>_ declaration.
+* annotation element of one of the XML schema
+elements specified in link:jaxb.html#a2079[See Customizable
+Schema Elements].”
+* in a <property> declaration. See
+link:jaxb.html#a1783[See <property> Declaration].” This can be
+used for customization at the point of reference to a simple type.
+
+When used in a _<globalBindings>_
+declaration, _<javaType>_ defines customization values with global
+scope. When used in an annotation element of one of the schema elements
+specified in link:jaxb.html#a2079[See Customizable Schema
+Elements].” the customization values have component scope.
+
+=== name
+
+The _javaType_ , if specified, is the Java
+datatype to which _xmlType_ is to be bound. Therefore, _javaType_ must
+be a legal Java type name, which may include a package prefix. If the
+package prefix is not present, then the Java type name must be one of
+the Java built-in primitive types [JLS - Java Language Specification,
+Second Edition, Section 4.2, “Primitive Types and Values”]. (For
+example, “ _int_ ”) or a Java class in the unnamed package. If class
+javaType declares a public constructor with following signature,
+_javaType(java.lang.String)_ , _parseMethod_ attribute does not need to
+be specified.
+
+===  _xmlType_
+
+The _xmlType_ , if specified, is the name of
+the XML Schema datatype to which _javaType_ is to bound. If specified,
+_xmlType_ must be a XML atomic datatype derived from restriction. The
+use of the _xmlType_ is further constrained as follows.
+
+The purpose of the _xmlType_ attribute is to
+allow the global customization of a XML schema to Java datatype. Hence
+_xmlType_ attribute is required when _<javaType>_ declaration’s parent
+is _<globalBindings>_ . If absent, it must result in an invalid
+customization as specified in link:jaxb.html#a1544[See Invalid
+Customizations].” Otherwise, the _xmlType_ attribute must not be present
+since the XML datatype is determined from the XML schema element with
+which the annotation element containing _<javaType>_ declaration or the
+_<baseType>_ (containing the _<javaType>_ ) is associated. If present,
+it must result in an invalid customization as specified in
+link:jaxb.html#a1544[See Invalid Customizations].”
+
+Examples can be found in
+link:jaxb.html#a2062[See Example: javaType Customization: Java
+Built-in Type]” and link:jaxb.html#a2027[See Example: javaType
+Customization: User Specified Parse Method]”
+
+===  _parseMethod_
+
+The parse method if specified, must be
+applied during unmarshalling in order to convert a string from the input
+document into a value of the target Java datatype. The parse method must
+be invoked as follows:
+
+* The parse method defaults to _new_ provided
+_javaType_ is not a Java primitive type such as ( _"int"_ ). If
+_javaType_ is a Java primitive type, then this must result in an invalid
+customization as specified in link:jaxb.html#a1544[See Invalid
+Customizations].” Otherwise, the binding compiler must assume that the
+target type is a class that defines a constructor as follows:
+*  _String_ as the first parameter of the
+constructor.
+
+To apply the conversion to a string it must
+generate code that invokes this constructor, passing it the input
+string.
+
+* The parse method may be specified in the
+form _ClassName.methodName,_ where the ClassName is a fully qualified
+class name that includes the package name. A compiler must assume that
+the class _ClassName_ exists and that it defines a static method named
+_methodName_ that takes:
+*  _String_ as the first argument.
+
+To apply the conversion to a string it must
+generate code that invokes this method, passing it the input string.
+
+* The parse method may be specified in the
+form _methodName_ provided _javaType_ is not a Java primitive type (such
+as _"int"_ ). If _javaType_ is Java primitive type, then this must
+result in an invalid customization as specified in
+link:jaxb.html#a1544[See Invalid Customizations].” Otherwise,
+the binding compiler must assume that _methodName_ is a method in the
+class _javaType._ The binding compiler must therefore prefix the
+_javaType_ to the _methodName_ and process _javaType._ _methodName_ as
+specified in above.
+
+The string passed to parse method can be any
+lexical representation for _xmlType_ as specified in [XSD PART2].
+
+If parseMethod attribute is not specified,
+_xmlType_ is not a primitive or wrapper class and _javaType_ has an
+accessible one argument constructor, where the argument is type
+_java.lang.String_ , input text is parsed by invoking _new_ with a
+_java.lang.String_ parameter.
+
+===  _printMethod_
+
+The print method if specified, must be
+applied during marshalling in order to convert a value of the target
+type into a lexical representation:
+
+* The print method is specified in the form
+_methodName_ provided _javaType_ is not a Java primitive type (such as
+_"int"_ ). If _javaType_ is Java primitive type, then this must result
+in an invalid customization as specified in
+link:jaxb.html#a1544[See Invalid Customizations].” Otherwise,
+the compiler must assume that the target type is a class or an interface
+that defines a zero-argument instance method named _methodName_ that
+returns a _String_ . To apply the conversion it must generate code to
+invoke this method upon an instance of the target Java datatype.
+* If the print method is specified in the
+form _ClassName.methodName_ then the compiler must assume that the class
+_ClassName_ exists and that it defines a static method named
+_methodName_ that returns a string that takes the following:
+* the first parameter is the target Java
+datatype.
+
+To apply the conversion to a string it must
+generate code that invokes this method, passing it a value of the target
+Java datatype.
+
+The lexical representation to which the value
+of the target type is converted can be any lexical representation for
+_xmlType_ as specified in [XSD PART2].
+
+If _printMethod_ attribute is not specified
+and _xmlType_ is not a primitive or wrapper class, _javaType.toString()_
+is used as the default print method..
+
+
+
+===  _DatatypeConverter_
+
+Writing customized parse and print methods
+can be difficult for a Java programmer. This requires a programmer to
+understand the lexical representations of XML schema datatypes. To make
+it easier, an interface, _DatatypeConverterInterface,_ and a class
+_DatatypeConverter_ are defined to expose the parse and print methods of
+a JAXB implementation. These can be invoked by user defined parse and
+print methods. This shifts the burden of dealing with lexical spaces
+back to the JAXB implementation.
+
+The _DatatypeConverterInterface_ defines
+parse and print methods for XML schema datatypes. There is one parse and
+print method for each of XML schema datatype specified in
+link:jaxb.html#a725[See Java Mapping for XML Schema Built-in
+Types]. The interface is fully specified by the Javadoc specified in
+_javax.xml.bind.DatatypeConverterInterface_ .
+
+The _DatatypeConverter_ class defines a
+static parse and print method corresponding to each parse and print
+method respectively in the _DatatypeConverterInterface_ interface. The
+property _javax.xml.bind.DatatypeConverter_ can be used to select the
+name of a class that provides an implementation of the parse and print
+methods. The name specified in the property must be a fully qualified
+class name and must implement the interface _DatatypeConverterInterface_
+. The class is fully specified by the Javadoc specified in
+_javax.xml.bind.DatatypeConverter_ .
+
+=== Usage
+
+The following example demonstrates the use of
+the _DatatypeConverter_ class for writing a customized parse and print
+method.
+
+=== [[a2027]]Example: javaType Customization: User Specified Parse Method
+
+This example shows the binding of XML schema
+type _"xs:date"_ is bound to a Java datatype _long_ using user specified
+print and parse methods.
+
+<jaxb:globalBindings> +
+<jaxb:javaType name="long" xmlType="xs:date" +
+parseMethod="pkg.MyDatatypeConverter.myParseDate" +
+printMethod="pkg.MyDatatypeConverter.myPrintDate"/> +
+</jaxb:javaType> +
+</jaxb:globalBindings> +
+
+package pkg; +
+import javax.xml.bind.DatatypeConverter;
+
+public class MyDatatypeConverter \{ +
+public static long myParseDate(String s) \{
+
+ java.util.Calendar d =
+DatatypeConverter.parse(s);
+
+ long result= cvtCalendarToLong(d) ; // user
+defined method
+
+ return result; +
+}
+
+ public static String myPrintDate(long l) \{
+
+ java.util.Calendar d = cvtLongToCalendar(l);
+//user defined
+
+ return DatatypeConverter.print(d);
+
+ } +
+}
+
+The implementation of the print methods (
+_parseDate_ and _printDate_ ) are provided by the user.
+
+The customization is applied during the
+processing of XML instance document. During unmarshalling, the JAXB
+implementation invokes _myParseDate_ . If _myParseDate_ method throws a
+_ParseException_ , then the JAXB implementation code catches the
+exception, and generate a _parseConversionEvent_ .
+
+=== Lexical And Value Space
+
+[XSD PART 2] specifies both a value space and
+a lexical space for an schema datatypes. There can be more than one
+lexical representation for a given value.
+
+Examples of multiple lexical representations
+for a single value are:
+
+* For boolean, the value _true_ has two
+lexical representations _"true"_ and _"1"._
+* For integer, the value _1_ has two lexical
+representations _"1.0"_ and _"1"._
+
+XSD PART 2 also specifies a canonical
+representation for all XML schema atomic datatypes.
+
+The requirements on the parse and print
+methods are as follows:
+
+* A JAXB implementation of a parse method in
+_DatatypeConverterInterface_ must be capable of a processing all lexical
+representations for a value as specified by [XSD PART 2]. This ensures
+that an instance document containing a value in any lexical
+representation specified by [XSD PART 2] can be marshalled.
+* A JAXB implementation of a print method in
+_DatatypeConverterInterface_ must convert a value into any lexical
+representation of the XML schema datatype to which the parse method
+applies, as specified by [XSD PART 2] and which is valid with respect to
+the application’s schema.
+* 
+
+=== Built-in Conversions
+
+As a convenience to the user, this section
+specifies some built-in conversions. A built-in conversion is one where
+the parse and the print method may be omitted by a user. The built-in
+conversions leverage the narrowing and widening conversions defined in
+[JLS - Java Language Specification, Second Edition], Section 5.1.2,
+“Widening Primitive Conversion” and Section 5.1.3, “Narrowing Primitive
+Conversions.” For example:
+
+<xs:simpleType name="foo" type="xs:long">
+
+ <xs:annotation><xs:appinfo>
+
+ <jaxb:javaType name="int"/>
+
+ </xs:appinfo></xs:annotation>
+
+</xs:simpleType>
+
+If the parse method is omitted, then a JAXB
+implementation must perform the one of the following binding options:
+
+. If _javaType_ is one of the following
+primitive types or its corresponding wrapper class _byte, short, int,
+long, float, double_ , bind _xmlType_ to its default Java datatype using
+the parse method for the _xmlType_ defined in _DatatypeConverter_ . If
+necessary, convert the default Java datatype for _xmlType_ to value of
+type _javaType_ by a type cast.
+. Else if default Java datatype defines a
+public one-argument constructor that takes a _java.lang.String_ , use
+_new_ with a _java.lang.String_ parameter for parsing.
+. Else javaType(java.lang.String) does not
+exist, this must result in an invalid binding customization as specified
+in link:jaxb.html#a1544[See Invalid Customizations].
+
+=== [[a2062]]Example: javaType Customization: Java Built-in Type
+
+This example illustrates how to bind a XML
+schema type to a Java type different from the default one.
+
+XML Schema fragment:
+
+<xs:element name="partNumber" type="xs:int"/>
+
+Customization:
+
+<jaxb:globalBindings>
+
+ ....
+
+ <jaxb:javaType name="long"
+
+ xmlType="xs:int"/>
+
+</jaxb:globalBindings>
+
+Since a Java built-in is specified, a parse
+or a print method need not be specified. A JAXB implementation uses the
+parse and print methods defined in _DatatypeConverter_ class for
+converting between lexical representations and values. A JAXB
+implementation unmarshals an input value using the following methods:
+
+ int j =
+(int)DataTypeConverter.parseLong(string);
+
+=== Events
+
+The parse method _parseMethod_ may fail,
+since it is only defined on those strings that are valid representations
+of target Java datatype values and it can be applied to arbitrary
+strings. A parse method must indicate failure by throwing an exception
+of whatever type is appropriate, though it should never throw a
+_TypeConstraintException_ . A JAXB unmarshaller process must ensure that
+an exception thrown by a parse method is caught and, if appropriate, a
+_parseConversionEvent_ event is generated.
+
+The print method _printMethod_ usually does
+not fail. If it does, then the JAXB implementation must ensure that the
+exception thrown by a print method is caught and a
+_printConversionEvent_ is generated.
+
+=== Customization Overrides
+
+The _<javaType>_ overrides the default
+binding of _xmlType_ to the Java datatype specified in
+link:jaxb.html#a725[See Java Mapping for XML Schema Built-in
+Types].
+
+=== [[a2079]]Customizable Schema Elements
+
+=== Simple Type Definition
+
+A _<javaType>_ binding declaration is allowed
+in the annotation element of the of a simple type definition. The
+_javaType_ overrides the default binding of _xmlType_ to the Java
+datatype specified in link:jaxb.html#a725[See Java Mapping for
+XML Schema Built-in Types]. The customization values defined have
+definition scope and thus covers all references to this simple type
+definition.
+
+If the simple type definition is mapped to a
+schema-derived type, an _@XmlJavaTypeAdapter_ is generated on that
+class. Annotation element _@XmlJavaTypeAdapter.value()_ is set to a
+generated classlink:#a5379[28] that extends
+_javax.xml.bind.annotation.adapter.XmlAdapter_ . The generated class’
+_unmarshal_ method must call the <javaType> customization’s parse
+method, which is specified in link:jaxb.html#a1981[See
+<javaType> Declaration]. The generated class’ _marshal_ method must call
+the <javaType> customization’s print method.
+
+===  _GlobalBindings_
+
+A _<javaType>_ binding declaration is allowed
+as part of _<globalBindings>._ The _javaType_ overrides the default
+binding of _xmlType_ to the Java datatype specified in
+link:jaxb.html#a725[See Java Mapping for XML Schema Built-in
+Types]. The customization values defined have global scope.
+
+For each element or attribute declaration
+that references an _xmlType_ that has a globalBindings _<javaType>_
+customization specified for it, the corresponding JAXB property is
+annotated with _@XmlJavaTypeAdapter_ .
+
+===  _<property><baseType>_ declaration
+
+A _<javaType>_ binding declaration is allowed
+as part of _<baseType>_ in the _<property>_ binding declaration. The
+_javaType_ overrides the default binding of _xmlType_ to the Java
+datatype specified in link:jaxb.html#a725[See Java Mapping for
+XML Schema Built-in Types]. Additional semantics are specified in
+link:jaxb.html#a1801[See baseType]” also
+apply.
+
+The schema-derived JAXB property is annotated
+with _@XmlJavaTypeAdapter_ as specified in
+link:jaxb.html#a1801[See baseType]”.
+
+=== [[a2090]] _<typesafeEnum>_ Declaration
+
+This binding declaration allows the
+customization of a binding of an XML schema element to its Java
+representation as an enum type, Section 8.9 in [JLS3]. Only simple type
+definitions with enumeration facets can be customized using this binding
+declaration.
+
+=== [[a2092]]Usage
+
+<typesafeEnumClass> +
+[ name = "enumClassName" ] +
+[ map = “true” | “false” | “1” | “0” ] +
+[ ref = "enumClassName" ] +
+[ <typesafeEnumMember> ... </typesafeEnumMember> ]* +
+[ <javadoc> enumClassJavadoc </javadoc> ] +
+</typesafeEnumClass> +
+ +
+<typesafeEnumMember name = "enumMemberName"> +
+[ value = "enumMemberValue"] +
+[ <javadoc> enumMemberJavadoc </javadoc> ] +
+</typesafeEnumMember>
+
+There are two binding declarations
+_<typesafeEnumClass>_ and _<typesafeEnumMember>_ . The two binding
+declarations allow the enumeration members of an enumeration class and
+enumeration class itself to be customized independently.
+
+The < _typesafeEnumClass>_ declaration
+defines the following customization values:
+
+*  _name_ defines the customization value
+_enumClassName_ , if specified. _enumClassName_ must be a legal Java
+Identifier; it must not have a package prefix. +
+ +
+For an anonymous simple type, the _name_ attribute must be present. If
+absent, it must result in an invalid customization as specified in
+link:jaxb.html#a1544[See Invalid Customizations].”
+*  _map_ determines if the simple type
+definition should be bound to an enum type. When _map_ ’s value is
+_false_ , then the simple type definition must not be bound to an enum
+type. _map_ defaults to _true_ .
+*  _ref_ if specified, is the name of the
+enum class that is provided outside the schema compiler. This
+customization causes a schema compiler to refer to this external enum,
+as opposed to generate a definition. It must include the complete
+package name. This attribute is mutually exclusive with the _className_
+attribute and the _map_ attribute.
+*  _<javadoc>_ element, if specified
+customizes the Javadoc for the enumeration class. _<_ _javadoc>_ defines
+the customization value _enumClassjavadoc_ if specified as described in
+link:jaxb.html#a2142[See <javadoc> Declaration].”
+* Zero or more _<typesafeEnumMember>_
+declarations. The customization values are as defined as specified by
+the _<typesafeEnumMember>_ declaration.
+
+The _<typesafeEnumMember>_ declaration
+defines the following customization values:
+
+*  _name_ must always be specified and
+defines a customization value _enumMemberName_ . _enumMemberName_ must
+be a legal Java identifier.
+*  _value_ defines a customization value
+_enumMemberValue_ , if specified. _enumMemberValue_ must be the
+enumeration value specified in the source schema. The usage of _value_
+is further constrained as specified in link:jaxb.html#a2106[See
+value Attribute].”
+*  _<javadoc>_ if specified, customizes the
+Javadoc for the enumeration constant. _<javadoc>_ defines a
+customization value _enumMemberjavadoc_ if specified as described in
+link:jaxb.html#a2142[See <javadoc> Declaration].”
+
+For inline annotation, the
+_<typesafeEnumClass>_ must be specified in the annotation element of the
+< _simpleType_ > element. The _<typesafeEnumMember>_ must be specified
+in the annotation element of the enumeration member. This allows the
+enumeration member to be customized independently from the enumeration
+class.
+
+===  _value_ [[a2106]] Attribute
+
+The purpose of the _value_ attribute is to
+support customization of an enumeration value using an external binding
+syntax. When the _<typesafeEnumMember>_ is used in an inline annotation,
+the enumeration value being customized can be identified by the
+annotation element with which it is associated. However, when an
+external binding declaration is used, while possible, it is not
+desirable to use XPath to identify an enumeration value.
+
+So when customizing using external binding
+syntax, the _value_ attribute must be provided. This serves as a key to
+identify the enumeration value to which the _<typesafeEnumMember>_
+applies. It’s use is therefore further constrained as follows:
+
+* When _<typesafeEnumMember>_ is specified in
+the annotation element of the enumeration member or when XPath refers
+directly to a single enumeration facet, then the value attribute must be
+absent. If present, it must result in must result in an invalid
+customization as specified in link:jaxb.html#a1544[See Invalid
+Customizations].”
+* When _<typesafeEnumMember>_ is scoped to
+the _typesafeEnumClass_ declaration, the value attribute must be
+present. If absent, it must result in must result in an invalid
+customization as specified in link:jaxb.html#a1544[See Invalid
+Customizations].” The enumMemberValue must be used to identify the
+enumeration member to which the _<typesafeEnumMember>_ applies.
+
+An example of external binding syntax can be
+found in link:jaxb.html#a2134[See Example 2: typesafeEnum
+Customization: External Binding Declaration].”
+
+=== Inline Annotations
+
+There are two ways to customize an
+enumeration class:
+
+* split inline annotation
+* combined inline annotation
+
+In split inline annotation, the enumeration
+value and the enumeration class are customized separately i.e. the
+_<typesafeEnumMember>_ is used independently not as a child element of
+_<typesafeEnumClass>._ An example of this is shown in
+link:jaxb.html#a2129[See Example 1: typesafeEnum Customization:
+Split Inline Annotation].”
+
+In combined inline annotation, the
+enumeration value and the enumeration class are customized together i.e.
+the _<typesafeEnumMember>_ is used as a child element of
+_<typesafeEnumClass>._ This is similar to the customization used in
+external binding declaration. In this case the _value_ attribute must be
+present in the _<typesafeEnumMember>_ for reasons noted in
+link:jaxb.html#a2106[See value Attribute].” An example of this
+customization is shown in link:jaxb.html#a2138[See Example 3:
+typesafeEnum Customization: Combined Inline Annotation].”
+
+=== Customization Overrides
+
+When binding a schema type definition’s Java
+representation to an enum type, the following customization values
+override the defaults specified in Chapter 5. It is specified in a
+common section here and referenced from link:jaxb.html#a1857[See
+Customizable Schema Elements].”
+
+* name: If enumClassName is defined, then the
+name obtained by mapping enumClassName as specified in
+link:jaxb.html#a1608[See Customized Name Mapping].”
+* package name: The name obtained by
+inheriting _packgeName_ from a scope that covers this schema element and
+mapping packageName as specified in link:jaxb.html#a1608[See
+Customized Name Mapping].”
+* enumclass javadoc: _enumClassJavaDoc_ if
+defined, customizes the _class/interface section (_
+link:jaxb.html#a2145[See Javadoc Sections]”) for the enumeration
+class, as specified in link:jaxb.html#a2163[See Javadoc
+Customization].”
+* enum constant set: Each member of the set
+is computed as follows:
+*  name: If enumMemberName is defined, the
+name obtained by mapping enumMemberName as specified in
+link:jaxb.html#a1608[See Customized Name Mapping].”
+* javadoc: _enumMemberJavaDoc_ if defined,
+customizes the _field section (_ link:jaxb.html#a2145[See
+Javadoc Sections]” ) for the enumeration class, as specified in
+link:jaxb.html#a2163[See Javadoc Customization].”
+
+=== [[a2126]]Customizable Schema Elements
+
+Any XML Schema simple type which has an
+enumeration facet can be customized with _<jaxb:typesafeEnumClass>_
+declaration with the following exception. If the simple type definition
+derives from _xs:QName. xs:NOTATIION, xs:base64Binary, xs:hexBinary,
+xs:date, xs:time, xs:dateTime, xs:duration, xs:gDay, xs:gMonth,
+xs:gYear, xs:gMonthDay, xs:gYearMonth, xs:IDREF, xs:ID_ , it must result
+in an invalid customization as specified in
+link:jaxb.html#a1544[See Invalid Customizations].”. Since most
+of these Xml datatypes bind to a mutable Java type, instances of these
+Java types are not sufficient to be an immutable value of an enum
+constant.
+
+* 
+
+=== [[a2129]]Example 1: typesafeEnum Customization: Split Inline Annotation
+
+XML Schema fragment:
+
+<xs:simpleType name="USState"> +
+<xs:annotation><xs:appinfo> +
+<jaxb:typesafeEnumClass name="USStateAbbr"/> +
+</xs:appinfo></xs:annotation> +
+<xs:restriction base="xs:NCName"> +
+<xs:enumeration value="AK"> +
+<xs:annotation><xs:appinfo> +
+<jaxb:typesafeEnumMember name="STATE_AK"/> +
+</xs:appinfo></xs:annotation> +
+</xs:enumeration> +
+<xs:enumeration value="AL"> +
+<xs:annotation><xs:appinfo> +
+<jaxb:typesafeEnumMember name="STATE_AL"/> +
+</xs:appinfo></xs:annotation> +
+</xs:enumeration> +
+</xs:restriction> +
+</xs:simpleType>
+
+Customized derived code:
+
+public enum USStateAbbr \{ +
+STATE_AL, STATE_AK; +
+public String value() \{ return name(); } +
+public static USStateAbbr fromValue(String value) \{ ... } +
+};
+
+=== [[a2134]]Example 2: typesafeEnum Customization: External Binding Declaration
+
+The following example shows how to customize
+the above XML schema fragment using an external binding syntax.
+
+<jaxb:typesafeEnumClass name="USStateAbbr"> +
+<jaxb:typesafeEnumMember name="STATE_AK" value="AK"> +
+<jaxb:typesafeEnumMember name="STATE_AL" value="AL"/> +
+</jaxb:typesafeEnumClass>
+
+The attribute _value_ must be specified for
+_<typesafeEnumMember>_ . This identifies the enumeration member to which
+_<typesafeEnumMember>_ applies.
+
+=== [[a2138]]Example 3: typesafeEnum Customization: Combined Inline Annotation
+
+The following example shows how to customize
+the above XML schema fragment using inline annotation which does not
+split the external binding syntax.
+
+<xs:simpleType name="USState"> +
+<xs:annotation><xs:appinfo> +
+<jaxb:typesafeEnumClass name="USStateAbbr"> +
+<jaxb:typesafeEnumMember name="STATE_AK" value="AK"/> +
+<jaxb:typesafeEnumMember name="STATE_AL" value="AL"/> +
+</jaxb:typesafeEnumClass> +
+</xs:appinfo></xs:annotation> +
+<xs:restriction base="xs:NCName"> +
+<xs:enumeration value="AK"/> +
+<xs:enumeration value="AL"/> +
+</xs:restriction> +
+</xs:simpleType>
+
+The attribute value must be specified for
+_typesafeEnumMember_ . This identifies the enumeration member to which
+the binding declaration applies.
+
+===  _<javadoc>_ [[a2142]] Declaration
+
+The _<javadoc>_ declaration allows the
+customization of a javadoc that is generated when an XML schema
+component is bound to its Java representation.
+
+This binding declaration is not a global XML
+element. Hence it can only be used as a local element within the content
+model of another binding declaration. The binding declaration in which
+it is used determines the section of the Javadoc that is customized.
+
+=== [[a2145]]Javadoc Sections
+
+The terminology used for the javadoc sections
+is derived from “Requirements for Writing Java API Specifications” which
+can be found online at http:
+_//java.sun.com/j2se/javadoc/writingapispecs/index.html._
+
+The following sections are defined for the
+purposes for customization:
+
+* package section (corresponds to package
+specification)
+* class/interface section (corresponds to
+class/interface specification)
+* method section (corresponds to method
+specification)
+* field section (corresponds to field
+specification)
+
+=== Usage
+
+Note that the text content of a _<javadoc>_
+element must use _CDATA_ or _&lt;_ to escape embedded HTML tags.
+
+<javadoc>
+
+ Contents in &lt;b>Javadoc&lt;\b> format.
+
+</javadoc>
+
+or
+
+<javadoc>
+
+ <<![CDATA[
+
+ Contents in <b>Javadoc<\b> format
+
+ ]]>
+
+</javadoc>
+
+=== [[a2163]]Javadoc Customization
+
+The Javadoc must be generated from the
+_<javadoc>_ element if specified. The Javadoc section depends upon where
+_<javadoc>_ element is used. JAXB providers may generate additional
+provider specific Javadoc information (for example, contents of the
+_<xs:documentation>_ element).
+
+===  _<dom>_ [[a2165]] Declaration
+
+The _<dom>_ customization binds an XML Schema
+component to DOM rather than to a strongly typed Java representation.
+Specifically, JAXB bindings for mixed content and wildcard result in a
+hybrid mixture of strongly typed Java instances with DOM nodes or
+java.lang.String, representing text info. These mixed bindings might be
+more easily processed solely as one form, namely as an XML fragment
+represented as DOM. This customization also meets a JAX-WS 2.0
+databinding requirement from link:jaxb.html#a179[See Disabling
+Databinding]”.
+
+=== Usage
+
+The syntax for the customization is the
+following:
+
+<dom [ [type= "w3c" |
+_otherDomRepresentations_ ] />
+
+You can use the optional type attribute to
+specify the type of DOM. By default, it is W3C DOM.
+
+=== Customizable Schema Elements
+
+This customization can be attached to the
+following XML Schema components:
+
+* Element declaration ( _<xs:element>_ )
+* Type definition ( _<xs:complexType>_ and
+_<xs:simpleType>_ )
+* Wildcard ( _<xs:any>_ )
+* Model groups ( _<xs:choice>_ _,_ _<xs:all>_
+_,_ _<xs:sequence>_ )
+* Model group definition ( _<xs:group>_ )
+* Particle
+
+For all of the above cases, the Java
+representation of the DOM element is an instance of the Element class
+for the specified DOM representation. For example, W3C DOM element is
+bound to _org.w3c.dom.Element_ .
+
+Special Case Handling of DOM customization on
+a:
+
+*  _type definition_ - it is semantically
+equivalent to placing the dom customization on each element declaration
+referencing that type definition.
+*  _global element declaration_ - it is
+semantically equivalent to placing the dom customization on each element
+declaration referencing, via _@ref_ , the global element declaration.
+The dom customization on the global element declaration does not cause
+that element to be unmarshalled as DOM when it is the root element of an
+XML document nor when the element is part of a wildcard content JAXB
+property.
+*  _mixed content_ - if an XML schema
+component is annotated with a _dom_ customization and that XML schema
+component can contain character data information due to its parent
+complex type definition being defined with mixed content, character data
+information is handled as specified in link:jaxb.html#a1369[See
+Bind mixed content]”.
+
+The dom customization allows one to disable
+databinding and process a part of a document using other technologies
+that require “raw” XML.
+
+=== Examples
+
+=== Wildcard Binding Example
+
+A wildcard is mapped to a List of
+_org.w3c.dom.Element_ . Each element that matches to the wildcard will
+be turned into a DOM tree.
+
+<xs:complexType name=”foo”> +
+<xs:sequence> +
+<xs:any maxOccurs="unbounded" processContents="lax"> +
+_<xs:annotation><xs:appinfo> +
+<jaxb:dom/> +
+</xs:appinfo></xs:annotation> +
+_ </xs:any> +
+</xs:sequence> +
+</xs:complexType>
+
+ +
+import org.w3c.dom.Element; +
+public class Foo \{ +
+@XmlAnyElement(lax=”false”) +
+List<Element> getContent()\{...} +
+}
+
+=== Wildcard and Mixed Content Binding Example
+
+If the complexType definition above is
+defined to have mixed content, due to element _[complexType]_ __ having
+attribute _@mixed=”true”_ , the JAXB binding is:
+
+import org.w3c.dom.Element; +
+public class Foo \{ +
+/* Element content is represented _org.w3c.dom.Element_ . +
+* Character data information is represented as instances of +
+* _java.lang.String_ . */ +
+@XmlMixed +
+@XmlAnyElement(lax=”false”) +
+List<Object> getContent()\{...} +
+}
+
+===  _<inlineBinaryData>_ [[a2193]] Declaration
+
+The _<inlineBinaryData>_ customization
+provides declarative control over the optimization for binary data
+described in link:jaxb.html#a5109[See Appendix],
+link:jaxb.html#a5110[See Enhanced Binary Data Handling].
+
+=== Usage
+
+The syntax for the customization is the
+following:
+
+<inlineBinaryData/>
+
+This customization disables considering the
+binary data optimization for a schema component containing binary data.
+
+This customization can be attached to the
+following XML Schema components:
+
+* Element declaration ( _<xs:element>_ ) with
+binary data or
+* Type definition ( _<xs:complexType>_ and
+_<xs:simpleType>_ ) deriving from binary datatype
+
+When a schema component that binds to a JAXB
+property is customized with <inlineBinaryData>, its schema-derived JAXB
+property is annotated with _@XmlInlineBinaryData_ . When a type
+definition is customized with <inlineBinaryData>, its schema-derived
+class is annotated with program annotation _@XmlInlineBinaryData_ .
+
+===  _<factoryMethod>_ Declaration
+
+The _<factoryMethod>_ customization provides
+declarative control over an element or type factory method name
+generated in a package’s _ObjectFactory_ class introduced in
+link:jaxb.html#a482[See Java Package].”. This customization is
+useful to resolve name collisions between factory methods in the
+schema-derived _ObjectFactory_ class.
+
+=== Usage
+
+The syntax for the customization is the
+following:
+
+<factoryMethod
+name=”BaseForFactoryMethodName”/>
+
+The customization value defined is:
+
+*  _name -_ each character of name must be a
+valid part of a Java identifier as determined by
+_java.lang.Character.isJavaIdentifierPart()._
+
+The name of the factory method is generated
+by concatenating the following components:
+
+* The string constant _create_
+*  _@name_ ’s value
+
+=== Usage Constraints
+
+The usage constraints on _<factoryMethod>_
+are specified below. Any constraint violation must result in an invalid
+customization as specified in link:jaxb.html#a1544[See Invalid
+Customizations].” The usage constraints are:
+
+.  _<factoryMethod>_ is only allowed to
+annotate an element declaration or a type definition.
+
+Note that this customization does not require
+a factory method to be generated, it simply provides a factory method
+name if a factory method is to be generated for the annotated element
+declaration or type definition. Section 6 and 7 specifies when a factory
+method is generated for an element declarations or type definitions.
+
+=== [[a2217]]Annotation Restrictions
+
+[XSD PART 1] allows an annotation element to
+be specified for most elements but is ambiguous in some cases. The
+ambiguity and the way they are addressed are described here.
+
+The source of ambiguity is related to the
+specification of an annotation element for a reference to a schema
+element using the “ref” attribute. This arises in three cases:
+
+* A local attribute references a global
+attribute declaration using the “ref” attribute.
+* A local element in a particle references a
+global element declaration using the “ref” attribute.
+* A model group in a particle references a
+model group definition using the “ref” attribute.
+
+For example in the following schema fragment
+(for brevity, the declaration of the global element “Name” and “Address”
+has been omitted).
+
+ _<xs:element name = "Customer">_
+
+ _<xs:complexType>_
+
+ _<xs:element ref = "Name"/>_
+
+ _<xs:element ref = "Address" />_
+
+ _</xs:complexType>_
+
+ _</xs:element>_
+
+XML Schema spec is ambiguous on whether an
+annotation element can be specified at the reference to the “Name”
+element.
+
+The restrictions on annotation elements has
+been submitted as an issue to the W3C Schema Working Group along with
+JAXB technology requirements (which is that annotations should be
+allowed anywhere). Pending a resolution, the semantics of annotation
+elements where the XML spec is unclear are assumed as specified as
+follows.
+
+This specification assumes that an annotation
+element can be specified in each of the three cases outlined above.
+Furthermore, an annotation element is assumed to be associated with the
+abstract schema component as follows:
+
+* The annotation element on an attribute ref
+is associated with \{Attribute Use}
+* The annotation element on a model group ref
+or an element reference is associated with the \{particle}.
+
+== CHAPTER 8 - 
+
+[[a2236]]Java Types To XML
+
+=== Introduction
+
+This chapter specifies the mapping from
+program elements to XML Schema. The mapping includes a default as well
+as a customized mapping.
+
+=== Overview
+
+This section is non normative and provides a
+high level view of Java to XML Schema mapping targeted towards both JAXB
+application developers and JAXB implementation vendors.
+
+=== Mapping Scope
+
+The mapping covers program elements commonly
+used in the composition of a data model for an application: package,
+field, property and types (classes and enum construct). Additionally,
+the mapping scope also covers mapping annotations used to annotate
+schema derived code.
+
+In so far as possible, a program element is
+mapped to an equivalent XML Schema construct in an intuitive manner.
+Thus,
+
+* Package maps to a XML target namespace. A
+package provides a naming context for types. A XML target namespace
+provides a naming context for schema components such as elements, type
+definitions.
+* Type maps to a schema type. A value type is
+a data container for values; e.g. a value class contains values
+represented by it’s properties and fields. A schema type is a datatype,
+an instance of which (e.g. element) acts as a data container for values
+represented by schema components within a schema type’s content model
+(e.g. element, attributes, etc.). Thus a type maps naturally to a schema
+type. For e.g.,
+*  class typically maps to a complex type
+definition
+* java primitive types and wrapper classes map
+to XML Schema simple type definition.
+* Field or property maps to an element or an
+attribute contained within the complex type to which a type is mapped.
+* Enum type maps to a simple schema type
+constrained by enumeration facets.
+
+The input to the mapping process is one or
+more sets of packages or classes. A package or a class is mapped and
+recursively, fields, properties and types contained with it. The mapping
+is customizable.
+
+=== Mapping Annotations
+
+Mapping annotationsThe mapping of program
+elements to XML Schema construct can be customized using mapping
+annotations, program annotations based on JSR 175 program annotation
+facility. Mapping annotations are used for:
+
+* customizing the Java to XML schema mapping.
+* annotating schema derived code.
+* control over optimized binary data encoding.
+
+The mapping annotations are described in the
+_javax.xml.bind.annotation_ and _javax.xml.bind.annotation.adapters_
+packages.
+
+Retention Policy The retention policy of all
+mapping annotations is RetentionPolicy.RUNTIME. This policy allows
+introspection of mapping annotations at runtime. Introspection can be
+used by JAXB binding framework to marshal/unmarshal an object graph to
+XML representation or to customize the mapping of program elements to
+XML Schema constructs. This policy also allows a JAXB vendor
+implementation to generate a schema from a program element’s compiled
+form rather than its source.
+
+=== XML Name Derivation
+
+Mapped program element is a program element
+that has been mapped to an XML Schema construct. It is possible to use
+_@XmlTransient_ annotation type to prevent the mapping of a program
+element.
+
+XML Names An XML name may be needed for the
+schema components for a mapped program element, for e.g. element name.
+XML names are usually derived from a program element name, for e.g.
+property, field, class name etc.But they can be customized using mapping
+annotation. When an XML name is derived from a property name, bean de
+capitalization rules are used. If a Java Identifier is not a legal XML
+name, then a legal XML name can be assigned using an annotation element
+(e.g. _@XmlType(name=”foo”)_ ).
+
+=== Fields and Properties
+
+XML global element Fields and properties
+typically map to local elements within a complex type for a class. But a
+well formed XML document begins with a root element (a global element in
+the corresponding schema). The _@XmlRootElement_ annotation can be used
+to associate a global element with a class or an enum type.
+
+Null Value and Nillable Element A null value
+for a type mapped to an XML Schema element in two ways: absence of an
+element or an nillable element. The mapping annotation for an element
+allows either mapping.
+
+
+
+=== Type Mapping
+
+Legacy applications One of the primary use
+cases for Java language to XML Schema mapping is to allow an existing
+application to be exported as a web service. In many cases, the existing
+applications are legacy applications consisting of classes that follow
+different class designs. The annotations and default mapping are
+designed to enable such classes to be mapped to schema with minimal
+changes to existing code. See link:jaxb.html#a3676[See Default
+Mapping] for default mapping.
+
+Class A class usually maps to a complex type.
+However, using _@XmlValue_ annotation, a class can also be mapped to a
+simple type (to hold a simple value) or a complexType with simpleContent
+(to hold a simple value and attributes). The _@XmlType_ annotation can
+be used to customize the mapping of a class. For example, it can be used
+to map a class to an anonymous type or to control the ordering of
+properties and/or fields. Properties and fields are unordered; but they
+can be mapped to a content model that is ordered (e.g. xs:sequence) or
+unordered content model (xs:all).
+
+Class Designs A class with a public or
+protected no-arg constructor can be mapped. If a class has a static
+zero-arg factory method, then the factory method can be specified using
+the annotation element _@XmlType.factoryMethod()_ and
+_@XmlType.factoryClass()_ .
+
+Ordering of Properties/fields: The ordering of
+properties and fields can be customized in one of two ways: at the
+package level using @XmlAccessorOrder or using _@XmlType.propOrder()_ at
+the class level.
+
+Class Hierarchy Mapping Class hierarchy
+typically maps to a type derivation hierarchy. The _@XmlType_ and
+_@XmlValue_ annotations together provide support mapping class hierarchy
+to schema type hierarchy where XML Schema complex type derives by
+extension from either another complex type or a simple type.
+
+Supported Collection Types Typed collections
+and untyped collections are mapped. Mapped collection types are: arrays,
+indexed properties and parametric types. Mapped untyped collection are:
+_java.util.List_ , _java.util.Set_ and _java.util.HashMap_ . Of these,
+_java.util.HashMap_ does not map naturally to a XML Schema construct.
+For example, _HashMap_ can have different XML serialized forms which
+differ in trade-offs made between memory and speed or specificity and
+generality. The XML serialization form can be customized using
+_@XmlJavaTypeAdapter_ (link:jaxb.html#a2278[See Adapter]”).
+
+Collection serialized forms A collection type
+can be mapped to a XML Schema complex type and collection item is mapped
+to local element within it. Alternately, a parameterized collection
+(e.g. List<Integer>) can be mapped to a simple schema type that derives
+by list.
+
+When a collection type is mapped to a XML
+Schema complex type, the mapping is designed to support two forms of
+serialization shown below.
+
+//Example: code fragment +
+int[] names; +
+ +
+// XML Serialization Form 1 (Unwrapped collection) +
+// Element name is derived from property or field name +
+<names> ... </names> +
+<names> ... </names> +
+... +
+ +
+// XML Serialization Form 2 ( Wrapped collection ) +
+// Element name of wrapper is derived from property or field name +
+// Element name of each item in collection is also derived from
+
+// property name +
+<names> +
+<names> value-of-item </names> +
+<names> value-of-item </names> +
+.... +
+</names>
+
+The two serialized XML forms allow a null
+collection to be represented either by absence or presence of an element
+with a nillable attribute. The _@XmlElementWrapper_ annotation on the
+property or field is used to customize the schema corresponding to the
+above XML serialization forms.
+
+A parameterized collection (e.g.
+List<Integer>) can also be mapped to simple schema that derives by list
+using _@XmlList_ annotation. For e.g. the serialized XML form is: “1 2 3
+“.
+
+=== [[a2278]]Adapter
+
+A type may not map naturally to a XML
+representation (see Supported Collection Types above). As another
+example, a single instance of a type may have different on wire XML
+serialization forms.
+
+Adapter approach defines a portable
+customization mechanism for applications exemplified above. The
+mechanism provides a way to adapt a bound type, a Java type used to
+process XML content, to value type, mapped to an XML representation or
+vice versa. It is the value type that is used for marshalling and
+unmarshalling. Use of this approach involves two steps:
+
+* provide an adapter class that extends the
+abstract class _@javax.xml.bind.annotation.adapters.XmlAdapter_ that
+defines two methods _unmarshal()_ and _marshal()_ . The methods are
+invoked by JAXB vendor implementation during unmarshalling and
+marshaling respectively to adapt between bound and value types.
+* specify the adapter class using the
+_@XmlJavaTypeAdapter_ annotation.
+
+=== Referential Integrity
+
+Preserving referential integrity of an object
+graph across XML serialization followed by a XML de serialization,
+requires an object reference to be marshalled by reference or
+containment appropriately. Possible strategies include:
+
+* marshal all references to a given object by
+reference.
+* marshal the first reference to an object by
+containment and subsequent references to the same object by reference.
+
+Depending on the strategy, the schema to which
+program element is mapped also varies accordingly.
+
+Two annotations _@XmlID_ and _@XmlIDREF_
+provide the mechanism which can be used together to map program element
+by reference or containment. This places the burden of preserving
+referential integrity on a developer. On the other hand, the ability to
+customize the mapping is useful since it can result in mapping of
+program elements to a schema that defines a document structure more
+meaningfully to an application than a default derived schema.
+
+=== Property/Field Name Collision
+
+A XML name collision can arise when the
+property name obtained by bean de capitalization and the name of a field
+map to a same schema component. For example
+
+public int item;
+
+pubilc int getItem();
+
+public void setItem(int val);
+
+The name collision occurs because the property
+name, bean de capitalization, and the name of the public field are both
+the same i.e. _item._ In the case, where the property and the public
+field refer to the same field, the _@XmlTransient_ can be used to
+resolve the name collision by preventing the mapping of either the
+public field or the property.
+
+=== Naming Conventions
+
+Any source and schema fragments and examples
+shown in this chapter are meant to be illustrative rather than
+normative.
+
+*  _@XmlAttribute_ denotes both a program
+annotation type as well a specific use of annotation type.
+* The prefix _xs:_ is used to refer to schema
+components in W3C XML Schema namespace.
+* The prefix _ref:_ is used to refer to schema
+components in the namespace _“http://ws-i.org/profiles/basic/1.1/xsd”_
+* 
+
+=== Constraint Violations
+
+For the purpose of mapping and constraint
+checking, if a program element is not annotated explicitly, and there is
+a default mapping annotation defined for that element, it must be
+applied first before performing any constraint checks or mapping. This
+is assumed in the normative mapping tables shown below.
+
+The mapping of program elements to XML Schema
+constructs is subject to mapping constraints, specified elsewhere in
+this chapter. The mapping constraints must be enforced by the
+_javax.xml.bind.annotation.JAXBContext.newInstance(..)_ method. Any
+cycles resulting from a combination of annotations or default mapping
+must be detected in
+_javax.xml.bind.annotation.JAXBContext.newInstance(..)_ method and also
+constitutes a constraint violation. A _javax.xml.bind.JAXBException_ or
+(its subclass, which can be provider specific) must be thrown upon a
+constraint violation.
+
+A JAXB Provider must support the schema
+generation at runtime. See
+_javax.xml.bind.JAXBContext.generateSchema(..)_ for more information.
+
+=== Type Mapping
+
+This section specifies the mapping of Java
+types to XML Schema.
+
+=== Java Primitive types
+
+The default mapping of Java types (and their
+wrapper classes) specified in table link:jaxb.html#a2310[See
+Mapping: Java Primitive types to Schema Types] must be supported.
+
+=== [[a2310]]Mapping: Java Primitive types to Schema Types
+
+Java Primitive Type
+
+XML data type
+
+boolean
+
+xs:boolean
+
+byte
+
+xs:byte
+
+short
+
+xs:short
+
+int
+
+xs:int
+
+long
+
+xs:long
+
+float
+
+xs:float
+
+double
+
+xs:double
+
+=== Java Standard Classes
+
+The default mapping of Java classes specified
+in link:jaxb.html#a2329[See Mapping of Standard Java classes]
+must be supported.
+
+=== [[a2329]]Mapping of Standard Java classes
+
+Java Class
+
+XML data type
+
+java.lang.String
+
+xs:string
+
+java.math.BigInteger
+
+xs:integer
+
+java.math.BigDecimal
+
+xs:decimal
+
+java.util.Calendar
+
+xs:dateTime
+
+java.util.Date
+
+xs:dateTime
+
+javax.xml.namespace.QName
+
+xs:QName
+
+java.net.URI
+
+xs:string
+
+javax.xml.datatype.XMLGregorianCalendar
+
+xs:anySimpleType
+
+javax.xml.datatype.Duration
+
+xs:duration
+
+java.lang.Object
+
+xs:anyType
+
+java.awt.Image
+
+xs:base64Binary
+
+javax.activation.DataHandler
+
+xs:base64Binary
+
+javax.xml.transform.Source
+
+xs:base64Binary
+
+java.util.UUID
+
+xs:string
+
+
+
+* 
+
+A byte[] must map to xs:base64Binary by
+default.
+
+=== Generics
+
+=== Type Variable
+
+The following grammar is from [JLS], Section
+4.4, “Type Variables”.
+
+ _TypeParameter: +
+TypeVariable TypeBoundopt_
+
+
+
+ _TypeBound: +
+extends ClassOrInterfaceType AdditionalBoundListopt_
+
+A type variable without a Typebound must be
+mapped to xs:anyType.
+
+A type variable with a TypeBound must map to
+the schema type to which ClassOrInterfaceType is mapped; the mapping of
+ClassOrInterface is subject to the mapping constraints specified in
+other sections in this chapter.
+
+<!-- code fragment
+
+public class Shape <T> \{
+
+ public T xshape;
+
+ public Shape() \{};
+
+ public Shape(T f) \{
+
+ xshape = f;
+
+ }
+
+}
+
+
+
+<!-- XML Schema
+
+<xs:complexType name="shape">
+
+ <xs:sequence>
+
+ <xs:element name="xshape" type="xs:anyType"
+minOccurs="0"/>
+
+ </xs:sequence>
+
+ </xs:complexType>
+
+=== [[a2386]]Type Arguments and Wildcards
+
+The following grammar is from [JLS], Section
+4.5.1, “Type Arguments and Wildcards”.
+
+TypeArguments:
+
+ <ActualTypeArgumentList>
+
+
+
+ActualTypeArgumentList:
+
+ ActualTypeArgument
+
+ ActualTypeArgumentList, ActualTypeArgument
+
+
+
+ActualTypeArgument:
+
+ ReferenceType
+
+ Wildcard
+
+
+
+Wildcard:
+
+?WildcardBounds
+
+
+
+WildcardBounds:
+
+ extends ReferenceType
+
+ super ReferenceType
+
+A wildcard without a WildcardBounds must map
+to schema type xs:anyType.
+
+A wildcard with a WildcardBounds whose super
+type is ReferenceType must map to schema type xs:anyType.
+
+A wildcard with a WildcardBounds that extends
+a ReferenceType must map to the schema type to which the ReferenceType
+is mapped; this mapping is subject to the mapping constraints specified
+in other sections in this chapter and is determined by the annotations
+as specified in the mapping tables in the chapter. For example:
+
+
+
+
+
+/** EXAMPLE : WildcarType Mapping
+
+// Code fragment
+
+public class Shape \{...}
+
+
+
+public class Rectangle extends Shape \{...}
+
+public class Circle extends Shape \{...}
+
+
+
+public class Foo \{
+
+ public java.util.List<? extends Shape>
+shapes;
+
+}
+
+
+
+<-- XML Schema fragment
+
+<xs:complexType name="shape">
+
+ ...
+
+</xs:complexType>
+
+
+
+<xs:complexType name="circle">
+
+ <xs:complexContent>
+
+ <xs:extension base="shape">
+
+ ...
+
+ </xs:extension>
+
+ </xs:complexContent>
+
+ </xs:complexType>
+
+
+
+<xs:complexType name="rectangle">
+
+ <xs:complexContent>
+
+ <xs:extension base="shape">
+
+ ...
+
+ </xs:extension>
+
+ </xs:complexContent>
+
+</xs:complexType>
+
+
+
+<xs:complexType name="foo">
+
+ <xs:sequence>
+
+ <xs:element name="shapes" type="shape"
+nillable="true"
+
+ maxOccurs="unbounded" minOccurs="0"/>
+
+ </xs:sequence>
+
+</xs:complexType>
+
+
+
+=== Collections
+
+The following collection must be supported:
+
+*  _java.util.Map_ and its subtypes (e.g.
+java.util.HashMap)
+*  _java.util.Collection_ and it’s subtypes
+(e.g. java.util.List)
+
+The mapping of collection depends upon the
+annotations on the program elements and is specified in the mapping
+tables. This specification uses a collection type to be one of
+_java.util.Collection_ (or a subtype derived from it) , an array or an
+JavaBean index property.
+
+=== Java Package
+
+ _@XmlSchema_ is used in the mapping of
+package to an XML target namespace.
+
+=== [[a2456]]@XmlSchema
+
+=== Synopsis
+
+public enum XmlNsForm \{UNQUALIFIED,
+QUALIFIED, UNSET}
+
+
+
+@Retention(RUNTIME) @Target(\{})
+
+public @interface XmlNs \{
+
+
+
+@Retention(RUNTIME) @Target(\{PACKAGE})
+
+public @interface XmlSchema \{
+
+ XmlNs[] xmlns() default \{};
+
+ String namespace() default "";
+
+ String location() default "";
+
+ XmlNsForm elementFormDefault() default
+XmlNsForm.UNSET;
+
+ XmlNsForm attributeFormDefault() default
+XmlNsForm.UNSET;
+
+}
+
+=== Mapping
+
+If _location()_ is “”, a package annotated
+with _@XmlSchema_ must be mapped as specified in
+link:jaxb.html#a2476[See Mapping: Package to XML target
+namespace]. Otherwise a package will not produce any schema document.
+
+* 
+
+* 
+
+
+
+=== Mapping: Package to [[a2476]]XML target namespace
+
+ _targetNamespace_
+
+if _@XmlSchema.namespace()_ is __ "" _,_ then
+_absent;_
+
+
+
+otherwise @XmlSchema.namespace()
+
+ _elementFormDefault_
+
+ if the value of
+_@XmlSchema.elementFormDefault()_ is _@XmlNsForm.UNSET,_ then _absent;_
+
+
+
+otherwise, the value of
+_@XmlSchema.elementFormDefault()_
+
+ _attributeFormDefault_
+
+ if the value of
+_@XmlSchema.attributeFormDefault()_ is _@XmlNsForm.UNSET,_ then
+_absent;_
+
+
+
+otherwise, the value of
+_@XmlSchema.attributeFormDefault()_
+
+ _Namespace prefixes_
+
+if _@XmlSchema.xmlns()_ is \{} then
+implementation defined;
+
+
+
+otherwise _@XmlSchema.xmlns()_
+
+=== @XmlAccessorType
+
+This annotation allows control over default
+serialization of fields and properties.
+
+=== Synopsis
+
+@Inherited @Retention(RUNTIME)
+@Target(\{PACKAGE, TYPE})
+
+public @interface XmlAccessorType \{
+
+ XmlAccessType value() default
+XmlAccessType.PUBLIC_MEMBER;
+
+}
+
+
+
+public enum XmlAccessType \{ NONE, PROPERTY,
+FIELD, PUBLIC_MEMBER}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+This annotation can be used only with the
+following other annotations: _@XmlType, @XmlRootElement_ ,
+_@XmlAccessorOrder, @XmlSchema, @XmlSchemaType, @XmlSchemaTypes,
+@XmlJavaTypeAdapters._ It can also be used with the following
+annotations at the package level: _@ XmlJavaTypeAdapter_ .
+
+See link:jaxb.html#a3676[See Default
+Mapping]”.
+
+=== [[a2506]]@XmlAccessorOrder
+
+This annotation allows control over the
+default ordering of properties and fields that are mapped to XML
+elements. Properties and fields mapped to XML attributes are not
+impacted by this annotation since XML attributes are unordered.
+
+=== Synopsis
+
+@Inhertited @Retention(RUNTIME)
+@Target(\{PACKAGE, TYPE})
+
+public @interface XmlAccessorOrder \{
+
+ XmlAccessOrder value() default
+XmlAccessOrder.UNDEFINED;
+
+}
+
+
+
+public enum XmlAccessOrder \{ UNDEFINED,
+ALPHABETICAL}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+. This annotation can be
+used only with the following other annotations: _@XmlType,
+@XmlRootElement_ , _@XmlAccessorType, @XmlSchema, @XmlSchemaType,
+@XmlSchemaTypes, @XmlJavaTypeAdapters._ It can also be used with the
+following annotations at the package level: _@ XmlJavaTypeAdapter_ .
+
+If the value of _@XmlAccessorOrder.value()_ is
+_XmlAccessOrder.ALHPHABETICAL_ , then the default ordering of
+fields/properties is lexicographic order as determined by
+_java.lang.String.CompareTo((String anotherString)_ .
+
+If the _@XmlAccessorOrder.value()_ is
+_XmlAccessOrder.UNDEFINED_ , then the default ordering of
+fields/properties is unspecified.
+
+=== [[a2520]]@XmlSchemaType
+
+This annotation allows a customized mapping to
+a XML Schema built in type. This is useful where a Java type can map to
+more than one schema built in types. An example is
+_XMLGregorianCalendar_ which can represent one of the eight schema
+built-in types.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD,
+PACKAGE})
+
+public @interface XmlSchemaType \{
+
+ String name();
+
+ String namespace() default
+"http://www.w3.org/2001/XMLSchema";
+
+ Class type() default DEFAULT.class;
+
+ static final class DEFAULT \{}
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* name() must be an atomic simple type schema
+type (or a type that derives from it) to which the type of the property
+or field can be mapped from XML Schema -> Java as specified in Section
+6.2.2, “Atomic Datatype”. Example
+
+
+
+ // @XmlSchemaType can specify any one of the
+eight calendar types
+
+ // that map to XMLGregorianCalendar.
+
+ @XmlSchemaType(name=”date”)
+
+ XMLGregorianCalendar foo;
+
+*  If the annotation is used as a package
+level annotation or within _@XmlSchemaTypes_ , value of
+_@XmlSchemaType.type()_ must be specified and must be the Java type that
+is being customized.
+* If the annotation is used on a field or a
+method, then value of type() must be DEFAULT.class.
+* This annotation can only be used with the
+following other annotations: _@XmlElement, @XmlAttribute,
+@XmlJavaTypeAdapter, @XmlJavaTypeAdapters._
+
+package:
+
+When this annotation is used at the package
+level, the mapping applies to references to _@XmlSchemaType.type()_ as
+specified below. For clarity, the following code example is used along
+with normative text.
+
+// Example: change the default mapping at
+package level
+
+package foo;
+
+@javax.xml.bind.annotation.XmlSchemaType
+
+ (name="date",
+
+
+type=javax.xml.datatype.XMLGregorianCalendar.class)
+
+A _@XmlSchemaType_ that is specified as a
+package level annotation must apply at the point of reference as
+follows:
+
+. a property/field within a class in package
+(e.g _exmple.po)_ whose reference type is _@XmlSchemaType.type()_ . For
+e.g.
+
+ // XMLGregorianCalendar will be mapped to XML
+Schema type "date"
+
+ XMLGregorianCalendar cal;
+
+. a property/field within a class in package
+(e.g _exmple.po)_ , where _@XmlSchemaType.type()_ is used as a
+parametric type. For e.g.
+
+ // Example: Following code maps to a
+repeating element with
+
+ // XML Schema type of "date".
+
+ List<XMLGregorianCalendar> bar;
+
+property/field:
+
+A _@XmlSchemaType_ specified on the
+property/field maps references to _@XmlSchemaType.type()_ as follows:
+
+. property/field is a single valued.
+
+ // Maps XMLGregorianCalendar to XML Schema
+type "date"”
+
+ @XmlSchemaType(name=”date”)
+
+ public XMLGregorianCalendar cal;
+
+. a property/field where
+_@XmlSchemaType.type()_ is used as a parametric type. For e.g.
+
+ // Example: Following code maps to a
+repeating element with
+
+ // XML Schema type of "date".
+
+ @XmlSchemaType(name="date")
+
+ List<XMLGregorianCalendar> bar;
+
+=== @XmlSchemaTypes
+
+This annotation is a container annotation for
+defining multiple _@XmlSchemaType_ annotations at the package level.
+
+=== Synopsis
+
+ @Retention(RUNTIME) @Target(\{PACKAGE})
+
+ public @interface XmlSchemaTypes \{
+
+ // Collection of @\{@link XmlSchemaType}
+annotations
+
+ XmlSchemaType[] value();
+
+ }
+
+=== Mapping
+
+Each _@XmlSchemaType_ annotation in
+_@XmlSchemaTypes.value()_ must be mapped as specified in
+link:jaxb.html#a2520[See @XmlSchemaType]”.
+
+=== Java class
+
+=== [[a2578]]@XmlType
+
+ _@XmlType_ is used to map a Java class to a
+schema type. The schema type is computed from its annotation element
+values.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{TYPE})
+
+public @interface XmlType \{
+
+ String name() default "##default";
+
+ String[] propOrder() default \{""};
+
+ String namespace() default "##default" ;
+
+ Class factoryClass() default DEFAULT.class;
+
+ static final class DEFAULT \{};
+
+ String factoryMethod() default "";
+
+}
+
+
+
+=== [[a2591]]Mapping
+
+The following mapping constraints must be
+enforced:
+
+* a class must be either be a top level class
+or a nested static class.
+* a class must have a public or protected
+no-arg constructor or a factory method identified by \{ _factoryClass(),
+factoryMethod()_ } unless it is adapted using _@XmlJavaTypeAdapter_ .
+* If _factoryClass()_ is other than
+DEFAULT.class, then _factoryMethod()_ must be specified (i.e. the
+default value ““ cannot be used.)
+* If _factoryClass()_ is _DEFAULT.class_ and
+_factoryMethod()_ is not ““, then _factoryMethod()_ be a method in this
+class.
+* if _@XmlType.propOrder_ is not \{} or \{““},
+then the set must include all of the properties and fields mapped to
+particles as specified in:
+* link:jaxb.html#a2898[See
+@XmlElement]”
+* link:jaxb.html#a3019[See
+@XmlElements]”
+* link:jaxb.html#a3049[See
+@XmlElementRef]”
+* link:jaxb.html#a3112[See
+@XmlElementRefs]”
+*  _@XmlType.propOrder_ must not include a
+field or property annotated with _@XmlTransient._
+* if the class, subClass, derives from another
+XML-bound class, baseClass directly or indirectly (other than
+java.lang.Object), then the subClass must not contain a mapped property
+or field annotated with _@XmlValue_ annotation.
+* If a class contains a mapped property or
+field annotated with _@XmlValue_ annotation, then all other mapped
+fields or properties in the class must be mapped to an XML attribute.
+* This annotation can be used with the
+following annotations: _@XmlRootElement, @XmlAccessorOrder,
+@XmlAccessorType._
+* Even though the syntax allows it, @XmlType
+is disallowed on an interface.
+
+A class annotated with @ _XmlType_ , must be
+mapped as specified below:
+
+class must be mapped as specified in
+link:jaxb.html#a2678[See Mapping: Class to Simple Type
+Definition] if the class contains only one mapped property or field that
+is annotated with @ _XmlValue_ as specified in
+link:jaxb.html#a3331[See @XmlValue]”.
+
+otherwise, the class must be mapped as
+specified in link:jaxb.html#a2611[See Mapping: Class to Complex
+Type
+Definition].
+
+=== [[a2611]]Mapping: Class to Complex Type Definition
+
+\{name}
+
+if _@XmlType.name()_ is ““, then absent
+
+
+
+otherwise if _@XmlType.name()_ is “
+_##default_ “, then the XML name derived from the class name as
+specified in link:jaxb.html#a3678[See Java Identifier To XML
+Name]”
+
+
+
+otherwise _@XmlType.name()_
+
+\{target namespace}
+
+{empty}if _@XmlType.namespace()_ is “
+_##default_ “ && _@XmlType.name()_ is ““ and class is annotated with
+_@XmlRootElement_ , then the \{target namespace} as specified in
+link:jaxb.html#a2742[See Mapping: Class to Element Declaration]
+
+
+
+otherwise if _@XmlType.namespace()_ is “
+_##default_ “ && _@XmlType.name()_ is ““ and class is not annotated with
+_@XmlRootElement_ , then the \{target namespace} of the attribute or
+element to which the property or field, from where this class is
+referenced, is mapped.
+
+
+
+{empty}otherwise if _@XmlType.namespace()_ is
+“ _##default_ “ && _@XmlType.name()_ is not ““, then the namespace to
+which the package, in which class is defined, is mapped as specified in
+link:jaxb.html#a2476[See Mapping: Package to XML target
+namespace]
+
+
+
+otherwise _@XmlType.namespace()_
+
+\{base type definition}
+
+if the class contains a mapped property or
+field annotated with _@XmlValue_ as specified in
+link:jaxb.html#a3331[See @XmlValue]”, then the schema type to
+which mapped property or field’s type is mapped.
+
+
+
+otherwise schema type to which the nearest
+XML-bound ancestor class is mapped
+
+* 
+
+* 
+
+\{derivation method}
+
+if _\{base type definition}_ is _xs:anyType_ ,
+then by _restriction_
+
+
+
+otherwise _extension_
+
+\{final}
+
+if class modifier final is present. then the
+set \{extension, restriction};
+
+
+
+otherwise, the empty set.
+
+\{abstract}
+
+true if the class modifier abstract is
+present;
+
+
+
+otherwise false.
+
+\{attribute uses}
+
+The set of properties or fields mapped to
+attributes as specified in link:jaxb.html#a3230[See
+@XmlAttribute]”.
+
+\{attribute wildcard}
+
+Attribute wildcard as specified in
+link:jaxb.html#a3303[See XmlAnyAttribute]”.
+
+\{content type}
+
+. empty if no mapped property or field is
+annotated with _@XmlElement_
+.  _mixed_ if a property or field is annotated
+with _@XmlMixed_ as specified in link:jaxb.html#a3449[See
+@XmlMixed]”.
+.  _simpleContent_ if :
+. no property or field is annotated with
+_@XmlElement_
+. && one or more properties or fields is
+annotated with _@XmlAttribute_
+. && one property is annotated with
+_@XmlValue_ .
+.  _element-only content_ if one or more
+properties is annotated with _@XmlElement; +
+content model_ mapped as specified in link:jaxb.html#a2662[See
+Mapping: Class body to Model Group Component]”.
+
+\{prohibited substitutions}
+
+Empty set
+
+
+
+* 
+
+\{annotations}
+
+ _absent_
+
+=== [[a2662]]Mapping: Class body to Model Group Component
+
+\{compositor}
+
+if _@XmlType.propOrder()_ is \{} then _xs:all_
+;
+
+
+
+otherwise _xs:sequence_ . The ordering of
+particles is:
+
+if _@XmlType.propOrder()_ is not ““, then the
+order in which properties/fields are listed in _@XmlType.propOrder()_ .
+
+
+
+if _@XmlType.propOrder()_ is ““ &&
+
+class is annotated with
+_@XmlAccessorOrder(XmlAcessOrder.ALPHABETICAL) )_ or
+_@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)_ is specified at the
+package level and class is not annotated with
+_@XmlAccessorOrder(XmlAccessOrder.UNDEFINED)_ , then alphabetical order
+as specified in link:jaxb.html#a2506[See @XmlAccessorOrder]”.
+
+
+
+otherwise order is unspecified.
+
+\{particles}
+
+Set of properties or fields mapped to
+particles. See _\{compositor}_ mapping above for ordering of particles.
+
+\{annotation}
+
+ _unspecified_
+
+
+
+=== [[a2678]]Mapping: Class to Simple Type Definition
+
+\{name}
+
+if _@XmlType.name()_ is ““, then absent
+
+
+
+otherwise if _@XmlType.name()_ is “
+_##default_ “,
+
+then the XML name derived from the class name
+as specified in link:jaxb.html#a3678[See Java Identifier To XML
+Name]”
+
+
+
+otherwise _@XmlType.name()_
+
+\{target namespace}
+
+{empty}if _@XmlType.namespace()_ is “
+_##default_ “ && _@XmlType.name()_ is ““ and class is annotated with
+_@XmlRootElement_ , then the \{target namespace} as specified in
+link:jaxb.html#a2742[See Mapping: Class to Element Declaration]
+
+
+
+otherwise if _@XmlType.namespace()_ is “
+_##default_ “ && _@XmlType.name()_ is ““ and class is not annotated with
+_@XmlRootElement_ , then the \{target namespace} of the attribute or
+element to which the property or field, from where this class is
+referenced, is mapped.
+
+
+
+{empty}otherwise if _@XmlType.namespace()_ is
+“ _##default_ “ && _@XmlType.name()_ is not ““, then the namespace to
+which the package, in which class is defined, is mapped as specified in
+link:jaxb.html#a2476[See Mapping: Package to XML target
+namespace]
+
+
+
+otherwise _@XmlType.namespace()_
+
+\{base type definition}
+
+ur-type definition, _xs:anyType_ .
+
+
+
+NOTE: This is subject to the mapping
+constraints on XmlType. See link:jaxb.html#a2591[See Mapping]”.
+
+\{facets}
+
+ _empty set_
+
+\{fundamental facets}
+
+derived
+
+\{final}
+
+empty set.
+
+A subset of \{extension, list, restriction,
+union}.
+
+\{variety}
+
+Must be mapped as shown below
+
+
+
+atomic
+
+ _\{primitive type definition}_
+
+if property or field type is one of:
+
+- primitive type
+
+- wrapper class
+
+- reference type mapped to a simple atomic
+type.
+
+
+
+
+
+list
+
+ _\{item type definition}_
+
+if the property or field type is one of the
+following collection types:
+
+- generic list
+
+- indexed property
+
+- single dimensional array
+
+{empty}link:jaxb.html#a3800[See
+@XmlType: List simple type]
+
+
+
+union
+
+ _\{member type definitions}_
+
+Not mapped.
+
+\{annotation}
+
+ _unspecified_
+
+
+
+=== @XmlRootElement
+
+ _@XmlRooElement_ can be used to associate a
+global element with the schema type to which a class is mapped.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{TYPE}
+
+public @interface XmlRootElement \{
+
+ String name() default "##default" ;
+
+ String namespace() default "##default" ;
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+. The only other annotations allowed with this
+annotation are: _@XmlType, @XmlEnum, @XmlAccessorType,
+@XmlAcessorOrder._
+
+A class annotated with _@XmlRootElement_
+annotation, must be mapped as specified in
+link:jaxb.html#a2742[See Mapping: Class to Element Declaration].
+
+=== Mapping: Class [[a2742]]to Element Declaration
+
+\{name}
+
+if _@XmlRootElement.name()_ is “##default“,
+then the XML name derived from the class name as specified in
+link:jaxb.html#a3678[See Java Identifier To XML Name]”;
+
+
+
+otherwise _@XmlRootElement.name()_
+
+\{target namespace}
+
+{empty}if _@XmlRootElement.namespace()_ is “
+_##default_ “ _,_ then the value of the targetNamespace to which the
+package containing the class is mapped as specified in
+link:jaxb.html#a2476[See Mapping: Package to XML target
+namespace]
+
+
+
+otherwise _@XmlRootElement.namespace()_
+
+\{type definition}
+
+schema type to which the class is mapped as
+specified in link:jaxb.html#a2578[See @XmlType]”.
+
+\{scope}
+
+ _global_
+
+\{value constraint}
+
+ _absent_
+
+\{nillable}
+
+ _false_
+
+\{identity-constraint definitions}
+
+empty set
+
+\{substitution group affiliation}
+
+ _absent_
+
+* 
+
+\{substitution group exclusions}
+
+ _\{extension, restriction}_
+
+\{disallowed substitution}
+
+ _\{substitution,extension,restriction}_
+
+\{abstract}
+
+ _false_
+
+* 
+
+\{annotation}
+
+ _unspecified_
+
+=== @XmlTransient
+
+ _@XmlTransient_ is used to prevent the
+mapping of a class.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(TYPE)
+
+public @interface XmlTransient \{}
+
+=== Mapping
+
+The class must not be mapped. Any reference to
+this class from the other XML-bound classes will treated as if they are
+refering to the nearest XML-bound ancestor of this class (which could be
+_java.lang.Object_ , which guarantees that there always exists such a
+class.)
+
+For the effect that this annotation causes on
+derived classes, see link:jaxb.html#a2611[See Mapping: Class to
+Complex Type Definition].
+
+Note that a class with _@XmlTransient_ may
+still have properties and fields with JAXB annotations. Those are mapped
+to XML when a derived class is mapped to XML. See section
+link:jaxb.html#a2876[See Property And Field] for more details.
+
+The following mapping constraints must be
+enforced:
+
+*  _@XmlTransient_ is mutually exclusive with
+all other mapping annotations.
+
+=== @XmlSeeAlso
+
+ _@XmlSeeAlso_ is an annotation that can be
+optionally placed on a class to instruct the JAXB runtime and the schema
+generator to also bind classes listed in _@XmlSeeAlso_ , when it binds
+the class that _@XmlSeeAlso_ is on.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(TYPE)
+
+public @interface XmlRootElement \{
+
+ Class[] value();
+
+}
+
+=== Enum Type
+
+=== @XmlEnum
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{TYPE}
+
+public @interface XmlEnum \{
+
+ // Java type that is mapped to a XML simple
+type
+
+ Class <?> value() default String.class;
+
+}
+
+
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+ _@XmlEnum.value()_ must be mapped to a XML
+schema simple type.
+
+=== Mapping: Enum type to Base Type Definition
+
+\{base type definition}
+
+schema type to which _@XmlEnum.value()_ is
+mapped.
+
+\{variety}
+
+The value depends upon the schema type to
+which the _@XmlEnum.value()_ is mapped. But syntactically, it is always
+a restriction of \{base type definition}.
+
+derived from the \{base type definition}
+
+* 
+
+
+
+=== @XmlEnumValue
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD}
+
+public @interface XmlEnumValue \{
+
+ String value();
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+*  _@XmlEnumValue.value()_ must have a valid
+lexical representation for _@XmlEnum.value()_ .
+
+
+
+=== Mapping: Enum constant to Enumeration Schema Component
+
+\{value}
+
+ _@XmlEnumValue.value()_
+
+\{annotation}
+
+unspecified
+
+=== @XmlType
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{TYPE})
+
+public @interface XmlType \{
+
+ String name() default "##default";
+
+ String namespace() default "##default" ;
+
+ String[] propOrder() default \{""};
+
+ Class factoryClass() default DEFAULT.class;
+
+ static final class DEFAULT \{};
+
+ String factoryMethod() default ““;
+
+}
+
+=== [[a2837]]Mapping
+
+The following mapping constraints must be
+enforced:
+
+.  _factoryMethod(),factoryClass()_ and
+_@XmlType.propOrder_ must be ignored.
+. This annotation can be used only with the
+following other annotations: _@XmlRootElement, @XmlAccessorOrder,
+@XmlAccessorType._ However, _@XmlAccessorOrder_ and _@XmlAccessorType_
+must be ignored; they are not meaningful when used to annotate an enum
+type.
+
+=== @XmlRootElement
+
+ _@XmlRootElement_ can be used to associate a
+global element with the schema type to which the enum type is mapped.
+
+The following mapping constraints must be
+enforced:
+
+. The only other annotations allowed with this
+annotation are: _@XmlType, @XmlEnum, @XmlAccessorType,
+@XmlAcessorOrder._ Note that _@XmlAccessorType_ and _@XmlAccessorOrder_
+while allowed will be ignored by the constraint in
+link:jaxb.html#a2837[See Mapping].
+
+The mapping must be performed as specified in
+link:jaxb.html#a2846[See Mapping: Enum type to Element
+Declaration].
+
+=== [[a2846]]Mapping: Enum type to Element Declaration
+
+\{name}
+
+if _@XmlRootElement.name()_ is “##default“,
+then the XML name derived from the enum type name as specified in
+link:jaxb.html#a3678[See Java Identifier To XML Name]”;
+
+
+
+otherwise _@XmlRootElement.name()_
+
+\{target namespace}
+
+{empty}if _@XmlRootElement.namespace()_ is “
+_##default_ “ _,_ then the value of the targetNamespace to which the
+package containing the class is mapped as specified in
+link:jaxb.html#a2476[See Mapping: Package to XML target
+namespace]
+
+
+
+otherwise _@XmlRootElement.namespace()_
+
+\{type definition}
+
+schema type to which the class is mapped as
+specified in link:jaxb.html#a2578[See @XmlType]”.
+
+\{scope}
+
+ _global_
+
+\{value constraint}
+
+ _absent_
+
+\{nillable}
+
+ _false_
+
+\{identity-constraint definitions}
+
+empty set
+
+\{substitution group affiliation}
+
+ _absent_
+
+* 
+
+\{substitution group exclusions}
+
+ _\{extension, restriction}_
+
+\{disallowed substitution}
+
+ _\{substitution,extension,restriction}_
+
+\{abstract}
+
+ _false_
+
+\{annotation}
+
+ _unspecified_
+
+=== [[a2876]]Property And Field
+
+The following must be mapped (subject to the
+mapping constraints listed below):
+
+* read/write property as identified by
+java.beans.Introspector.getBeanInfo with its nearest XML-bound
+superclass as the stopClass.
+* non static, non transient field of all the
+ancestors up to the stopClass (but excluding the stopClass itself); if
+annotated with _@XmlAttribute_ , then static final field must be mapped
+(informally this maps to a fixed attribute but this is formally
+specified in the mapping tables below).
+
+A mapped property is a property found as above
+and mapped either by default or using a JAXB annotation.
+
+A mapped field is a field found as above and
+mapped either by default or using a JAXB annotation.
+
+A property or field that has been annotated
+with _@XmlTransient_ is not mapped.
+
+The following mapping constraints must be
+enforced.
+
+* For a property, a given annotation can be
+applied to either read or write property but not both.
+* A property name must be different from any
+other property name in any of the super classes of the class being
+mapped. +
+* A mapped field name or the de capitalized
+name of a mapped property must be unique within a class. For e.g.
+
+
+
+ // Example 1:
+
+ // Both the field “x” and property getX/setX
+are mapped by
+
+ // default. However, the decapitalized name
+property getX/setX
+
+ // is also “x” which collides with the field
+name “x”.
+
+ public class Foo \{
+
+ public int x;
+
+
+
+ public int getX \{..};
+
+ public void setX \{..};
+
+ }
+
+=== [[a2898]]@XmlElement
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD}
+
+public @interface XmlElement \{
+
+ String name() default "##default" ; // name
+for XML element
+
+ boolean nillable() default false;
+
+ boolean required() default false;
+
+ String namespace() default "##default" ;
+
+ Class type() default DEFAULT.class;
+
+ String defaultValue() default "\u0000";
+
+ static final class DEFAULT \{}
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* The only additional mapping annotations
+allowed with _@XmlElement_ are: _@XmlID, @XmlIDREF, @XmlList,
+@XmlSchemaType, @XmlValue, @XmlAttachmentRef, @XmlMimeType,
+@XmlInlineBinaryData, @XmlJavaTypeAdapter_ and _@XmElementWrapper.
+@XmlElement_ can also be used within _@XmlElements_ .
+* If the property or field type is a
+parametric collection type, then _@XmlElement.type()_ must be
+_DEFAULT.class_ or _collectionitem.class_ (since the type of the
+collection is already known).
+
+A field or property annotated must be mapped
+as follows:
+
+* If _@XmlElement.namespace()_ is not “
+_##default_ ” and different from the _\{target namespace}_ of the
+enclosing class, then it must be mapped as specified in
+link:jaxb.html#a2941[See Mapping: Property/field to Particle -
+ref attribute].
+* If property is single valued, and it’s type
+is annotated with _@XmlRootElement_ and _@XmlType.name()= ““_ , then the
+property must be mapped as specified in link:jaxb.html#a2941[See
+Mapping: Property/field to Particle - ref attribute].
+
+Design Note: This mapping is designed to
+eliminate an infinite recursion. For example:
+
+ // Code fragment
+
+ @XmlRootElement
+
+ @XmlType(name="")
+
+ class Foo \{
+
+ Foo foo;
+
+ }
+
+In the absence of the above mapping, the above
+code would map to:
+
+ <schema>
+
+ <element name="foo">
+
+ <complexType>
+
+ <sequence>
+
+ <element name=”foo” minOccurs=”0”>
+
+ <complexType>
+
+ ... infinite recursion ...
+
+With the above mapping, the code fragment
+would instead map to:
+
+ <schema>
+
+ <element name="foo">
+
+ <complexType>
+
+ <sequence>
+
+ <element ref=”foo” minOccurs=”0”>
+
+
+
+* otherwise, it must be mapped as
+link:jaxb.html#a2959[See Mapping: Property/field to Particle -
+no ref attribute].
+* 
+
+=== Mapping: Property/field to [[a2941]]Particle - ref attribute
+
+\{min occurs}
+
+if _@XmlElement.required()_ is true, then 1
+
+
+
+if the property type is a primitive type or a
+multi dimensional array with a primitive type then 1
+
+
+
+otherwise 0
+
+\{max occurs}
+
+if the type of the property/field is not a
+collection type, then 1
+
+
+
+otherwise _unbounded_ .
+
+\{term}
+
+element declaration as specified in
+link:jaxb.html#a2973[See Mapping: Property/field to Element
+declaration] with the following overrides for the abstract schema
+component properties:
+
+\{scope} is _global_
+
+ _\{value constraint}_ is _absent_
+
+ _\{type definition}_ is _xs:anyType_ if the
+mapping results in two or more element decalarations with the same name.
+
+Note: The above make the element a global
+element declaration rather than a local element declaration.
+
+
+
+=== [[a2959]]Mapping: Property/field to Particle - no ref attribute
+
+\{min occurs}
+
+if _@XmlElement.required()_ is true, then 1
+
+
+
+otherwise if the property type is a primitive
+type or a multi dimensional array with a primitive type then 1
+
+
+
+otherwise 0
+
+\{max occurs}
+
+if the type of the property/field is not a
+collection type, then 1;
+
+
+
+otherwise _unbounded_ .
+
+\{term}
+
+must be mapped as specified in
+link:jaxb.html#a2973[See Mapping: Property/field to Element
+declaration].
+
+
+
+=== Mapping: [[a2973]]Property/field to Element declaration
+
+\{name}
+
+if _@XmlElement.name()_ is _“##default”,_ then
+the XML name derived from the property or field name as specified in
+link:jaxb.html#a3678[See Java Identifier To XML Name]”;
+
+
+
+otherwise _@XmlElement.name()_
+
+\{target namespace}
+
+if _@XmlElement.namespace()_ is “ _##default_
+“, then
+
+if the enclosing package has @ _XmlSchema_
+annotation and is _@XmlSchema.elementFormDefault_ is
+_@XmlNsForm.QUALIFIED_ , then the namespace of the enclosing class. +
+ +
+otherwise ““ (which produces unqualified element in the default
+namespace).
+
+otherwise, _@XmlElement.namespace()_
+
+\{type definition}
+
+Note: The order of type inference below is
+significant.
+
+
+
+if _@XmlElement.type()_ is not _DEFAULT.class_
+, then the schema type to which _@XmlElement.type()_ is mapped.
+
+
+
+otherwise if annotated with _@XmlList,_ schema
+type derived by mapping as specified in link:jaxb.html#a3399[See
+@XmlList]”
+
+
+
+otherwise if annotated with _@XmlValue_ ,
+schema type derived by mapping as specified in
+link:jaxb.html#a3331[See @XmlValue]”
+
+
+
+otherwise if annotated with _@XmlID_ , the
+schema type derived by mapping as specified in
+link:jaxb.html#a3377[See @XmlID]”
+
+
+
+otherwise if annotated with _@XmlIDREF_ , the
+schema type derived by mapping as specified in
+link:jaxb.html#a3387[See @XmlIDREF]”
+
+
+
+otherwise if the property or field is a
+collection type, then the schema type derived by mapping the collection
+item type.
+
+
+
+otherwise the schema type to which the type of
+the property is mapped.
+
+\{scope}
+
+complex type to which the property’s or the
+field’s containing class is mapped as specified in
+link:jaxb.html#a2456[See @XmlSchema]”.
+
+\{value constraint}
+
+if @XmlElement.defaultValue() is "\u0000" then
+_absent_
+
+
+
+otherwise default value with the value
+_@XmlElement.defaultvalue()_ .
+
+\{nillable}
+
+ _@XmlElement.nillable()_
+
+\{identity-constraint definitions}
+
+ _absent_
+
+\{substitution group affiliation}
+
+ _absent_
+
+\{substitution group exclusions}
+
+\{ _extension, restriction_ }
+
+\{disallowed substitution}
+
+\{ _extension, restriction,substitution_ }
+
+\{abstract}
+
+ _false_
+
+\{annotation}
+
+ _unspecified_
+
+.
+
+=== [[a3019]]@XmlElements
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD,METHOD})
+
+public @interface XmlElements \{
+
+ XmlElement[] value(); // collection of
+@XmlElement annotations
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* If the property or field type is a
+parameterized collection type, then the size of the
+_@XmlElements.value()_ must be 1.
+* This annotation can be used only with the
+following annotations: _@XmlIDREF, @XmlElementWrapper,
+@XmlJavaTypeAdapter._
+* If _@XmlIDREF_ is specified, then each
+_@XmlElement.type()_ must contain a JavaBean property/field annotated
+with _@XmlID_ .
+
+The property or field must be mapped as
+follows:
+
+* If the size of _@XmlElements.value()_ is 1,
+then the property must be mapped as specified in
+link:jaxb.html#a2898[See @XmlElement]”.
+* otherwise it must be mapped as specified in
+link:jaxb.html#a3034[See Mapping: List of types to choice
+particle].
+
+
+
+=== [[a3034]]Mapping: List of types to choice particle
+
+\{min occurs}
+
+0
+
+\{max occurs}
+
+ _unbounded_
+
+\{term}
+
+{empty}If \{particples} row in
+link:jaxb.html#a3042[See Mapping: List of types to choice model
+group of elements] results in a single particle, then that single
+particle. Otherwise mapped as specified in
+link:jaxb.html#a3042[See Mapping: List of types to choice model
+group of elements]
+
+
+
+=== [[a3042]]Mapping: List of types to choice model group of elements
+
+\{compositor}
+
+ _choice_
+
+\{particles}
+
+set obtained by mapping each _@XmlElement_ in
+_@XmlElements.value()_ as specified in link:jaxb.html#a2973[See
+Mapping: Property/field to Element declaration].
+
+\{annotation}
+
+ _unspecified_
+
+=== [[a3049]]@XmlElementRef
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD}
+
+public @interface XmlElementRef \{
+
+ String name() default "##default" ; // name
+for XML element
+
+ String namespace() default "##default" ;
+
+ Class type() default DEFAULT.class;
+
+ static final class DEFAULT \{}
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* The only other additional JAXB mapping
+annotations allowed with _@XmlElementRef_ are: _@XmlElementWrapper_ and
+_@XmlJavaTypeAdapter._
+* If the collection item type or property type
+(for single valued property) is _javax.xml.bind.JAXBElement_ , then \{
+_@XmlElementRef.name()_ , _@XmlElementRef.namespace()}_ must point an
+element factory method with an _@XmlElementDecl_ annotation in a class
+annotated with _@XmlRegistry_ (usually _ObjectFactory_ class generated
+by the schema compiler) :
+*  _@XmlElementDecl.name()_ must equal
+_@XmlElementRef.name()_
+*  _@XmlElementDecl.namespace()_ must equal
+_@XmlElementRef.namespace()_ .
+* If the collection item type (for collection
+property) or property type (for single valued property) is not
+_javax.xml.bind.JAXBElement_ , then the type referenced by the property
+or field must be annotated with _@XmlRootElement_ .
+
+A field or property annotated with the
+_@XmlElementRef_ annotation must be mapped as follows:
+
+* if the type of the property or field is
+single valued property, then it must be mapped as specified in
+link:jaxb.html#a3078[See Mapping: Property/field (property type
+single valued) to Particle with ref attribute]
+* otherwise (the type of the property or field
+is a parametric type), then it must be mapped as specified in
+link:jaxb.html#a3097[See Mapping: Property/Field (parametric
+type) to choice particle].
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+=== [[a3078]]Mapping: Property/field (property type single valued) to Particle with ref attribute
+
+\{min occurs}
+
+1
+
+\{max occurs}
+
+1
+
+\{term}
+
+must be mapped as specified in
+link:jaxb.html#a3085[See Mapping: Property/field to Element
+declaration with ref attribute].
+
+=== [[a3085]]Mapping: Property/field to Element declaration with ref attribute
+
+\{name}
+
+if _@XmlElementRef.type()_ is
+_@XmlElementRef.DEFAULT.class_ and the property type is not
+_javax.xml.bind.JAXBElement_ , then the XML name
+_@XmlRootElement.name()_ on the type being referenced.
+
+
+
+otherwise if _@XmlElementRef.type()_ is
+_@XmlElementRef.DEFAULT.class_ and the parametric type or the property
+type (for single valued property) is a _javax.xml.bind.JAXBElement_ ,
+then the _@XmlElementRef.name()_
+
+\{target namespace}
+
+if _@XmlElementRef.type()_ is
+_@XmlElementRef.DEFAULT.class_ and the property type is not
+_javax.xml.bind.JAXBElement_ , then the XML namespace of the type being
+referenced.
+
+ __ 
+
+otherwise if _@XmlElementRef.type()_ is
+_@XmlElementRef.DEFAULT.class_ and the property type is single valued
+and is _javax.xml.bind.JAXBElement_ , then the
+_@XmlElementRef.namespace()_
+
+\{annotation}
+
+ _unspecified_
+
+
+
+=== [[a3097]]Mapping: Property/Field (parametric type) to choice particle
+
+\{min occurs}
+
+ _0_
+
+\{max occurs}
+
+ _unbounded_
+
+\{term}
+
+{empty}If \{particles} row in
+link:jaxb.html#a3105[See Mapping: Property/field (parametric
+type) to choice model group of element refs] results in single particle,
+then that single particle. Otherwise mapped as specified in
+link:jaxb.html#a3105[See Mapping: Property/field (parametric
+type) to choice model group of element refs]
+
+
+
+=== [[a3105]]Mapping: Property/field (parametric type) to choice model group of element refs
+
+\{compositor}
+
+ _choice_
+
+\{particles}
+
+set obtained by visiting parametric type and
+each of its derived types and if annotated with @XmlRootElement, then
+mapping the @XmlRootElement as specified in as specified in
+link:jaxb.html#a3085[See Mapping: Property/field to Element
+declaration with ref attribute].
+
+\{annotation}
+
+ _unspecified_
+
+=== [[a3112]]@XmlElementRefs
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD,METHOD})
+
+public @interface XmlElementRefs \{
+
+ XmlElementRef[] value();
+
+}
+
+
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* The only other additional JAXB mapping
+annotations allowed with @XmlElementRefs are: _@XmlElementWrapper_ and @
+_XmlJavaTypeAdapter_ .
+
+The property or field must be mapped as
+specified in link:jaxb.html#a3124[See Mapping: List of element
+instances to choice particle].
+
+
+
+=== [[a3124]]Mapping: List of element instances to choice particle
+
+\{min occurs}
+
+ _0_
+
+\{max occurs}
+
+ _unbounded_
+
+\{term}
+
+{empty}If the \{particles} row in
+link:jaxb.html#a3132[See Mapping: List of element instances to
+choice model group of element refs] results in a single particle, then
+that single particle. Otherwise mapped as specified in
+link:jaxb.html#a3132[See Mapping: List of element instances to
+choice model group of element refs]
+
+
+
+=== [[a3132]]Mapping: List of element instances to choice model group of element refs
+
+\{compositor}
+
+ _choice_
+
+\{particles}
+
+set obtained by mapping
+
+* each _@XmlElementRef_ in
+_@XmlElementRefs.value()_ as specified in
+link:jaxb.html#a3049[See @XmlElementRef]”.
+* if property is annotated with
+_@XmlAnyElement,_ then the particle obtained by mapping as specified in
+link:jaxb.html#a3210[See @XmlAnyElement]”
+
+\{annotation}
+
+ _unspecified_
+
+=== @XmlElementWrapper
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD}
+
+public @interface XmlElementWrapper \{
+
+ String name() default "##default" ; // name
+for XML element
+
+ String namespace() default "##default" ;
+
+ boolean nillable() default false;
+
+ boolean required() default false;
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* The only additional mapping annotations
+allowed with _@XmlElementWrapper_ are: _@XmlElement, @XmlElements,
+@XmlElementRef, @XmlElementRefs, @XmlJavaTypeAdapter._
+* The property or the field must be a
+collection property.
+
+The property or field must be mapped as
+follows:
+
+* If _@XmlElementWrapper.namespace()_ is not “
+_##default_ ” and different from the _\{target namespace}_ of the
+enclosing class, then it must be mapped as specified as specified in
+link:jaxb.html#a3202[See Mapping: Property/field Element Wrapper
+with ref attribute].
+* otherwise, it must be mapped as
+link:jaxb.html#a3158[See Mapping: Property/field to Particle for
+Element Wrapper].
+
+
+
+=== [[a3158]]Mapping: Property/field to Particle for Element Wrapper
+
+\{min occurs}
+
+if _@XmlElementWrapper.nillable()_ is true or
+_@XmlElementWrapper.required()_ is true, then 1;
+
+
+
+otherwise 0
+
+\{max occurs}
+
+1
+
+\{term}
+
+must be mapped as specified in
+link:jaxb.html#a3167[See Mapping: Property/field to Element
+Declaration for Element Wrapper].
+
+=== Mapping: Property/field to Element Declaration for Element Wrapper [[a3167]]
+
+\{name}
+
+if _@XmlElementWrapper.name()_ is “
+_##default_ “, then the XML name derived from the property or field name
+as specified in link:jaxb.html#a3678[See Java Identifier To XML
+Name]”;
+
+
+
+otherwise _@XmlElementWrapper.name()_
+
+\{target namespace}
+
+if _@XmlElementWrapper.namespace()_ is “
+_##default_ “,
+
+if the enclosing package has @ _XmlSchema_
+annotation and is _@XmlSchema.elementFormDefault_ is
+_@XmlNsForm.QUALIFIED_ , then the namespace of the enclosing class. +
+ +
+otherwise ““ (which produces unqualified element in the default
+namespace).
+
+otherwise _@XmlElementWrapper.namespace()_
+
+\{type definition}
+
+{empty}if property/field is annotated with
+_@XmlElementRef_ or _@XmlElementRefs_ then the schema type as specified
+in link:jaxb.html#a3124[See Mapping: List of element instances
+to choice particle]
+
+
+
+otherwise if property/field is annotated with
+_@XmlElement_ or _@XmlElements_ then the schema type as specified
+inlink:jaxb.html#a3034[See Mapping: List of types to choice
+particle].
+
+\{scope}
+
+complex type to which the property’s or the
+field’s containing class is mapped.
+
+\{value constraint}
+
+ _absent_
+
+\{nillable}
+
+ _@XmlElementWrapper.nillable()_
+
+\{identity-constraint definitions}
+
+ _absent_
+
+
+
+\{substitution group affiliation}
+
+ _absent_
+
+
+
+\{substitution group exclusions}
+
+\{ _extension, restriction_ }
+
+
+
+\{disallowed substitution}
+
+\{ _extension, restriction,substitution_ }
+
+
+
+\{abstract}
+
+ _false_
+
+\{annotation}
+
+ _unspecified_
+
+=== [[a3202]]Mapping: Property/field Element Wrapper with ref attribute
+
+\{min occurs}
+
+1
+
+\{max occurs}
+
+1
+
+\{term}
+
+element declaration whose \{name} is
+_@XmlElementWrapper.name()_ and \{target namespace} is
+_@XmlElementWrapper.namespace()._
+
+Note: The element declaration is assumed to
+already exist and is not created.
+
+=== [[a3210]]@XmlAnyElement
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD})
+
+public @interface XmlAnyElement \{
+
+ boolean lax() default false;
+
+ Class<? extends DomHandler> value() default
+W3CDomHandler.class;
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* The only other JAXB annotations allowed with
+_@XmlAnyElement_ are: _@XmlElementRefs._
+* There must be only one property or field
+that is annotated with _@XmlAnyElement_ .
+* If a baseType has a property annotated with
+_@XmlAnyElement_ , then no other sub type in the inheritance hierarchy
+rooted at baseType can contain a property annotated with
+_@XmlAnyElement_ .
+
+The property or field must be mapped as
+specified in link:jaxb.html#a3223[See Mapping: Wildcard schema
+component for wildcard (xs:any)]”.
+
+=== [[a3223]]Mapping: Wildcard schema component for wildcard (xs:any)
+
+\{namespace constraint}
+
+ _##other_
+
+\{process contents}
+
+ _”lax”_ if _lax()_ is _true_ otherwise
+_“skip”_
+
+\{annotation}
+
+ _unspecified_
+
+=== [[a3230]]@XmlAttribute
+
+ _@XmlAttribute_ is used to map a property or
+a field to an XML attribute.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD})
+
+public @interface XmlAttribute \{
+
+ String name() default ##default”;
+
+ boolean required() default false;
+
+ String namespace() default "##default" ;
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* If the type of the field or the property is
+a collection type, then the collection item type must be mapped to
+schema simple type. Examples:
+
+ @XmlAttribute List<Integer> foo; // legal
+
+ @XmlAttribute List<Bar> foo; // illegal if
+Bar does not map to a
+
+ // schema simple type
+
+* If the type of the field or the property is
+a non collection type, then the type of the property or field must map
+to a simple schema type. Examples:
+
+ @XmlAttribute int foo; // legal
+
+ @XmlAttribute Foo foo; // illegal if Foo does
+not map to a schema
+
+ // simple type
+
+* The only additional mapping annotations
+allowed with _@XmlAttribute_ are: _@XmlID, @XmlIDREF, @XmlList,
+@XmlSchemaType, @XmlValue, @XmlAttachmentRef, @XmlMimeType,
+@XmlInlineBinaryData, @XmlJavaTypeAdapter._
+* 
+
+The property or field must be mapped as
+follows:
+
+* If _@XmlAttribute.namespace()_ is not
+“##default” and differs from the _\{target namespace}_ of the schema
+type to which the type containing the property or field is mapped, then
+the property or field must be mapped as specified in
+link:jaxb.html#a3255[See Mapping: Property/field to Attribute
+Use (with ref attribute)].
+* otherwise, it must be mapped as specified in
+link:jaxb.html#a3266[See Mapping: Property/field to Attribute
+Use (no ref attribute)].
+
+
+
+=== [[a3255]]Mapping: Property/field to Attribute Use (with ref attribute)
+
+\{required}
+
+ _@XmlAttribute.required()_
+
+\{attribute declaration}
+
+attribute declaration whose \{name} is
+_@XmlAttribute.name()_ and \{target namespace} is
+_@XmlAttribute.namespace()._
+
+For e.g.
+
+ _<xs:attribute ref=”xml:lang”/>_
+
+\{value constraint}
+
+ _absent_
+
+\{annotation}
+
+ _unspecified_
+
+=== [[a3266]]Mapping: Property/field to Attribute Use (no ref attribute)
+
+\{required}
+
+ _@XmlAttribute.required()_
+
+\{attribute declaration}
+
+Mapped as specified in
+link:jaxb.html#a3276[See Mapping: Property/field to Attribute
+Declaration]”
+
+\{value constraint}
+
+
+
+if field has access modifiers public and
+static then the _fixed_
+
+otherwise _absent_
+
+
+
+=== [[a3276]]Mapping: Property/field to Attribute Declaration
+
+\{name}
+
+if _@XmlAttribute.name()_ is “##default“, then
+the XML name derived from the property or field name as specified in
+link:jaxb.html#a3678[See Java Identifier To XML Name]”;
+
+
+
+otherwise _@XmlAttribute.name()_ .
+
+\{target namespace}
+
+if _@XmlAttribute.namespace()_ is
+_“##default”,_ then value of targetNamespace in
+link:jaxb.html#a2476[See Mapping: Package to XML target
+namespace];
+
+
+
+otherwise _@XmlType.namespace()_
+
+\{type definition}
+
+if annotated with _@XmlList,_ schema type
+derived by mapping as specified in link:jaxb.html#a3399[See
+@XmlList]”
+
+
+
+otherwise if annotated with _@XmlID_ , the
+schema type derived by mapping as specified in
+link:jaxb.html#a3377[See @XmlID]”
+
+
+
+otherwise if annotated with _@XmlIDREF_ , the
+schema type derived by mapping as specified in
+link:jaxb.html#a3387[See @XmlIDREF]”
+
+
+
+otherwise if the type of the property is a
+collection type, then the schema type derived by mapping the collection
+item type.
+
+
+
+otherwise the schema type to which the type of
+the property is mapped.
+
+\{scope}
+
+complex type of the containing class
+
+\{value constraint}
+
+if field has access modifiers static and final
+then _fixed_
+
+otherwise _absent_
+
+\{annotation}
+
+ _unspecified_
+
+
+
+=== [[a3303]]XmlAnyAttribute
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD})
+
+public @interface XmlAnyAttribute\{}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* There must be only one property or field in
+a class that is annotated with _@XmlAnyAttribute._
+* The type of the property or the field must
+be _java.util.Map._
+* The only other annotations that can be used
+on the property or field with _@XmlAnyAttribute_ are:
+_@XmlJavaTypeAdapter._
+
+The property or field must be mapped as
+specified in link:jaxb.html#a3313[See Mapping: Wildcard schema
+component for Attribute Wildcard].”
+
+=== [[a3313]]Mapping: Wildcard schema component for Attribute Wildcard
+
+\{namespace constraint}
+
+ _##other_
+
+\{process contents}
+
+ _skip_
+
+\{annotation}
+
+ _unspecified_
+
+=== @XmlTransient
+
+ _@XmlTransient_ is used to prevent the
+mapping of a property or a field.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD,
+TYPE})
+
+public @interface XmlTransient \{}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* The field or the property must not be
+mapped.
+*  _@XmlTransient_ is mutually exclusive with
+all other mapping annotations.
+
+
+
+
+
+=== [[a3331]]@XmlValue
+
+=== Synopsis
+
+ _@Retention(RUNTIME) @Target(\{FIELD,
+METHOD})_
+
+ _public @interface XmlValue \{}_
+
+=== XmlValue Type Mapping
+
+The following mapping constraints must be
+enforced:
+
+. At most one field or a property in a class
+can be annotated with @ _XmlValue_ .
+.  _@XmlValue_ can be used with the following
+annotations:
+.  _@XmlList_ - however this is redundant
+since _@XmlList_ maps a type to a schema simple type that derives by
+list just as _@XmlValue_ would.
+.  _@XmlJavaTypeAdapter_
+. If the type of the field or property is a
+collection type, then the collection item type must map to a simple
+schema type. Examples:
+
+ // Examples (not exhaustive): Legal usage of
+@XmlValue
+
+ @XmlValue List<Integer> foo; // int maps to
+xs:int
+
+ @XmlValue String[] foo; // String maps to
+xs:string
+
+ @XmlValue List<Bar> foo; // only if Bar maps
+to a simple
+
+ // schema type
+
+. If the type of the field or property is not
+a collection type, then the type of the property or field must map to a
+schema simple type.
+. The containing class must not extend another
+class (other than java.lang.Obect).
+
+=== Mapping
+
+* If the type of the property or field is a
+collection type, then the type must be must be mapped as specified in
+link:jaxb.html#a3353[See @XmlValue: Mapping to list simple
+type]”.
+* Otherwise, the schema type to which the type
+of the property or field is mapped.
+
+
+
+=== [[a3353]]@XmlValue: Mapping to list simple type
+
+\{name}
+
+ _absent_
+
+\{target namespace}
+
+\{target namespace} of the attribute or
+element to which the property or field is mapped and from where this
+type is referenced.
+
+\{base type definition}
+
+ur-type definition, _xs:anyType_ .
+
+\{facets}
+
+ _empty set_
+
+\{fundamental facets}
+
+derived
+
+\{final}
+
+#all
+
+\{variety}
+
+list
+
+\{item type definition}
+
+if the field, property or parameter is a
+collection type
+
+* if annotated with _@XmlIDREF_ , then
+_xs:IDREF_ as specified in link:jaxb.html#a3387[See @XmlIDREF]”
+* otherwise the schema type to which the
+collection item type is mapped.
+
+otherwise
+
+* if annotated with _@XmlIDREF_ , then
+_xs:IDREF_ as specified in link:jaxb.html#a3387[See @XmlIDREF]”
+* otherwise the schema type to which the type
+of the property, field or the parameter is mapped.
+
+\{annotation}
+
+ _unspecified_
+
+=== [[a3377]]@XmlID
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD})
+
+public @interface XmlID \{}
+
+=== XmlID Type Mapping
+
+The following mapping constraints must be
+enforced:
+
+* at most one field or property in a class can
+be annotated with _@XmlID_ .
+* The type of the field or property must be
+_java.lang.String_ .
+* The only other program annotations allowed
+with _@XmlID_ are: _@XmlAttribute_ and _@XmlElement_ .
+
+The type of the annotated program element must
+be mapped to _xs:ID._
+
+=== [[a3387]]@XmlIDREF
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD})
+
+public @interface XmlIDREF \{}
+
+=== XmlIDREF Type Mapping
+
+The following mapping constraints must be
+enforced:
+
+* If the type of the field or property is a
+collection type, then the collection item type must contain a property
+or field annotated with _@XmlID_ .
+* If the field or property is not a collection
+type, then the type of the property or field must contain a property or
+field annotated with _@XmlID_ .
+
+Note: If the collection item type or the type
+of the property (for non collection type) is _java.lang.Object,_ then
+the instance must contain a property/field annotated with _@XmlID_
+attribute.
+
+* The only additional mapping annotations
+allowed with _@XmlIDREF_ are: _@XmlElement_ , _@XmlAttribute, @XmlList,_
+and _@XmlElements, @XmlJavaTypeAdapter._
+
+If the type of the field or property is a
+collection type, then each collection item type must be mapped to
+_xs:IDREF_ .
+
+If the type of the field or property is single
+valued, then the type of the property or field must be mapped to
+_xs:IDREF_ .
+
+=== [[a3399]]@XmlList
+
+This annotation maps a collection type to a
+list simple type.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD,
+PARAMETER})
+
+public @interface XmlList \{}
+
+=== XmlIList Type Mapping
+
+The following mapping constraints must be
+enforced:
+
+* The type of the field, property or parameter
+must be a collection type.
+* The collection item type must map to a
+simple schema type that does not derive by list. For example:
+
+
+
+ // Examples: Legal usage of @XmlList
+
+ @XmlList List<Integer> foo; // int maps to
+xs:int
+
+ @XmlList String[] foo; // String maps to
+xs:string
+
+ @XmlList List<Bar> foo; // only if Bar maps
+to a simple type
+
+
+
+ // Example: Illegal usage of @XmlList
+
+ public class Foo \{
+
+ // @XmlValue maps List to a XML Schema list
+simple type
+
+ @XmlValue List<Integer> a;
+
+ }
+
+ class Bar \{
+
+ // Use of @XmlList is illegal since Foo
+itself mapped
+
+ // to a XML Schema list simple type; XML
+Schema list simple
+
+ // type can't derive from another XML Schema
+list simple type
+
+ @XmlList List<Foo> y;
+
+ }
+
+* The only additional mapping annotations
+allowed with _@XmlList_ are: _@XmlElement, @XmlAttribute, @XmlValue_ and
+_@XmlIDREF, @XmlJavaTypeAdapter._
+
+The type of the property or field must be
+mapped as specified in link:jaxb.html#a3428[See @XmlList:
+Mapping to list simple type].
+
+
+
+=== [[a3428]]@XmlList: Mapping to list simple type
+
+\{name}
+
+ _absent_
+
+\{target namespace}
+
+\{target namespace} of the attribute or
+element to which the property or field is mapped and from where this
+type is referenced.
+
+\{base type definition}
+
+ur-type definition, _xs:anyType_ .
+
+\{facets}
+
+ _empty set_
+
+\{fundamental facets}
+
+derived
+
+\{final}
+
+#all
+
+\{variety}
+
+list
+
+\{item type definition}
+
+if annotated with _@XmlIDREF_ , then xs:IDREF
+as specified in link:jaxb.html#a3387[See @XmlIDREF]”
+
+
+
+otherwise the schema type to which the
+collection item type is mapped.
+
+\{annotation}
+
+ _unspecified_
+
+=== [[a3449]]@XmlMixed
+
+This annotation is used for dealing with mixed
+content in XML instances.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{FIELD, METHOD})
+
+public @interface XmlMixed \{}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* The only additional mapping annotations
+allowed with _@XmlMixed_ are: _@XmlElementRef, @XmlAnyElement,
+@XmlJavaTypeAdapter._
+
+The java.lang.String instances must be
+serialized as XML infoset text information items.
+
+=== @XmlMimeType
+
+=== Synopsis
+
+@Retention(RUNTIME)
+@Target(\{FIELD,METHOD,PARAMETER})
+
+public @interface XmlMimeType \{
+
+ // Textual representation of the MIME type,
+such as "image/jpeg"
+
+ // "image/*", "text/xml; charset=iso-8859-1"
+and so on.
+
+ String value();
+
+}
+
+=== Mapping
+
+
+
+=== @XmlMimeType: Mapping to Foreign Namespace attribute
+
+\{name}
+
+ _“expectedContentTypes”_
+
+\{target namespace}
+
+"http://www.w3.org/2005/05/xmlmime"
+
+attribute value
+
+ _@XmlMimeType.value()_
+
+=== @XmlAttachmentRef
+
+=== Synopsis
+
+@Retention(RUNTIME)
+@Target(\{FIELD,METHOD,PARAMETER})
+
+public @interface XmlAttachmentRef \{ }
+
+=== Mapping
+
+The type of property or field must map to
+_ref:swaRef_ .
+
+=== XmlInlineBinaryData
+
+@Retention(RUNTIME)
+@Target(\{FIELD,METHOD,TYPE})
+
+public @interface XmlInlineBinaryData \{
+
+}
+
+=== Mapping
+
+This annotation does not impact the schema
+generation. See the javadoc for
+_javax.xml.bind.annotation.XmlInlineBinaryData_ for more details.
+
+=== ObjectFactory Method
+
+The annotations in this section are intended
+primarily for use by schema compiler in annotating element factory
+methods in the schema derived ObjectFactory class
+(link:jaxb.html#a482[See Java Package]”). They are not expected
+to be used when mapping existing classes to schema.
+
+
+
+=== @XmlElementDecl
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{METHOD})
+
+public @interface XmlElementDecl \{
+
+ Class scope() default GLOBAL.class;
+
+
+
+ // XML namespace of element
+
+ String namespace() default "##default";
+
+
+
+ String name(); // local name of element
+
+
+
+ //XML namespace name of a substitution
+group's head element.
+
+ String substitutionHeadNamespace() default
+"##default";
+
+
+
+ //XML local name of a substitution group's
+head element.
+
+ String substitutionHeadName() default "";
+
+ public final class GLOBAL \{}
+
+}
+
+=== Mapping
+
+The following mapping constraints must be
+enforced:
+
+* annotation can only be used on an element
+factory method (link:jaxb.html#a482[See Java Package]”). 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
+* class containing the element factory method
+annotated with _@XmlElementDecl_ must be annotated with _@XmlRegistry_ .
+* element factory method must take one
+parameter assignable to _java.lang.Object_ .
+* two or more element factory methods
+annotated with _@XmlElementDecl_ must not map to element declarations
+with identical _\{name}_ _\{target namespace}_ values.
+* if type Foo has an element factory method
+and is also annotated with @XmlRootElement, then they must not map to
+element declarations with identical _\{name}_ and _\{target namespace}_
+values.
+
+One example of where the above scenario occurs
+is when a developer attempts to add behavior/data to code generated from
+schema. For e.g. schema compiler generates an element instance factory
+method (e.g. _createFoo_ ) annotated with _@XmlElementDecl_ . But the
+developer annotates _Foo_ with _@XmlRootElement_ .
+
+An element factory method must be mapped as
+specified in link:jaxb.html#a3518[See Mapping: Element Factory
+method to Element Declaration].
+
+
+
+=== [[a3518]]Mapping: Element Factory method to Element Declaration
+
+\{name}
+
+ _@XmlElementDecl.name()_
+
+\{target namespace}
+
+{empty}if _@XmlElementDecl.namespace()_ is “
+_##default_ “ _,_ then the value of the targetNamespace to which the
+package of the class containing the factory method is mapped as
+specified in link:jaxb.html#a2476[See Mapping: Package to XML
+target namespace]
+
+
+
+otherwise _@XmlElementDecl.namespace()_
+
+\{type definition}
+
+schema type to which the class is mapped as
+specified in link:jaxb.html#a2578[See @XmlType]”.
+
+\{scope}
+
+ _global_ if _@XmlElementDecl.scope()_ is
+_@XmlElementDecl.GLOBAL_
+
+
+
+otherwise the complex type definition to which
+the class containing the object factory method is mapped.
+
+\{value constraint}
+
+ _absent_
+
+\{nillable}
+
+ _false_
+
+\{identity-constraint definitions}
+
+empty set
+
+\{substitution group affiliation}
+
+element declaration derived from
+_@XmlElementDecl.name()_ and _@XmlElementDecl.substitutionHeadName()_
+
+\{substitution group exclusions}
+
+ _\{}_
+
+\{disallowed substitution}
+
+\{}
+
+\{abstract}
+
+ _false_
+
+\{annotation}
+
+ _unspecified_
+
+=== Adapter
+
+=== XmlAdapter
+
+public abstract class
+XmlAdapter<ValueType,BoundType> \{
+
+ // Do-nothing constructor for the derived
+classes.
+
+ protected XmlAdapter() \{}
+
+
+
+ // Convert a value type to a bound type.
+
+ public abstract BoundType unmarshal(ValueType
+v);
+
+
+
+ // Convert a bound type to a value type.
+
+ public abstract ValueType marshal(BoundType
+v);
+
+}
+
+For an overview, see the section,
+link:jaxb.html#a2278[See Adapter]”.
+
+For detailed information, see the javadocs for
+_javax.xml.bind.annotation.adapters.XmlAdapter_ and
+_javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter._
+
+=== [[a3561]]@XmlJavaTypeAdapter
+
+=== Synopsis
+
+@Retention(RUNTIME)
+@Target(\{PACKAGE,FIELD,METHOD,TYPE,PARAMETER})
+
+public @interface XmlJavaTypeAdapter \{
+
+ Class<? extends XmlAdapter> value();
+
+ Class type() default DEFAULT.class;
+
+ static final class DEFAULT \{}
+
+}
+
+For an overview, see
+link:jaxb.html#a2278[See Adapter]”.
+
+=== Scope
+
+The scope of _@XmlJavaTypeAdapter_ must cover
+the program elements as specified below:
+
+package:
+
+For clarity, the following code example is
+used along with normative text.
+
+// Adapts Foo type to MyFoo type
+
+FooAdapter extends XmlAdapter<MyFoo, Foo>
+
+
+
+// FooAdapter is installed at the package
+level - example.po
+
+@XmlJavaTypeAdapter(value=FooAdapter.class,
+type=Foo.class)
+
+A _@XmlJavaTypeAdapter_ that extends
+_XmlAdapter <valueType, boundType>_ and is specified as a package level
+annotation must adapt _boundType_ at the point of reference as follows:
+
+. a property/field/parameter within a class in
+package (e.g _exmple.po)_ whose reference type is _boundType_ . For e.g.
+
+ // Foo will be adapted to MyFoo
+
+ Foo foo;
+
+. a property/field/parameter within a class in
+package (e.g _exmple.po)_ , where _boundType_ is used as a parametric
+type. For e.g.
+
+ // List<Foo> will be adapted to List<MyFoo>
+
+ Foo foo;
+
+
+
+class, interface, enum type:
+
+For clarity, the following code example is
+used along with normative text.
+
+// Adapts Foo type to MyFoo type
+
+FooAdapter extends XmlAdapter<MyFoo, Foo>
+
+
+
+// FooAdapter is specified on class, interface
+or enum type. @XmlJavaTypeAdapter(FooAdapter.class)
+
+public class Foo \{...}
+
+A _@XmlJavaTypeAdapter_ that extends
+_XmlAdapter <valueType, boundType>_ and is specified on the class,
+interface or Enum type (i.e. on a program element that matches meta
+annotation @Target=\{type}) must adapt _boundType_ at the point of
+reference as follows:
+
+. a property/field whose reference type is
+_boundType_ . For e.g.
+
+ // Foo will be adapted to MyFoo
+
+ Foo foo;
+
+. a property/field where _boundType_ is used
+as a parametric type. For e.g.
+
+ // List<Foo> will be adapted to List<MyFoo>
+
+ List<Foo> foo;
+
+Note: A _@XmlJavaTypeAdapter_ on a class does
+not apply to references to it’s sub class.
+
+//Example:
+
+@XmlJavaTypeAdapter(..) public class Foo \{..}
+
+...
+
+public class DerivedFoo extends Foo \{..}
+
+...
+
+public class Bar \{
+
+ // XmlJavaTypeAdapter applies to foo;
+
+ public Foo foo;
+
+ ...
+
+ // XmlJavaTypeAdaper DOES NOT apply to
+derivedFoo;
+
+ public DerivedFoo derivedFoo;
+
+}
+
+property/field/parameter:
+
+A _@XmlJavaTypeAdapter_ that extends
+_XmlAdapter <valueType, boundType>_ and is specified on the
+property/field or parameter must adapt _boundType_ as follows:
+
+. property/field is a single valued and its
+type is _boundType_ :
+
+ // Foo will be adapted to MyFoo
+
+ @XmlJavaTypeAdapter(FooAdapter.class) Foo
+foo;
+
+. a property/field where _boundType_ is used
+as a parametric type. For e.g.
+
+ // List<Foo> will be adapted to List<MyFoo>
+
+ List<Foo> foo;
+
+=== Relationship to other annotations
+
+ _@XmlJavaTypeAdapter_ must be applied first
+before any other mapping annotation is processed. Further annotation
+processing is subject to their respective mapping constraints. For
+example,
+
+// PtoQAdapter is applied first and therefore
+converts type Q to P
+
+// Next foo is mapped with a type of P (not Q)
+subject to the
+
+// mapping constraints specified in
+@XmlElements.
+
+@XmlJavaTypeAdapter(PtoQAdapter)
+
+@XmlElements(\{
+
+ @XmlElement(name="x",type=PX.class),
+
+ @XmlElement(name="y",type=PY.class)
+
+})
+
+Q foo;
+
+
+
+@XmlType abstract class P \{}
+
+@XmlType class PX extends P \{}
+
+@XmlType class PY extends P \{}
+
+=== Class Inheritance Semantics
+
+When annotated on a class, the use of
+_@XmlJavaTypeAdapter_ annotation is subject to the class inheritance
+semantics described here. The semantics is described in terms of two
+classes: a _BaseClass_ and a _SubClass_ that derives from _BaseClass_ .
+There are two cases to consider:
+
+*  _@XmlJavaTypeAdapter_ annotates the
+_BaseClass_
+*  _@XmlJavaTypeAdapter_ annotates the
+_SubClass_ , a class that derives from _BaseClass_ .
+
+BaseClass: In this case, _@XmlJavaTypeAdapter_
+annotates the _BaseClass_ . In this case, the marshalling and
+unmarshalling of an instance of property or a field with a static type
+of baseClass must follow the schema to which
+_XmlJavaTypeAdapter.value()_ is mapped.
+
+//Example: code fragment
+
+@XmlJavaTypeAdapter(..) BaseClass \{..}
+
+public SubClass extends BaseClass \{..}
+
+public BaseClass foo;
+
+public SubClass subFoo = new SubClass();
+
+foo = subFoo;
+
+In the absence of _@XmlJavaTypeAdapter_
+annotation, the instance of subFoo is marshalled with an xsi:type:
+
+<foo xsi:type="subClass"/>
+
+With the _@XmlJavaTypeAdapter_ annotation,
+however, the instance of subFoo must be marshalled/unmarshalled
+following the XML schema for _@XmlJavaTypeAdapter.value()_ .
+
+Subclass: In this case, _@XmlJavaTypeAdapter_
+annotates the _SubClass_ . By definition, the annotation does not cover
+references to BaseClass. Thus, the schema types to which _SubClass_ and
+_BaseClass_ map are not in the same schema type hierarchy. Hence an
+object with a static type of _BaseClass_ but containing an instance of
+_SubClass_ can’t be marshalled or unmarshalled. An attempt to do so must
+fail. For e.g,
+
+// Example: Code fragment
+
+BaseClass\{..}
+
+...
+
+@XmlJavaTypeAdapter(..) SubClass extends
+BaseClass \{..}
+
+
+
+public class Bar \{
+
+ public BaseClass foo;
+
+ public SubClass subFoo = new SubClass();
+
+
+
+ // marshal, unmarshal of foo will fail
+
+ foo = subFoo;
+
+
+
+ // marshal, unmarshal of subFoo will succeed
+
+}
+
+=== @XmlJavaTypeAdapters
+
+This annotation is a container annotation for
+defining multiple _@XmlJavTypeAdapters_ annotations at the package
+level.
+
+=== Synopsis
+
+@Retention(RUNTIME) @Target(\{PACKAGE})
+
+public @interface XmlJavaTypeAdapters \{
+
+ // Collection of @\{@link XmlJavaTypeAdapter}
+annotations
+
+ XmlJavaTypeAdapter[] value();
+
+}
+
+=== Mapping
+
+Each _@XmlJavaTypeAdapter_ annotation in
+_@XmlJavaTypeAdapters.value()_ must be mapped as specified in
+link:jaxb.html#a3561[See @XmlJavaTypeAdapter]”.
+
+=== [[a3676]]Default Mapping
+
+This section describes the default mapping of
+program elements. The default mapping is specified in terms of default
+annotations that are considered to apply to a program element even in
+their absence.
+
+=== [[a3678]]Java Identifier To XML Name
+
+The following is the default mapping for
+different identifiers:
+
+* class name: a class name is mapped to an XML
+name by de capitalization using
+_java.beans.Introspector.decapitalize(class name )._
+* enumtype name: enumtype name is mapped to an
+XML name by de capitalization using
+_java.beans.Introspector.decapitalize(enumtype name)._
+* A property name (e.g. address) is derived
+from JavaBean access method (e.g. getAddress) by JavaBean de
+capitalization of the JavaBean property name
+_java.beans.Introspector.decapitalize(JavaBeanAccessMethod)_
+
+=== Package
+
+A package must be mapped with the following
+default package level mapping annotations:
+
+*  _@XmlAccessorType( +
+javax.xml.bind.annotation.XmlAccessType.PUBLIC_MEMBER)_
+*  _@XmlAccessorOrder( +
+javax.xml.bind.annotation.XmlAccessOrder.UNDEFINED)_
+* 
+
+*  _@XmlSchema_
+
+=== Class
+
+Unless _@XmlTransient_ annotation is present,
+a class with a public or protected no-arg constructor must be mapped
+with the following default mapping annotations: _@XmlType_ .
+
+=== enum type
+
+An enum type must be mapped with the following
+default mapping annotations:
+
+* enum type declaration:
+
+ @XmlType
+
+ @XmlEnum
+
+ enum type \{...}
+
+* each enum constant:
+
+ @XmlEnumValue (enumConstatEnum.name())
+
+=== Property / Field
+
+If the value of _@XmlAccessorType.value()_ is
+_javax.xml.bind.annotation.XmlAccessType.NONE_ , then
+
+* properties and fields, unless explicitly
+annotated, must be considered to be annotated with _@XmlTransient_ .
+
+If the value of _@XmlAccessorType.value()_ is
+_javax.xml.bind.annotation.XmlAccessType.PROPERTY_ , then
+
+* properties not explicitly annotated must be
+mapped; fields, unless explicitly annotated, must be considered to be
+annotated with _@XmlTransient._
+
+If the value of _@XmlAccessorType.value()_ is
+_javax.xml.bind.annotation.XmlAccessType.FIELD_ , then
+
+* fields not explicitly annotated must be
+mapped; properties, unless explicitly annotated, must be considered to
+be annotated with _@XmlTransient._
+
+If the value of _@XmlAccessorType.value()_ is
+_javax.xml.bind.annotation.XmlAccessType.PUBLIC_MEMBER,_ then
+
+* all properties and public fields, unless
+annotated with _@XmlTransient_ , must be mapped.
+
+See javadoc for
+_@javax.xml.bind.annotation.XmlAccessorType_ for further information on
+inheritance rules for this annotation.
+
+=== Default Mapping
+
+A property name (e.g. address) must be derived
+from JavaBean access method (e.g. getAddress) by JavaBean
+decapitalization of the JavaBean property name
+_java.beans.Introspector.decapitalize(JavaBeanAccessMethod)_
+
+A single valued property or field must be
+mapped with the following default mapping annotation:
+
+ _@XmlElement_
+
+* 
+
+A property or field with a collection type
+must be mapped by with the following default mapping annotation:
+
+* if the property or field is annotated with
+_@XmlList_ , then the default mapping annotation is:
+
+ @XmlElement
+
+
+
+* otherwise the default mapping annotation is:
+
+ @XmlElements( \{ @XmlElement(nillable=true)})
+
+=== Map
+
+By default, _java.util.Map<K,V>_ must be
+mapped to the following anonymous schema type. The parameterized types K
+and V must be mapped as specified in link:jaxb.html#a2386[See
+Type Arguments and Wildcards]”. The anonymous schema type is at the
+point of reference.
+
+<!-- Default XML Schema mapping for Map<K,V>
+-->
+
+<xs:complexType>
+
+ <xs:sequence>
+
+ <xs:element name="entry"
+
+ minOccurs ="0" maxOccurs="unbounded">
+
+ <xs:complexType>
+
+ <xs:sequence>
+
+ <xs:element name="key" type="xs:anyType"
+
+ minOccurs="0"/>
+
+ <xs:element name="value" type="xs:anyType"
+
+ minOccurs="0"/>
+
+ </xs:sequence>
+
+ </xs:complexType>
+
+ </xs:element>
+
+ </xs:sequence>
+
+</xs:complexType>
+
+
+
+<!-- Default XML Schema mapping for
+Map<String, Integer>-->
+
+<xs:complexType>
+
+ <xs:sequence>
+
+ <xs:element name="entry"
+
+ minOccurs="0" maxOccurs="unbounded">
+
+ <xs:complexType>
+
+ <xs:sequence>
+
+ <xs:element name="key" type="xs:string"
+
+ minOccurs="0"/>
+
+ <xs:element name="value" type="xs:int"
+
+ minOccurs="0"/>
+
+ </xs:sequence>
+
+ </xs:complexType>
+
+ </xs:element>
+
+ </xs:sequence>
+
+</xs:complexType>
+
+The mapping of Map can be customized using
+_@XmlJavaTypeAdapter_ annotation.
+
+=== Multidimensional Array
+
+By default, a multidimensional array must be
+mapped to a complex type as follows. Note the table specifies a two
+dimensional array mapping. If an array is more than two dimensions, then
+the mapping is used recursively.
+
+
+
+=== Mapping: Two dimensional array to Complex Type Definition
+
+\{name}
+
+If the basetype is a primitive type (e.g.
+int[][]) or its corresponding wrapper class (e.g. Integer[][]), then the
+name is basetype concatenated with “Array” (e.g. intArray).
+
+
+
+otherwise if the basetype is a reference type
+(e.g. Foo[][]), then the XML name to which the reference type is mapped
+(e.g. foo) concatenated with “Array” (e.g. fooArray).
+
+\{target namespace}
+
+if the basetype is a primitive or its
+corresponding wrapper class then "http://jaxb.dev.java.net/array"
+
+ __ 
+
+otherwise the namespace to which the reference
+type is mapped (e.g. for Foo[][], the namespace of the XML type to which
+Foo is mapped).
+
+\{base type definition}
+
+ _xs:anyType_
+
+\{derivation method}
+
+ _restriction_
+
+\{final}
+
+ _#all_
+
+\{abstract}
+
+false
+
+\{attribute uses}
+
+empty set
+
+\{attribute wildcard}
+
+absent
+
+\{content type}
+
+ _element-only content +
+content model_ mapped as specified in link:jaxb.html#a3787[See
+Mapping: Two dimensional array to sequence model group]”.
+
+\{prohibited substitutions}
+
+Empty set
+
+\{annotations}
+
+ _absent_
+
+
+
+=== [[a3787]]Mapping: Two dimensional array to sequence model group
+
+\{compositor}
+
+ _xs:sequence_
+
+\{particles}
+
+A repeating element defined as follows:
+
+
+
+ _<xs:element name="item" type=schematype
+minOccurs="0" maxOccurs="unbounded" nillable="true"/>_
+
+
+
+where schematype is the schema to which the
+array’s component type is mapped (e.g. int[][], then “xs:int”; Foo[][]
+then “foo” assuming Foo is mapped to the schema type foo.
+
+\{annotation}
+
+ _unspecified_
+
+=== Notes
+
+This section contains a collection of notes
+intended to aid in the review of this version of the specification. They
+are collected here in a separate section and referenced from possibly
+multiple places elsewhere in the specification to make the specification
+more compact.
+
+=== [[a3800]]@XmlType: List simple type
+
+It is possible to map a homogenous collection
+to a simple type with a variety of \{list}. For e.g.
+
+// Code fragment
+
+public class USStateList \{
+
+ @XmlValue
+
+ List <int> items;
+
+}
+
+
+
+// schema fragment
+
+<xs:simpleType name=”USStateList”>
+
+ <xs:list itemType=”int”/>
+
+<xs:simpleType>
+
+Other types which can be mapped to a list
+simple type include: indexed property, single dimensional arrays.
+
+== CHAPTER 9 - 
+
+[[a3815]]Compatibility
+
+This section describes conformance
+requirements for an implementor of this specification. A JAXB
+implementation must implement these constraints, without exception, to
+provide a predictable environment for application development and
+deployment.
+
+This section explicitly lists the high level
+requirements of this specification. Additional requirements can be found
+in other sections of this specification and the associated javadoc for
+package _javax.xml.bind_ and its subpackages. If any requirements listed
+here conflict with requirements listed elsewhere in the specification,
+the requirements here take precedence and replace the conflicting
+requirements.
+
+A JAXB implementation must implement the
+processing model specified in Appendix B,
+link:jaxb.html#a3856[See Runtime Processing]”.
+
+A JAXB implementation included in a product
+that supports software development must support a schema generator. A
+schema generator must support all the Java Types to XML Schema mapping
+specified in Section 8, link:jaxb.html#a2236[See Java Types To
+XML]”.
+
+A JAXB implementation included in a product
+that supports software development must support a schema compiler. All
+operating modes of a schema compiler must support all the XML
+Schema-to-Java bindings described in this specification. Additionally,
+any operating mode must not implement a default binding for XML
+Schema-to-Java bindings as an alternative to those specified in Section
+6, link:jaxb.html#a694[See Binding XML Schema to Java
+Representations]” nor alternative interpretations for the standard
+customizations described in Section 7, link:jaxb.html#a1498[See
+Customizing XML Schema to Java Representation Binding].”
+
+The default operating mode for a schema
+compiler MUST report an error when extension binding declaration is
+encountered. All operating modes for a schema compiler MUST report an
+error if an invalid binding customization is detected as defined in
+Section 7. An extension binding declaration must be introduced in the
+following cases:
+
+. to alter a binding customization that is
+allowed to be associated with a schema element as specified in Section
+7, link:jaxb.html#a1498[See Customizing XML Schema to Java
+Representation Binding].”
+. to associate a binding customization with a
+schema element where it is disallowed as specified in Section 7,
+link:jaxb.html#a1498[See Customizing XML Schema to Java
+Representation Binding].”
+
+The default operating mode for a schema
+compiler MUST report an error when processing a schema that does not
+comply with the 2001 W3C Recommendation for XML Schema, [XSD Part 1] and
+[XSD Part 2].
+
+A schema compiler MAY support non-default
+operating modes for binding schema languages other than XML Schema.
+
+A schema compiler MUST be able to generate
+Java classes that are able to run on at least one Sun's Reference
+Implementation of the J2SE Java Runtime Environment that is Java SE 5 or
+higher.
+
+A schema generator MAY support non-default
+operating modes for mapping Java types to schema languages other than
+XML Schema.
+
+A Java platform configured with any JAXB 2.0
+implementation MUST allow any JAXB 1.0 application, packaged as
+specified by the JAXB 1.0 implementation used by the application, to run
+as specified by the JAXB 1.0 specification. A JAXB 1.0 application uses
+schema-derived classes generated by a JAXB 1.0 compliant schema compiler
+and is distributed with the compatible JAXB 1.0 runtime implementation.
+Unlike JAXB 2.0, JAXB 1.0 specified a tight coupling between a JAXB 1.0
+implementation’s schema-derived code and the JAXB 1.0 implementation of
+package _javax.xml.bind_ . The required processing model for a JAXB 1.0
+schema compiler generated package is specified in
+_javax.xml.bind.JAXBContext_ class javadoc under the heading _SPEC
+REQUIREMENT_ .
+
+== CHAPTER 10 - 
+
+References
+
+[XSD Part 0] XML Schema Part 0: Primer, +
+Available at _http://www.w3.org/TR/2004/REC-xmlschema-0-20041028/ +
+_ (schema fragments borrowed from this widely used source)
+
+[XSD Part 1] XML Schema Part 1: Structures, +
+Available at _http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/_
+
+[XSD Part 2] XML Schema Part 2: Datatypes, +
+Available at _http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/_
+
+[XMl-Infoset] XML Information Set, John Cowan
+and Richard Tobin, eds., W3C, 16 March 2001. Available at
+_http://www.w3.org/TR/2001/WD-xml-infoset-20010316/_
+
+[XML 1.0] Extensible Markup Language (XML)
+1.0 (Second Edition), +
+W3C Recommendation 6 October 2000. +
+Available at _http://www.w3.org/TR/2000/REC-xml-20001006_ .
+
+[Namespaces in XML] Namespaces in XML +
+W3C Recommendation 14 January 1999. +
+Available at _http://www.w3.org/TR/1999/REC-xml-names-19990114_
+
+[XPath], XML Path Language, James Clark and
+Steve DeRose, eds., W3C, 16 November 1999. Available at
+_http://www.w3.org/TR/1999/REC-xpath-19991116_
+
+[XSLT 1.0] XSL Transformations (XSLT),
+Version 1.0, James Clark, W3C Recommendation 16 November 1999. Available
+at http://www.w3.org/TR/1999/REC-xslt-19991116.
+
+
+
+[BEANS] JavaBeans(TM), Version 1.01, July 24,
+1997. Available at _http://java.sun.com/beans_ .
+
+[XSD Primer] XML Schema Part 0: Primer, +
+W3C Recommendation 2 May 2001 +
+Available at _http://www.w3.org/TR/xmlschema-0/_
+
+[BLOCH] Joshua Bloch, Effective Java, Chapter
+3, Typesafe Enums +
+_http://developer.java.sun.com/developer/Books/shiftintojavapage1.html#replaceenum_
+
+[BLOCH_2] Joshua Bloch, Effective Java,
+Chapter 1, Item 1: Consider factory methods over constructors
+
+[RFC2396] Uniform Resource Identifiers (URI):
+Generic Syntax, _http://www.ietf.org/rfc/rfc2396.txt._
+
+[JAX-RPC] Javaª API for XML-based RPC JAX-RPC
+1.0, _http://java.sun.com/xml/downloads/jaxrpc.html_ .
+
+[JAX-WS] Javaª API for XML Web
+Services(JAX-WS) 2.0, Marc Hadley, Roberto Chinnici.
+
+[JLS] or [JLS3] The Java Language
+Specification, 3rd Edition, Gosling, Joy, Steele, Bracha. Available at
+_http://java.sun.com/docs/books/jls_ .
+
+[NIST] NIST XML Schema Test Suite, +
+_http://xw2k.sdct.itl.nist.gov/xml/page4.html._
+
+[MTOM] SOAP Message Transmission Optimization
+Mechanism, http://www.w3.org/TR/2004/WD-soap12-mtom-20040608/
+
+[XOP] Martin Gudgin, Noah Mendelsohn, Mark
+Nottingham, and Herve Ruellan. XML-binary Optimized Packaging.
+Recommendation, W3C, January 2005. http://www.w3.org/TR/xop10/.
+
+[MIME] Anish Karmarkar, Ümit Yalçinalp,
+"Describing Media Content of Binary Data in XML", W3C note,
+http://www.w3.org/TR/2005/NOTE-xml-media-types-20050504
+
+[WSIAP] Chris Ferris, Anish Karmarkar, and
+Canyang Kevin Liu. Attachments Profile Version 1.0. Final 1 Material,
+WS-I, August 2004.
+http://www.ws-i.org/Profiles/AttachmentsProfile-1.0-2004-08-24.html.
+
+[WSIBP] WS-I Basic Profile 1.0,
+http://www.ws-i.org/Profile/Basic/2003-08/BasicProfile-1.0a.html
+
+[CA] Common Annotations for the Javaª
+Platform, Rajiv Mordani
+
+=== [[a3855]]Appendix
+
+[[a3856]]Runtime Processing
+
+=== Introduction
+
+Two of the important goals of JAXB 2.0 are
+portability (for inclusion in J2SE) and handling of invalid XML content
+(for e.g. schema evolution). These goals imply that a JAXB Provider must
+be capable of marshalling and unmarshalling XML instances using JAXB
+annotated classes derived using another JAXB Provider. To ensure
+portable behavior of JAXB mapped classes across JAXB Providers requires
+a specification of runtime processing model of the JAXB 2.0 binding
+framework.
+
+This appendix specifies the runtime
+processing model of XML instances and requirements on JAXB 2.0
+Provider's runtime. It differs from the documentation found elsewhere in
+the specification/javadocs. Chapter 4,”Binding Framework” and the
+javadocs for the package javax.xml.bind do describe the JAXB 2.0 binding
+framework. But these are written from a JAXB 2.0 developer perspective
+rather than from a JAXB 2.0 Provider perspective and thus do not
+describe requirements on JAXB 2.0 Provider runtime. This was sufficient
+for JAXB 1.0 since portability was not a goal for JAXB 1.0 and schema
+derived implementation classes were coupled to the JAXB 1.0 Provider
+runtime. However, this is insufficient for JAXB 2.0, where portability
+and handling invalid XML content are goals.
+
+=== Scope and Conventions
+
+=== Scope
+
+This appendix describes marshalling and
+unmarshalling.
+
+=== Format
+
+The specification uses the following for
+specifying runtime behavior:
+
+* XML Infoset, Second Edition,
+http://www.w3.org/TR/xml-infoset augmented with attributes xsi:type and
+xsi:nil that can be used by a document author.
+* XML Schema abstract schema component model.
+* JAXB defined annotations as needed
+
+=== Notations
+
+The following notations/conventions are used:
+
+* For brevity, property is used but is used
+to mean JavaBean property or a field.
+* XML Infoset properties that are associated
+with an information item are enclosed in [...], for e.g. AII.[local
+name]. And program elements the constitute the Java representation to
+which an information item are identified as for e.g. AII.valuetype.
+* AII: Attribute Information Item in XML
+Infoset
+* AII.[local name] : local name property in
+infoset for AII
+* AII.[namespace] : namespace property in
+infoset for AII
+* AII.[owner element] : owner element in
+infoset for AII
+* AII.[normalized value]: normalized value in
+inforset for AII
+* AII.property : JAXB property to which AII
+is mapped. The property in in the java type to which AII.[owner element]
+is mapped.
+* AII.valuetype: Java type representing the
+XML serialized for AII.
+* AII.boundtype: Java type that is bound;
+this differs from AII.valuetype only if JAXB property is associated with
+a @XmlJavaTypeAdapter.
+* AII.schematype : schema type to which AII
+is bound statically using Java -> XML schema mapping rules.
+* EII: Element Information Item in infoset
+* EII.[local name] : local name property in
+XML infoset for EII
+* EII.[namespace] : namespace property in XML
+infoset for EII
+* EII.[children]: children property in XML
+infoset for EII
+* EII.[parent]: parent property in XML
+infoset for EII
+* EII.property : JAXB property to which EII
+is mapped. The property is in the javatype to which EII.[parent] is
+mapped.
+* EII.valuetype : java type representing the
+XML serialized for EII
+* EII.boundtype : java type that is bound;
+this differs from EII.valuetype only if JAXB property is associated with
+a @XmlJavaTypeAdapter.
+* EII.schematype : schema type to which EII
+is bound statically using java -> XML schema mapping rules.
+* EII.xsitype : the xsi:type specified in the
+XML instance by a document author. null if no xsi:type was specified.
+* EII.xsinil : the xsi:nil specified in the
+XML instance by a document author. null if no xsi:nil was specified.
+
+=== Unmarshalling
+
+This section specifies the runtime behavior
+and JAXB provider requirements related to unmarshalling. The
+specification includes unmarshalling of invalid XML content in an XML
+instance. +
+ +
+This section specifies only flexible, standard unmarshalling (flexible
+because unmarshalling deals with invalid XML content). Other
+unmarshalling modes will not be specified. Flexible unmarshalling
+specified here must be supported by all JAXB Providers.
+
+The unmarshalling methods in the binding
+framework fall into the following categories:
+
+. Unmarshal methods that do not take a
+declaredType as parameter:
+
+ _javax.xml.bind.Unmarshaller.unmarshal_
+(...) +
+_javax.xml.bind.Binder.unmarshal_ (...) +
+
+
+
+. Unmarshal methods that take a declaredType
+as a parameter:
+
+ _javax.xml.bind.Unmarshaller.unmarshal_
+(..., _java.lang.Class<T> declaredType_ ) +
+_javax.xml.bind.Binder.unmashal_ (..., _java.lang.Class<T> declaredType_
+)
+
+The unmarshal methods that do not take
+declaredType as parameter must be unmarshalled as specified in
+link:jaxb.html#a3902[See Globally Declared Root Element]”.
+
+The unmarshal methods that take a
+_declaredType_ as a parameter must be unmarshalled as specified in
+link:jaxb.html#a3953[See Declared Type]”.
+
+=== [[a3902]]Globally Declared Root Element
+
+There are two ways that a root element can be
+represented in Java representation:
+
+* as an element instance factory method that
+is generated in the public ObjectFactory class of a package when a
+schema is compiled. An element instance factory method is annotated with
+a
+
+@XmlElementDecl annotation. For e.g.
+
+ public class ObjectFactory \{
+
+ @XmlElementDecl(...)
+
+ public JAXBElement<T> createFoo(T
+elementValue);
+
+ ...
+
+ }
+
+* as a type (either an enum type or a class)
+that has been annotated with @XmlRootElement. For e.g.
+
+
+
+ @XmlRootElement(...)
+
+ public class Foo \{...}
+
+The unmarshalling of XML content results in a
+content tree with a root that is an instance of either a _JAXBElement_
+instance or a type that is annotated with _@XmlRootElement_ . The
+content tree must be created as follows:
+
+. lookup an element factory method in the
+ObjectFactory class matching on:
+
+EII.[namespace] ==
+@XmlElementDecl.namespace() && EII.[local name] ==
+@XmlElementDecl.name()
+
+or for a type annotated with @XmlRootElement
+matching on:
+
+EII.[namespace] ==
+@XmlRootElement.namespace() && EII.[local name] ==
+@XmlRootElement.name()
+
+NOTE: The lookup will only find one of the
+above not both. If both a type as well as an element factory method were
+found, it would be flagged as an error when JAXBContext is created.
+
+. if an element factory method in the
+ObjectFactory class or a type annotated with @XmlRootElement is found,
+then determine the valueType.
+. if an element factory method is found,
+there is no @XmlJavaTypeAdapter associated with the value parameter to
+the element factory method, then the valueType is the java type of the
+value parameter to the element factory method. For e.g.
+
+ @XmlElementDecl(name = "bar", namespace =
+"")
+
+ public JAXBElement<Foo> createBar(Foo value)
+\{
+
+ return new JAXBElement<Foo>(
+
+ _Bar_QNAME, ((Class) Foo.class), null,
+value);
+
+ }
+
+the valueType type is Foo.
+
+* 
+
+if the parameter is associated with
+@XmlJavaTypeAdapter, then the valueType is the java type specified in
+@XmlJavaTypeAdapter.value() .
+
+. if a type annotated with @XmlRootElement is
+found then valueType is the type. For e.g.
+
+ @XmlRootElement(...)
+
+ public class Foo \{ ... }
+
+* 
+
+Go to step 4, “Check for type substitution”
+
+. If neither the element factory method nor a
+type annotated with @XmlRootElement is found, then the element is
+unknown. Set valueType of the element to null.
+
+Even though the element is unknown, a
+document author can still perform type substitution. This case can arise
+if the XML schema contains only schema types and no global elements. For
+e.g a document author could have specified a xsi:type that has been
+mapped by JAXB. For e.g.
+
+ <unknownElement xsi:type="PurchaseOrder"/>
+
+So goto step 4, "Check for type substitution"
+
+. “Check for type substitution”
+. if xsi:type is not specified, and the
+valueType is null (i.e. the root element is unknown and we got to this
+step from step 3), throw a _javax.xml.bind.UnmarshalException_ and
+terminate processing.
+. otherwise, if _xsi:type_ is specified, but
+is not mapped to a JAXB mapped type (e.g. class is not marked with
+@XmlType declaration), then throw a _javax.xml.bind.UnmarshalException_
+and terminate processing.
+. otherwise, if xsi:type is specified, and is
+mapped to a JAXB mapped type set the valueType to the javatype to which
+xsi:type is mapped.
+. otherwise, xsi:type is not specified;
+valueType is unchanged.
+. Unmarshal valueType as specified in
+link:jaxb.html#a3960[See Value Type]”.
+. If the element factory method is annotated
+with @XmlJavaTypeAdapter, then convert the valueType into a boundType
+
+ boundType =
+@XmlJavaTypeAdapter.value().unmarshal(valueType)
+
+. Determine the content root type to be
+returned by unmarshal() method.
+. if the element lookup returned an element
+instance factory method, then create a JAXBElement instance using the
+boundType. The content root type is the JAXBElement instance.
+. otherwise, if the element lookup returned a
+type annotated with @XmlRootElement, then the content root type is the
+boundType.
+. otherwise, the element is an unknown
+element. Wrap the boundType using JAXBElement with an element name in
+the XML instance document (e.g. “unknown Element”). The content root
+type is the JAXBElement instance.
+. return the content root type.
+
+=== [[a3953]]Declared Type
+
+The unmarshalling process described in this
+section must be followed for the unmarshal methods that take a
+_declaredType_ as a parameter.
+
+. Determine the valueType to be unmarshalled
+as follows:
+. if _xsi:type_ is specified, but is not
+mapped to a JAXB mapped type , then throw a
+_javax.xml.bind.UnmarshalException_ and terminate processing.
+. otherwise if _xsi:type_ is specified and is
+mapped to JAXB mapped type, then valueType is the JAXB mapped type.
+. otherwise valueType is the argument passed
+to _declaredType_ parameter in the +
+_unmarshal_ (..., _java.lang.Class<T>declaredType_ ) call.
+. Unmarshal valueType as specified in
+link:jaxb.html#a3960[See Value Type]”.
+
+=== [[a3960]]Value Type
+
+The following steps unmarshal either
+EII.valuetype or AII.valuetype, depending upon whether an EII or AII is
+being unmarshalled.
+
+Note: Whether an EII or AII is being
+unmarshalled is determined by the “caller” of this section.
+AII.valuetype and EII.valuetype are assumed to be set by the time this
+section entered.
+
+. If an instance of valueType does not exist,
+create an instance of valueType as follows (for e.g. if a value of a
+property with type _java.util.List_ is non null, then unmarshal the
+value into that _java.util.List_ instance __ rather than creating a new
+instance of _java.util.List_ and assigning that to the property):
+. if valueType is a class and is the type
+parameter specified in the element factory method, then instantiate the
+class using element factory method; otherwise instantiate the class
+using factory method if specified by _@XmlType.factoryClass()_ and
+_@XmlType.factoryMethod();_ or if there is no factory method, using the
+no-arg constructor.
+. if valueType is an enum type, then obtain
+an instance of the enum type for the enum constant annotated with
+_@XmlEnumValue_ and _@XmlEnumValue.value()_ matches the lexical
+representation of the EII.
+. Invoke any event callbacks in the following
+order as follows:
+. If valueType implements an unmarshal event
+callback _beforeUnmarshal(..)_ as specified in Section 4.4.1,”Unmarshal
+Event Callback”, then invoke _beforeUnmarshal(..)_ .
+. If _Unmarshaller.getListener()_ returns
+_Unmarshaller.Listener_ that is not null, then invoke
+_Unmarshaller.Listener.beforeUnmarshal(..)_ .
+. If an EII.valuetype is being unmarshalled,
+unmarshal into this instance the following. Note: The following steps
+can be done in any order; the steps are just broken down and listed
+separately for clarity:
+
+If EII.valueType being unmarshalled
+
+. unmarshal each child element information
+item in EII.[children] as specified in link:jaxb.html#a3978[See
+Element Information Item]”.
+. unmarshal each attribute information item
+in EII.[attributes] as specified in link:jaxb.html#a4002[See
+Attribute Information Item]”.
+. Unmarshal the value of EII.schematype or
+AII.schematype following the Java to XML Schema rules defined in Chapter
+8, “Java Types to XML”. If the value in XML instance is unparseable,
+then it must be handled as specified in link:jaxb.html#a4086[See
+Unparseable Data for Simple types]”.
+. Invoke any event callbacks in the following
+order as follows:
+. If valueType implements an unmarshal event
+callback _afterUnmarshal(..)_ as specified in Section 4.4.1,”Unmarshal
+Event Callback”, then invoke _afterUnmarshal(..)_ .
+. If _Unmarshaller.getListener()_ returns
+_Unmarshaller.Listener_ that is not null, then invoke
+_Unmarshaller.Listener.afterUnmarshal(..)_ .
+. return // either AII.valuetype or
+EII.valuetype.
+
+=== [[a3978]]Element Information Item
+
+An EII must be unmarshalled as follows:
+
+. infer EII.property as specified in
+link:jaxb.html#a4023[See Property Inference - Element
+Information Item]”.
+. if EII.property is null, then there is no
+property to hold the value of the element. If validation is on (i.e.
+Unmarshaller.getSchema() is not null), then report a
+javax.xml.bind.ValidationEvent. Otherwise, this will cause any unknown
+elements to be ignored.
+
+If EII.property is not null and there is no
+setter method as specified in section link:jaxb.html#a4259[See
+Getters/Setters]” then report a javax.xml.bind.ValidationEvent.
+
+Goto step 8.
+
+. infer the EII.valuetype as described in
+link:jaxb.html#a4043[See Type Inference - Element Information
+Item]”.
+. if EII.valuetype is null, then go to step
+8.
+
+NOTE: EII.valuetype = null implies that there
+was problem. so don't attempt to unmarshal the element.
+
+. Unmarshal EII.valuetype as specified in
+link:jaxb.html#a3960[See Value Type]”.
+. if there is a @XmlJavaTypeAdapter
+associated with EII.property, then adapt the EII.valuetype as follows:
+
+ EII.boundtype = +
+@XmlJavaTypeAdapter.value().unmarshal(EII.valuetype)
+
+otherwise
+
+EII.boundtype = EII.valuetype
+
+. set the value of EII.property to
+EII.boundtype as follows:
+
+Wrap EII.boundtype into a
+javax.xml.bind.JAXBElement instance if:
+
+. the property is not a collection type and
+its type is javax.xml.bind.JAXBElement
+. the property is a collection type and is a
+collection of JAXBElement instances (annotated with @XmlElementRef or
+@XmlElementRefs)
+
+If EII.property is not a collection type:
+
+. set the value of EII.property to
+EII.boundtype.
+
+If EII.property is collection type:
+
+. add EII.boundtype to the end of the
+collection.
+
+NOTE: Adding JAXBElement instance or a type
+to the end of the collection preserves document order. And document
+order could be different from the order in XML Scheme if the instance
+contains invalid XML content.
+
+. return
+
+=== [[a4002]]Attribute Information Item
+
+An attribute information item must be
+unmarshalled as follows:
+
+. infer AII.property as described in section
+link:jaxb.html#a4033[See Property Inference - Attribute
+Information Item]”.
+. if AII.property is null, then the attribute
+is invalid with respect to the XML schema. This is possible if for e.g.
+schema has evolved. If validation is on (i.e. Unmarshaller.getSchema()
+is not null), then report a javax.xml.bind.ValidationEvent. Otherwise,
+this will cause any unknown elements to be ignored.
+
+If AII.property is not null and there is no
+setter method as specified in section link:jaxb.html#a4259[See
+Getters/Setters]” then report a javax.xml.bind.ValidationEvent. +
+ +
+Goto step 8.
+
+. infer the AII.valuetype as described in
+link:jaxb.html#a4079[See Type Inference - Attribute Information
+Item]”.
+. if AII.valuetype is null, then go to step
+8.
+
+NOTE: AII.valuetype = null implies that there
+was problem. so don't attempt to unmarshal the attribute.
+
+. Unmarshal AII.valuetype as specified in
+link:jaxb.html#a3960[See Value Type]”.
+. If AII.property is associated with a
+_@XmlJavaTypeAdapter_ , adapt AII.valuetype as follows:
+
+ AII.boundtype =
+
+
+@XmlJavaTypeAdapter.value().unmarshal(AII.valuetype)
+
+otherwise
+
+ AII.boundtype = AII.valuetype
+
+. If AII.property is single valued:
+. set the value of AII.property to
+AII.boundtype.
+
+If AII.property is a collection type (e.g.
+List<Integer> was mapped to a Xml Schema list simple type using @XmlList
+annotation):
+
+add EII.boundtype to the end of the
+collection.
+
+. return
+
+=== Property Inference
+
+Unmarshalling requires the inference of a
+property or a field that contains the value of EII and AII being
+unmarshalled.
+
+=== [[a4023]]Property Inference - Element Information Item
+
+The property to which an EII is mapped is
+inferred based on name.
+
+* 
+
+Infer EII.property by matching constraints
+described below:
+
+. initialize EII.property to null
+. if property is mapped to XML Schema element
+declaration, elem, in the content model of EII.[parent].schematype &&
+EII.[local name] == elem.\{name} && EII.[namespace] == elem.\{namespace}
+
+set EII.property to property
+
+ Goto step 4.
+
+. If there is a JAXB property mapped to XML
+Schema wildcard ( _xs:any_ ) (as determined by _@XmlAnyElement_ ), set
+this JAXB property to EII.property. This property will hold wildcard
+content (e.g. invalid XML content caused by schema evolution).
+. return EII.property
+
+=== [[a4033]]Property Inference - Attribute Information Item
+
+Infer the property for the AII by matching
+constraints described below:
+
+. initialize AII.property to null
+. if property mapped to XML Schema attribute
+declaration, attr, in the content model of AII.[owner].schematype &&
+AII.[local name] == attr.\{name} && AII.[namespace] == attr.\{namespace}
+
+set AII.property to property
+
+Goto step 4.
+
+. if there is a property mapped to a XML
+Schema xs:anyAttribute (i.e. annotated with _@XmlAnyAttribute_ ), then
+set this property to AII.property. This property holds XML content
+matching wildcard attribute ( _xs:anyAttribute)_ or unknown attributes
+(which can occur for e.g. if schema has evolved).
+. return AII.property
+
+=== Type Inference
+
+Unmarshalling requires the inference of the
+type of a property or a field that to contain the value of EII and AII
+being unmarshalled.
+
+=== [[a4043]]Type Inference - Element Information Item
+
+This section describes how to infer
+EII.valuetype; this holds the value of the element (content model +
+attributes).
+
+EII.valuetype must be inferred as described
+below:
+
+. initialize EII.valuetype to null.
+. if EII.xsitype is set, document author has
+performed type substitution.
+
+Goto step 4 to handle type substitution.
+
+. if EII.schematype is not mapped to a java
+type, then
+. report a validation event.
+. Go to step 7.
+
+otherwise
+
+. set EII.valuetype to the javatype to which
+EII.schematype is mapped.
+. Go to step 7.
+
+NOTE: This case can arise for example, when
+EII.schematype is compiled into a java type at schema compilation time,
+but the javatype was not registered with _JAXBContext.newInstance(..)_ .
+
+. check if EII.xsitype is mapped to a JAXB
+mapped type. It is possible that EII.xsitype is compiled to a javatype
+at schema compilation time, but the javatype was not registered with
+_JAXBContext.newInstance(..)_
+
+If EII.xsitype is not mapped, then report a
+validation event.
+
+Goto step 7.
+
+. check if the java type to which EII.xsitype
+is mapped is assignment comparable with the static type of the
+property/field if no _@XmlJavaTypeAdapter_ is associated with the
+property/field or with the _valueType_ specified in
+_XmlAdapter<valueType, boundType>_ if a _@XmlJavaTypeAdapter_ is
+associated with the property/field.
+
+The above check can fail for e.g when a
+document author attempts to substitute a complex type that derives from
+simple type but customization to enable simple type substitution was not
+used. For e.g.
+
+. <!-- local element with simple type -->
+
+ <xs:element name="foo" type="xs:int"/>
+
+ <!-- complex type for substituting the
+simple type -->
+
+ <xs:complexType name="MyInt">
+
+ <xs:extension xs:int>
+
+ ...add attributes
+
+ </xs:extends>
+
+ </xs:complexType>
+
+. customization to handle type substitution
+of simple types is not used. So the property is
+
+ public int getFoo();
+
+ public void setFoo(int );
+
+ public class MyInt \{...}
+
+. the document author attempts to substitute
+complexType MyInt.
+
+ <foo xsi:type="MyInt"/>
+
+. The type MyInt is not assignment comparable
+with int.
+. set EII.valuetype to javatype to which
+EII.xsitype is mapped.
+
+NOTE: if we got to this step, this implies
+that type substitution is valid.
+
+. return EII.valuetype
+
+=== [[a4079]]Type Inference - Attribute Information Item
+
+Infer the AII.valuetype as follows:
+
+. initialize AII.valuetype to null.
+. if AII.schematype is not mapped to a java
+type, then report a validation event. Otherwise, set AII.valuetype to
+the java type to which AII.schematype is mapped.
+
+NOTE: This case can arise for example, when
+AII.schematype is compiled into a java type at schema compilation time,
+but the javatype is not registered with the
+_JAXBContext.newInstance(..)_
+
+. return AII.valuetype
+
+=== Invalid XML Content
+
+=== [[a4086]]Unparseable Data for Simple types
+
+If simple type data cannot be parsed into a
+java datatype, then the value of the java datatype must not change the
+current set value. An access to the datatype must return the value as
+specified in link:jaxb.html#a4095[See Missing element
+information item]”. If the conversion of lexical representation into a
+value results in an exception, then the exception must be caught and a
+validation event reported. This is to ensure that such conversion errors
+do not terminate unmarshalling.
+
+// Example : XML Schema fragment
+
+<xs:element name="foo" type="xs:int"/>
+
+
+
+// Example: XML instance.
+
+// Data is not parseable into type xs:int ;
+however unmarshal will
+
+// still succeed.
+
+<foo> SUN </foo>
+
+=== [[a4095]]Missing element information item
+
+This case arises when an element declaration
+required by a XML schema is missing from the XML instance.
+
+Property or field access must return the
+value specified in link:jaxb.html#a4101[See Value for missing
+elements/attributes]”
+
+=== Missing Attribute
+
+This case arises when a property or a field
+is mapped to an XML attribute but the attribute is missing from the XML
+instance.
+
+Property or field access must return the
+value specified in link:jaxb.html#a4101[See Value for missing
+elements/attributes]”.
+
+=== [[a4101]]Value for missing elements/attributes
+
+If an attribute or an element is missing from
+an XML instance, then unmarshal will not change the current set value.
+An access to the property will return the set value or if unset, the
+uninitialized value. The uninitialized value of the property or field
+depends upon it's type. If the type is
+
+. int - value is 0
+. boolean - value is false
+. a reference (must be mapped to a simple
+type) - value is null.
+. float - the value is +0.0f
+. double - the value is 0.0d
+. short - the value is (short) 0
+. long - the value is 0L
+
+Note The uninitialized values are returned
+only if the value is not set. A value could be set for example in a
+validation handler that catches the validation event.
+
+=== Unknown Element
+
+In this case, XML instance contains EII for
+which there is no corresponding element declaration in the XML schema.
+If the valuetype to which the EII.parent maps contains a property/field
+annotated with _@XmlAnyElement_ , this EII can be unmarshalled into the
+property/field.
+
+Unknown attribute handling during
+unmarshalling is specified in link:jaxb.html#a4023[See Property
+Inference - Element Information Item]”.
+
+=== Unknown attribute
+
+In this case, XML instance contains AII for
+which there is no corresponding attribute declaration in the XML schema.
+If the valuetype to which the AII.parent maps contains a property/field
+annotated with _@XmlAnyAttribute_ , the AII can be unmarshalled into the
+property/field.
+
+Unknown attribute handling during
+unmarshalling is specified in link:jaxb.html#a4033[See Property
+Inference - Attribute Information Item]”.
+
+=== Marshalling
+
+To marshal a content tree, a JAXB application
+invokes one of the following marshal methods:
+
+Marshaller.marshal(Object jaxbElement, ...)
+throws JAXBException;
+
+
+
+Binder.marshal(Object jaxbObject, ...) throws
+JAXBException;
+
+A JAXB Provider must marshal the content tree
+as follows:
+
+* marshal the XML root element tag as
+specified in link:jaxb.html#a4125[See XML Root Element Tag]”
+* marshal _obj_ as specified in section
+link:jaxb.html#a4132[See Type]”.
+
+=== [[a4125]]XML Root Element Tag
+
+. If _obj_ is an instance of
+_javax.xml.bind.JAXBElement_ then marshal _obj_ as specified in
+link:jaxb.html#a4139[See JAXBElement]”
+
+Goto step 4
+
+. If _obj.getClass()_ is annotated with
+_@XmlRootElement_ , then set \{EII.[local name], EII.[namespace]} by
+deriving them from the @XmlRootElement annotation following the Java to
+Schema mapping rules in chapter 8. Marshal obj instance as specified in
+link:jaxb.html#a4132[See Type]”.
+
+Goto step 4
+
+. If obj has neither an @XmlRootElement nor
+is a JAXBElement instance, then throw a _JAXBException_ and terminate
+processing.
+. done
+
+=== [[a4132]]Type
+
+The type must be marshalled as follows. If
+the type is an instance of
+
+* JAXBElement , then marshal as specified in
+link:jaxb.html#a4139[See JAXBElement]”.
+* Otherwise, marshal the type as follows. If
+the type is a :
+* class, then marshal as specified in
+link:jaxb.html#a4156[See class]”.
+* primitive type or standard class, then
+marshal as specified in link:jaxb.html#a4180[See Primitives and
+Standard classes]”
+* enum type then marshal following the schema
+to which it is mapped.
+
+=== [[a4139]]JAXBElement
+
+An _obj,_ that is an instance of
+_javax.xml.bind.JAXBElement_ must be marshalled as specified here:
+
+.  _JAXBElement jaxbelem = (JAXBElement)
+obj;_
+. set \{EII.[local name] , EII.[namespace]}
+to _jaxbelem.getName()_
+. if _jaxbelem.isNil()_ , add _xsi:nil_ to
+EII.[attributes]
+. 
+
+. if _jaxbelem.isTypeSubstituted()_ is true,
+then type substitution has occurred i.e. _jaxbelem.getDeclaredType()_
+(static type) is different from _jaxbelem.getValue()_ (the type of the
+value for this instance). So,
+. EII.[local name] = “type”
+. EII.[prefix]=”xsi”
+. EII.[normalized value] = QName of the
+schema type to which _jaxbelem.getValue()_ is mapped following Java ->
+Schema mapping rules in Chapter 8. For e.g.
+
+ <foo xsi:type=”MyAddrType”/>
+
+. set boundType to _jaxbelem.getValue()_ if
+_jaxbelem.isTypeSubstituted()_ is _true_ otherwise
+_jaxbelem.getDeclaredType()_
+. determine the valueType to be marshalled.
+If the program element being processed is associated with
+@XmlJavaTypeAdapter then boundType is
+
+ valueType =
+@XmlJavaTypeAdapter.value().marshal(boundType)
+
+otherwise valueType is boundType
+
+. map valueType to XML infoset information
+items as specified in link:jaxb.html#a4132[See Type]” and add
+them to EII.
+. marshal EII.
+
+=== [[a4156]]class
+
+A class must be mapped to XML infoset items
+as follows:
+
+. If a class mapped to a value as specified
+link:jaxb.html#a3331[See @XmlValue]”, then map the value to an
+XML infoset and add it to EII.[children]
+
+return
+
+. For each property that is mapped to XML
+attribute as specified in link:jaxb.html#a3230[See
+@XmlAttribute]”:
+. derive \{AII.[local name], AII.[prefix],
+AII.[namespace] } from \{name} \{target namespace}.
+. AII.[normalized value] = value of property
+as specified in link:jaxb.html#a4169[See property type]”
+. add AII to EII.[attributes]
+
+NOTE: There order in which the properties are
+marshalled is not specified (XML attributes are unordered by XML
+Schema).
+
+. For each property that is mapped to an XML
+element declaration, elem:
+. derive \{childEII.[local name],
+childEII.[prefix], childEII.[namespace] } from elem.\{name}
+elem.\{target namespace}
+. map property type to XML infoset items into
+childEII as specified in link:jaxb.html#a4169[See property
+type]”.
+. add childEII to EII.[children]
+
+=== [[a4169]]property type
+
+The value of a property with type ,
+boundType, must be marshalled into childEII (set by “caller of this
+section”) as follows:
+
+. If property does not have a getter method
+as specified in section link:jaxb.html#a4259[See
+Getters/Setters]” then report a javax.xml.bind.ValidationEvent. Goto
+step 4.
+. If the value of the property being
+marshalled is a subtype boundType, then
+. EII.[local name] = “type”
+. EII.[prefix]=”xsi”
+. EII.[normalized value] = QName of the
+schema type to which _jaxbelem.getValue()_ is mapped following Java ->
+Schema mapping rules in Chapter 8. For e.g.
+
+ <foo xsi:type=”MyAddrType”/>
+
+. add EII to childEII
+. Marshal the value as specified in
+link:jaxb.html#a4132[See Type]”.
+. Return
+
+=== [[a4180]]Primitives and Standard classes
+
+Primitive values and standard classes
+described in this section map to XML schema simple types.
+
+The value of a primitive type or a standard
+class must be marshalled to a lexical representation or unmarshalled
+from a lexical representation as specified in the below:
+
+* using a print or parse method in
+javax.xml.bind.DatatypeConverter interface:
+
+Many of the types have a corresponding print
+and parse method in javax.xml.bind.DatatypeConverter interface for
+converting a value to a lexical representation in XML and vice versa.
+The implementation of DatatypeConverter is JAXB Provider specific.
+
+A XML Schema simple type can have more than
+lexical representation (e.g. “true” “false” “0” “1”). Since the
+DatatypeConverter implementation is JAXB Provider specific, the exact
+lexical representation that a value is marshalled to can vary from one
+JAXB Provider to another. However, the lexical representation must be
+valid with respect to the XML Schema.
+
+* some data types such as
+XMLGregorianCalendar contain methods on the class that return or consume
+their XML lexical representation. For such datatypes, the method
+indicated in the table is used.
+* A wrapper class (e.g. java.lang.Integer)
+must be converted to its non wrapper counterpart (e.g. int) and then
+marshalled.
+
+
+
+=== Lexical Representation of Standard Classes
+
+Java Standard Classes
+
+printMethod
+
+parse Method
+
+ _java.lang.String_
+
+ _printString_
+
+ _parseString_
+
+ _java.util.Calendar_
+
+ _printDateTime_
+
+ _parseDateTime_
+
+ _java.util.Date_
+
+ _printDateTime_
+
+ _parseDateTime_
+
+ _java.net.URI_
+
+ _URI.toString()_
+
+ _URI(String str)_
+
+ _javax.xml.datatype._
+
+ _XMLGregorianCalendar_
+
+ _XMLGregorianCalendar._
+
+ _toXMLFormat()_
+
+ _DatatypeFactory._
+
+ _newXMLGregorianCalendar(_
+
+ _String lexicalRepresentation)_
+
+ _javax.xml.datatype._
+
+ _Duration_
+
+ _Duration._
+
+ _toString()_
+
+ _DatatypeFactory._
+
+ _newDuration(_
+
+ _String lexicalRepresentation)_
+
+ _java.util.UUID_
+
+ _UUID.toString()_
+
+ _UUID.fromString()_
+
+=== Null Value
+
+A null value in Java representation can be
+marshalled either as an absence of an element from an XML instance or as
+_xsi:nil_ . The marshalled value depends upon the values of
+_@XmlElement.required()_ and _@XmlElement.nillable()_ annotation
+elements on the property/field and must be marshalled as shown below.
+For clarity, example schema fragments (as determined by the mapping
+rules specified in Chapter 8) for the following field
+
+@XmlElement(required=”..”, nillable=”...”)
+
+foo;
+
+are reproduced here along with the XML
+representation for null value produced by marshalling.
+
+*  _@XmlElement(required=true, nillable_ =
+_false)_
+
+The value of the property/field cannot be
+null.
+
+ // Example: generated schema
+
+ <xs:element name=”foo” minOccurs=”1”/ ...>
+
+ ...
+
+ </xs:element>
+
+*  _@XmlElement(required=true,
+nillable=true)_
+
+null is marshalled as _xsi:nil=”true”_
+
+ // Example:generated schema
+
+ <xs:element name=”foo” minOccurs=”1”
+nillable=”true” ...>
+
+ ...
+
+ /xs:element>
+
+
+
+ <!-- marshalled XML representation for null
+value -->
+
+ <foo xsi:nil=”true” .../>
+
+*  _@XmlElement(required=false,
+nillable=true)_
+
+null is marshalled as _xsi:nil=”true”_
+
+ // Examle: generated schema
+
+ <xs:element name=”foo” minOccurs=”0” ...>
+
+ ...
+
+ </xs:element>
+
+
+
+ <!-- Example: marshalled XML representation
+for null value -->
+
+ <foo xsi:nil=”true” .../>
+
+*  _@XmlElement(required=false,
+nillable=false)_
+
+null is not marshalled i.e it maps to absence
+of an element from XML instance.
+
+ // Example: Generated schema
+
+ <xs:element name=”foo” minOccurs=”0” ...>
+
+ ...
+
+ </xs:element>
+
+
+
+ <!-- Example: null value for foo not
+marshalled -->
+
+=== [[a4259]]Getters/Setters
+
+When _@XmlAccessType.PUBLIC_MEMBER_ or
+_@XmlAccessType.PROPERTY_ is in effect for a class, then the instance of
+the class is marshalled using getter/setter methods as opposed to
+fields. This section outlines the constraints the must be checked at
+runtime. A constraint failure is handled as specified elsewhere in the
+chapter from where this section is referenced.
+
+Unmarshalling : A property must have a setter
+method if
+
+*  _@XmlAccessorType.PUBLIC_MEMBER_ or
+_@XmlAccessorType.PROPERTY_ applies to the property.
+* or if the property’s getter/setter method
+is annotated with a mapping annotation.
+
+The one exception to the above constraint is:
+if property type is _java.util.List_ then only a getter method is
+required.
+
+* 
+
+Marshalling: A property must have a getter
+method if
+
+*  _@XmlAccessType.PUBLIC_MEMBER_ or
+_@XmlAccessType.PROPERTY_ applies to the class
+* or if the property’s getter/setter method
+is annotated with a mapping annotation.
+
+=== Appendix
+
+[[a4270]]Normative Binding Schema
+Syntax
+
+=== JAXB Binding Schema
+
+Online versions of JAXB Binding Schema are
+available at:
+
+
+_http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd[]http://java.sun.com/xml/ns/jaxb/bindingschema_1_0.xsd[http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd +
+http://java.sun.com/xml/ns/jaxb/bindingschema_1_0.xsd +
+]_
+
+Additions to JAXB 1.0 binding schema are in
+_bold_ .
+
+<?xml version = "1.0" encoding = "UTF-8"?>
+
+<xs:schema
+
+ targetNamespace =
+"http://java.sun.com/xml/ns/jaxb"
+
+ xmlns:jaxb =
+"http://java.sun.com/xml/ns/jaxb"
+
+ xmlns:xs =
+"http://www.w3.org/2001/XMLSchema"
+
+ elementFormDefault = "qualified" +
+attributeFormDefault = "unqualified">
+
+<xs:group name = "declaration">
+
+ <xs:choice>
+
+ <xs:element ref = "jaxb:globalBindings"/>
+
+ <xs:element ref = "jaxb:schemaBindings"/>
+
+ <xs:element ref = "jaxb:class"/>
+
+ <xs:element ref = "jaxb:property"/>
+
+ <xs:element ref = "jaxb:typesafeEnumClass"/>
+
+ <xs:element ref =
+"jaxb:typesafeEnumMember"/>
+
+ <xs:element ref = "jaxb:javaType"/>
+
+ <xs:element ref = "jaxb:dom"/>
+
+ <xs:element ref = "jaxb:inlineBinaryData"/>
+
+ <xs:any namespace = "##other"
+processContents = "lax"/>
+
+ </xs:choice>
+
+ </xs:group>
+
+ <xs:attribute name = "version"
+type="xs:token" >
+
+ _<xs:annotation><xs:documentation>_
+
+ _Used to specify the version of the binding
+schema on the schema element for inline annotations or jaxb:bindings for
+external binding._
+
+ _</xs:documentation></xs:annotation>_
+
+ </xs:attribute>
+
+ <xs:attributeGroup name =
+"propertyAttributes">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>_
+
+ _Attributes used for property customization.
+The attribute group can be referenced either from the globalBindings
+declaration or from the_
+
+ _property declaration. The following
+defaults are defined by the JAXB specification in global scope only.
+Thus they apply when the propertyAttributes group is referenced from the
+globalBindings declaration but not when referenced from the property
+declaration._
+
+ _collectionType a class that implements
+java.util.List._
+
+ _fixedAttributeAsConstantProperty false_
+
+ _enableFailFastCheck false_
+
+ _generateIsSetMethod false_
+
+ __ _optionalProperty wrapper_
+
+ _generateElementProperty false_
+
+ _</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:attribute name = "collectionType"
+type="jaxb:referenceCollectionType"/>
+
+ <xs:attribute name =
+"fixedAttributeAsConstantProperty" type = "xs:boolean"/>
+
+ <xs:attribute name = "enableFailFastCheck"
+type = "xs:boolean"/>
+
+ <xs:attribute name = "generateIsSetMethod"
+type = "xs:boolean"/>
+
+ _<xs:attribute name = "optionalProperty">_
+
+ _<xs:simpleType>_
+
+ _<xs:restriction base="xs:NCName">_
+
+ _<xs:enumeration value="wrapper"/>_
+
+ _<xs:enumeration value="primitive"/>_
+
+ _<xs:enumeration value="isSet"/>_
+
+ _</xs:restriction>_
+
+ _</xs:simpleType>_
+
+ _</xs:attribute>_
+
+ _<xs:attribute name =
+"generateElementProperty" type="xs:boolean"/>_
+
+</xs:attributeGroup>
+
+ <xs:attributeGroup name =
+"XMLNameToJavaIdMappingDefaults">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Customize XMLNames to
+Java id mapping</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:attribute name = "underscoreBinding"
+default = "asWordSeparator" type = "jaxb:underscoreBindingType"/>
+
+ </xs:attributeGroup>
+
+ <xs:attributeGroup name =
+"typesafeEnumClassDefaults">
+
+ <xs:attribute name =
+"typesafeEnumMemberName" _default = "skipGeneration"_ type =
+"jaxb:typesafeEnumMemberNameType"/>
+
+ <xs:attribute name = "typesafeEnumBase"
+_default = "xs:string"_ type = "jaxb:typesafeEnumBaseType"/>
+
+ _<xs:attribute name =
+"typesafeEnumMaxMembers" type="xs:int" default="256"/>_
+
+ </xs:attributeGroup>
+
+ <xs:element name = "globalBindings">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Customization values
+defined in global scope.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:complexType>
+
+ <xs:sequence minOccurs = "0"> +
+<xs:element ref = "jaxb:javaType" minOccurs = "0" maxOccurs =
+"unbounded"/> +
+_<xs:element ref = "jaxb:serializable" minOccurs = "0"/>_
+
+ <xs:any namespace = "##other"
+processContents = "lax">
+
+ _<xs:annotation> <xs:documentation>_
+
+ _allows extension binding declarations to be
+specified._
+
+ _</xs:documentation></xs:annotation>_
+
+ </xs:any>
+
+ </xs:sequence>
+
+ <xs:attributeGroup ref =
+"jaxb:XMLNameToJavaIdMappingDefaults"/>
+
+ <xs:attributeGroup ref =
+"jaxb:typesafeEnumClassDefaults"/>
+
+ <xs:attributeGroup ref =
+"jaxb:propertyAttributes"/>
+
+ _<xs:attribute name="generateValueClass"
+type="xs:boolean"_
+
+ _default= "true"/>_
+
+ _<xs:attribute name="generateElementClass"
+type="xs:boolean"_
+
+ _default= "false"/>_
+
+ _<xs:attribute name="mapSimpleTypeDef"
+type="xs:boolean"_
+
+ _default= "false"/>_
+
+ _<xs:attribute name="localScoping" default=
+"nested">_
+
+ _<xs:simpleType>_
+
+ _<xs:restriction base="xs:NCName">_
+
+ _<xs:enumeration value="nested"/>_
+
+ _<xs:enumeration value="toplevel"/>_
+
+ _</xs:restriction>_
+
+ _</xs:simpleType>_
+
+ _</xs:attribute>_
+
+ <xs:attribute name =
+"enableJavaNamingConventions" default = "true" type = "xs:boolean"/>
+
+ <xs:attribute name = "choiceContentProperty"
+default = "false" type = "xs:boolean"/>
+
+ </xs:complexType>
+
+ </xs:element>
+
+ <xs:element name = "schemaBindings">
+
+ <xs:annotation>
+
+ <xs:documentation>Customization values with
+schema scope<xs:documentation>
+
+ </xs:annotation>
+
+ <xs:complexType>
+
+ <xs:all>
+
+ <xs:element name = "package" type =
+"jaxb:packageType" minOccurs = "0"/>
+
+ <xs:element name = "nameXmlTransform" type =
+"jaxb:nameXmlTransformType" minOccurs = "0"/>
+
+ </xs:all>
+
+ </xs:complexType>
+
+ </xs:element>
+
+ <xs:element name = "class">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Customize interface and
+implementation class.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:complexType>
+
+ <xs:sequence>
+
+ <xs:element name = "javadoc" type =
+"xs:string" minOccurs = "0"/>
+
+ </xs:sequence>
+
+ <xs:attribute name = "name" type =
+"jaxb:javaIdentifierType">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Java class name without
+package prefix.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:attribute>
+
+ <xs:attribute name = "implClass" type =
+"jaxb:javaIdentifierType">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Implementation class name
+including package prefix. </xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:attribute>
+
+ _<xs:attribute name="generateValueClass"
+type="xs:boolean" default= "true"/>_
+
+ </xs:complexType>
+
+ </xs:element>
+
+ <xs:element name = "property">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Customize
+property.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:complexType>
+
+ <xs:all>
+
+ <xs:element name = "javadoc" type =
+"xs:string" minOccurs="0"/>
+
+ <xs:element name = "baseType"
+type="jaxb:propertyBaseType" minOccurs="0"/>
+
+ </xs:all>
+
+ _<xs:attribute name = "name" type =
+"jaxb:javaIdentifierType"/> +
+<xs:attribute name = "attachmentRef" default="default">_
+
+ _<xs:simpleType>_
+
+ _<xs:restriction base="xs:NCName">_
+
+ _<xs:enumeration value="resolve"/>_
+
+ _<xs:enumeration value="doNotResolve"/>_
+
+ _<xs:enumeration value="default"/>_
+
+ _</xs:restriction>_
+
+ _</xs:simpleType>_
+
+ _</xs:attribute>_
+
+ <xs:attributeGroup ref =
+"jaxb:propertyAttributes"/>
+
+ </xs:complexType>
+
+ </xs:element>
+
+ <xs:element name = "javaType">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Data type conversions;
+overriding builtins</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:complexType>
+
+ <xs:attribute name = "name" use = "required"
+type = "jaxb:javaIdentifierType">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>name of the java type to
+which xml type is to be bound.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:attribute>
+
+ <xs:attribute name = "xmlType" type =
+"xs:QName">
+
+ _<xs:annotation>_
+
+ _<xs:documentation> xml type to which java
+datatype has to be bound._
+
+ _Must be present when javaType is scoped to
+globalBindings._
+
+ _</xs:documentation>_
+
+ </xs:annotation>
+
+ </xs:attribute>
+
+ <xs:attribute name = "parseMethod" type =
+"jaxb:javaIdentifierType"/>
+
+ <xs:attribute name = "printMethod" type =
+"jaxb:javaIdentifierType"/>
+
+ _<xs:annotation>_
+
+ _<xs:documentation>_
+
+ _If true, the parsMethod and printMethod
+must reference a method_
+
+ _signtature that has a second parameter of
+type NamespaceContext._
+
+ _</xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:attribute>
+
+ </xs:complexType>
+
+ </xs:element>
+
+<xs:element name = "typesafeEnumClass">
+
+ _<xs:annotation>_
+
+ _<xs:documentation> Bind to a type safe
+enumeration class.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:complexType>
+
+ <xs:sequence>
+
+ <xs:element name = "javadoc" type =
+"xs:string" minOccurs = "0"/>
+
+ <xs:element ref = "jaxb:typesafeEnumMember"
+minOccurs = "0" maxOccurs = "unbounded"/>
+
+ </xs:sequence>
+
+ <xs:attribute name = "name" type =
+"jaxb:javaIdentifierType"/>
+
+ _<xs:attribute name = "map" type =
+"xs:boolean" default = "true"/>_
+
+ </xs:complexType>
+
+ </xs:element>
+
+ <xs:element name = "typesafeEnumMember">
+
+ _<xs:annotation>_
+
+ _<xs:documentation> Enumeration member name
+in a type safe enumeration class.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:complexType>
+
+ <xs:sequence>
+
+ <xs:element name = "javadoc" type =
+"xs:string" minOccurs = "0"/>
+
+ </xs:sequence>
+
+ <xs:attribute name = "value"
+type="xs:anySimpleType"/>
+
+ <xs:attribute name = "name" use = "required"
+type = "jaxb:javaIdentifierType"/>
+
+ </xs:complexType>
+
+ </xs:element>
+
+
+
+ _<!-- TYPE DEFINITIONS -->_
+
+
+
+ <xs:complexType name = "propertyBaseType">
+
+ <xs:all>
+
+ <xs:element ref = "jaxb:javaType" minOccurs
+= "0"/>
+
+ </xs:all>
+
+ _<xs:attribute name = "name" type =
+"jaxb:javaIdentifierType">_
+
+ _<xs:annotation><xs:documentation>_
+
+ _The name attribute for [baseType] enables
+more precise control over the actual base type for a JAXB property. This
+customization enables specifying a more general/specialized base type
+than the property's default base type. The name attribute value must be
+a fully qualified Java class name. Additionally, this Java class must be
+a super interface/class or subclass of the default Java base type for
+the property. When the default base type is a primitive type, consider
+the default Java base type to be the Java wrapper class of that
+primitive type.This customization is useful to enable simple type
+substitution for a JAXB property representing with too restrictive of a
+default base type. It also can be used to provide stronger typing for
+the binding of an element/attribute of type xs:IDREF._
+
+ _</xs:documentation></xs:annotation>_
+
+ _</xs:attribute>_
+
+ </xs:complexType>
+
+<xs:complexType name = "packageType">
+
+ <xs:sequence>
+
+ <xs:element name = "javadoc" type =
+"xs:string" minOccurs = "0"/>
+
+ </xs:sequence>
+
+ <xs:attribute name = "name" type =
+"jaxb:javaIdentifierType"/>
+
+ </xs:complexType>
+
+ <xs:simpleType name =
+"underscoreBindingType">
+
+ _<xs:annotation>_
+
+ _<xs:documentation> +
+Treate underscore in XML Name to Java identifier mapping. +
+</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:restriction base = "xs:string">
+
+ <xs:enumeration value = "asWordSeparator"/>
+
+ <xs:enumeration value = "asCharInWord"/>
+
+ </xs:restriction>
+
+ </xs:simpleType>
+
+ <xs:simpleType name =
+"typesafeEnumBaseType">
+
+ _<xs:annotation>_
+
+ _<xs:documentation> +
+XML types or types derived from them which have enumeration facet(s)
+which are be mapped to typesafeEnumClass by default. The following types
+cannot be specified in this list: "xsd:QName", "xsd:base64Binary",
+"xsd:hexBinary", "xsd:date", "xsd:time", "xsd:dateTime",
+"xsd:duration","xsd:gDay", "xsd:gMonth", "xsd:Year", "xsd:gMonthDay",
+"xsd:gYearMonth",_ _"xsd:ID", "xsd:IDREF", "xsd:NOTATION"_
+
+ _</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:list itemType = "xs:QName"/>
+
+ </xs:simpleType>
+
+ <xs:simpleType name =
+"typesafeEnumMemberNameType">
+
+ _<xs:annotation><xs:documentation> +
+Used to customize how to handle name collisions._
+
+ _</xs:documentation></xs:annotation>_
+
+ <xs:restriction base = "xs:string">
+
+ <xs:enumeration value = "generateName"/>
+
+ <xs:enumeration value = "generateError"/>
+
+ _<xs:enumeration value = "skipGeneration"/>_
+
+ </xs:restriction>
+
+ </xs:simpleType>
+
+ <xs:simpleType name = "javaIdentifierType">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Placeholder type to
+indicate Legal Java identifier.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:list itemType = "xs:NCName"/>
+
+ </xs:simpleType>
+
+ <xs:complexType name =
+"nameXmlTransformRule">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Rule to transform an Xml
+name into another Xml name</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:attribute name = "prefix" type =
+"xs:string">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>prepend the string to
+QName.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:attribute>
+
+ <xs:attribute name = "suffix" type =
+"xs:string">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Append the string to
+QName.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:attribute>
+
+ </xs:complexType>
+
+ <xs:complexType name =
+"nameXmlTransformType">
+
+ _<xs:annotation><xs:documentation>_
+
+ _Allows transforming an xml name into
+another xml name. Use case UDDI 2.0
+schema.</xs:documentation></xs:annotation>_
+
+ <xs:all>
+
+ <xs:element name = "typeName" type =
+"jaxb:nameXmlTransformRule" minOccurs = "0">
+
+ _<xs:annotation><xs:documentation>Mapping
+rule for type definitions.</xs:documentation></xs:annotation>_
+
+ </xs:element>
+
+ <xs:element name = "elementName" type =
+"jaxb:nameXmlTransformRule" minOccurs = "0">
+
+ _<xs:annotation><xs:documentation>Mapping
+rule for elements</xs:documentation></xs:annotation>_
+
+ </xs:element>
+
+ <xs:element name = "modelGroupName" type =
+"jaxb:nameXmlTransformRule" minOccurs = "0">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Mapping rule for model
+group</xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:element>
+
+ <xs:element name = "anonymousTypeName" type
+= "jaxb:nameXmlTransformRule" minOccurs = "0">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>Mapping rule for class
+names generated for an anonymous type.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:element>
+
+ </xs:all>
+
+ </xs:complexType>
+
+ <xs:attribute name =
+"extensionBindingPrefixes">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>_
+
+ _A schema compiler only processes this
+attribute when it occurs on an_
+
+ _an instance of xs:schema element. The value
+of this attribute is a_
+
+ _whitespace-separated list of namespace
+prefixes. The namespace bound_
+
+ _to each of the prefixes is designated as a
+customization declaration_
+
+ _namespace._
+
+ _</xs:documentation>_
+
+ _</xs:annotation>_
+
+ <xs:simpleType>
+
+ <xs:list itemType = "xs:normalizedString"/>
+
+ </xs:simpleType>
+
+ </xs:attribute>
+
+ <xs:element name = "bindings">
+
+ _<xs:annotation>_
+
+ _<xs:documentation> +
+Binding declaration(s) for a remote schema. If attribute node is set,
+the binding declaraions are associated with part of the remote schema
+designated by schemaLocation attribute. The node attribute identifies
+the node in the remote schema to associate the binding declaration(s)
+with._
+
+ _</xs:documentation>_
+
+ _</xs:annotation>_
+
+ _<!-- a <bindings> element can contain
+arbitrary number of binding declarations or nested <bindings> elements
+-->_
+
+ <xs:complexType>
+
+ <xs:sequence>
+
+ <xs:choice minOccurs = "0" maxOccurs =
+"unbounded">
+
+ <xs:group ref = "jaxb:declaration"/>
+
+ <xs:element ref = "jaxb:bindings"/>
+
+ </xs:choice>
+
+ </xs:sequence>
+
+ <xs:attribute name = "schemaLocation" type =
+"xs:anyURI">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>_
+
+ _Location of the remote schema to associate
+binding declarations with._
+
+ _</xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:attribute>
+
+ <xs:attribute name = "node" type =
+"xs:string">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>_
+
+ _The value of the string is an XPATH 1.0
+compliant string that resolves to a node in a remote schema to associate
+binding declarations with. The remote schema is specified by the
+schemaLocation attribute occuring in the current element or in a parent
+of this element. </xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:attribute>
+
+ <xs:attribute name = "version" type =
+"xs:token">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>_
+
+ _Used to indicate the version of binding
+declarations. Only valid on root level bindings element. Either this or
+"jaxb:version" attribute but not both may be specified.
+</xs:documentation>_
+
+ _</xs:annotation>_
+
+ </xs:attribute>
+
+ <xs:attribute ref = "jaxb:version">
+
+ _<xs:annotation>_
+
+ _<xs:documentation>_
+
+ _Used to indicate the version of binding
+declarations. Only valid on root level bindings element. Either this
+attribute or "version" attribute but not both may be
+specified.</xs:documentation>_
+
+ _</xs:annotation>_
+
+ _</xs:attribute>_
+
+ </xs:complexType>
+
+ </xs:element>
+
+ <xs:simpleType
+name="referenceCollectionType">
+
+ <xs:union>
+
+ <xs:simpleType>
+
+ <xs:restriction base="xs:string">
+
+ <xs:enumeration value="indexed"/>
+
+ </xs:restriction>
+
+ </xs:simpleType>
+
+ <xs:simpleType>
+
+ <xs:restriction
+base="jaxb:javaIdentifierType"/>
+
+ </xs:simpleType>
+
+ </xs:union>
+
+ </xs:simpleType>
+
+ _<xs:element name="dom">_
+
+ _<xs:complexType>_
+
+ _<xs:attribute name = "type"
+type="xs:NCName" default="w3c">_
+
+ _<xs:annotation><xs:documentation>Specify
+DOM API to bind to JAXB property to.<xs:documentation></xs:annotation>_
+
+ _</xs:attribute>_
+
+ _</xs:complexType>_
+
+ _</xs:element>_
+
+ _<xs:element name="inlineBinaryData">_
+
+ _<xs:annotation> <xs:documentation> +
+Disable MTOM/XOP encoding for this binary data. Annotation can be placed
+on a type defintion that derives from a W3C XSD binary data type or on
+an element that has a type that is or derives from a W3C XSD binary data
+type._
+
+ _</xs:documentation></xs:annotation>_
+
+ _</xs:element>_
+
+ _<xs:element name = "serializable">_
+
+ _<xs:complexType>_
+
+ _<xs:attribute name="uid" type="xs:long"
+default="1"/> +
+</xs:complexType>_
+
+ _</xs:element>_
+
+</xs:schema>
+
+
+
+
+
+=== [[a4649]]Appendix
+
+Binding XML Names to Java
+Identifiers
+
+=== Overview
+
+This section provides default mappings from:
+
+* XML Name to Java identifier
+* Model group to Java identifier
+* Namespace URI to Java package name
+
+=== [[a4656]]The Name to Identifier Mapping Algorithm
+
+Java identifiers typically follow three
+simple, well-known conventions:
+
+* Class and interface names always begin with
+an upper-case letter. The remaining characters are either digits,
+lower-case letters, or upper-case letters. Upper-case letters within a
+multi-word name serve to identify the start of each non-initial word, or
+sometimes to stand for acronyms.
+* Method names and components of a package
+name always begin with a lower-case letter, and otherwise are exactly
+like class and interface names.
+* Constant names are entirely in upper case,
+with each pair of words separated by the underscore character (‘_’,
+\u005F, LOW LINE).
+
+XML names, however, are much richer than Java
+identifiers: They may include not only the standard Java identifier
+characters but also various punctuation and special characters that are
+not permitted in Java identifiers. Like most Java identifiers, most XML
+names are in practice composed of more than one natural-language word.
+Non-initial words within an XML name typically start with an upper-case
+letter followed by a lower-case letter, as in Java language, or are
+prefixed by punctuation characters, which is not usual in the Java
+language and, for most punctuation characters, is in fact illegal.
+
+In order to map an arbitrary XML name into a
+Java class, method, or constant identifier, the XML name is first broken
+into a _word list_ . For the purpose of constructing word lists from XML
+names we use the following definitions:
+
+* A _punctuation character_ is one of the
+following:
+*  A hyphen (’-’, \u002D, HYPHEN-MINUS),
+*  A period (‘.’, \u002E, FULL STOP),
+*  A colon (’:’, \u003A, COLON),
+*  A dot (‘.’, \u00B7, MIDDLE DOT),
+*  \u0387, GREEK ANO TELEIA,
+* \u06DD, ARABIC END OF AYAH, or
+*  \u06DE, ARABIC START OF RUB EL HIZB.
+*  An underscore (’_’, \u005F, LOW LINE) with
+following exceptionlink:#a5380[29]
+
+These are all legal characters in XML names.
+
+* A _letter_ is a character for which the
+_Character.isLetter_ method returns _true_ , _i.e._ , a letter according
+to the Unicode standard. Every letter is a legal Java identifier
+character, both initial and non-initial.
+* A _digit_ is a character for which the
+_Character.isDigit_ method returns _true_ , _i.e._ , a digit according
+to the Unicode Standard. Every digit is a legal non-initial Java
+identifier character.
+* A _mark_ is a character that is in none of
+the previous categories but for which the
+_Character.isJavaIdentifierPart_ method returns _true_ . This category
+includes numeric letters, combining marks, non-spacing marks, and
+ignorable control characters.
+
+Every XML name character falls into one of
+the above categories. We further divide letters into three
+subcategories:
+
+* An _upper-case letter_ is a letter for
+which the _Character.isUpperCase_ method returns _true_ ,
+* A _lowercase letter_ is a letter for which
+the _Character.isLowerCase_ method returns _true_ , and
+* All other letters are _uncased_ .
+
+An XML name is split into a word list by
+removing any leading and trailing punctuation characters and then
+searching for _word breaks_ . A word break is defined by three regular
+expressions: A prefix, a separator, and a suffix. The prefix matches
+part of the word that precedes the break, the separator is not part of
+any word, and the suffix matches part of the word that follows the
+break. The word breaks are defined as:
+
+=== [[a4681]]XML Word Breaks
+
+Prefix
+
+Separator
+
+Suffix
+
+Example
+
+{empty}[^punct]
+
+punct+1
+
+{empty}[^punct]
+
+foo|--|bar
+
+digit
+
+
+
+{empty}[^ _digit_ ]
+
+foo|22|bar
+
+{empty}[^digit]
+
+
+
+digit
+
+foo|22
+
+lower
+
+
+
+{empty}[^lower]
+
+foo|Bar
+
+upper
+
+
+
+upper lower
+
+FOO|Bar
+
+letter
+
+
+
+{empty}[^letter]
+
+Foo|\u2160
+
+{empty}[^letter]
+
+
+
+letter
+
+\u2160|Foo
+
+uncased
+
+
+
+{empty}[^uncased]
+
+
+
+{empty}[^uncased]
+
+
+
+uncased
+
+
+
+(The character _\u2160_ is ROMAN NUMERAL ONE,
+a numeric letter.)
+
+After splitting, if a word begins with a
+lower-case character then its first character is converted to upper
+case. The final result is a word list in which each word is either
+
+* A string of upper- and lower-case letters,
+the first character of which is upper case (includes underscore,’_’, for
+exception case1).
+* A string of digits, or
+* A string of uncased letters and marks.
+
+Given an XML name in word-list form, each of
+the three types of Java identifiers is constructed as follows:
+
+* A class or interface identifier is
+constructed by concatenating the words in the list,
+* A method identifier is constructed by
+concatenating the words in the list. A prefix verb ( _get_ , _set_ ,
+_etc._ ) is prepended to the result.
+* A constant identifier is constructed by
+converting each word in the list to upper case; the words are then
+concatenated, separated by underscores.
+
+This algorithm will not change an XML name
+that is already a legal and conventional Java class, method, or constant
+identifier, except perhaps to add an initial verb in the case of a
+property access method.
+
+To improve user experience with default
+binding, the automated resolution of frequent naming collision is
+specified in link:jaxb.html#a4770[See Standardized Name
+Collision Resolution]“.
+
+=== Example
+
+=== [[a4734]]XML Names and derived Java Class, Method, and Constant Names
+
+XML Name
+
+Class Name
+
+Method Name
+
+Constant Name
+
+mixedCaseName
+
+MixedCaseName
+
+getMixedCaseName
+
+MIXED_CASE_NAME
+
+Answer42
+
+Answer42
+
+getAnswer42
+
+ANSWER_42
+
+name-with-dashes
+
+NameWithDashes
+
+getNameWithDashes
+
+NAME_WITH_DASHES
+
+other_punct-chars
+
+OtherPunctChars
+
+getOtherPunctChars
+
+OTHER_PUNCT_CHARS
+
+=== [[a4755]]XML Names and derived Java Class, Method, and Constant Names when <jaxb:globalBindings underscoreHandling=”asCharInWord”>
+
+[width="100%",cols="25%,25%,25%,25%",options="header",]
+|===
+|XML Name |Class
+Name |Method Name
+|Constant Name
+|other_punct-chars
+|Other_punctChars
+|getOther_punctChars
+|OTHER_PUNCT_CHARS
+
+|name_with_underscore
+|Name_with_underscore
+|name_with_underscore
+|NAME_WITH_UNDERSCORE
+|===
+
+=== [[a4767]]Collisions and conflicts
+
+It is possible that the name-mapping
+algorithm will map two distinct XML names to the same word list.These
+cases will result in a _collision_ if, and only if, the same Java
+identifier is constructed from the word list and is used to name two
+distinct generated classes or two distinct methods or constants in the
+same generated class. It is also possible if two or more namespaces are
+customized to map to the same Java package, XML names that are unique
+due to belonging to distinct namespaces could mapped to the same Java
+Class identifier. Collisions are not permitted by the schema compiler
+and are reported as errors; they may be repaired by revising XML name
+within the source schema or by specifying a customized binding that maps
+one of the two XML names to an alternative Java identifier.
+
+A class name must not conflict with the
+generated JAXB class, _ObjectFactory_ , link:jaxb.html#a482[See
+Java Package], that occurs in each schema-derived Java package. Method
+names are forbidden to conflict with Java keywords or literals, with
+methods declared in _java.lang.Object_ , or with methods declared in the
+binding-framework classes. Such conflicts are reported as errors and may
+be repaired by revising the appropriate schema or by specifying an
+appropriate customized binding that resolves the name collision.
+
+=== [[a4770]]Standardized Name Collision Resolution
+
+Given the frequency of an XML element or
+attribute with the name “class” or “Class” resulting in a naming
+collision with the inherited method _java.lang.Object.getClass()_ ,
+method name mapping automatically resolves this conflict by mapping
+these XML names to the java method identifier “getClazz”.
+
+* 
+
+=== [[a4773]]Deriving a legal Java identifier from an enum facet value
+
+Given that an enum facet’s value is not
+restricted to an XML name, the XML Name to Java identifier algorithm is
+not applicable to generating a Java identifier from an enum facet’s
+value. The following algorithm maps an enum facet value to a valid Java
+constant identifier name.
+
+* For each character in enum facet value, +
+copy the character to a string representation _javaId_ when
+_java.lang.Character.isJavaIdentifierPart()_ is _true_ .
+* To follow Java constant naming convention,
+each valid lower case character must be copied as its upper case
+equivalent.
+* There is no derived Java constant
+identifier when any of the following occur:
+*  _javaId.length() == 0_
+* 
+_java.lang.Character.isJavaIdentifierStart(javaId.get(0)) == false_
+
+=== [[a4780]]Deriving an identifier for a model group
+
+XML Schema has the concept of a group of
+element declarations. Occasionally, it is convenient to bind the
+grouping as a Java content property or a Java value class. When a
+semantically meaningful name for the group is not provided within the
+source schema or via a binding declaration customization, it is
+necessary to generate a Java identifier from the grouping. Below is an
+algorithm to generate such an identifier.
+
+A name is computed for an unnamed model group
+by concatenating together the first 3 element declarations and/or
+wildcards that occur within the model group. Each XML \{name} is mapped
+to a Java identifier for a method using the XML Name to Java Identifier
+Mapping algorithm. Since wildcard does not have a \{name} property, it
+is represented as the Java identifier “ _Any_ ”. The Java identifiers
+are concatenated together with the separator “ _And_ ” for sequence and
+all compositor and “ _Or_ ” for choice compositors. For example, a
+sequence of element _foo_ and element _bar_ would map to _“_ _FooAndBar_
+_”_ and a choice of element _foo_ and element _bar_ maps to _“_
+_FooOrBar_ _._ ” Lastly, a sequence of wildcard and element _bar_ would
+map to the Java identifier _“_ _AnyAndBar_ _”_ .
+
+=== Example:
+
+Given XML Schema fragment:
+
+<xs:choice> +
+<xs:sequence> +
+<xs:element ref="A"/> +
+<xs:any processContents="strict"/> +
+</xs:sequence> +
+<xs:element ref="C"/>
+
+</xs:choice>
+
+The generated Java identifier would be
+_AAndAnyOrC_ .
+
+=== [[a4788]]Generating a Java package name
+
+This section describes how to generate a
+package name to hold the derived Java representation. The motivation for
+specifying a default means to generate a Java package name is to
+increase the chances that a schema can be processed by a schema compiler
+without requiring the user to specify customizations.
+
+If a schema has a target namespace, the next
+subsection describes how to map the URI into a Java package name. If the
+schema has no target namespace, there is a section that describes an
+algorithm to generate a Java package name from the schema filename.
+
+=== Mapping from a Namespace URI
+
+An XML namespace is represented by a URI.
+Since XML Namespace will be mapped to a Java package, it is necessary to
+specify a default mapping from a URI to a Java package name. The URI
+format is described in [RFC2396].
+
+The following steps describe how to map a URI
+to a Java package name. The example URI,
+_http://www.acme.com/go/espeak.xsd_ , is used to illustrate each step.
+
+. Remove the scheme and _":"_ part from the
+beginning of the URI, if present. +
+Since there is no formal syntax to identify the optional URI scheme,
+restrict the schemes to be removed to case insensitive checks for
+schemes “ _http_ ” and “ _urn_ ”.
+
+ _//www.acme.com/go/espeak.xsd_
+
+. Remove the trailing file type, one of _.??_
+or _.???_ or _.html_ .
+
+ _//www.acme.com/go/espeak_
+
+. Parse the remaining string into a list of
+strings using _’/’_ and _‘:’_ as separators. Treat consecutive
+separators as a single separator.
+
+ _\{"www.acme.com", "go", "espeak" }_
+
+. For each string in the list produced by
+previous step, unescape each escape sequence octet.
+
+ _\{"www.acme.com", "go", "espeak" }_
+
+. If the scheme is a “urn”, replace all
+dashes, “-”, occurring in the first component with
+“.”.link:#a5381[30]
+. Apply algorithm described in Section 7.7
+“Unique Package Names” in [JLS] to derive a unique package name from the
+potential internet domain name contained within the first component. The
+internet domain name is reversed, component by component. Note that a
+leading “ _www_ .” is not considered part of an internet domain name and
+must be dropped.
+
+If the first component does not contain
+either one of the top-level domain names, for example, com, gov, net,
+org, edu, or one of the English two-letter codes identifying countries
+as specified in ISO Standard 3166, 1981, this step must be skipped.
+
+ _\{“com”, “acme”, “go”, “espeak”}_
+
+. For each string in the list, convert each
+string to be all lower case.
+
+ _\{"com”, “acme”, "go", "espeak" }_
+
+. For each string remaining, the following
+conventions are adopted from [JLS] Section 7.7, “Unique Package Names.”
+. If the sting component contains a hyphen,
+or any other special character not allowed in an identifier, convert it
+into an underscore.
+. If any of the resulting package name
+components are keywords then append underscore to them.
+. If any of the resulting package name
+components start with a digit, or any other character that is not
+allowed as an initial character of an identifier, have an underscore
+prefixed to the component.
+
+ _\{"com”, “acme”, "go", "espeak" }_
+
+. Concatenate the resultant list of strings
+using _’.’_ as a separating character to produce a package name.
+
+ _Final package name: "com.acme.go.espeak"._
+
+link:jaxb.html#a4767[See Collisions
+and conflicts], specifies what to do when the above algorithm results in
+an invalid Java package name.
+
+=== [[a4816]]Conforming Java Identifier Algorithm
+
+This section describes how to convert a legal
+Java identifier which may not conform to Java naming conventions to a
+Java identifier that conforms to the standard naming conventions.
+link:jaxb.html#a1608[See Customized Name Mapping]“discusses when
+this algorithm is applied to customization names.
+
+Since a legal Java identifier is also a XML
+name, this algorithm is the same as link:jaxb.html#a4656[See The
+Name to Identifier Mapping Algorithm]” with the following exception:
+constant names must not be mapped to a Java constant that conforms to
+the Java naming convention for a constant.
+
+=== Appendix
+
+External Binding Declaration
+
+=== [[a4821]]Example
+
+=== Example: Consider the following schema and external binding file:
+
+Source Schema: _A.xsd:_
+
+<xs:schema
+xmlns:xs="http://www.w3.org/2001/XMLSchema"
+
+ xmlns:ens="http://example.com/ns"
+
+ targetNamespace="http://example.com/ns"> +
+<xs:complexType name="aType">
+
+ <xs:sequence>
+
+ <xs:element name="foo" type="xs:int"/>
+
+ </xs:sequence>
+
+ <xs:attribute name="bar" type="xs:int"/>
+
+ </xs:complexType>
+
+ <xs:element name="root" type="ens:aType"/>
+
+</xs:schema>
+
+External binding declarations file:
+
+<jaxb:bindings
+xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
+
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+
+ version="1.0">
+
+ <jaxb:bindings schemaLocation=” _A.xsd_ ”>
+
+ <jaxb:bindings
+node="//xs:complexType[@name=’aType’]”>
+
+ <jaxb:class name="customNameType"/>
+
+ <jaxb:bindings
+node=”.//xs:element[@name=’foo’]”> +
+<jaxb:property name="customFoo"/>
+
+ </jaxb:bindings>
+
+ <jaxb:bindings
+node=”./xs:attribute[@name=’bar’]”> +
+<jaxb:property name="customBar"/> +
+</jaxb:bindings>
+
+ </jaxb:bindings>
+
+ </jaxb:bindings>
+
+</jaxb:bindings>
+
+Conceptually, the combination of the source
+schema and external binding file above are the equivalent of the
+following inline annotated schema.
+
+<xs:schema
+xmlns:xs="http://www.w3.org/2001/XMLSchema" +
+xmlns:ens="http://example.com/ns" +
+targetNamespace="http://example.com/ns"
+
+
+xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" +
+jaxb:version="1.0"> +
+<xs:complexType name="aType"> +
+_<xs:annotation> +
+<xs:appinfo> +
+_ _<jaxb:class name="customNameType"/> +
+_ _</xs:appinfo> +
+</xs:annotation> +
+_ <xs:sequence> +
+<xs:element name="foo" type="xs:int"> +
+_<xs:annotation> +
+<xs:appinfo> +
+_ _<jaxb:property name="customFoo"/> +
+_ _</xs:appinfo> +
+</xs:annotation> +
+_ </xs:element> +
+</xs:sequence> +
+<xs:attribute name="bar" type="xs:int"> +
+_<xs:annotation> +
+<xs:appinfo> +
+_ _<jaxb:property name="customBar"/> +
+_ _</xs:appinfo> +
+</xs:annotation> +
+_ </xs:attribute> +
+</xs:complexType> +
+<xs:element name="root" type="ens:aType"/> +
+</xs:schema>
+
+=== Transformation
+
+The intent of this section is to describe the
+transformation of external binding declarations and their target schemas
+into a set of schemas annotated with JAXB binding declarations. ready
+for processing by a JAXB compliant schema compiler.
+
+This transformation must be understood to
+work on XML data model level. Thus, this transformation is applicable
+even for those schemas which contain semantic errors.
+
+The transformation is applied as follows:
+
+. Gather all the top-most _<jaxb:bindings>_
+elements from all the schema documents and all the external binding
+files that participate in this process. _Top-most_ _<jaxb:bindings>_ are
+those _<jaxb:bindings>_ elements that are either a root element in a
+document or whose parent is an _<xs:appinfo>_ element. We will refer to
+these trees as “external binding forest.”
+. Collect all the namespaces used in the
+elements inside the external binding forest, except the taxi namespace,
+_"http://java.sun.com/xml/ns/jaxb”,_ and the no namespace. Allocate an
+unique prefix for each of them and declare the namespace binding at all
+the root _<xs:schema>_ elements of each schema documents. +
+Then add a _jaxb:extensionBindingPrefix_ attribute to each _<xs:schema>_
+element with all those allocated prefixes. If an _<xs:schema>_ element
+already carries this attribute, prefixes are just appended to the
+existing attributes. +
+ +
+Note: The net effect is that all “foreign” namespaces used in the
+external binding forest will be automatically be considered as extension
+customization declaration namespaces.
+. For each _<jaxb:bindings>_ element, we
+determine the “target element” that the binding declaration should be
+associated with. This process proceeds in a top-down fashion as follows:
+. Let _p_ be the target element of the parent
+_<jaxb:bindings>_ . If it is the top most _<jaxb:bindings>_ , then let
+_p_ be the < _jaxb:bindings>_ element itself.
+. Identify the “target element” using
+_<jaxb:bindings>_ attributes. +
+(i) If the _<jaxb:bindings>_ has a _@schemaLocation_ , the value of the
+attribute should be taken as an URI and be absolutized with the base URI
+of the _<jaxb:bindings>_ element. Then the target element will be the
+root node of the schema document identified by the absolutized URI. If
+there’s no such schema document in the current input, it is an error.
+Note: the root node of the schema document is not the document element.
+
+(ii) If the _<jaxb:bindings>_ has _@node_ ,
+the value of the attribute should be evaluated as an XPath 1.0
+expression. The context node in this evaluation should be _p_ as we
+computed in the previous step. It is an error if this evaluation results
+in something other than a node set that contains exactly one element.
+Then the target element will be this element.
+
+(iii) if the _<jaxb:bindings>_ has neither
+_@schemaLocation_ nor _@node_ , then the target element will be _p_ as
+we computed in the previous step. Note: _<jaxb:bindings>_ elements can’t
+have both _@schemaLocation_ and _@node_ at the same time.
+
+We define the target element of a binding
+declaration to be the target element of its parent _<jaxb:bindings>_
+element. The only exception to this is _<jaxb:globalBindings>_ binding
+declaraiton, in which case the target element will be the document
+element of any one of the schema documents being compiled (such choice
+is undeterministic, but the semantics of _<jaxb:globalBindings>_ is not
+affected by this choice, so the end result will be the same.) It is an
+error if a target element of a binding declaration doesn’t belong to the
+_"http://wwww.w3.org/2001/XMLSchema"_ namespace.
+
+. Next, for each target element of binding
+declarations, if it doesn’t have any _<xs:annotation> <xs:appinfo>_ in
+its children, one will be created and added as the first child of the
+target. +
+ +
+After that, we move each binding declaration under the target node of
+its parent _<jaxb:bindings>_ . Consider the first _<xs:appinfo>_ child
+of the target element. The binding declaration element will be moved
+under this _<xs:appinfo>_ element.
+
+=== Appendix
+
+XML Schema
+
+=== Abstract Schema Model
+
+The following summarization abstract schema
+component model has been extracted from [XSD Part 1] as a convenience
+for those not familiar with XML Schema component model in understanding
+the binding of XML Schema components to Java representation. One must
+refer to [XSD Part 1] for the complete normative description for these
+components.
+
+=== [[a4867]]Simple Type Definition Schema Component
+
+=== Simple Type Definition Schema Components
+
+Component
+
+Description
+
+\{name}
+
+Optional. An NCName as defined by
+[XML-Namespaces].
+
+\{target namespace}
+
+Either ·absent· or a namespace name.
+
+\{base type definition}
+
+A simple type definition
+
+\{facets}
+
+A set of constraining facets.
+
+\{fundamental facets}
+
+A set of fundamental facets.
+
+\{final}
+
+A subset of \{extension, list, restriction,
+union}.
+
+\{variety}
+
+One of \{atomic, list, union}. Depending on
+the value of \{variety}, further properties are defined as follows:
+
+
+
+atomic
+
+ _\{primitive type definition}_
+
+A built-in primitive simple type definition.
+
+
+
+list
+
+ _\{item type definition}_
+
+A simple type definition.
+
+
+
+union
+
+ _\{member type definitions}_
+
+A non-empty sequence of simple type
+definitions.
+
+\{annotation}
+
+Optional. An annotation.
+
+=== [[a4899]]Enumeration Facet Schema Component
+
+=== Enumeration Facet Schema Components
+
+Component
+
+Description
+
+\{value}
+
+The actual value of the value. (Must be in
+value space of base type definition.)
+
+\{annotation}
+
+Optional annotation.
+
+=== [[a4907]]Complex Type Definition Schema Component
+
+=== Complex Type Definition Schema Components
+
+Component
+
+Description
+
+\{name}
+
+Optional. An NCName as defined by
+[XML-Namespaces].
+
+\{target namespace}
+
+Either ·absent· or a namespace name.
+
+\{base type definition}
+
+Either a simple type definition or a complex
+type definition.
+
+\{scope}
+
+Either _global_ or a complex type definition
+
+\{derivation method}
+
+Either extension or restriction.
+
+\{final}
+
+A subset of \{extension, restriction}.
+
+\{abstract}
+
+A boolean
+
+\{attribute uses}
+
+A set of attribute uses.
+
+\{attribute wildcard}
+
+Optional. A wildcard.
+
+\{content type}
+
+ One of empty, a simple type definition, or a
+pair consisting of a ·content model· and one of mixed, element-only.
+
+\{prohibited substitutions}
+
+A subset of \{extension, restriction}.
+
+\{substitution group affiliation}
+
+Optional. If exists, this element declaration
+belongs to a substitution group and this specified element name is the
+QName of the substitution head.
+
+\{annotations}
+
+A set of annotations.
+
+=== [[a4937]]Element Declaration Schema Component
+
+=== Element Declaration Schema Components
+
+Component
+
+Description
+
+\{name}
+
+An NCName as defined by [XML-Namespaces].
+
+\{target namespace}
+
+Either ·absent· or a namespace name
+
+\{type definition}
+
+Either a simple type definition or a complex
+type definition.
+
+\{scope}
+
+Optional. Either global or a complex type
+definition.
+
+\{value constraint}
+
+Optional. A pair consisting of a value and
+one of default, fixed.
+
+\{nillable}
+
+A boolean.
+
+\{identity-constraint definitions}
+
+A set of constraint definitions.
+
+\{substitution group affiliation}
+
+Optional. A top-level element definition.
+
+\{substitution group exclusions}
+
+A subset of \{extension, restriction}.
+
+\{disallowed substitution}
+
+A subset of
+\{substitution,extension,restriction}.
+
+\{abstract}
+
+A boolean.
+
+\{annotation}
+
+Optional. An annotation.
+
+=== [[a4965]]Attribute Declaration Schema Component
+
+=== Attribute Declaration Schema Components
+
+Component
+
+Description
+
+\{name}
+
+An NCName as defined by [XML-Namespaces].
+
+\{target namespace}
+
+If form is present and is “qualified”, or if
+form is absent and the value of @attributeFormDefault on the <schema>
+ancestor is “qualified”, then the schema’s \{targetNamespace}, or
+·absent· if there is none, otherwise ·absent·
+
+\{type definition}
+
+A simple type definition.
+
+\{scope}
+
+Optional. Either global or a complex type
+definition.
+
+\{value constraint}
+
+Optional. A pair consisting of a value and
+one of default, fixed.
+
+\{annotation}
+
+Optional. An annotation.
+
+=== Model Group Definition Schema Component
+
+=== Model Group Definition Schema Components
+
+Component
+
+Description
+
+\{name}
+
+An NCName as defined by [XML-Namespaces].
+
+\{target namespace}
+
+Either ·absent· or a namespace name.
+
+\{model group}
+
+A model group.
+
+\{annotation}
+
+Optional. An annotation.
+
+=== Identity-constraint Definition Schema Component
+
+=== Identity-constraint Definition Schema Components
+
+Component
+
+Description
+
+\{name}
+
+An NCName as defined by [XML-Namespaces].
+
+\{target namespace}
+
+Either ·absent· or a namespace name.
+
+\{identity-constraint category}
+
+One of key, keyref or unique.
+
+\{selector}
+
+A restricted XPath ([XPath]) expression.
+
+\{fields}
+
+A non-empty list of restricted XPath
+([XPath]) expressions.
+
+\{referenced key}
+
+Required if \{identity-constraint category}
+is keyref, forbidden otherwise.
+
+An identity-constraint definition with
+\{identity-constraint category} equal to key or unique.
+
+\{annotation}
+
+Optional. An annotation.
+
+=== [[a5012]]Attribute Use Schema Component
+
+=== Attribute Use Schema Components
+
+Component
+
+Description
+
+\{required}
+
+A boolean.
+
+\{attribute declaration}
+
+An attribute declaration.
+
+\{value constraint}
+
+Optional. A pair consisting of a value and
+one of default, fixed.
+
+=== [[a5022]]Particle Schema Component
+
+=== Particle Schema Components
+
+Component
+
+Description
+
+\{min occurs}
+
+A non-negative integer.
+
+\{max occurs}
+
+Either a non-negative integer or unbounded.
+
+\{term}
+
+One of a model group, a wildcard, or an
+element declaration.
+
+=== [[a5032]]Wildcard Schema Component
+
+=== Wildcard Schema Components
+
+Component
+
+Description
+
+\{namespace constraint}
+
+One of any; a pair of not and a namespace
+name or ·absent·; or a set whose members are either namespace names or
+·absent·.
+
+\{process contents}
+
+One of skip, lax or strict.
+
+\{annotation}
+
+Optional. An annotation.
+
+=== Model Group Schema Component
+
+=== Model Group Components
+
+Component
+
+Description
+
+\{compositor}
+
+One of _all, choice_ or _sequence_ .
+
+\{particles}
+
+A list of particles.
+
+\{annotation}
+
+An annotation.
+
+=== Notation Declaration Schema Component
+
+=== Notation Declaration Components
+
+Component
+
+Description
+
+\{name}
+
+An NCName as defined by [XML-Namespaces].
+
+\{target namespace}
+
+Actual value of the targetNamespace
+[attribute] of the parent schema element
+
+\{system identifier}
+
+The ·actual value· of the system [attribute],
+if present, otherwise absent.
+
+\{public identifier}
+
+{empty}The ·actual value· of the public
+[attribute]
+
+\{annotation}
+
+Optional. An annotation.
+
+=== Wildcard Schema Component
+
+=== Wildcard Components
+
+Component
+
+Description
+
+\{namespace constraint}
+
+ One of _any_ ; a pair of _not_ and a
+namespace name or ·absent·; or a set whose members are either namespace
+names or ·absent·.
+
+\{process contents}
+
+One of _skip_ , _lax_ or _strict_ .
+
+\{annotation}
+
+Optional. An annotation.
+
+=== Attribute Group Definition Schema Component
+
+=== Attribute Group Definition Schema Components
+
+Component
+
+Description
+
+\{name}
+
+An NCName as defined by [XML-Namespaces].
+
+\{target namespace}
+
+Either ·absent· or a namespace name.
+
+\{attribute uses}
+
+A set of attribute uses.
+
+\{attribute wildcard}
+
+Optional. A wildcard. _(part of the complete
+wildcard)_
+
+\{annotation}
+
+Optional. An annotation.
+
+=== Appendix
+
+Deprecated JAXB 1.0
+Functionality
+
+=== Overview
+
+Due to significant re-architecture in JAXB
+2.0 to improve efficiency, usability, schema-derived footprint and
+binding framework runtime footprint, certain JAXB 1.0 operations are no
+longer required to be implemented in JAXB 2.0. These deprecated
+operations do still need to be supported by a JAXB 2.0 binding runtime
+for JAXB 1.0 schema-derived classes.
+
+=== [[a5094]]On-demand Validation
+
+It is optional for a JAXB 2.0 implementation
+to implement on-demand validation for JAXB 2.0 mapped classes. There is
+no reasonable way to implement this functionality of JAXB 2.0 annotated
+classes and leverage JAXP 1.3 validation facility. For backwards
+compatibility, an implementation is required to support this
+functionality for JAXB 1.0 schema-derived classes.
+
+=== [[a5096]]Validator for JAXB 1.0 schema-derived classes
+
+ _The following text is from JAXB 1.0
+Specification and applies to JAXB 1.0 schema-derived classes._
+
+An application may wish to validate the
+correctness of the Java content tree based on schema validation
+constraints. This form of validation enables an application to initiate
+the validation process on a Java content tree at a point in time that it
+feels it should be valid. The application is notified about validation
+errors and warnings detected in the Java content tree.
+
+The _Validator_ class is responsible for
+controlling the validation of a content tree of in-memory objects. The
+following summarizes the available operations on the class.
+
+public interface Validator \{ +
+ValidationEventHandler _getEventHandler_ () +
+void _setEventHandler_ (ValidationEventHandler)
+
+  +
+boolean _validate_ (java.lang.Object subrootObject)
+
+ boolean _validateRoot_ (java.lang.Object
+rootObject) +
+
+ java.lang.Object _getProperty_
+(java.lang.String name) +
+void _setProperty_ (java.lang.String name,
+java.lang.Object value)
+
+}
+
+ _The JAXBContext_ class provides a factory
+to create a _Validator_ instance. After an application has made a series
+of modifications to a Java content tree, the application validates the
+content tree on-demand. As far as the application is concerned, this
+validation takes place against the Java content instances and validation
+constraint warnings and errors are reported to the application relative
+to the Java content tree. Validation is initiated by invoking the
+_validateRoot(Object)_ method on the root of the Java content tree or by
+invoking _validate(Object)_ method to validate any arbitrary subtree of
+the Java content tree. The only difference between these two methods is
+global constraint checking (i.e. verifying ID/IDREF constraints.) The
+_validateRoot(Object)_ method includes global constraint checking as
+part of its operation, whereas the _validate(Object)_ method does not.
+
+The validator governs the process of
+validating the content tree, serves as a registry for identifier
+references, and ensures that all local (and when appropriate, global)
+structural constraints are checked before the validation process is
+complete.
+
+If a violation of a local or global
+structural constraint is detected, then the application is notified of
+the event with a callback passing an instance of a _ValidationEvent_ as
+a parameter.
+
+=== [[a5109]]Appendix
+
+[[a5110]]Enhanced Binary Data
+Handling
+
+=== Overview
+
+Optimized transmission of binary data as
+attachments is described by standards such as Soap [MTOM]/Xml-binary
+Optimized Packaging[XOP] and WS-I Attachment Profile 1.0 [WSIAP]. To
+optimally support these standards when JAXB databinding is used within a
+message passing environment, link:jaxb.html#a5149[See
+javax.xml.bind.attachments]“specifies an API that allows for an
+integrated, cooperative implementation of these standards between a
+MIME-based package processor and the JAXB 2.0 unmarshal/marshal
+processes. An enhanced binding of MIME content to Java representation is
+specified in link:jaxb.html#a5113[See Binding MIME Binary
+Data]“.
+
+=== [[a5113]]Binding MIME Binary Data
+
+=== Binary Data Schema Annotation
+
+As specified in [MIME], the XML Schema
+annotation attribute, _xmime:expectedContentTypes_ , lists the expected
+MIME content-type(s) for element content whose type derives from the xsd
+binary datatypes, _xs:base64Binary_ or x _s:hexBinary_ .
+
+JAXB 2.0 databinding recognizes this schema
+constraint to improve the binding of MIME type constrained binary data
+to Java representation. The _xmime:expectedContentType_ attribute is
+allowed on type definitions deriving from binary datatypes and on
+element declarations with types that derive from binary datatypes. For
+JAXB 2.0 binding purposes, the schema annotation,
+_xmime:expectedContentTypes_ is evaluated for binding purposes for all
+cases EXCEPT when the annotation is on an element declaration with a
+named complex type definition. For that case, the
+_xmime:expectedContentTypes_ annotation must be located directly within
+the scope of the complex type definition in order to impact the binding
+of the complex type definition’s simple binary content.
+
+=== Binding Known Media Type
+
+When _@xmime:expectedContentTypes_ schema
+annotation only refers to one MIME type, it is considered a known media
+type for the binary data. [MIME] does not require an _xmime:contentType_
+attribute to hold the dynamic mime type for the binary data for this
+case. JAXB binding can achieve an optimal binding for this case. The
+default MIME type to Java datatype are in
+link:jaxb.html#a5119[See Default Binding for Known Media Type].
+
+=== [[a5119]]Default Binding for Known Media Type
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|MIME Type |Java
+Type
+|image/gif
+|java.awt.Image
+
+|image/jpeg
+|java.awt.Image
+
+|text/xml or application/xml
+|javax.xml.transform.Source
+
+| _any other MIME types_
+|javax.activation.DataHandler
+|===
+
+A JAXB program annotation element,
+_@XmlMimeType_ , is generated to preserve the known media type for use
+at marshal time.
+
+=== schema with a known media type
+
+<?xml version="1.0" ?> +
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" +
+xmlns:tns="http://example.com/know-type" +
+| xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
+
+
+targetNamespace="http://example.com/know-type">
+
+ <xs:import
+namespace="http://www.w3.org/2005/05/xmlmime"
+
+
+schemaLocation="http://www.w3.org/2005/05/xmlmime"/>
+
+ <xs:element name="JPEGPicture"
+type="xs:base64binary" +
+xmime:expectedContentTypes="image/jpeg"/> +
+</xs:schema>
+
+=== JAXB 2.0 binding of Example 9-1
+
+ import java.awt.Image; +
+@XmlRegistry +
+class ObjectFactory \{ +
+@XmlElementDecl(...) +
+@XmlMimeType("image/jpeg")
+
+ JAXBELement<Image> createJPEGPicture(Image
+value); +
+}
+
+The _@XmlMimeType_ annotation provides the
+MIME content type needed by JAXB 2.0 Marshaller to specify the mime type
+to set _DataHandler.setContentType(String)_ .
+
+=== [[a5140]]Schema for local element declaration annotated with known media type
+
+ <?xml version="1.0" ?> +
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" +
+xmlns:tns="http://example.com/know-type" +
+xmlns:xmime="http://www.w3.org/2005/05/xmlmime" +
+targetNamespace="http://example.com/know-type"> +
+<xs:import namespace="http://www.w3.org/2005/05/xmlmime" +
+schemaLocation="http://www.w3.org/2005/05/xmlmime"/> +
+<xs:complexType name="Item"> +
+<xs:sequence> +
+<xs:element name="JPEGPicture" +
+type="xs:base64Binary" +
+xmime:expectedContentTypes="image/jpeg"/> +
+</xs:sequence> +
+</xs:complexType> +
+</xs:schema>
+
+=== Java Binding of link:jaxb.html#a5140[See Schema for local element declaration annotated with known media type]“
+
+import java.awt.Image; +
+public class Item \{ +
+@XmlMimeType("image/jpeg") +
+Image getJPEGPicture(); +
+void setJPEGPicture(Image value); +
+}
+
+=== Binding Preferred Media Types
+
+If there are more than one mime type listed
+in _xmime:expectedContentTypes_ or if there is one with a wildcard in
+it, the annotation specifies the Preferred Media Types and recommends
+that the binary data be simple content that has an attribute
+_xmime:contentType_ that specifies which of the
+_xmime:expectedContentTypes_ the binary data represents.
+
+Given that the exact media type is not known
+for this case, a Preferred Media Type binds to
+_javax.activation.DataHandler_ . _DataHandler_ has a property
+_get/setContentType_ that should be kept synchronized with the value of
+the JAXB binding for the _xmime:contentType_ attribute.
+
+=== [[a5147]]Binding WS-I Attachment Profile _ref:swaRef_
+
+An XML element or attribute with a type
+definition of _ref:swaRef_ is bound to a JAXB property with base type of
+_javax.activation.DataHandler_ and annotated with _@XmlAttachmentRef_ .
+
+=== [[a5149]]javax.xml.bind.attachments
+
+The abstract classes _AttachmentUnmarshaller_
+and _AttachmentMarshaller_ in package _javax.xml.bind.attachments_ are
+intended to be implemented by a MIME-based package processor, such as
+JAX-WS 2.0 implementation, and are called during JAXB unmarshal/marshal.
+The JAXB unmarshal/marshal processes the root part of a MIME-based
+package, delegating knowledge of the overall package and its other parts
+to the _Attachment*_ class implementations.
+
+=== AttachmentUnmarshaller
+
+An implementation of this abstract class by a
+MIME-based package processor provides access to package-level
+information that is outside the scope of the JAXB unmarshal process. A
+MIME-based package processor registers its processing context with a
+JAXB 2.0 processor using the method
+_setAttachmentUnmarshaller(AttachmentUnmarshaller)_ of
+_javax.xml.bind.Unmarshaller_ .
+
+Interactions between the Unmarshaller and the
+abstract class are summarized below. The javadoc specifies the details.
+
+public abstract class AttachmentUnmarshaller
+\{ +
+public boolean isXOPPackage(); +
+public abstract DataHandler getAttachmentAsDataHandler(String cid); +
+public abstract byte[] getAttachmentAsByteArray(String cid); +
+}
+
+The JAXB unmarshal process communicates with
+a MIME-based package processor via an instance of AttachmentUnmarshaller
+registered with the unmarshaller. link:jaxb.html#a5165[See JAXB
+marshal/unmarshalling of optimized binary content.] summarizes this
+processing.
+
+* MTOM/XOP processing during unmarshal: +
+When _isXOPPackage()_ returns true, the unmarshaller replaces each XOP
+include element it encounters with MIME content returned by the
+appropriate _getAttachment*()_ method.
+* WS-I AP processing: +
+Each element or attribute of type definition _ref:swaRef_ , a content-id
+uri reference to binary data, is resolved by the unmarshal process by a
+call to the appropriate _getAttachment*()_ method.
+
+=== AttachmentMarshaller
+
+An _AttachmentMarshaller_ instance is
+registered with a _javax.xml.bind.Marshaller_ instance using the method
+_Marshaller.setAttachmentMarshaller()_ .
+
+Interactions between the Marshaller and the
+abstract class is summarized below. See the javadoc for details.
+
+public abstract class AttachmentMarshaller
+\{ +
+public boolean isXOPPackage(); +
+public abstract String +
+addMtomAttachment(DataHandler data, +
+String elementNamespace, +
+String elementLocalName); +
+public abstract String +
+addMtomAttachment(byte[] data, +
+String elementNamespace, +
+String elementLocalName); +
+public abstract String addSwaRefAttachment(DataHandler data); +
+}
+
+When an AttachmentMarshaller instance is
+registered with the Marshaller, the following processing takes place.
+
+* MTOM/XOP processing: +
+When _isXOPPackage_ () is true and a JAXB property representing binary
+data is being marshalled, the method _addMtomAttachment_ (...) is called
+to provide the MIME-based package processor the opportunity to decide to
+optimize or inline the binary data. +
+ +
+Note that the schema customization specified in
+link:jaxb.html#a2193[See <inlineBinaryData> Declaration]“can be
+used to declaratively disable XOP processing for binary data.
+* WS-I AP processing: +
+The _addSwaRefAttachment_ method is called when marshalling content
+represented by a _ref:swaRef_ type definition. +
+ +
+One can declaratively customize swaRef processing within a schema using
+schema customization @attachmentRef of <jaxb:property>, specified in
+link:jaxb.html#a1786[See Usage]“.
+
+=== [[a5165]]JAXB marshal/unmarshalling of optimized binary content.
+
+image:xmlb-23.png[image]
+
+=== Appendix
+
+Change Log
+
+=== Changes since Proposed Final Draft
+
+* Section 7.6.1.2, nameXmlTransform: Apply
+customization [ _jaxb:nameXmlTransform]_ addition of prefix and/or
+suffix after XML to Java name transformation is applied.
+* Section 6.7.1-2 changed to allow generation
+of element factory method for abstract element. Change was necessary to
+support element substitution. The abstract element factory method is
+generated so it can be annotated with JAXB program annotation that
+enables element substitution, _@XmlElementDecl.substitutionHeadName_ .
+* Section 7.7.3.5 fixed the example with
+<class> customization. Made the corresponding change in Section 6.7.2 so
+Objectfactory method creates an instance of generated class.
+* Chapter 8 and appendix B:
+@XmlJavaTypeAdapter on class, interface or enum type is mutually
+exclusive with any other annotation.
+* Chapter 8: added @XmlElement.required() for
+schema generation
+* Section 8.7.1.2: clarifications for no-arg
+static factory method in @XmlType annotation.
+* Section 8.9.13.2: Disallow use of @XmlList
+on single valued property.
+* Section 8.9.8.2, Table 8-30 :
+@XmlAnyAttribute maps to anyAttribute with a namespace constraint with
+##other.
+* Section 8.9.1.2: If @XmlElement.namespace()
+is different from that of the target namespace of the enclosing class,
+require a global element to be generated in the namespace specified in
+@XmlElement.namespace() to make the generated schema complete.
+* Section 8.9.15: Allow @XmlMimeType on a
+parameter.
+* Section 8.9.16: Allow @XmlAttachmentRef on
+a parameter.
+* Chapter 8: removed constraint check that
+namespace() annotation element must be a valid namespace URI from
+different annotations.
+* Chapter 8: Java Persistence and JAXB 2.0
+alignment related changes. +
+constructor requirement: public or protected no-arg constructor +
+@AccessType renamed to @XmlAccessType. +
+@AccessorOrder renamed to @XmlAccessOrder. +
+@XmlTransient is mutually exclusive with other annotations. +
+@A property or field that is transient or marked with @XmlTransient and
+specified in @XmlType.propOrder is an error.
+* Chapter 8: Clarifications for generics -
+type variables with type bound, bounded wildcards and java.util.Map.
+* Section 8.9: reworked constraints on the
+properties to handle different use cases permitted by JavaBean design
+pattern.
+* Section 8: Take elementFormDefault into
+account when determining the namespace for @XmlElement and
+@XmlElementWrapper annotations.
+* Section 8: Added missing mapping
+constraints for @XmlElementWrapper. Also disallow use of @XmlIDREF with
+@XmlElementWrapper.
+* Chapter 9, “Compatibility”: clarified
+schema generator and schema compiler requirements.
+* Section B.2.5: Added marshalling of null
+value as xsi:nil or empty element based upon @XmlElement.required and
+@XmlElement.nillable annotation elements.
+* Section B.5: Added new section and moved
+runtime requirements on getters/setters to here.
+
+=== Changes since Public Review
+
+* Update link:jaxb.html#a3815[See
+Compatibility]” for JAXB 2.0 technology. Additional requirements added
+for Java Types to XML binding and the running of JAXB 1.0 application in
+a JAXB 2.0 environment.
+* Added external event callback mechanism,
+_Unmarshaller.Listener_ and _Marshaller.Listener_ .
+* Added new unmarshal method overloading,
+unmarshal by declaredType, to _Unmarshaller_ and _Binder_ . Enables
+unmarshalling a root element that corresponds with a local element
+declaration in schema.
+* Added link:jaxb.html#a1459[See
+Modifying Schema-Derived Code]” describing use of annotation
+_@javax.annotation.Generated_ to distinguish between generated and
+user-modified code in schema-derived class.
+* Element declaration with anonymous complex
+type definition binds to _@XmlRootElement_ annotated class except for
+cases in Section 6.7.3.1.
+* Removed <jaxb:globalBindings
+nullsInCollection>. The customization <jaxb:property
+generateElementProperty=”true”> can achieve same desired result.
+* Added clarification that mapping two or
+more target namespaces to same java package can result in naming
+collision that should be detected as an error by schema compiler.
+* Added <jaxb:factoryMethod> customization to
+enable the resolution of name collisions between factory methods.
+* First parameter to any of the overloaded
+Marshaller.marshal() methods must be a JAXB element; otherwise, method
+must throw MarshalException. See updated Marshaller javadoc and
+link:jaxb.html#a397[See Marshalling]” for details.
+* Prepend “_”, not “Original”, to a Java
+class name representing an XML Schema type definition that has been
+redefined in link:jaxb.html#a1316[See Redefine]”.
+* Format for class name in _jaxb.index_ file
+clarified in JAXBConext.newInstance(String) method javadoc.
+* Clarifications on @dom customization in
+Section 7.12..
+* Chapter 8: Added support for
+@XmlJavaTypeAdapter at the package level.
+* Chapter 8: Added new annotation
+@XmlJavaTypeAdapters as a container for defining multiple
+@XmlJavaTypeAdapters at the package level.
+* Chapter 8: Added support for @XmlSchemaType
+at the package level.
+* Chapter 8: Added @XmlSchemaTypes as a
+container annotation for defining multiple @XmlSchemaType annotations at
+the package level.
+* Chapter 8: added lists of annotations
+allowed with each annotation.
+* Chapter 8: Bug fixes and clarifications
+related to mapping and mapping constraints.
+* Chapter 8: Expanded collection types mapped
+to java.util.Map and java.util.Collection.
+* Appendix B. Incorporate event call backs
+into unmarshalling process.
+* Appendix B: Incorporate into unmarshalling
+process additional unmarshal methods: Binder.unmarshal(..), unmarshal
+methods that take a declaredType as a parameter - Binder.unmarshal(...,
+declaredType) and Unmarshaller.unmarshal(...,declaredType).
+
+=== Changes since Early Draft 2
+
+* Simple type substitution support added in
+Section 6.7.4.2.
+* Updates to enum type binding. (Section
+7.5.1, 7.5.5, 7.10, Appendix D.3)
+* Optimized binary data.(Appendix H) and
+schema customizations. (Section 7.13 and 7.10.5)
+* Clarification for _<jaxb:globalBindings
+underscoreHandling=”asCharInWord”>_ (Appendix D.2)
+* Added Unmarshal and Marshal Callback Events
+(Section 4.4.1,4.5.1)
+* Clarification: xs:ID and xs:IDREF can not
+bind to an enum type. (Section 6.2.3,7.10.5)
+* Added schema customization: +
+<jaxb:globalBinding localScoping=”nested”|”toplevel”> (Section 7.5.1) +
+<jaxb:inlineBinaryData> (Section 7.13) +
+<jaxb:property @attachmentRef/> (Section 7.8.1)
+* Updated Section 6 and 7 with mapping
+annotations that are generated on schema-derived JAXB
+classes/properties/fields.
+* Added javax.xml.bind.Binder class to
+Section 4.8.2.
+* Runtime generation of schema from JAXB
+mapping annotations: JAXBContext.generateSchema().
+* Chapter 8: added @XmlList: bind
+property/field to simple list type
+* Chapter 8: added @XmlAnyElement: bind
+property/field to xs:any
+* Chapter 8: added @XmlAnyAttribute - bind
+property/field to xs:anyAttribute
+* Chapter 8. added @XmlMixed - for mixed
+content
+* Chapter 8, added annotations for
+attachment/MTOM support: @XmlMimeType, @XmlAttachmentRef
+* Chapter 8: added @XmlAccessorOrder - to
+specify default ordering.
+* Chapter 8: added @XmlSchemaType mainly for
+use in mapping XMLGregorianCalendar.
+* Chapter 8: map java.lang.Object to
+xs:anyType
+* Chapter 8: added mapping of
+XMLGregorianCalendar
+* Chapter 8: added mapping of generics - type
+variables, wildcardType
+* Chapter 8: added mapping of binary data
+types.
+* Chapter 8: default mappings changed for
+class, enum type.
+* Chapter 8: default mapping of propOrder
+specified.
+* Chapter 8: mapping of classes - zero arg
+constructor, factory method.
+* Chapter 8: added Runtime schema generation
+requirement.
+* Chapter 8: Clarified mapping constraints
+and other bug fixes.
+* Added Appendix B new: Added Runtime
+Processing Model to specify the marshalling/unmarshalling for dealing
+with invalid XML content and schema evolution.
+* Updated Appendix C to JAXB 2.0 binding
+schema.
+
+=== Changes since Early Draft
+
+* Updated goals in Introduction.
+* Update to Section 3 “Architecture”
+introducing Java to Schema binding.
+*  section on portable annotation-driven
+architecture.
+* section on handling of invalid XML content
+* Binding Framework
+* Replaced _IXmlElement<T>_ interface with
+_JAXBElement<T>_ class. (JAXBElement is used for schema to java binding)
+*  _JAXBIntrospector_ introduced _._
+* Add flexible (by-name) unmarshal and
+describe JAXB 1.0 structural unmarshalling.
+* Moved deprecated on-demand validation,
+accessible via javax.xml.bind.Validator, to Appendix H.
+* XSD to Java Binding
+* Bind complex type definition to value class
+by default.
+* Schema-derived code is annotated with JAXB
+java annotations.
+* Bind XSD simpleType with enum facet to J2SE
+5.0 enum type. Change default for jaxb:globalBinding @typeEnumBase from
+xs:NCName to xs:string.
+*  _ObjectFactory_ factory methods no longer
+throws _JAXBException_ .
+* Added customizations +
+[jaxb:globalBindings] @generateValueClass, @generateElementClass,
+@serializable, @optionalProperty, @nullInCollection +
+[jaxb:property] @generateElementProperty
+* Add binding support for redefine
+* Simplified following bindings: +
+- union by binding to String rather than Object. +
+- Attribute Wildcard binds to portable abstraction of a
+java.util.Map<QName, String>, not javax.xml.bind.AttributeMap. +
+- bind xsd:anyType to java.lang.Object in JAXB property method
+signatures and element factory method(support element/type substitution)
+* Changes required for default and customized
+binding in order to support flexible unmarshalling described in Section
+4.4.3.
+* Java to XSD Binding
+* Added @XmlAccessorType for controlling
+whether fields or properties are mapped by default.
+* Added @XmlEnum and @XmlEnumValue for
+mapping of enum types.
+* Collections has been redesigned to allow
+them to be used in annotation of schema derived code:
+
+ - removed @XmlCollectionItem and
+@XmlCollection
+
+- Added annotations parameters to @XmlElement
+
+- added @XmlElementRef
+
+- added @XmlElements and @XmlElementRefs as
+containers for collections of @XmlElements or @XmlElementRefs.
+
+- added @XmlElementWrapper for wrapping of
+collections.
+
+* Added mapping of anonymous types.
+* Added mapping of nested classes to schema
+* Added @XmlRootElement for annotating
+classes. @XmlElement can now only be used to annotate properties/fields.
+* Added @XmlElementRef for supporting schema
+derived code as well as mapping of existing object model to XML
+representation. javadoc for @XmlElementRef contains an example
+* Added @XmlElementDecl on object factory
+methods for supporting mapping of substitution groups for schema -> java
+binding.
+* Redesigned Adapter support for mapping of
+non Java Beans.
+
+ - new package
+javax.xml.bind.annotation.adapters for adapters.
+
+- Added XmlAdapter base abstract class for
+all adapters.
+
+- redesigned and moved XmlJavaTypeAdapter to
+the package.
+
+* Moved default mapping from each section to
+“Default Mapping” section.
+* Consistent treatment of defaults
+“##default”
+* Removed JAX-RPC 1.1 Alignment. JAX-WS 2.0
+is deferring its databinding to JAXB 2.0.
+
+=== Changes for 2.0 +
+Early Draft v0.4
+
+* Updated link:jaxb.html#a2[See
+Introduction]”.
+* Added link:jaxb.html#a151[See
+Requirements]”
+* Added link:jaxb.html#a2236[See Java
+Types To XML]” for Java Source to XML Schema mapping.
+* XML Schema to schema-derived Java Binding
+changes
+* Element handling changes to support element
+and type substitution in link:jaxb.html#a680[See Java Element
+Representation Summary]”, link:jaxb.html#a1023[See Element
+Declaration]” and link:jaxb.html#a630[See Element Property]”.
+* Added link:jaxb.html#a1306[See
+Attribute Wildcard]” binding
+* Support binding all wildcard content in
+link:jaxb.html#a1384[See Bind wildcard schema component]”.
+* Addition/changes in
+link:jaxb.html#a725[See Java Mapping for XML Schema Built-in
+Types].
+* XML Schema to Java Customization
+* Added ability to doable databinding for an
+XML Schema fragment in link:jaxb.html#a2165[See <dom>
+Declaration]”.
+
+=== Changes for 1.0 Final
+
+* Added method
+_javax.xml.bind.Marshaller.getNode(Object)_ which returns a DOM view of
+the Java content tree. See method's javadoc for details.
+
+=== Changes for Proposed Final
+
+* Added link:jaxb.html#a3815[See
+Compatibility].”
+* Section 5.9.2, “General Content Property,”
+removed value content list since it would not be tractable to support
+when type and group substitution are supported by JAXB technology.
+* Added the ability to associate
+implementation specific property/value pairs to the unmarshal,
+validation and JAXB instance creation. Changes impact Section 3.4
+“Unmarshalling,” Section 3.5 “Validator” and the ObjectFactory
+description in Section 4.2 “Java Package.”
+* Section 6.12.10.1, “Bind a Top Level Choice
+Model Group” was updated to handle Collection properties occurring
+within a Choice value class.
+* Section 6.12.11, “Model Group binding
+algorithm” changed step 4(a) to bind to choice value class rather than
+choice content property.
+* link:jaxb.html#a595[See List
+Property] and link:jaxb.html#a610[See isSet Property Modifier]”
+updated so one can discard set value for a List property via calling
+unset method.
+* At end of Section 4, added an UML diagram
+of the JAXB Java representation of XML content.
+* Updated default binding handling in
+link:jaxb.html#a996[See Model Group Definition].” Specifically,
+value class, element classes and enum types are derived from the content
+model of a model group definition are only bound once, not once per time
+the group is referenced.
+* Change link:jaxb.html#a1384[See
+Bind wildcard schema component],” to bind to a JAXB property with a
+basetype of _java.lang.Object,_ not _javax.xml.bind.Element._ Strict and
+lax wildcard validation processing allows for contents constrained only
+by _xsi:type_ attribute. Current APIs should allow for future support of
+_xsi:type_ .
+* Simplify anonymous simple type definition
+binding to typesafe enum class. Replace incomplete approach to derive a
+name with the requirement that the @name attribute for element
+typesafeEnumClass is mandatory when associated with an anonymous simple
+type definition.
+* Changed link:jaxb.html#a1012[See
+Deriving Class Names for Named Model Group Descendants]” to state that
+all classes and interfaces generated for XML Schema component that
+directly compose the content model for a model group, that these
+classes/interfaces should be generated once as top-level interface/class
+in a package, not in every content model that references the model
+group.
+* Current link:jaxb.html#a1580[See
+<globalBindings> Declaration]”:
+* Replaced _modelGroupAsClass_ with
+_bindingStyle_ .
+* Specified schema types that cannot be
+listed in _typesafeEnumBase_ .
+* link:jaxb.html#a1783[See <property>
+Declaration]:
+* Clarified the customization of model groups
+with respect to _choiceContentProperty, elementBinding and
+modelGroupBinding._ Dropped _choiceContentProperty_ from the
+_<property>_ declaration.
+* Added _<baseType>_ element and clarified
+semantics.
+* Added support for customization of simple
+content.
+* Added customization of simple types at
+point of reference.
+* Clarified restrictions and relationships
+between different customizations.
+* link:jaxb.html#a1981[See <javaType>
+Declaration]”:
+* Added
+_javax.xml.bind.DatatypeConverterInterface_ interface.
+* Added _javax.xml.bind.DatatypeConverter_
+class for use by user specified parse and print methods.
+* Added
+_javax.xml.namespace.NamespaceContext_ class for processing of QNames.
+* Clarified print and parse method
+requirements.
+* Added narrowing and widening conversion
+requirements.
+* Throughout link:jaxb.html#a1498[See
+Customizing XML Schema to Java Representation Binding],” clarified the
+handling of invalid customizations.
+
+=== Changes for Public Draft 2
+
+Many changes were prompted by inconsistencies
+detected within the specification by the reference implementation
+effort. Change bars indicate what has changed since Public Draft.
+
+* Section 4.5.4, “isSetProperty Modifier,”
+describes the customization required to enable its methods to he
+generated.
+* Section 5.7.2, “Binding of an anonymous
+type definition,” clarifies the generation of value class and typesafe
+enum classes from an anonymous type definition.
+* Section 5.2.4, “List” Simple Type
+Definition and the handling of list members within a union were added
+since public draft.
+* Clarification on typesafe enum global
+customization “generateName” in Section 5.2.3.4, “XML Enumvalue
+To Java Identifier Mapping.”
+* Clarification of handling binding of
+wildcard content in Section 5.9.4.
+* Chapter6, “Customization,” resolved binding
+declaration naming inconsistencies between specification and normative
+binding schema.
+* removed _enableValidation_ attribute (a
+duplicate of _enableFailFastCheck)_ from < _globalBindings>_
+declaration.
+* Added default values for <
+_globalBindings>_ declaration attributes.
+* Changed _typesafeEnumBase_ to a list of
+QNames. Clarified the binding to typesafe enum class.
+* Clarified the usage and support for
+_implClass_ attribute in _<class>_ declaration.
+* Clarified the usage and support for
+_enableFailFastCheck_ in the _<property>_ declaration.
+* Added _<javadoc>_ to typesafe enum class,
+member and property declarations.
+* Mention that embedded HTML tags in
+_<javadoc>_ declaration must be escaped.
+* Fixed mistakes in derived Java code
+throughout document.
+* Added Section 7. Compatibility and updated
+Appendix E.2 “Non required XML Schema Concepts” accordingly.
+
+=== Changes for Public Draft
+
+* link:jaxb.html#a1442[See Bind
+single occurrence choice group to a choice content property],” replaced
+overloading of choice content property setter method with a single
+setter method with a value parameter with the common type of all members
+of the choice. Since the resolution of overloaded method invocation is
+performed using compile-time typing, not runtime typing, this
+overloading was problematic. Same change was made to binding of union
+types.
+* Added details on how to construct factory
+method signature for nested content and element classes.
+* Section 3.3, default validation handler
+does not fail on first warning, only on first error or fatal error.
+* Add ID/IDREF handling in section 5.
+* Updated name mapping in appendix C.
+* link:jaxb.html#a572[See Indexed
+Property], added getIDLenth() to indexed property.
+* Removed ObjectFactory.setImplementation
+method from link:jaxb.html#a482[See Java Package]. The negative
+impact on implementation provided to be greater than the benefit it
+provided the user.
+* Introduced external binding declaration
+format.
+* Introduced a method to introduce extension
+binding declarations.
+* Added an appendix section describing JAXB
+custom bindings that align JAXB binding with JAX-RPC binding from XML to
+Java representation.
+* Generate isID() accessor for boolean
+property.
+* Section 6, Customization has been
+substantially rewritten.
+
+'''''
+
+[.footnoteNumber]# 1.# [[a5352]]In the interest of
+terseness, JAXB 2.0 program annotations have been ommitted.
+
+[.footnoteNumber]# 2.# [[a5353]]Appropriate
+customization required to bind a fixed attribute to a constant value.
+
+[.footnoteNumber]# 3.# [[a5354]]Type constraint
+checking only performed if customization enables it and implementation
+supports fail-fast checking
+
+[.footnoteNumber]# 4.# [[a5355]]JAXB 1.0 deprecated
+class, _javax.xml.bind.Validator_ , is described in
+link:jaxb.html#a5096[See Validator for JAXB 1.0 schema-derived
+classes]”.
+
+[.footnoteNumber]# 5.# [[a5356]]Section 7.4.1.1
+“Package Annotations” in [JLS] recommends that file-system-based
+implementations have the annotated package declaration in a file called
+_package-info.java_ .
+
+[.footnoteNumber]# 6.# [[a5357]]Program annotations
+@XmlRootElement and @XmlType are specified in Section 8.0.
+
+[.footnoteNumber]# 7.# [[a5358]]Note that it is
+optional for a JAXB implementation to support type constraint checks
+when setting a property in this version of the specification.
+
+[.footnoteNumber]# 8.# [[a5359]]An unmarshalling
+implementation should distinguish between a value from an XML instance
+document and a schema specified defaulted value when possible. A
+property should only be considered to have a set value when there exists
+a corresponding value in the XML content being unmarshalled.
+Unfortunately, unmarshalling implementation paths do exist that can not
+identify schema specified default values, this situation is considered a
+one-time transformation for the property and the defaulted value will be
+treated as a set value.
+
+[.footnoteNumber]# 9.# [[a5360]]Namely, a _boolean_
+field type defaults to _false_ , _integer_ field type defaults to _0_ ,
+object reference field type defaults to _null_ , floating point field
+type defaults to _+0.0f_ .
+
+[.footnoteNumber]# 10.# [[a5361]]Note that it is
+optional for a JAXB implementation to support type constraint checks
+when setting a property in this version of the specification.
+
+[.footnoteNumber]# 11.# [[a5362]]Note that it is
+optional for a JAXB implementation to support type constraint checks
+when setting a property in this version of the specification.
+
+[.footnoteNumber]# 12.# [[a5363]]A Java application
+usually does not need to distinguish between the absence of a element
+from the infoset and when the element occurred with nil content. Thus,
+in the interest of simplifying the generated API, methods were not
+provided to distinguish between the two. Two annotation elements
+@XmlElement.required and @XmlElement.nillable allow a null value to be
+marshalled as an empty or nillable element.
+
+[.footnoteNumber]# 13.# [[a5364]]The exception case is
+that an element declaration with an anonymous type definition is bound
+to a schema-derived value class by default as described in
+link:jaxb.html#a1084[See Binding of an anonymous complex type
+definition]”.
+
+[.footnoteNumber]# 14.#
+link:jaxb.html#a1369[See Bind mixed
+content] describes why <ASimpleElement> element is bound to a Java
+Element representation.
+
+[.footnoteNumber]# 15.# [[a5366]]Assume a
+customization that binds this local element declaration to an element
+class. By default, this local declaration binds to a element instance
+factory returning JAXBElement<Integer>
+
+[.footnoteNumber]# 16.# [[a5367]]See next figure for
+default binding for anonymous type definition.
+
+[.footnoteNumber]# 17.# [[a5368]]enable type
+substitution for element of xsd:anySimpleType
+
+[.footnoteNumber]# 18.# [[a5369]]Exception cases that
+do not bind to enum type: when the base type is or derives from _xs:ID_
+and _xs:IDREF_ . Rationale for not binding these type definitions to an
+enum type is in link:jaxb.html#a2126[See Customizable Schema
+Elements]“.
+
+[.footnoteNumber]# 19.# [[a5370]]Note for this case,
+the _enumConstantValueType_ is always _java.lang.String_ .
+
+[.footnoteNumber]# 20.#
+link:jaxb.html#a1582[See Usage]”
+describes the _enableFailFastCheck_ customization and
+_link:jaxb.html#a256[See Validation]_ ” defines fail-fast
+checking.
+
+[.footnoteNumber]# 21.# [[a5372]]Note that
+link:jaxb.html#a1084[See Binding of an anonymous complex type
+definition]” defines the name and package property for anonymous type
+definitions occurring within an element declaration.
+
+[.footnoteNumber]# 22.# [[a5373]]Element substitution
+extensibility does allow element substitution(s) to be defined in a
+separate schema than a global element reference occurs. When schemas are
+not compiled at same time, the schema to java binding declaration,
+<jaxb:property generateElementProperty=”true”/> described in
+link:jaxb.html#a1786[See Usage] forces the generation of an
+element property for a global element reference, independent of it not
+belonging to a element substitution group.
+
+[.footnoteNumber]# 23.# [[a5374]]The desire to reduce
+the overall number of schema-derived classes generated by default
+influenced the decision to default to binding an element declaration to
+an element instance factory. A customization described in
+link:jaxb.html#a1580[See <globalBindings> Declaration] exists
+that binds each element declaration to a Java element class so element
+substitution checking can be enforced entirely by strongly typed method
+signatures.
+
+[.footnoteNumber]# 24.# [[a5375]]Specifying a
+customization of the local element declaration A within Derived complex
+type to a different property name than A would avoid the fallback
+position for this case.
+
+[.footnoteNumber]# 25.# [[a5376]]Note that primitive
+Java types must be represented by their Java wrapper classes when base
+type is used in the choice content property method signatures. Also, all
+sequence descendants of the choice are treated as either a general
+content property or are mapped to their own value class.
+
+[.footnoteNumber]# 26.# [[a5377]]XML schema does not
+associate anonymous types with a specific symbol space. However,
+_nameXmlTransform_ is used since it provides a convenient way to
+customize the value class to which an anonymous type is bound.
+
+[.footnoteNumber]# 27.# [[a5378]]There is no need to
+standardize the name of the generated class since
+_@XmlJavaTypeAdapter.value()_ references the class.
+
+[.footnoteNumber]# 28.# [[a5379]]There is no need to
+standardize the name of the generated class since
+_@XmlJavaTypeAdapter.value()_ references the class.
+
+[.footnoteNumber]# 29.# [[a5380]]Exception case:
+Underscore is not considered a punctuation mark for schema customization
+_<jaxb:globalBindings underscoreHandling="asCharInWord"/>_ specified in
+link:jaxb.html#a1613[See Underscore Handling]". For this
+customization, underscore is considered a special letter that never
+results in a word break as defined in link:jaxb.html#a4681[See
+XML Word Breaks] and it is definitely not considered an uncased letter.
+See example bindings in link:jaxb.html#a4755[See XML Names and
+derived Java Class, Method, and Constant Names when <jaxb:globalBindings
+underscoreHandling=”asCharInWord”>].
+
+[.footnoteNumber]# 30.# [[a5381]]Sample URN
+"urn:hl7-org:v3" \{"h17-org", "v3") transforms to \{"h17.org", "v3"}.
diff --git a/spec/src/main/asciidoc/images/xmlb-10.png b/spec/src/main/asciidoc/images/xmlb-10.png
new file mode 100644
index 0000000..1319344
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-10.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-11.png b/spec/src/main/asciidoc/images/xmlb-11.png
new file mode 100644
index 0000000..778f540
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-11.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-12.png b/spec/src/main/asciidoc/images/xmlb-12.png
new file mode 100644
index 0000000..584bfe2
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-12.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-13.png b/spec/src/main/asciidoc/images/xmlb-13.png
new file mode 100644
index 0000000..707c860
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-13.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-15.png b/spec/src/main/asciidoc/images/xmlb-15.png
new file mode 100644
index 0000000..896e80f
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-15.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-16.png b/spec/src/main/asciidoc/images/xmlb-16.png
new file mode 100644
index 0000000..90d3865
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-16.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-17.png b/spec/src/main/asciidoc/images/xmlb-17.png
new file mode 100644
index 0000000..875fda5
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-17.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-18.png b/spec/src/main/asciidoc/images/xmlb-18.png
new file mode 100644
index 0000000..658af48
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-18.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-2.png b/spec/src/main/asciidoc/images/xmlb-2.png
new file mode 100644
index 0000000..a6f45ad
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-2.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-23.png b/spec/src/main/asciidoc/images/xmlb-23.png
new file mode 100644
index 0000000..8be22ac
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-23.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-3.png b/spec/src/main/asciidoc/images/xmlb-3.png
new file mode 100644
index 0000000..a9121d9
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-3.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-4.png b/spec/src/main/asciidoc/images/xmlb-4.png
new file mode 100644
index 0000000..d20f1f7
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-4.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-8.png b/spec/src/main/asciidoc/images/xmlb-8.png
new file mode 100644
index 0000000..73c305d
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-8.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/xmlb-9.png b/spec/src/main/asciidoc/images/xmlb-9.png
new file mode 100644
index 0000000..d2eb8b3
--- /dev/null
+++ b/spec/src/main/asciidoc/images/xmlb-9.png
Binary files differ
diff --git a/spec/src/main/asciidoc/xml-binding-spec.adoc b/spec/src/main/asciidoc/xml-binding-spec.adoc
index eb4f2f2..dfdc77b 100644
--- a/spec/src/main/asciidoc/xml-binding-spec.adoc
+++ b/spec/src/main/asciidoc/xml-binding-spec.adoc
@@ -26,3 +26,4 @@
 // == Jakarta XML Binding
 :sectnums:
 include::xml-binding.adoc[]
+include::XMLBinding.adoc[]
diff --git a/spec/src/main/asciidoc/xml-binding.adoc b/spec/src/main/asciidoc/xml-binding.adoc
index 4ce9d55..62cee9c 100644
--- a/spec/src/main/asciidoc/xml-binding.adoc
+++ b/spec/src/main/asciidoc/xml-binding.adoc
@@ -1,7 +1,7 @@
 //
 // Copyright (c) 2017, 2020 Contributors to the Eclipse Foundation
 //
-== Introduction
+== Scope
 
 The Jakarta XML Binding provides an API and tools that automate the mapping
 between XML documents and Java objects.
\ No newline at end of file