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