View Javadoc

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