cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache CXF Documentation > Aegis Theory of Operation (2.0.x)
Date Thu, 25 Nov 2010 15:03:00 GMT
<html>
<head>
    <base href="https://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/1810/9/1/_/styles/combined.css?spaceKey=CXF20DOC&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://cwiki.apache.org/confluence/display/CXF20DOC/Aegis+Theory+of+Operation+%282.0.x%29">Aegis
Theory of Operation (2.0.x)</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://cwiki.apache.org/confluence/display/~bimargulies@gmail.com">Benson
Margulies</a>
    </h4>
        <br/>
                         <h4>Changes (0)</h4>
                                 
    
<div id="page-diffs">
            <table class="diff" cellpadding="0" cellspacing="0">
            <tr><td class="diff-snipped" >...<br></td></tr>
        </table>
</div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <h4><a name="AegisTheoryofOperation%282.0.x%29-%26nbsp%3BThisPageisaWorkInProgress"></a>&nbsp;This
Page is a Work In Progress</h4>


<h1><a name="AegisTheoryofOperation%282.0.x%29-Summary%28WhyuseAegis%3F%29"></a>Summary
(Why use Aegis?)</h1>


<p>The purpose of Aegis is to allow you to control how your classes and methods are
serialized in the web service environment without requiring intrusive modifications to your
source code. If you are willing to modify your source code to include annotations, you should
probably use JAXB. JAXB code can move to other web service toolkits. Aegis is a private feature
of CXF. Aegis allows you to specify the same sorts of things that JAXB allows you to specify.
The difference is where and how you specify them. In Aegis, for a class (or interface) named
'SomeObjectOfMine', you place a file names SomeObjectOfMine.aegis.xml (called a <b>mapping
file</b>) in the classpath in the same project. Aegis reads the XML file for instructions.</p>


<p>CXF includes a total of three databindings: Aegis, JAXB, and Source. As soon as the
present author figures our what Source is for, he will add some commentary comparing it to
Aegis.</p>

<h1><a name="AegisTheoryofOperation%282.0.x%29-BasicProcess"></a>Basic Process</h1>

<p>Think of Aegis as processing your classes and methods in three levels:</p>
<ul>
	<li>Pure introspection</li>
	<li>JAXB-ish annotations</li>
	<li>Mapping files</li>
</ul>


<p>Aegis' pure introspection behavior is much like that of JAXB. Given a class or a
method, it will derive a sensible mapping to WSDL and XML Schema. It will map packages to
namespaces, classes to types, properties to elements, and methods to operations.</p>

<p>You can modify this behavior by adding some annotations that are modeled on the JAXB
annotations, but which are defined in org.apache.cxf.aegis.java5. Or you can use the JAXB
annotations: as of CXF 2.1, Aegis respects both. The supported annotations are:</p>
<ul>
	<li>XmlAttribute</li>
	<li>XmlElement</li>
	<li>XmlParamType</li>
	<li>XmlReturnType</li>
	<li>XmlType</li>
</ul>


<p>If you are willing to use these, perhaps you should be using JAXB altogether. However,
they do come in handy if you have some code where you absolutely can't modify the source,
some code that you can, and you want to mix it together in a single web service. You can use
these as more convenient ways of marking the files you can modify, and XML mapping files for
the items that you can't modify.</p>

<p>Finally, XML mapping files allow you to apply detailed control for properties, classes,
and methods via an XML specification.</p>

<p>There is also a procedure for adding custom mappings beyond the capabilities of these
basic methods.</p>

<h1><a name="AegisTheoryofOperation%282.0.x%29-BasicConfigurationandOptions"></a>Basic
Configuration and Options </h1>

<p>Aegis has some global configuration, and then some per-service configuration. The
global configuration is organized in the AegisDatabinding object. </p>

<h2><a name="AegisTheoryofOperation%282.0.x%29-TheConfigurationobject"></a>The
Configuration object</h2>

<p>The AegisDatabinding accepts a Configuration object. The configuration objects sets
defaults for type mapping. The properties should be self-explanatory, as they correspond to
the usual option attributes of XML schema types and elements. Note that 'extensibleElements'
means adding xs:any to the WSDL Complex Type Definition.</p>

<h2><a name="AegisTheoryofOperation%282.0.x%29-ThenamespaceMap"></a>The
namespaceMap</h2>

<p>The AegisDatabinding accepts a Map&lt;String, String&gt; to control the assignment
of namespace prefixes. Most application have no interest in the assignment of prefixes. The
semantics of XML are concerned with the actual namespace URI or URL strings, not the prefixes.
However, there are some cases (such as very basic clients coded in simple languages) in which
is it desirable to set up controlled, immutable, prefix mappings. The Map keys are namespaces,
and the values are prefixes. Needless to say, both sides of the map have to be unique.</p>

<h2><a name="AegisTheoryofOperation%282.0.x%29-TheTypeMappingRegistry"></a>The
TypeMappingRegistry</h2>

<p>Much of the operation of Aegis is coordinated by the TypeMappingRegistry. There is
only one implementation of this interface: the DefaultTypeMappingRegistry. As the name suggests,
it maintains a unique mapping from classes (both data beans and service interfaces and implementations)
to CXF type descriptions. Unless you are undertaking a very serious complex customization,
you should not be contemplating replacing or extending this class. (As of this writing, in
fact, it is <b>final</b>. That is likely to change, but it is still not a good
idea.</p>

<p>One important aspect of the DefaultTypeMapping registry which turns up in other aspects
of Aegis is that it is really multiple registries: one per service target namespace, plus
extras for soap encodings. There is some <em>very</em> confusing terminology in
the code: the name <b>encodingStyleURI</b> is used in the DefaultTypeMappingRegistry
for the key to the map of the registries, when in fact what ends up in that key can be either
a Soap encoding style URI (e.g. <a href="http://schemas.xmlsoap.org/soap/encoding/" class="external-link"
rel="nofollow">http://schemas.xmlsoap.org/soap/encoding/</a>) or the namespace URI
of a service (as initialized by AegisDatabinding.getNamespaceURI()).</p>

<p>(More information to come as the author figures out what all this is about).</p>

<h2><a name="AegisTheoryofOperation%282.0.x%29-PerserviceConfiguration"></a>Per-service
Configuration</h2>

<p>Each CXF service implements Map&lt;String, Object&gt; to allow you to specify
additional configuration information. Aegis looks for the following keys:</p>

<ul>
	<li>OVERRIDES_TYPES_KEY: a List&lt;Class&gt; of additional classes to map in
the schema. This is most useful for allowing derived classes of declared Exceptions to be
marshalled to the client.</li>
	<li>READ_XSI_TYPES_KEY: A string (false or true). When not "false", Aegis will respect
xsi:type attributes. What is this good for?</li>
	<li>WRITE_XSI_TYPES_KEY: Whether to write xsi:type attributes.</li>
</ul>


<h2><a name="AegisTheoryofOperation%282.0.x%29-DefaultMappingDetails"></a>Default
Mapping Details</h2>

<p>To begin with, the DefaultTypeMappingRegistry establishes a set of mapping for basic
types. For services declared to operate with Soap 1.1, it sets up two sets of mappings.</p>

<h3><a name="AegisTheoryofOperation%282.0.x%29-Soap1.1SOAPmappings"></a>Soap
1.1 SOAP mappings</h3>

<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'>Type</th>
<th class='confluenceTh'>SOAP Mapping</th>
</tr>
<tr>
<td class='confluenceTd'>boolean</td>
<td class='confluenceTd'>Soap-encoded boolean</td>
</tr>
<tr>
<td class='confluenceTd'>Boolean</td>
<td class='confluenceTd'>Soap-encoded boolean</td>
</tr>
<tr>
<td class='confluenceTd'>int</td>
<td class='confluenceTd'>Soap-encoded int</td>
</tr>
<tr>
<td class='confluenceTd'>Integer</td>
<td class='confluenceTd'>Soap-encoded int</td>
</tr>
<tr>
<td class='confluenceTd'>short</td>
<td class='confluenceTd'>Soap-encoded int</td>
</tr>
<tr>
<td class='confluenceTd'>Short</td>
<td class='confluenceTd'>Soap-encoded int</td>
</tr>
<tr>
<td class='confluenceTd'>double</td>
<td class='confluenceTd'>Soap-encoded double</td>
</tr>
<tr>
<td class='confluenceTd'>Double</td>
<td class='confluenceTd'>Soap-encoded double</td>
</tr>
<tr>
<td class='confluenceTd'>float</td>
<td class='confluenceTd'>Soap-Encoded float</td>
</tr>
<tr>
<td class='confluenceTd'>Float</td>
<td class='confluenceTd'>Soap-Encoded float</td>
</tr>
<tr>
<td class='confluenceTd'>long</td>
<td class='confluenceTd'>Soap-encoded long</td>
</tr>
<tr>
<td class='confluenceTd'>Long</td>
<td class='confluenceTd'>Soap-encoded long</td>
</tr>
<tr>
<td class='confluenceTd'>char</td>
<td class='confluenceTd'>Soap-encoded char</td>
</tr>
<tr>
<td class='confluenceTd'>Character</td>
<td class='confluenceTd'>Soap-encoded char</td>
</tr>
<tr>
<td class='confluenceTd'>String</td>
<td class='confluenceTd'>Soap-encoded String</td>
</tr>
<tr>
<td class='confluenceTd'>java.sql.Date</td>
<td class='confluenceTd'>Soap-encoded date-time</td>
</tr>
<tr>
<td class='confluenceTd'>java.util.Calendar</td>
<td class='confluenceTd'>Soap-encoded date-time</td>
</tr>
<tr>
<td class='confluenceTd'>byte[]</td>
<td class='confluenceTd'>soap-encoded Base64</td>
</tr>
<tr>
<td class='confluenceTd'>BigDecimal</td>
<td class='confluenceTd'>Soap-encoded Decimal</td>
</tr>
<tr>
<td class='confluenceTd'>BigInteger</td>
<td class='confluenceTd'>Soap-encoded BigInteger</td>
</tr>
</tbody></table>
</div>


<h3><a name="AegisTheoryofOperation%282.0.x%29-Soap1.1XSDmappings"></a>Soap
1.1 XSD mappings</h3>

<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'>Type</th>
<th class='confluenceTh'>XSD Mapping</th>
</tr>
<tr>
<td class='confluenceTd'>boolean</td>
<td class='confluenceTd'>XSD boolean</td>
</tr>
<tr>
<td class='confluenceTd'>Boolean</td>
<td class='confluenceTd'>XSD boolean</td>
</tr>
<tr>
<td class='confluenceTd'>int</td>
<td class='confluenceTd'>XSD int</td>
</tr>
<tr>
<td class='confluenceTd'>Integer</td>
<td class='confluenceTd'>XSD int</td>
</tr>
<tr>
<td class='confluenceTd'>short</td>
<td class='confluenceTd'>XSD int</td>
</tr>
<tr>
<td class='confluenceTd'>Short</td>
<td class='confluenceTd'>XSD int</td>
</tr>
<tr>
<td class='confluenceTd'>double</td>
<td class='confluenceTd'>XSD double</td>
</tr>
<tr>
<td class='confluenceTd'>Double</td>
<td class='confluenceTd'>XSD double</td>
</tr>
<tr>
<td class='confluenceTd'>float</td>
<td class='confluenceTd'>XSD float</td>
</tr>
<tr>
<td class='confluenceTd'>Float</td>
<td class='confluenceTd'>XSD float</td>
</tr>
<tr>
<td class='confluenceTd'>long</td>
<td class='confluenceTd'>XSD long</td>
</tr>
<tr>
<td class='confluenceTd'>Long</td>
<td class='confluenceTd'>XSD long</td>
</tr>
<tr>
<td class='confluenceTd'>char</td>
<td class='confluenceTd'>XSD char</td>
</tr>
<tr>
<td class='confluenceTd'>Character</td>
<td class='confluenceTd'>XSD char</td>
</tr>
<tr>
<td class='confluenceTd'>String</td>
<td class='confluenceTd'>XSD String</td>
</tr>
<tr>
<td class='confluenceTd'>java.sql.Date</td>
<td class='confluenceTd'>XSD date-time</td>
</tr>
<tr>
<td class='confluenceTd'>java.sql.Time</td>
<td class='confluenceTd'>XSD time</td>
</tr>
<tr>
<td class='confluenceTd'>java.util.Calendar</td>
<td class='confluenceTd'>XSD date-time</td>
</tr>
<tr>
<td class='confluenceTd'>byte[]</td>
<td class='confluenceTd'>XSD Base64</td>
</tr>
<tr>
<td class='confluenceTd'>BigDecimal</td>
<td class='confluenceTd'>XSD Decimal</td>
</tr>
<tr>
<td class='confluenceTd'>BigInteger</td>
<td class='confluenceTd'>XSD Integer</td>
</tr>
<tr>
<td class='confluenceTd'>org.w3c.Document</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>org.jdom.Document</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>org.jdom.Element</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.transform.source</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.stream.XMLStreamReader</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>Object</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>javax.activation.DataSource</td>
<td class='confluenceTd'>XSD Base64 via MTOM data source type (See org.apache.cxf.argis.type.mtom)</td>
</tr>
<tr>
<td class='confluenceTd'>javax.activation.DataHandler</td>
<td class='confluenceTd'>XSD Base64 via MTOM data source type (See org.apache.cxf.argis.type.mtom)</td>
</tr>
</tbody></table>
</div>


<h3><a name="AegisTheoryofOperation%282.0.x%29-ServicesthatDon%27tUseSoap1.1"></a>Services
that Don't Use Soap 1.1</h3>

<p>The type mappings for non-Soap-1.1 services start out with the same XSD types as
the Soap-1.1 services </p>

<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'>Type</th>
<th class='confluenceTh'>XSD Mapping</th>
</tr>
<tr>
<td class='confluenceTd'>boolean</td>
<td class='confluenceTd'>XSD boolean</td>
</tr>
<tr>
<td class='confluenceTd'>Boolean</td>
<td class='confluenceTd'>XSD boolean</td>
</tr>
<tr>
<td class='confluenceTd'>int</td>
<td class='confluenceTd'>XSD int</td>
</tr>
<tr>
<td class='confluenceTd'>Integer</td>
<td class='confluenceTd'>XSD int</td>
</tr>
<tr>
<td class='confluenceTd'>short</td>
<td class='confluenceTd'>XSD int</td>
</tr>
<tr>
<td class='confluenceTd'>Short</td>
<td class='confluenceTd'>XSD int</td>
</tr>
<tr>
<td class='confluenceTd'>double</td>
<td class='confluenceTd'>XSD double</td>
</tr>
<tr>
<td class='confluenceTd'>Double</td>
<td class='confluenceTd'>XSD double</td>
</tr>
<tr>
<td class='confluenceTd'>float</td>
<td class='confluenceTd'>XSD float</td>
</tr>
<tr>
<td class='confluenceTd'>Float</td>
<td class='confluenceTd'>XSD float</td>
</tr>
<tr>
<td class='confluenceTd'>long</td>
<td class='confluenceTd'>XSD long</td>
</tr>
<tr>
<td class='confluenceTd'>Long</td>
<td class='confluenceTd'>XSD long</td>
</tr>
<tr>
<td class='confluenceTd'>char</td>
<td class='confluenceTd'>XSD char</td>
</tr>
<tr>
<td class='confluenceTd'>Character</td>
<td class='confluenceTd'>XSD char</td>
</tr>
<tr>
<td class='confluenceTd'>String</td>
<td class='confluenceTd'>XSD String</td>
</tr>
<tr>
<td class='confluenceTd'>java.sql.Date</td>
<td class='confluenceTd'>XSD date-time</td>
</tr>
<tr>
<td class='confluenceTd'>java.sql.Time</td>
<td class='confluenceTd'>XSD time</td>
</tr>
<tr>
<td class='confluenceTd'>java.util.Calendar</td>
<td class='confluenceTd'>XSD date-time</td>
</tr>
<tr>
<td class='confluenceTd'>byte[]</td>
<td class='confluenceTd'>XSD Base64</td>
</tr>
<tr>
<td class='confluenceTd'>BigDecimal</td>
<td class='confluenceTd'>XSD Decimal</td>
</tr>
<tr>
<td class='confluenceTd'>BigInteger</td>
<td class='confluenceTd'>XSD Integer</td>
</tr>
<tr>
<td class='confluenceTd'>org.w3c.Document</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>org.jdom.Document</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>org.jdom.Element</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.transform.source</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.stream.XMLStreamReader</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>Object</td>
<td class='confluenceTd'>XSD Any</td>
</tr>
<tr>
<td class='confluenceTd'>javax.activation.DataSource</td>
<td class='confluenceTd'>Base64 via MTOM data source type (See org.apache.cxf.argis.type.mtom)</td>
</tr>
<tr>
<td class='confluenceTd'>javax.activation.DataHandler</td>
<td class='confluenceTd'>Base54 MTOM data source type (See org.apache.cxf.argis.type.mtom)</td>
</tr>
</tbody></table>
</div>


<p>These services get some additional mappings, as well:</p>

<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'>Type</th>
<th class='confluenceTh'>Mapping</th>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.datatype.Duration</td>
<td class='confluenceTd'>XSD Duration</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.datatype.XMLGregorianCalendar</td>
<td class='confluenceTd'>XSD Date</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.datatype.XMLGregorianCalendar</td>
<td class='confluenceTd'>XSD Time</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.datatype.XMLGregorianCalendar</td>
<td class='confluenceTd'>XSD gDay</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.datatype.XMLGregorianCalendar</td>
<td class='confluenceTd'>XSD gMonth</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.datatype.XMLGregorianCalendar</td>
<td class='confluenceTd'>XSD gMonthDay</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.datatype.XMLGregorianCalendar</td>
<td class='confluenceTd'>XSD gYear</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.datatype.XMLGregorianCalendar</td>
<td class='confluenceTd'>XSD gYearMonth</td>
</tr>
<tr>
<td class='confluenceTd'>javax.xml.datatype.XMLGregorianCalendar</td>
<td class='confluenceTd'>XSD Date-Time</td>
</tr>
</tbody></table>
</div>


<h1><a name="AegisTheoryofOperation%282.0.x%29-CustomizingTypeMapping"></a>Customizing
Type Mapping</h1>

<p>Each of the standard type mappings is a relationship between a Java class object
and a subclass of org.apache.xxf.aegis.Type. If you want to add your own class-level mapping,
you can implement your own subclasses of Type, and register them against your service URI
(or an encoding style URI) in the type mapping registry. Reading the source of the standard
objects is required here.  </p>

<h1><a name="AegisTheoryofOperation%282.0.x%29-TheTypeCreators"></a>The
Type Creators</h1>

<p>The type mapping registry maintains a chain of TypeCreator objects. These objects
do the work of creating mappings for Java types that are not pre-mapped via the standard types
above or custom mappings that you install. The XMLTypeCreator handled mapping files. For historical
reasons, the rest of the process is split between the Java5TypeCreator and the DefaultTypeCreator.
Historically, XFire supported Java 1.4, so all the code that depended on Java 1.5 (both annotation
processing and generic type processing) was quarantined in the Java5TypeCreator.</p>

<p>The creators are arranged in a chain via the AbstractTypeCreator class, which stores
a nextCreator. The top creator gets the first run at a method, property, field, or class.
It can do the entire mapping, or call the next creator in the chain and modify its results,
or simply punt to the next creator in the chain. If you want algorithmic control on the automatic
type mapping process, you will want to put your own type creator at the head of the chain.
</p>

<p>This is not so easy to do with Spring, as the desired process is to let the DefaultTypeMappingRegistry
create the usual chain, and then retrieve and modify it. However, you can achieve this result
by copying what the DefaultTypeMappingRegistry does: arrange a chain of your creator followed
by XML, Java5, and Default.</p>




    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;">
            <a href="https://cwiki.apache.org/confluence/users/viewnotifications.action"
class="grey">Change Notification Preferences</a>
        </div>
        <a href="https://cwiki.apache.org/confluence/display/CXF20DOC/Aegis+Theory+of+Operation+%282.0.x%29">View
Online</a>
        |
        <a href="https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=66981&revisedVersion=9&originalVersion=8">View
Changes</a>
                |
        <a href="https://cwiki.apache.org/confluence/display/CXF20DOC/Aegis+Theory+of+Operation+%282.0.x%29?showComments=true&amp;showCommentArea=true#addcomment">Add
Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message