View Javadoc

1   package org.codehaus.xfire.wsdl11.builder;
2   
3   import java.util.Collection;
4   import java.util.HashMap;
5   import java.util.Iterator;
6   import java.util.Map;
7   
8   import javax.wsdl.Binding;
9   import javax.wsdl.BindingOperation;
10  import javax.wsdl.Definition;
11  import javax.wsdl.Input;
12  import javax.wsdl.Message;
13  import javax.wsdl.Output;
14  import javax.wsdl.Port;
15  import javax.wsdl.PortType;
16  import javax.wsdl.Service;
17  import javax.wsdl.WSDLException;
18  import javax.xml.namespace.QName;
19  
20  import org.codehaus.xfire.service.object.ObjectService;
21  import org.codehaus.xfire.service.object.Operation;
22  import org.codehaus.xfire.transport.Transport;
23  import org.codehaus.xfire.wsdl.WSDLWriter;
24  import org.codehaus.xfire.wsdl11.WSDL11Transport;
25  
26  
27  /***
28   * WSDL
29   * 
30   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
31   */
32  public abstract class AbstractJavaWSDL
33      extends org.codehaus.xfire.wsdl11.builder.AbstractWSDL
34      implements WSDLWriter
35  {  
36      private PortType portType;
37      
38      private Binding binding;
39      
40      private Collection transports;
41      
42      private Map wsdlOps;
43  
44      public AbstractJavaWSDL( ObjectService service, Collection transports ) throws WSDLException
45      {
46          super(service);
47          this.transports = transports;
48          wsdlOps = new HashMap();
49          
50          PortType portType = createAbstractInterface();
51          
52          createConcreteInterface(portType);
53  
54          writeDocument();
55      }
56      
57      protected QName createJavaxQName( org.dom4j.QName qname )
58      {
59          return new QName( qname.getNamespaceURI(), qname.getName() );
60      }
61      
62      public PortType createAbstractInterface()
63          throws WSDLException
64      {
65          ObjectService service = (ObjectService) getService();
66          Definition def = getDefinition();
67          
68          QName portName = new QName( service.getDefaultNamespace(),
69                                      service.getName() + "PortType" );
70          
71          portType = def.createPortType();
72          portType.setQName( portName );
73          portType.setUndefined(false);
74          def.addPortType( portType );
75          
76          // Create Abstract operations
77          for ( Iterator itr = service.getOperations().iterator(); itr.hasNext(); )
78          {
79              Operation op = (Operation) itr.next();
80              Message req = getInputMessage(op);
81              def.addMessage( req );
82              
83              Message res = getOutputMessage(op);
84              def.addMessage( res );
85  
86              javax.wsdl.Operation wsdlOp = createOperation( op, req, res );
87              wsdlOp.setUndefined(false);
88              portType.addOperation( wsdlOp );
89              
90              wsdlOps.put( op.getName(), wsdlOp );
91          }
92          
93          return portType;
94      }
95      
96      public void createConcreteInterface( PortType portType )
97      {
98          ObjectService service = (ObjectService) getService();
99          Definition def = getDefinition();
100         
101         QName name = new QName( service.getDefaultNamespace(),
102                 service.getName() );
103 
104         // Create a concrete instance for each transport.
105         Service wsdlService = def.createService();
106         wsdlService.setQName( name );
107         
108         for ( Iterator itr = transports.iterator(); itr.hasNext(); )
109         {
110             Object transportObj = (Transport) itr.next();
111             if (!(transportObj instanceof WSDL11Transport))
112                 break;
113             
114             WSDL11Transport transport = (WSDL11Transport) transportObj;
115             
116             Binding transportBinding = transport.createBinding( portType, service );
117             
118             for ( Iterator oitr = service.getOperations().iterator(); oitr.hasNext(); )
119             {
120                 // todo: move out of the first loop, we'll be creating req/res multiple times otherwise
121                 Operation op = (Operation) oitr.next();
122                 
123                 javax.wsdl.Operation wsdlOp = (javax.wsdl.Operation) wsdlOps.get( op.getName() );
124                 
125                 BindingOperation bop = transport.createBindingOperation( portType, wsdlOp, service );
126                 transportBinding.addBindingOperation( bop );
127             }
128 
129             Port transportPort = transport.createPort(transportBinding, service);
130             
131             def.addBinding( transportBinding );
132             wsdlService.addPort( transportPort );
133         }
134         
135         def.addService( wsdlService );
136 
137     }
138 
139     private Message getOutputMessage(Operation op)
140     {
141         // response message
142         Message res = getDefinition().createMessage();
143         res.setQName( new QName( getService().getDefaultNamespace(),
144                                  op.getName() + "Response") );
145 
146         res.setUndefined(false);
147 
148         createOutputParts( res, op );
149          
150         return res;
151     }
152 
153     private Message getInputMessage(Operation op)
154     {
155         Message req = getDefinition().createMessage();
156         req.setQName( new QName( getService().getDefaultNamespace(), op.getName() + "Request") );
157         req.setUndefined(false);
158         
159         createInputParts( req, op );
160 
161         return req;
162     }
163 
164 	protected abstract void createInputParts( Message req, Operation op );
165 
166     protected abstract void createOutputParts( Message req, Operation op );
167 
168     public javax.wsdl.Operation createOperation( Operation op, Message req, Message res )
169     {
170         Definition def = getDefinition();
171         javax.wsdl.Operation wsdlOp = def.createOperation();
172         
173         Input input = def.createInput();
174         input.setMessage( req );
175         input.setName( req.getQName().getLocalPart() );
176 
177         Output output = def.createOutput();
178         output.setMessage( res );
179         output.setName( res.getQName().getLocalPart() );
180         wsdlOp.setOutput( output );
181         
182         wsdlOp.setName( op.getName() );
183         wsdlOp.setInput( input );
184         
185         return wsdlOp;
186     }
187 }