Added: maven/doxia/website/content/doxia-example-book/doxia-example-book.rtf
URL: 
http://svn.apache.org/viewvc/maven/doxia/website/content/doxia-example-book/doxia-example-book.rtf?rev=1829011&view=auto
==============================================================================
--- maven/doxia/website/content/doxia-example-book/doxia-example-book.rtf 
(added)
+++ maven/doxia/website/content/doxia-example-book/doxia-example-book.rtf Thu 
Apr 12 21:22:02 2018
@@ -0,0 +1,869 @@
+{\rtf1\ansi\ansicpg1252
+\deff0{\fonttbl{\f0\froman\fcharset0 Times New Roman;}{\f1\fswiss\fcharset0 
Arial;}{\f2\froman\fcharset2 Symbol;}}
+{\colortbl\red0\green0\blue0;\red255\green255\blue255;\red255\green0\blue0;\red0\green0\blue255;}
+{\*\listtable
+{\list\listtemplateid1191975785\hybrid
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext\'01\u-3913
 ?;}{\levelnumbers;}\f2\fi0\li300\ri0\tx300}
+\listid547940200}
+{\list\listtemplateid1691885775\hybrid
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext\'01\u-3913
 ?;}{\levelnumbers;}\f2\fi0\li300\ri0\tx300}
+\listid330971605}
+{\list\listtemplateid1537420472\hybrid
+{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers
 \'01;}\fi0\li400\ri0\tx400}
+\listid47121393}
+{\list\listtemplateid18121305\hybrid
+{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers
 \'01;}\fi0\li400\ri0\tx400}
+\listid486993179}
+{\list\listtemplateid1634372024\hybrid
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext\'01\u-3913
 ?;}{\levelnumbers;}\f2\fi0\li300\ri0\tx300}
+\listid1837980986}
+}
+{\*\listoverridetable
+{\listoverride\listid547940200\listoverridecount0\ls1}
+{\listoverride\listid330971605\listoverridecount0\ls2}
+{\listoverride\listid47121393\listoverridecount0\ls3}
+{\listoverride\listid486993179\listoverridecount0\ls4}
+{\listoverride\listid1837980986\listoverridecount0\ls5}
+}
+{\info{\operator iText by lowagie.com}{\creationdate 
\yr2018\mo3\dy12\hr21\min20\sec28}{\operator Doxia iText}{\creationdate 
\yr2018\mo3\dy12\hr21\min20\sec28}}
+\paperw11907\paperh16840\margl720\margr720\margt720\margb720
+{\footer }{\header }\pgwsxn11907\pghsxn16840\sectd{\footer }{\header 
}\pgwsxn11907\pghsxn16840\pard\li0\ri0\f1\fs48\cf2 1. \f1\fs48\cf2 
Bindings\par\par\pard\li0\ri0\f1\fs44\cf0 1.1. \f1\fs44\cf0 Bindings Overview 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Bindings 
are one of the most important pieces of XFire. They control how the incoming 
and outoing XML is mapped to objects. \par\pard\li0\ri0\f0\fs20\cf0 \par 
\f1\fs20\cf0 The default binding in XFire is "Aegis". Aegis means "shield", and 
the point of it is to create a simple layer which makes going between objects 
and XML easy. Aegis also provides the layer which allows other bindings to 
integrate with XFire - like JAXB, XMLBeans and Castor. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Lets take a look at how you 
would use a different binding with XFire. The BindingProvider class is the one 
for actually taking the xml streams and reading/writing to them. When we create 
a service we need to actually s
 upply a BindingProvider to the service. In the simplest case of creating a 
service you're probably writing code like this: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  ServiceFactory factory = new ObjectServiceFactory();\f0\fs20\cf0 \par \cell 
\row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 But, what this is 
actually doing in the constructor is creating an AegisBindingProvider: 
\par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
   ServiceFactory factory = new ObjectServiceFactory(new 
AegisBindingProvider());\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 1.2. \f1\fs44\cf0 Using another 
binding \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 
This AegisBindingProvider has the concept of a TypeRegistry and TypeCreators 
(don't worry you don't need to know much about this), which create Type classes 
for you. Types serialize and deserialize java classes. When you use a different 
binding it actually provides a different TypeRegistry and TypeCreator for its 
types. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 So if you were to create 
a JAXB 2.0 binding you would do: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  import org.codehaus.xfire.aegis.AegisBindingProvider;\f0\fs20\cf0 \par 
\f1\fs20\cf0  import org.codehaus.xfire.jaxb2.JaxbTypeRegistry;\f0\fs20\cf0 
\par \f1\fs20\cf0  import 
org.codehaus.xfire.service.binding.ObjectServiceFactory;\f0\fs20\cf0 \par 
\f1\fs20\cf0  ...\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0  
ServiceFactory factory = new ObjectServiceFactory(new AegisBindingProvider(new 
JaxbTypeRegistry()));\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Each binding has a 
different type registry: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 Binding \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 Type Registry \cell \row
+\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 Default POJOs \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 
org.codehaus.xfire.aegis.DefaultTypeMappingRegistry \cell \row
+\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 Castor \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 
org.codehaus.xfire.castor.CastorTypeMappingRegistry \cell \row
+\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 JAXB 1.1 \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 
org.codehaus.xfire.jaxb.JaxbTypeRegistry \cell \row
+\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 JAXB 2.0 \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 
org.codehaus.xfire.jaxb2.JaxbTypeRegistry \cell \row
+\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 XMLBeans \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 
org.codehaus.xfire.xmlbeans.XmlBeansTypeRegistry \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 But don't stop here, 
you can use these BindingProviders with different ServiceFactorys. Here is an 
example using JAXB 2.0 and the annotation service factory. \par\f1\fs20\cf0 
\par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  import org.codehaus.xfire.aegis.AegisBindingProvider;\f0\fs20\cf0 \par 
\f1\fs20\cf0  import org.codehaus.xfire.jaxb2.JaxbTypeRegistry;\f0\fs20\cf0 
\par \f1\fs20\cf0  import 
org.codehaus.xfire.service.binding.ObjectServiceFactory;\f0\fs20\cf0 \par 
\f1\fs20\cf0  ...\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0  
ServiceFactory factory = new AnnotationServiceFactory(new 
Jsr181WebAnnotations(),\f0\fs20\cf0 \par \f1\fs20\cf0    new 
AegisBindingProvider(new JaxbTypeRegistry()));\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 1.3. \f1\fs44\cf0 Convenience 
ServiceFactorys \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par 
\f1\fs20\cf0 If you just want to use the simple ObjectServiceFactory we have 
several convenience ServiceFactorys around: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 Binding \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 Service Factory \cell \row
+\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 JAXB 1.1 \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 
org.codehaus.xfire.jaxb.JaxbServiceFactory \cell \row
+\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 JAXB 2.0 \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 
org.codehaus.xfire.jaxb2.JaxbServiceFactory \cell \row
+\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth5200
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0
 XMLBeans \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 
org.codehaus.xfire.xmlbeans.XmlBeansServiceFactory \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 You can use these just 
like you would an ObjectServiceFactory: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  import org.codehaus.xfire.jaxb2.JaxbServiceFactory;\f0\fs20\cf0 \par 
\f1\fs20\cf0  import org.codehaus.xfire.service.ServiceFactory;\f0\fs20\cf0 
\par \f1\fs20\cf0  ...\f0\fs20\cf0 \par \f1\fs20\cf0  ServiceFactory factory = 
new JaxbServiceFactory();\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 1.4. \f1\fs44\cf0 The MessageBinding 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 There is 
also one other type of binding, the MessageBinding. The MessageBinding has 
special semantics to allow you to work with XML streams and fragments real 
easily. Read more on the Message Binding page. 
\par\par\pard\li0\ri0\f1\fs44\cf0 1.5. \f1\fs44\cf0 Aegis Binding 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Aegis is 
the default XFire binding which maps XML to POJOs. It supports code first 
development only at this point - i.e. you write your service in POJOs and it 
will generate the XML schema/wsdl for you. \par\par\pard\li0\ri0\f1\fs44\cf0 
1.6. \f1\fs44\cf0 XML and Annotation Mapping Overview \par\par\f0\fs20\cf0 \par 
\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Aegis has a flexible mapping system 
so you can control how your beans are controlled. By default your POJOs are 
serialized based on their name an
 d namespaces. If you have a class in the "org.codehaus.xfire" package named 
"Employee" it would be serialized in namespace "http://xfire.codehaus.org"; with 
the local name "YourBean."\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Fore 
example, the java class: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  public class Employee\f0\fs20\cf0 \par \f1\fs20\cf0  \u123?\f0\fs20\cf0 \par 
\f1\fs20\cf0    private String name;\f0\fs20\cf0 \par \f1\fs20\cf0    private 
String title;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0    public String 
getName() \u123? return name; \u125?\f0\fs20\cf0 \par \f1\fs20\cf0    public 
void setName(String name) \u123? this.name = name; \u125?\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0    public String getTitle() \u123? return title; 
\u125?\f0\fs20\cf0 \par \f1\fs20\cf0    public void setTitle(String title) 
\u123? this.title = title; \u125?\f0\fs20\cf0 \par \f1\fs20\cf0  
\u125?\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 In XML this translates 
to: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <Employee xmlns="http://xfire.codehaus.org";>\f0\fs20\cf0 \par \f1\fs20\cf0    
<name>Santa Claus</name>\f0\fs20\cf0 \par \f1\fs20\cf0    <title>Chief Present 
Officer (CPO)</title>\f0\fs20\cf0 \par \f1\fs20\cf0  </Employee>\f0\fs20\cf0 
\par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 In XML Schema this 
would become a complex type: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <xsd:complexType name="Employee">\f0\fs20\cf0 \par \f1\fs20\cf0    
<xsd:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0      <xsd:element name="name" 
type="xsd:string" minOccurs="0" maxOccurs="1/>\f0\fs20\cf0 \par \f1\fs20\cf0    
  <xsd:element name="title" type="xsd:string" minOccurs="0" 
maxOccurs="1/>\f0\fs20\cf0 \par \f1\fs20\cf0    </xsd:sequence>\f0\fs20\cf0 
\par \f1\fs20\cf0  </xsd:complexType>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Validate your mapping! 
You can find an XML Schema for Aegis mapping files {\field{\*\fldinst{HYPERLINK 
http://xfire.codehaus.org/schemas/1.0/mapping.xsd}}{\fldrslt 
\pard\f1\fs24\cf3\ul here \ul0}}\f1\fs20\cf0 . \par\pard\li0\ri0\f1\fs40\cf0 
1.6.1. \f1\fs40\cf0 Supported Types \par\par\f0\fs20\cf0 \par \f1\fs20\cf0 
\pard\ql\fi0\li300\ri0\fs20\ls1{{\listtext\pard\f2\fi0\li300\ri0 
\'b7\tab}\f1\fs20\cf0 Basic types: int, double, float, long, byte[], short, 
String, BigDecimal \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Arrays \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Collections \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Dates: java.util.Date, 
java.util.Calendar, java.sql.Timestamp, java.sql.Date, java.sql.Time \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 XML: 
org.w3c.dom.Docmument, org.jdom.Element, XMLStreamReader, Source \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Complex types which are 
aggregations of the above \par
+}\pard\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 If you have constructors 
defined in your Java beans, make sure a default constructor (i.e. no arguments) 
is also declared. (Aegis needs a no-argument contstructor to instantiate client 
Java classes.) Controlling Mappings with XML \par\pard\li0\ri0\f0\fs20\cf0 \par 
\f1\fs20\cf0 Its easy to control how your service and its beans are mapped to 
xml. If you are using Java 5.0 skip straight down to that section otherwise 
read on to learn how to configure serialization via mapping files. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Mapping files must exist in the 
same package as your bean or service class on the class path. In the above 
example the mapping file would be named 
"/org/codehaus/xfire/YourBean.aegis.xml", with the following format: 
\par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <mappings>\f0\fs20\cf0 \par \f1\fs20\cf0    <mapping uri="" 
name="">\f0\fs20\cf0 \par \f1\fs20\cf0      <method 
name="methodName">\f0\fs20\cf0 \par \f1\fs20\cf0        <return-type 
mappedName="" componentType=""/>\f0\fs20\cf0 \par \f1\fs20\cf0        
<parameter index="" mappedName=""/>\f0\fs20\cf0 \par \f1\fs20\cf0      
</method>\f0\fs20\cf0 \par \f1\fs20\cf0      <property name="" mappedName="" 
style="attribute\u124?element" componentType=""/>\f0\fs20\cf0 \par \f1\fs20\cf0 
   </mapping>\f0\fs20\cf0 \par \f1\fs20\cf0  </mappings>\f0\fs20\cf0 \par \cell 
\row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Note that <method>is 
used to configure methods on your service and property is used to configure 
properties on your javabeans. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 
The above example highlights many of the possible elements, most are optional 
and the format encourages minimally specified mappings. 
\par\par\par\pard\li0\ri0\f1\fs44\cf0 1.7. \f1\fs44\cf0 Controlling Naming 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Lets 
pretend that in the above example you would like the elements names to be 
capatilized and in the namespace "urn:north-pole:operations". You could achieve 
this through a mapping file like so: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <mappings xmlns:np="urn:north-pole:operations">\f0\fs20\cf0 \par \f1\fs20\cf0 
   <mapping name="np:Employee">\f0\fs20\cf0 \par \f1\fs20\cf0      <property 
name="name" mappedName="Name"/>\f0\fs20\cf0 \par \f1\fs20\cf0      <property 
name="title" mappedName="Title"/>\f0\fs20\cf0 \par \f1\fs20\cf0    
</mapping>\f0\fs20\cf0 \par \f1\fs20\cf0  </mappings>\f0\fs20\cf0 \par \cell 
\row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Notice that the 
namespace was declared on the mappings element and then the prefix was used to 
specify the element QNames for the name/title properties. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This will result in a mapping 
like so: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <np:Employee xmlns:np="urn:north-pole:operations">\f0\fs20\cf0 \par 
\f1\fs20\cf0    <np:Name>Santa Claus</np:Name>\f0\fs20\cf0 \par \f1\fs20\cf0    
<np:Title>Chief Present Officer (CPO)</np:Title>\f0\fs20\cf0 \par \f1\fs20\cf0  
</np:Employee>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f1\fs40\cf0 1.7.1. \f1\fs40\cf0 Ignoring properties 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 If you 
don't want to serialize a certain property it is easy to ignore it: 
\par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <mappings>\f0\fs20\cf0 \par \f1\fs20\cf0    <mapping>\f0\fs20\cf0 \par 
\f1\fs20\cf0      <property name="propertyName" ignore="true"/>\f0\fs20\cf0 
\par \f1\fs20\cf0    </mapping>\f0\fs20\cf0 \par \f1\fs20\cf0  
</mappings>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\par\pard\li0\ri0\f1\fs40\cf0 1.7.2. \f1\fs40\cf0 Handling 
Collections \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par 
\f1\fs20\cf0 You undoubtedly use Collections in your code. Pre Java 5 it is 
impossible to determine the "component type" of a Collection by introspection. 
So you need to give Aegis some hints. For a service which returned a Collection 
of employees like so: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  public class EmployeeService\f0\fs20\cf0 \par \f1\fs20\cf0  
\u123?\f0\fs20\cf0 \par \f1\fs20\cf0      Collection getEmployees(String id) 
\u123? ... \u125?\f0\fs20\cf0 \par \f1\fs20\cf0  \u125?\f0\fs20\cf0 \par \cell 
\row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 You would need to 
supply metadata which gave the component type in a mapping file like this one: 
\par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <mappings>\f0\fs20\cf0 \par \f1\fs20\cf0    <mapping>\f0\fs20\cf0 \par 
\f1\fs20\cf0      <method name="getEmployees">\f0\fs20\cf0 \par \f1\fs20\cf0    
    <return-type componentType="org.codehaus.xfire.Employee" />\f0\fs20\cf0 
\par \f1\fs20\cf0      </method>\f0\fs20\cf0 \par \f1\fs20\cf0    
</mapping>\f0\fs20\cf0 \par \f1\fs20\cf0  </mappings>\f0\fs20\cf0 \par \cell 
\row
+\pard\par\qc\par\pard\li0\ri0\f1\fs40\cf0 1.7.3. \f1\fs40\cf0 Handling Maps 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Java Maps 
don't map well to XML Schema (no pun intended) because there is no Map concept 
in XML Schema so your clients. Maps are transformed to a collection of 
\pard\f1\fs24\cf0 key, value \f1\fs20\cf0 tuples instead. In addition to 
providing the type of the value, you must also provide Aegis with the type of 
the key: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  public class GiftService\f0\fs20\cf0 \par \f1\fs20\cf0  \u123?\f0\fs20\cf0 
\par \f1\fs20\cf0      Map getGiftList() \u123? /* returns a map of NiceChild 
=> Present */ \u125?\f0\fs20\cf0 \par \f1\fs20\cf0  \u125?\f0\fs20\cf0 \par 
\cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The mapping file 
should look like this: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <mappings>\f0\fs20\cf0 \par \f1\fs20\cf0    <mapping>\f0\fs20\cf0 \par 
\f1\fs20\cf0      <method name="getGiftList">\f0\fs20\cf0 \par \f1\fs20\cf0     
   <return-type keyType="org.codehaus.xfire.NiceChild" 
componentType="org.codehaus.xfire.Present">\f0\fs20\cf0 \par \f1\fs20\cf0      
</method>\f0\fs20\cf0 \par \f1\fs20\cf0    </mapping>\f0\fs20\cf0 \par 
\f1\fs20\cf0  </mappings>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This will generate the 
following type: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <xsd:complexType name="NiceChild2PresentMap">\f0\fs20\cf0 \par \f1\fs20\cf0   
 <xsd:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0      <xsd:element name="entry" 
minOccurs="0" maxOccurs="unbounded">\f0\fs20\cf0 \par \f1\fs20\cf0        
<xsd:complexType>\f0\fs20\cf0 \par \f1\fs20\cf0          
<xsd:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0            <xsd:element name="key" 
type="ns1:NiceChild" minOccurs="0" maxOccurs="1"/>\f0\fs20\cf0 \par 
\f1\fs20\cf0            <xsd:element name="value" type="ns1:Present" 
minOccurs="0" maxOccurs="1"/>\f0\fs20\cf0 \par \f1\fs20\cf0          
</xsd:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0        
</xsd:complexType>\f0\fs20\cf0 \par \f1\fs20\cf0      
</xsd:element>\f0\fs20\cf0 \par \f1\fs20\cf0    </xsd:sequence>\f0\fs20\cf0 
\par \f1\fs20\cf0  </xsd:complexType>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\par\par\pard\li0\ri0\f1\fs44\cf0 1.8. \f1\fs44\cf0 Interfaces and 
Aegis \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The 
Aegis binding will automatically create proxies for your interfaces when 
reading XML. So if you have an interface like this: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  public interface User \u123?\f0\fs20\cf0 \par \f1\fs20\cf0    public String 
getUsername();\f0\fs20\cf0 \par \f1\fs20\cf0    public String 
getPasswrod();\f0\fs20\cf0 \par \f1\fs20\cf0  \u125?\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 It will then create 
its own implementation of User and provide a username and password from the 
XML. You can specify your implementation class (in 1.1+) by setting a property 
on your service: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  Service service = ...;\f0\fs20\cf0 \par \f1\fs20\cf0  
service.setProperty("com.acme.User.implementation", 
"com.acme.UserImpl");\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 1.9. \f1\fs44\cf0 Castor 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Castor is 
a flexible XML binding tool that provides run-time marshalling and 
unmarshalling of XML and Java objects. One strength of Castor when compared to 
most (not all) other Java XML binding frameworks is that re-compilation of the 
Java code is not required if the mapping definition changes. Therefore, systems 
where the web service layer is being developed independently from the business 
layer can benefit from using Castor. XFire support for Castor is currently 
available in the latest XFire release. Two approaches to developing a Web 
service using Castor with XFire are presented below: top-down (schema first) 
and bottom-up (code first). Before proceeding, check the Dependency Guide for 
required castor module dependencies. \par\pard\li0\ri0\f1\fs40\cf0 1.9.1. 
\f1\fs40\cf0 Assumptions about Reader \par\par\f0\fs20\cf0 \par \f1\fs20\cf0 
\pard\ql\fi
 0\li300\ri0\fs20\ls2{{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 
Competence with Java and XML \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Basic knowledge of 
Castor XML binding framework \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Experience configuring 
Java webapp and deploying \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Nominal familiarity 
with Spring framework \par
+}\pard\par\par\pard\li0\ri0\f1\fs44\cf0 1.10. \f1\fs44\cf0 Top-down Approach 
(starting with XML schema): \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 
\par \f1\fs20\cf0 Firstly, the XML schema that defines the structure of your 
web service messages must be developed. For the purposes of this guide, we'll 
borrow a schema from http://www.webservicex.net/WeatherForecast.asmx?WSDL which 
defines a pre-existing weather forecast service. \par\pard\li0\ri0\f0\fs20\cf0 
\par \f1\fs20\cf0 The borrowed schema below should be saved under 
META-INF/schema/ in the classpath: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <s:schema elementFormDefault="qualified" 
targetNamespace="http://www.webservicex.net"\f0\fs20\cf0 \par \f1\fs20\cf0      
      xmlns:s="http://www.w3.org/2001/XMLSchema"; 
xmlns:tns="http://www.webservicex.net";>\f0\fs20\cf0 \par \f1\fs20\cf0        
<s:element name="GetWeatherByZipCode">\f0\fs20\cf0 \par \f1\fs20\cf0          
<s:complexType>\f0\fs20\cf0 \par \f1\fs20\cf0            
<s:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0              <s:element 
minOccurs="0" maxOccurs="1" name="ZipCode" type="s:string"/>\f0\fs20\cf0 \par 
\f1\fs20\cf0            </s:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0          
</s:complexType>\f0\fs20\cf0 \par \f1\fs20\cf0        </s:element>\f0\fs20\cf0 
\par \f1\fs20\cf0        <s:element 
name="GetWeatherByZipCodeResponse">\f0\fs20\cf0 \par \f1\fs20\cf0          
<s:complexType>\f0\fs20\cf0 \par \f1\fs20\cf0            <s:sequence>\f0\fs20
 \cf0 \par \f1\fs20\cf0              <s:element minOccurs="1" maxOccurs="1" 
name="GetWeatherByZipCodeResult" type="tns:WeatherForecasts"/>\f0\fs20\cf0 \par 
\f1\fs20\cf0            </s:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0          
</s:complexType>\f0\fs20\cf0 \par \f1\fs20\cf0        </s:element>\f0\fs20\cf0 
\par \f1\fs20\cf0        <s:complexType name="WeatherForecasts">\f0\fs20\cf0 
\par \f1\fs20\cf0          <s:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0           
 <s:element minOccurs="1" maxOccurs="1" name="Latitude" 
type="s:float"/>\f0\fs20\cf0 \par \f1\fs20\cf0            <s:element 
minOccurs="1" maxOccurs="1" name="Longitude" type="s:float"/>\f0\fs20\cf0 \par 
\f1\fs20\cf0            <s:element minOccurs="1" maxOccurs="1" 
name="AllocationFactor" type="s:float"/>\f0\fs20\cf0 \par \f1\fs20\cf0          
  <s:element minOccurs="0" maxOccurs="1" name="FipsCode" 
type="s:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0            <s:element 
minOccurs="0" maxOccurs="1" name="PlaceName" type="s:st
 ring"/>\f0\fs20\cf0 \par \f1\fs20\cf0            <s:element minOccurs="0" 
maxOccurs="1" name="StateCode" type="s:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0  
          <s:element minOccurs="0" maxOccurs="1" name="Status" 
type="s:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0            <s:element 
minOccurs="0" maxOccurs="1" name="Details" 
type="tns:ArrayOfWeatherData"/>\f0\fs20\cf0 \par \f1\fs20\cf0          
</s:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0        </s:complexType>\f0\fs20\cf0 
\par \f1\fs20\cf0        <s:complexType name="ArrayOfWeatherData">\f0\fs20\cf0 
\par \f1\fs20\cf0          <s:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0           
 <s:element minOccurs="0" maxOccurs="unbounded" name="WeatherData" 
type="tns:WeatherData"/>\f0\fs20\cf0 \par \f1\fs20\cf0          
</s:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0        </s:complexType>\f0\fs20\cf0 
\par \f1\fs20\cf0        <s:complexType name="WeatherData">\f0\fs20\cf0 \par 
\f1\fs20\cf0          <s:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0     
        <s:element minOccurs="0" maxOccurs="1" name="Day" 
type="s:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0            <s:element 
minOccurs="0" maxOccurs="1" name="WeatherImage" type="s:string"/>\f0\fs20\cf0 
\par \f1\fs20\cf0            <s:element minOccurs="0" maxOccurs="1" 
name="MaxTemperatureF" type="s:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0          
  <s:element minOccurs="0" maxOccurs="1" name="MinTemperatureF" 
type="s:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0            <s:element 
minOccurs="0" maxOccurs="1" name="MaxTemperatureC" 
type="s:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0            <s:element 
minOccurs="0" maxOccurs="1" name="MinTemperatureC" 
type="s:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0          
</s:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0        </s:complexType>\f0\fs20\cf0 
\par \f1\fs20\cf0  </s:schema>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Next, we'll use castor 
to generate POJO classes from the service schema. First, define the source 
generator task and a goal for generation. The example below is for a maven 1.x 
configuration. Go to Using the Source Code Generator for a full reference on 
generating java classes from XML schema. \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <ant:path id="castor.class.path">\f0\fs20\cf0 \par \f1\fs20\cf0          
<ant:path refid="maven.dependency.classpath"/>\f0\fs20\cf0 \par \f1\fs20\cf0    
      <ant:pathelement path="$\u123?maven.build.dest\u125?"/>\f0\fs20\cf0 \par 
\f1\fs20\cf0          <ant:pathelement 
path="$\u123?maven.test.dest\u125?"/>\f0\fs20\cf0 \par \f1\fs20\cf0  
</ant:path>\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0  <ant:taskdef 
name="castor-srcgen"\f0\fs20\cf0 \par \f1\fs20\cf0                  
classname="org.exolab.castor.tools.ant.taskdefs.CastorSourceGenTask"\f0\fs20\cf0
 \par \f1\fs20\cf0                  
classpathref="castor.class.path"/>\f0\fs20\cf0 \par \f0\fs20\cf0 \par 
\f1\fs20\cf0  <goal name="generate-source">\f0\fs20\cf0 \par \f1\fs20\cf0       
   <ant:delete dir="$\u123?maven.build.dir\u125?/generated-src"/>\f0\fs20\cf0 
\par \f1\fs20\cf0          <ant:mkdir dir="$\
 u123?maven.build.dir\u125?/generated-src"/>\f0\fs20\cf0 \par \f1\fs20\cf0      
    <castor-srcgen 
file="src/main/META-INF/schema/WeatherForecast.xsd"\f0\fs20\cf0 \par 
\f1\fs20\cf0                        package="net.webservicex"\f0\fs20\cf0 \par 
\f1\fs20\cf0                        
todir="$\u123?maven.build.dir\u125?/generated-src"\f0\fs20\cf0 \par 
\f1\fs20\cf0                        types="j2"\f0\fs20\cf0 \par \f1\fs20\cf0    
                    warnings="false" />\f0\fs20\cf0 \par \f1\fs20\cf0  
</goal>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 After running the 
generate-source goal, the supporting classes will be in the generated-src 
directory under the net.webservicex package. Along with each class is an 
accompanying Descriptor class file (e.g. WeatherDataDescriptor.java) that 
contains XML binding information. \par\pard\li0\ri0\f0\fs20\cf0 \par 
\f1\fs20\cf0 Next, write a Web service with the support of the generated 
classes. Note, the example below is a trivial implementation. \par\f1\fs20\cf0 
\par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  package foo.bar;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0  import 
net.webservicex.*;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0  public 
class WeatherService\f0\fs20\cf0 \par \f1\fs20\cf0  \u123?\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0      public GetWeatherByZipCodeResponse 
GetWeatherByZipCode(GetWeatherByZipCode body)\f0\fs20\cf0 \par \f1\fs20\cf0     
 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0          GetWeatherByZipCodeResponse res 
= new GetWeatherByZipCodeResponse();\f0\fs20\cf0 \par \f1\fs20\cf0          
String zipCode = body.getZipCode();\f0\fs20\cf0 \par \f1\fs20\cf0          if 
(!zipCode.equals("1050"))\f0\fs20\cf0 \par \f1\fs20\cf0              throw new 
RuntimeException("Parameter isnt passed correctly. expected: 1050, got 
"\f0\fs20\cf0 \par \f1\fs20\cf0                      + zipCode);\f0\fs20\cf0 
\par \f1\fs20\cf0          GetWeathe
 rByZipCodeResult weather = new GetWeatherByZipCodeResult();\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0          weather.setLatitude(1);\f0\fs20\cf0 
\par \f1\fs20\cf0          weather.setLongitude(1);\f0\fs20\cf0 \par 
\f1\fs20\cf0          weather.setPlaceName("Vienna, AT");\f0\fs20\cf0 \par 
\f1\fs20\cf0          weather.setAllocationFactor(1);\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0          
res.setGetWeatherByZipCodeResult(weather);\f0\fs20\cf0 \par \f0\fs20\cf0 \par 
\f1\fs20\cf0          return res;\f0\fs20\cf0 \par \f1\fs20\cf0      
\u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0  \u125?\f0\fs20\cf0 \par 
\cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 After this, configure 
the service in Xfire. The example below takes the XML configuration approach 
(which uses Spring integration). In addition, XFire supports integration of 
configuration into containers such as Plexus and PicoContainer. For more 
control over the Web service definition, JSR 181 Annotations should be used in 
the service code. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The 
configuration goes in the services.xml descriptor. This file goes in 
META-INF/xfire/ on the classpath: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <beans xmlns="http://xfire.codehaus.org/config/1.0";>\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0    <service>\f0\fs20\cf0 \par \f1\fs20\cf0      
<serviceClass>foo.bar.WeatherService</serviceBean>\f0\fs20\cf0 \par 
\f1\fs20\cf0      <schemas>\f0\fs20\cf0 \par \f1\fs20\cf0        
<schema>META-INF/schema/WeatherForecast.xsd</schema>\f0\fs20\cf0 \par 
\f1\fs20\cf0      </schemas>\f0\fs20\cf0 \par \f1\fs20\cf0      
<style>document</style>\f0\fs20\cf0 \par \f1\fs20\cf0      
<serviceFactory>#castorServiceFactory</serviceFactory>\f0\fs20\cf0 \par 
\f1\fs20\cf0    </service>\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0    
<bean id="castorTypeRegistry" 
class="org.codehaus.xfire.castor.CastorTypeMappingRegistry" />\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0    <bean id="bindingProvider" 
class="org.codehaus.xfire.aegis.AegisBindingProvider">\f0\fs20\cf0 \par \f1
 \fs20\cf0          <constructor-arg ref="castorTypeRegistry" />\f0\fs20\cf0 
\par \f1\fs20\cf0    </bean\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0    
<bean id="castorServiceFactory" 
class="org.codehaus.xfire.service.binding.ObjectServiceFactory">\f0\fs20\cf0 
\par \f1\fs20\cf0      <constructor-arg index="0" ref="xfire.transportManager" 
/>\f0\fs20\cf0 \par \f1\fs20\cf0      <constructor-arg index="1" 
ref="bindingProvider" />\f0\fs20\cf0 \par \f1\fs20\cf0     </bean>\f0\fs20\cf0 
\par \f0\fs20\cf0 \par \f1\fs20\cf0  </beans>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The service definition 
specifies the web service implementation class with the serviceClass property. 
A list of <schemas>can be provided to be included in WSDL generation. In this 
case, the borrowed schema definition in the classpath at 
META-INF/schema/WeatherForecast.xsd has been included. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The request and response 
messages were defined in our schema and were included as a single parameter and 
return type, respectively, in our service method. This lends itself to a bare 
(or unwrapped) parameter-style. The service definition specifies a bare 
parameter-style by setting the style property as 'document'. If a wrapped 
parameter-style is preferable, the request and response schema definitions and 
generated classes would not be needed, as the operation name would wrap any 
request parameters and return type. The style property in the service 
definition would not be needed as service facto
 ries create services as wrapped style by default. The service method signature 
for a wrapped style service would be: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  public WeatherForecasts GetWeatherByZipCode(String zipCode)\f0\fs20\cf0 \par 
\cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Service factories are 
responsible for creating the service inside of XFire. In this case, we want to 
use an ObjectServiceFactory with Castor binding, so the beans 
'castorTypeRegistry', 'bindingProvider' and 'castorServiceFactory' are defined. 
Notice that these beans are using spring-style bean definitions (e.g. bean 
id=... ) since XML Configuration uses Spring to build its services. We 
reference this service factory in the serviceFactory property of the service 
definition as #castorServiceFactory. The '#' denotes a reference to another 
defined bean. Read the Bindings section to learn more about setting up service 
factories with different xml binding mechanisms. \par\pard\li0\ri0\f0\fs20\cf0 
\par \f1\fs20\cf0 After configuring the service within XFire, the service needs 
to be exposed so it can be reached by client-proxies. This can be done over 
HTTP by defining a servlet in the web.xml. Since we have taken the XML 
Configuration 
 approach, it is best to set up the XFireConfigurableServlet in our web.xml. 
XFireConfigurableServlet will load the services.xml along with the included 
org.codehaus.xfire.spring.xfire.xml files upon initialization. Reference the 
XML Configuration for how to write the web.xml file. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Finally, deploy the web 
application to your favorite servlet container, and the service should be 
visible at /services/WeatherService?wsdl under the deployed webapp context 
path. \par\par\pard\li0\ri0\f1\fs44\cf0 1.11. \f1\fs44\cf0 Bottom-up Approach 
(starting with Java classes): \par\par\f0\fs20\cf0 \par 
\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Let's say you want to leverage your 
pre-existing business code by exposing certain methods with a Web Service. 
That's not too hard to do with Castor binding and XFire, but it's a different 
approach that involves mapping Java to XML rather than generating Java classes 
from schema. Service-oriented architecture disco
 urages simply exposing the domain model, but in this example we're going to be 
rebellious and not insulate it. This doesn't mean that the bottom-up approach 
can't follow SOA best practices, altogether. \par\pard\li0\ri0\f0\fs20\cf0 \par 
\f1\fs20\cf0 Below is a Book class that's part of the domain: \par\f1\fs20\cf0 
\par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  package foo.bar;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0  public 
class Book\f0\fs20\cf0 \par \f1\fs20\cf0  \u123?\f0\fs20\cf0 \par \f1\fs20\cf0  
    private String title;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0      
private String isbn;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0      
private String author;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0      
public String getIsbn()\f0\fs20\cf0 \par \f1\fs20\cf0      \u123?\f0\fs20\cf0 
\par \f1\fs20\cf0          return isbn;\f0\fs20\cf0 \par \f1\fs20\cf0      
\u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0      public void 
setIsbn(String isbn)\f0\fs20\cf0 \par \f1\fs20\cf0      \u123?\f0\fs20\cf0 \par 
\f1\fs20\cf0          this.isbn = isbn;\f0\fs20\cf0 \par \f1\fs20\cf0      
\u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0      public String 
getTitle()\f0\fs20\cf0 \par \f1\fs2
 0\cf0      \u123?\f0\fs20\cf0 \par \f1\fs20\cf0          return 
title;\f0\fs20\cf0 \par \f1\fs20\cf0      \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 
\par \f1\fs20\cf0      public void setTitle(String title)\f0\fs20\cf0 \par 
\f1\fs20\cf0      \u123?\f0\fs20\cf0 \par \f1\fs20\cf0          this.title = 
title;\f0\fs20\cf0 \par \f1\fs20\cf0      \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 
\par \f1\fs20\cf0      public String getAuthor()\f0\fs20\cf0 \par \f1\fs20\cf0  
    \u123?\f0\fs20\cf0 \par \f1\fs20\cf0          return author;\f0\fs20\cf0 
\par \f1\fs20\cf0      \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0   
   public void setAuthor(String author)\f0\fs20\cf0 \par \f1\fs20\cf0      
\u123?\f0\fs20\cf0 \par \f1\fs20\cf0          this.author = author;\f0\fs20\cf0 
\par \f1\fs20\cf0      \u125?\f0\fs20\cf0 \par \f1\fs20\cf0  \u125?\f0\fs20\cf0 
\par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Next, is a service 
class that has a couple methods we want to expose as a web service. Note: This 
service class could have existed already as a business service, or could have 
been written specifically to be a web service. As you might have noticed, the 
implementation is quite trivial (ie. stoopid). \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  package foo.bar;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0  public 
class BookService\f0\fs20\cf0 \par \f1\fs20\cf0  \u123?\f0\fs20\cf0 \par 
\f1\fs20\cf0      private Book onlyBook;\f0\fs20\cf0 \par \f0\fs20\cf0 \par 
\f1\fs20\cf0      public BookService()\f0\fs20\cf0 \par \f1\fs20\cf0      
\u123?\f0\fs20\cf0 \par \f1\fs20\cf0          onlyBook = new 
Book();\f0\fs20\cf0 \par \f1\fs20\cf0          onlyBook.setAuthor("Steve 
Ballmer");\f0\fs20\cf0 \par \f1\fs20\cf0          onlyBook.setTitle("How to 
Yell Real Loud and Look Like You Might Have a Heart Attack");\f0\fs20\cf0 \par 
\f1\fs20\cf0          onlyBook.setIsbn("012924828");\f0\fs20\cf0 \par 
\f1\fs20\cf0      \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0      
public String addBook(Book book)\f0\fs20\cf0 \par \f1\fs20\cf0      
\u123?\f0\fs20\cf0 \par \f1\fs20\cf0          return onlyBook.getIsbn(
 );\f0\fs20\cf0 \par \f1\fs20\cf0      \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 
\par \f1\fs20\cf0      public Book findBook(String isbn)\f0\fs20\cf0 \par 
\f1\fs20\cf0      \u123?\f0\fs20\cf0 \par \f1\fs20\cf0          return 
onlyBook;\f0\fs20\cf0 \par \f1\fs20\cf0      \u125?\f0\fs20\cf0 \par 
\f1\fs20\cf0  \u125?\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Let's create an XSD 
that matches the Book class, so that we know what the XML element for the Book 
class should look like. The Book.xsd schema below should be saved under 
META-INF/schema/ in the classpath: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <xsd:schema elementFormDefault="qualified" 
targetNamespace="http://xfire.codehaus.org"\f0\fs20\cf0 \par \f1\fs20\cf0       
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:tns="http://xfire.codehaus.org";>\f0\fs20\cf0 \par \f1\fs20\cf0      
<xsd:complexType name="Book">\f0\fs20\cf0 \par \f1\fs20\cf0          
<xsd:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0              <xsd:element 
name="title" type="xsd:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0              
<xsd:element name="isbn" type="xsd:string"/>\f0\fs20\cf0 \par \f1\fs20\cf0      
        <xsd:element name="author" type="xsd:string"/>\f0\fs20\cf0 \par 
\f1\fs20\cf0          </xsd:sequence>\f0\fs20\cf0 \par \f1\fs20\cf0      
</xsd:complexType>\f0\fs20\cf0 \par \f1\fs20\cf0  </xsd:schema>\f0\fs20\cf0 
\par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The schema outlines a 
complex type that has three string elements. It is important to note that the 
namespace prefix for XML schema namespace is 'xsd' and the namespace prefix for 
the target namespace is 'tns'. These are the prefixes used by the XFire WSDL 
builder when creating the schema section, and this schema will actually be 
inserted inline into the schema section of the WSDL. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Now we need to specify how to 
transform our Book class to an XML element that conforms to the XSD, and vice 
versa. This is done with a castor mapping file. More information on writing 
castor mappings is available at http://www.castor.org/xml-mapping.html 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The castor.xml mapping file 
below should be saved under the foo.bar package: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <?xml version="1.0" encoding="UTF-8"?>\f0\fs20\cf0 \par \f1\fs20\cf0  
<mapping>\f0\fs20\cf0 \par \f1\fs20\cf0    <class 
name="org.codehaus.xfire.castor.Book">\f0\fs20\cf0 \par \f1\fs20\cf0      
<map-to xml="Book" ns-uri="http://xfire.codehaus.org"; ns-prefix="tns" 
element-definition="false"/>\f0\fs20\cf0 \par \f1\fs20\cf0      <field 
name="title" type="string"/>\f0\fs20\cf0 \par \f1\fs20\cf0      <field 
name="isbn" type="string"/>\f0\fs20\cf0 \par \f1\fs20\cf0      <field 
name="author" type="string"/>\f0\fs20\cf0 \par \f1\fs20\cf0    
</class>\f0\fs20\cf0 \par \f1\fs20\cf0  </mapping>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Note again, the target 
namespace and tns prefix are the same as in the XSD. The element-defintion 
attribute denotes whether the XSD definition is a concrete element or an 
abstract complex type. In this case, it is a complex type so element-definition 
is false (which is actually is default value). \par\pard\li0\ri0\f0\fs20\cf0 
\par \f1\fs20\cf0 All the distinct parts are there, time to configure the 
service in Xfire. The example below takes the XML configuration approach (which 
uses Spring integration). \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The 
configuration goes in the services.xml descriptor. This file goes in 
META-INF/xfire/ on the classpath: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <beans xmlns="http://xfire.codehaus.org/config/1.0";>\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0    <service>\f0\fs20\cf0 \par \f1\fs20\cf0      
<serviceClass>foo.bar.BookService</serviceBean>\f0\fs20\cf0 \par \f1\fs20\cf0   
   <namespace>http://xfire.codehaus.org</namespace>\f0\fs20\cf0 \par 
\f1\fs20\cf0      <schemas>\f0\fs20\cf0 \par \f1\fs20\cf0        
<schema>META-INF/schema/Book.xsd</schema>\f0\fs20\cf0 \par \f1\fs20\cf0      
</schemas>\f0\fs20\cf0 \par \f1\fs20\cf0      
<serviceFactory>#castorServiceFactory</serviceFactory>\f0\fs20\cf0 \par 
\f1\fs20\cf0    </service>\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0    
<bean id="castorTypeRegistry" 
class="org.codehaus.xfire.castor.CastorTypeMappingRegistry">\f0\fs20\cf0 \par 
\f1\fs20\cf0        <property name="mappingFile" value="foo/bar/castor.xml" 
/>\f0\fs20\cf0 \par \f1\fs20\cf0    </bean>\f0\fs20
 \cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0    <bean id="bindingProvider" 
class="org.codehaus.xfire.aegis.AegisBindingProvider">\f0\fs20\cf0 \par 
\f1\fs20\cf0          <constructor-arg ref="castorTypeRegistry" />\f0\fs20\cf0 
\par \f1\fs20\cf0    </bean\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0    
<bean id="castorServiceFactory" 
class="org.codehaus.xfire.service.binding.ObjectServiceFactory">\f0\fs20\cf0 
\par \f1\fs20\cf0      <constructor-arg index="0" ref="xfire.transportManager" 
/>\f0\fs20\cf0 \par \f1\fs20\cf0      <constructor-arg index="1" 
ref="bindingProvider" />\f0\fs20\cf0 \par \f1\fs20\cf0     </bean>\f0\fs20\cf0 
\par \f0\fs20\cf0 \par \f1\fs20\cf0  </beans>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The service definition 
specifies the web service implementation class with the serviceClass property. 
A list of schemas can be provided to be included in WSDL generation. In this 
case, the schema definition in the classpath at META-INF/schema/Book.xsd has 
been included. Our service is of parameter style 'wrapped', as the method names 
in the service will wrap our request and response messages (e.g. findBook ). 
The style property in the service definition is not be needed as service 
factories create services as wrapped style by default. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Service factories are 
responsible for creating the service inside of XFire. In this case, we want to 
use an ObjectServiceFactory with Castor binding, so the beans 
'castorTypeRegistry', 'bindingProvider' and 'castorServiceFactory' are defined. 
Notice that these beans are using spring-style bean definitions (e.g. bean 
id=... ) since XML Configuration u
 ses Spring to build its services. We reference this service factory in the 
serviceFactory property of the service definition as #castorServiceFactory. The 
'#' denotes a reference to another defined bean. The 'castorTypeRegistry' 
definition sets the 'mappingFile' property to point to the castor.xml mapping 
file in the classpath. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 After 
configuring the service within XFire, the service needs to be exposed so it can 
be reached by client-proxies. This can be done over HTTP by defining a servlet 
in the web.xml. Reference the XML Configuration for how to write the web.xml 
file. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 After configuring the 
service and web application, deploy it to your favorite servlet container, and 
the service should be visible at /services/BookService?wsdl under the deployed 
webapp context path. \par\par\sect\sectd{\footer }{\header 
}\pgwsxn11907\pghsxn16840\pard\li0\ri0\f1\fs48\cf2 2. \f1\fs48\cf2 
Transports\par\pa
 r\pard\li0\ri0\f1\fs44\cf0 2.1. \f1\fs44\cf0 Transports and Channels 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Channels 
and Transports provide the basic unit of communication in XFire. A Channel 
simply sends messages (via send()) and listens for messages (via receive()). If 
you want to send a message to a particular URL you do: \par\f1\fs20\cf0 
\par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  TransportManager tm = ...;\f0\fs20\cf0 \par \f1\fs20\cf0  Transport t = 
tm.getTransportForUri("http://foo";);\f0\fs20\cf0 \par \f0\fs20\cf0 \par 
\f1\fs20\cf0  OutMessage msg = ...; // create an outmessage 
yourself\f0\fs20\cf0 \par \f1\fs20\cf0  Channel c = t.createChannel(); // 
create an anonymous endpoint\f0\fs20\cf0 \par \f1\fs20\cf0  MessageContext 
context = new MessageContext();\f0\fs20\cf0 \par \f1\fs20\cf0  c.send(msg, 
context);\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Each transport is 
responsible for creating its own protocol specific listener, for example a 
servlet in the case of HTTP. This listener then passes whatever messages it 
receives to the channel via Channel.receive(MessageContext, InMessage). 
Channels simply delegate their receive() to a ChannelEndpoint which application 
specific handling of what to do with the message. The default endpoint is aptly 
named DefaultEndpoint and will be covered in the next section. 
\par\pard\li0\ri0\f1\fs40\cf0 2.1.1. \f1\fs40\cf0 InMessage and OutMessage 
\par\par\f0\fs20\cf0 \par \par\pard\li0\ri0\f1\fs40\cf0 2.1.2. \f1\fs40\cf0 
MessageSerializer \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par 
\f1\fs20\cf0 Each OutMessage has a MessageSerializer. A message serializer 
takes the message body (message.getBody()) and writes it to an XMLStreamWriter 
that the Channel provides. The semantics of MessageSerializers should be such 
that they can be in
 voked multiple times. \par\par\pard\li0\ri0\f1\fs40\cf0 2.1.3. \f1\fs40\cf0 
Channels/Transports without Services \par\par\f0\fs20\cf0 \par 
\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Its important to note that Channels 
and transports are completely independent of XFire's Services. So I can use a 
channel to send a receive messages and never even create a service. I simply 
need to provide my own ChannelEndpoint. \par\par\pard\li0\ri0\f1\fs40\cf0 
2.1.4. \f1\fs40\cf0 DefaultEndpoint and the processing flow 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 
DefaultEndpoint takes a message, creates a default message exchange called 
InMessageExchange and creates a message pipeline. The message pipeline at first 
consists of the global in handlers from XFire.getInHandlers() and the transport 
handlers from Transport.getInHandlers. Later on when the service is resolved, 
the service's handlers get added into the pipeline. Once the operation is 
resolved, if there is an out mes
 sage to be set an Out pipeline is created and added to the MessageContext. 
\par\par\pard\li0\ri0\f1\fs40\cf0 2.1.5. \f1\fs40\cf0 Phases and Handlers 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 See 
Processing Pipeline for now. \par\par\pard\li0\ri0\f1\fs40\cf0 2.1.6. 
\f1\fs40\cf0 SOAP Processing \par\par\f0\fs20\cf0 \par 
\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 SOAPTransport.createTransport() 
adds SOAP support to a particular transport. It does so by adding three 
additional handlers: \par\f1\fs20\cf0 
\pard\ql\fi0\li400\ri0\fs20\ls3{{\listtext\pard\f0\fi0\li400\ri0 
1.\tab}\f1\fs20\cf0 ReadHeaderHandler - this handler reads in the soap headers. 
It stops reading the XML stream the moment the whitespace stops after the Body 
tag. If it encounters a Fault in the Body, an XFireFault is thrown. [[1]] 
ValidateHeadersHandler - Ensure that all the necessary headers are understood 
by the receiving handlers. [[1]] SoapSerializerHandler - Services provide a 
MessageSeri
 alizer of their own which is responsible for serializing the soap body. But 
what about the message headers? This is written out by the SoapSerializer. What 
the SoapSerializerHandler does is replace the outMessage.MessageSerializer with 
new SoapSerializer(outMsg.getMessageSerializer()). \par
+}\pard\par\pard\li0\ri0\f1\fs40\cf0 2.1.7. \f1\fs40\cf0 MessageExchanges 
\par\par\f0\fs20\cf0 \par \par\par\pard\li0\ri0\f1\fs44\cf0 2.2. \f1\fs44\cf0 
HTTP Transport \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f1\fs40\cf0 2.2.1. 
\f1\fs40\cf0 XFireServlet \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 
\par \f1\fs20\cf0 The core of the HTTP Transport takes place in the 
XFireServletController. Your own servlets can delegate appropriate requests to 
this class or you can use one of XFire's internal servlet classes. The 
XFireServlet is just a thin wrapper for the controller. The 
XFireServletController provides an xml configuration layer on top of this. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 XFire also provides the 
XFireConfigurableServlet which reads the services.xml format automatically for 
you and the XFireSpringServlet which provides Sprign integration. 
\par\par\pard\li0\ri0\f1\fs40\cf0 2.2.2. \f1\fs40\cf0 
HttpServletRequest/HttpServletResponse \par\par\f0\fs20\cf0 \par \pard
 \li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The 
HttpServletRequest/HttpServletResponse can be accessed via the 
XFireServletController. \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  HttpServletRequest request = XFireServletController.getRequest();\f0\fs20\cf0 
\par \f1\fs20\cf0  HttpServletResponse response = 
XFireServletController.getResponse();\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This method will work 
all the XFire servlets (XFireServlet, XFireConfigurableServlet, 
XFireSpringServlet). \par\par\pard\li0\ri0\f1\fs40\cf0 2.2.3. \f1\fs40\cf0 
Client authentication \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par 
\f1\fs20\cf0 The Apache Jakarta HttpClient is used under the covers to provide 
HTTP client support. There are two ways which you can override the HttpClient 
settings: \par\f1\fs20\cf0 
\pard\ql\fi0\li400\ri0\fs20\ls4{{\listtext\pard\f0\fi0\li400\ri0 
1.\tab}\f1\fs20\cf0 You can set the USERNAME/PASSWORD \f1\fs20\cf0 \par
+{\listtext\pard\f0\fi0\li400\ri0 2.\tab}\f1\fs20\cf0 You can supply your own 
HttpClientParms \f1\fs20\cf0 \f1\fs20\cf0 The HTTPClient javadocs provide 
information on how to configure the HttpClientParams. \par
+}\pard\par\pard\li0\ri0\f1\fs40\cf0 2.2.4. \f1\fs40\cf0 Proxy Support 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Proxy 
support looks very similar to the username/password scenario: \par\f1\fs20\cf0 
\par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  // Create your client\f0\fs20\cf0 \par \f1\fs20\cf0  Client client = 
....;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0  // Or get it from your 
proxy\f0\fs20\cf0 \par \f1\fs20\cf0  Client client = ((XFireProxy) 
Proxy.getInvocationHandler(myClientProxy)).getClient();\f0\fs20\cf0 \par 
\f1\fs20\cf0  client.setProperty(CommonsHttpMessageSender.HTTP_PROXY_HOST, 
"host");\f0\fs20\cf0 \par \f1\fs20\cf0  
client.setProperty(CommonsHttpMessageSender.HTTP_PROXY_PORT, 
"8080");\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\par\pard\li0\ri0\f1\fs40\cf0 2.2.5. \f1\fs40\cf0 HTTP Chunking 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 You'll 
need to enable HTTP chunking on the client if you are sending large files which 
can't be cached in memory: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  import org.codehaus.xfire.transport.http.HttpTransport;\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0  Client client = ....;\f0\fs20\cf0 \par 
\f1\fs20\cf0  client.setProperty(HttpTransport.CHUNKING_ENABLED, 
"true");\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\par\par\pard\li0\ri0\f1\fs44\cf0 2.3. \f1\fs44\cf0 JMS Transport 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This 
guide gives you a quick rundown of how to configure XFire to use JMS as a 
transport. JMS is one of the easiest means to create a reliable SOAP 
connection. Additionally it is much faster then things such as WS-Reliability. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This example assumes that you 
already know how to: \par\f1\fs20\cf0 
\pard\ql\fi0\li300\ri0\fs20\ls5{{\listtext\pard\f2\fi0\li300\ri0 
\'b7\tab}\f1\fs20\cf0 Configure services via XFire's services.xml format \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Build and deploy simple 
XFire applications \par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Use your JMS provider 
\par
+{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 A working knowledge of 
Spring \par
+}\pard\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 We're just going to show a 
simple synchronous Echo example running over JMS. The first thing you need to 
do is create your services.xml file: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  <beans xmlns="http://xfire.codehaus.org/config/1.0";>\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0    <!--\f0\fs20\cf0 \par \f1\fs20\cf0      
Register the JMS transport. Note: this needs to happen *before* we\f0\fs20\cf0 
\par \f1\fs20\cf0      create our service.\f0\fs20\cf0 \par \f1\fs20\cf0      
-->\f0\fs20\cf0 \par \f1\fs20\cf0    <xfire>\f0\fs20\cf0 \par \f1\fs20\cf0      
<transports>\f0\fs20\cf0 \par \f1\fs20\cf0        <bean 
id="jmsTransport"\f0\fs20\cf0 \par \f1\fs20\cf0              
class="org.codehaus.xfire.transport.jms.JMSTransport"\f0\fs20\cf0 \par 
\f1\fs20\cf0              
xmlns="http://xbean.org/schemas/spring/1.0";>\f0\fs20\cf0 \par \f1\fs20\cf0      
    <constructor-arg ref="xfire"/>\f0\fs20\cf0 \par \f1\fs20\cf0          
<constructor-arg ref="connectionFactory"/>\f0\fs20\cf0 \par \f1\fs20\cf0        
</bean>\f0\fs20\cf0 \par \f1\fs20\cf0     
  </transports>\f0\fs20\cf0 \par \f1\fs20\cf0    </xfire>\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0    <service xmlns:e="urn:Echo">\f0\fs20\cf0 \par 
\f1\fs20\cf0      <name>Echo</name>\f0\fs20\cf0 \par \f1\fs20\cf0      
<serviceClass>org.codehaus.xfire.test.Echo</serviceClass>\f0\fs20\cf0 \par 
\f1\fs20\cf0      
<implementationClass>org.codehaus.xfire.test.EchoImpl</implementationClass>\f0\fs20\cf0
 \par \f1\fs20\cf0      <bindings>\f0\fs20\cf0 \par \f1\fs20\cf0        
<soap11Binding name="e:EchoJMSBinding" 
transport="urn:xfire:transport:jms">\f0\fs20\cf0 \par \f1\fs20\cf0          
<endpoints>\f0\fs20\cf0 \par \f1\fs20\cf0            <endpoint 
name="e:EchoJMSEndpoint" url="jms://Echo" />\f0\fs20\cf0 \par \f1\fs20\cf0      
    </endpoints>\f0\fs20\cf0 \par \f1\fs20\cf0        
</soap11Binding>\f0\fs20\cf0 \par \f1\fs20\cf0      </bindings>\f0\fs20\cf0 
\par \f1\fs20\cf0    </service>\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 
   <bean id="connectionFactory"\f0\fs20\cf0 \par \f1
 \fs20\cf0          
class="org.apache.activemq.ActiveMQConnectionFactory"\f0\fs20\cf0 \par 
\f1\fs20\cf0          singleton="true"\f0\fs20\cf0 \par \f1\fs20\cf0          
xmlns="http://xbean.org/schemas/spring/1.0/";>\f0\fs20\cf0 \par \f1\fs20\cf0     
 <constructor-arg value="vm://localhost?broker.persistent=false" 
type="java.lang.String"/>\f0\fs20\cf0 \par \f1\fs20\cf0    </bean>\f0\fs20\cf0 
\par \f0\fs20\cf0 \par \f1\fs20\cf0  </beans>\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 There is a lot in 
here, so lets recap this a little bit. \par\pard\li0\ri0\f0\fs20\cf0 \par 
\f1\fs20\cf0 The xfire section contains a transports element. In transports we 
are creating our JMSTransport via the Spring bean syntax. XFire will then 
automatically register this transport for us into the TransportManager. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The service element contains 
our service definition. This is pretty standard, except you'll notice we're 
creating a new binding for JMS. soap11Binding 
transport="urn:xfire:transport:jms"tells XFire that we want to add a SOAP 1.1 
binding for JMS. In the endpoints section we tell XFire exactly what that 
endpoint will be. The JMS urls take the form of jms:// \pard\f1\fs24\cf0 
QueueName \f1\fs20\cf0 . \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 In the 
sections below we configure our JMS QueueConnectionFactory using ActiveMQ. 
\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\c
 f0 Once all of this is properly configured we will of course want to write a 
client: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  import java.lang.reflect.Proxy;\f0\fs20\cf0 \par \f0\fs20\cf0 \par 
\f1\fs20\cf0  import org.codehaus.xfire.client.XFireProxy;\f0\fs20\cf0 \par 
\f1\fs20\cf0  import org.codehaus.xfire.client.XFireProxyFactory;\f0\fs20\cf0 
\par \f1\fs20\cf0  import org.codehaus.xfire.service.Service;\f0\fs20\cf0 \par 
\f1\fs20\cf0  import 
org.codehaus.xfire.service.binding.ObjectServiceFactory;\f0\fs20\cf0 \par 
\f1\fs20\cf0  import 
org.codehaus.xfire.spring.AbstractXFireSpringTest;\f0\fs20\cf0 \par 
\f1\fs20\cf0  import org.codehaus.xfire.test.Echo;\f0\fs20\cf0 \par 
\f1\fs20\cf0  import org.codehaus.xfire.transport.jms.JMSTransport;\f0\fs20\cf0 
\par \f1\fs20\cf0  import 
org.springframework.context.ApplicationContext;\f0\fs20\cf0 \par \f1\fs20\cf0  
import 
org.apache.xbean.spring.context.ClassPathXmlApplicationContext;\f0\fs20\cf0 
\par \f0\fs20\cf0 \par \f1\fs20\cf0  public class J
 MSExampleTest\f0\fs20\cf0 \par \f1\fs20\cf0      extends 
AbstractXFireSpringTest\f0\fs20\cf0 \par \f1\fs20\cf0  \u123?\f0\fs20\cf0 \par 
\f1\fs20\cf0      protected ApplicationContext createContext()\f0\fs20\cf0 \par 
\f1\fs20\cf0      \u123?\f0\fs20\cf0 \par \f1\fs20\cf0          return new 
ClassPathXmlApplicationContext(new String[] \u123?\f0\fs20\cf0 \par 
\f1\fs20\cf0                  
"/org/codehaus/xfire/transport/jms/example/jms.xml",\f0\fs20\cf0 \par 
\f1\fs20\cf0                  "/org/codehaus/xfire/spring/xfire.xml" 
\u125?);\f0\fs20\cf0 \par \f1\fs20\cf0      \u125?\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0      public void testClient()\f0\fs20\cf0 \par 
\f1\fs20\cf0              throws Exception\f0\fs20\cf0 \par \f1\fs20\cf0      
\u123?\f0\fs20\cf0 \par \f1\fs20\cf0          // Create a ServiceFactory to 
create the ServiceModel.\f0\fs20\cf0 \par \f1\fs20\cf0          // We need to 
add the JMSTransport to the list of bindings to create.\f0\fs20\cf0 \par 
\f1\fs20\cf0      
     ObjectServiceFactory sf = new 
ObjectServiceFactory(getTransportManager());\f0\fs20\cf0 \par \f1\fs20\cf0      
    sf.addSoap11Transport(JMSTransport.BINDING_ID);\f0\fs20\cf0 \par 
\f0\fs20\cf0 \par \f1\fs20\cf0          // Create the service model\f0\fs20\cf0 
\par \f1\fs20\cf0          Service serviceModel = 
sf.create(Echo.class);\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0          
// Create a proxy for the service\f0\fs20\cf0 \par \f1\fs20\cf0          
XFireProxyFactory factory = new XFireProxyFactory(getXFire());\f0\fs20\cf0 \par 
\f1\fs20\cf0          Echo echo = (Echo) factory.create(serviceModel, 
"jms://Echo");\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0          // 
Since JMS doesn't really have a concept of anonymous endpoints, we 
need\f0\fs20\cf0 \par \f1\fs20\cf0          // need to let xfire know what JMS 
endpoint we should use\f0\fs20\cf0 \par \f1\fs20\cf0          ((XFireProxy) 
Proxy.getInvocationHandler(echo)).getClient().setEndpointUri("jms://Peer1");\f0\fs20
 \cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0          // run the 
client!\f0\fs20\cf0 \par \f1\fs20\cf0          String resString = 
echo.echo("hello");\f0\fs20\cf0 \par \f1\fs20\cf0          
assertEquals("hello", resString);\f0\fs20\cf0 \par \f1\fs20\cf0      
\u125?\f0\fs20\cf0 \par \f1\fs20\cf0  \u125?\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 2.4. \f1\fs44\cf0 Local Transport 
\par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 XFire 
includes an in-JVM transport called the LocalTransport. If you are using the 
XFire client or the Channel API, you can address a local service like so: 
\par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0
+\trbrdrh\brdrs\brdrw20\brdrcf0
+\trbrdrv\brdrs\brdrw20\brdrcf0
+\trpaddl100\trpaddr100\trpaddfl3\trpaddfr3
+\clbrdrl\brdrs\brdrw10\brdrcf0
+\clbrdrt\brdrs\brdrw10\brdrcf0
+\clbrdrb\brdrs\brdrw10\brdrcf0
+\clbrdrr\brdrs\brdrw10\brdrcf0
+\clcbpat1
+\clftsWidth3
+\clwWidth10400
+\clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0
  xfire.local://FooService\f0\fs20\cf0 \par \cell \row
+\pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 For example, when 
creating a service: \par\f1\fs20\cf0 \par\trowd
+\trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0
+\trbrdrt\brdrs\brdrw20\brdrcf0
+\trbrdrb\brdrs\brdrw20\brdrcf0
+\trbrdrr\brdrs\brdrw20\brdrcf0

[... 14 lines stripped ...]

Reply via email to