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
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
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
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
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 }