001 /******************************************************************************
002 * Copyright (C) MActor Developers. All rights reserved. *
003 * ---------------------------------------------------------------------------*
004 * This file is part of MActor. *
005 * *
006 * MActor is free software; you can redistribute it and/or modify *
007 * it under the terms of the GNU General Public License as published by *
008 * the Free Software Foundation; either version 2 of the License, or *
009 * (at your option) any later version. *
010 * *
011 * MActor is distributed in the hope that it will be useful, *
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
014 * GNU General Public License for more details. *
015 * *
016 * You should have received a copy of the GNU General Public License *
017 * along with MActor; if not, write to the Free Software *
018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
019 ******************************************************************************/
020 package org.mactor.brokers.soap.wsdl;
021
022 import java.io.File;
023 import java.io.FileInputStream;
024 import java.net.URL;
025 import java.util.ArrayList;
026 import java.util.Iterator;
027 import java.util.LinkedList;
028 import java.util.List;
029 import java.util.Map;
030
031 import javax.wsdl.Binding;
032 import javax.wsdl.BindingInput;
033 import javax.wsdl.BindingOperation;
034 import javax.wsdl.BindingOutput;
035 import javax.wsdl.Definition;
036 import javax.wsdl.Input;
037 import javax.wsdl.Message;
038 import javax.wsdl.Operation;
039 import javax.wsdl.Output;
040 import javax.wsdl.Port;
041 import javax.wsdl.Service;
042 import javax.wsdl.extensions.ExtensibilityElement;
043 import javax.wsdl.extensions.soap.SOAPAddress;
044 import javax.wsdl.extensions.soap.SOAPBinding;
045 import javax.wsdl.extensions.soap.SOAPBody;
046 import javax.wsdl.extensions.soap.SOAPOperation;
047 import javax.wsdl.factory.WSDLFactory;
048 import javax.wsdl.xml.WSDLReader;
049 import javax.xml.namespace.QName;
050
051 import org.xml.sax.InputSource;
052
053 // This code is based on example provided by Jim Winfield at
054 // http://www2.sys-con.com/ITSG/virtualcd/WebServices/archives/0310/behera/index.htm
055 public class Wsdl {
056 /** The default SOAP encoding to use. */
057 public final static String DEFAULT_SOAP_ENCODING_STYLE = "http://schemas.xmlsoap.org/soap/encoding/";
058 List<OperationInfo> operations;
059 Definition def;
060 public Wsdl(URL url) throws Exception {
061 this(new InputSource(url.openStream()));
062 }
063 public Wsdl(File file) throws Exception {
064 this(new InputSource(new FileInputStream(file)));
065 }
066 private Wsdl(InputSource is) throws Exception {
067 WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
068 def = reader.readWSDL(null, is);
069 this.operations = getOperations(def);
070 }
071 private List<OperationInfo> getOperations(Definition def) {
072 List<OperationInfo> operations = new LinkedList<OperationInfo>();
073 Map services = def.getServices();
074 if (services != null) {
075 Iterator it = services.values().iterator();
076 for (int i = 0; it.hasNext(); i++) {
077 Service service = (Service) it.next();
078 QName qName = service.getQName();
079 String namespace = qName.getNamespaceURI();
080 Map ports = service.getPorts();
081 Iterator portIter = ports.values().iterator();
082 while (portIter.hasNext()) {
083 Port port = (Port) portIter.next();
084 Binding binding = port.getBinding();
085 Iterator operIter = getOperations(binding).iterator();
086 while (operIter.hasNext()) {
087 OperationInfo operation = (OperationInfo) operIter.next();
088 operation.setNamespaceURI(namespace);
089 operation.setPort(port.getName());
090 operation.setService(service.getQName().getLocalPart());
091 ExtensibilityElement addrElem = findExtensibilityElement(port.getExtensibilityElements(), "address");
092 if (addrElem != null && addrElem instanceof SOAPAddress) {
093 SOAPAddress soapAddr = (SOAPAddress) addrElem;
094 operation.setTargetURL(soapAddr.getLocationURI());
095 }
096 operations.add(operation);
097 }
098 }
099 }
100 }
101 return operations;
102 }
103 private List getOperations(Binding binding) {
104 List operationInfos = new ArrayList();
105 List operations = binding.getBindingOperations();
106 if (operations != null && !operations.isEmpty()) {
107 ExtensibilityElement soapBindingElem = findExtensibilityElement(binding.getExtensibilityElements(), "binding");
108 String style = "document"; // default
109 if (soapBindingElem != null && soapBindingElem instanceof SOAPBinding) {
110 SOAPBinding soapBinding = (SOAPBinding) soapBindingElem;
111 style = soapBinding.getStyle();
112 }
113 Iterator opIter = operations.iterator();
114 int i = 0;
115 while (opIter.hasNext()) {
116 BindingOperation oper = (BindingOperation) opIter.next();
117 ExtensibilityElement operElem = findExtensibilityElement(oper.getExtensibilityElements(), "operation");
118 if (operElem != null && operElem instanceof SOAPOperation) {
119 OperationInfo operationInfo = new OperationInfo(style);
120 buildOperation(operationInfo, oper);
121 // Add to the return list
122 operationInfos.add(operationInfo);
123 }
124 }
125 }
126 return operationInfos;
127 }
128 private OperationInfo buildOperation(OperationInfo operationInfo, BindingOperation bindingOper) {
129 Operation oper = bindingOper.getOperation();
130 operationInfo.setTargetMethodName(oper.getName());
131 ExtensibilityElement operElem = findExtensibilityElement(bindingOper.getExtensibilityElements(), "operation");
132 if (operElem != null && operElem instanceof SOAPOperation) {
133 SOAPOperation soapOperation = (SOAPOperation) operElem;
134 operationInfo.setSoapActionURI(soapOperation.getSoapActionURI());
135 }
136 BindingInput bindingInput = bindingOper.getBindingInput();
137 BindingOutput bindingOutput = bindingOper.getBindingOutput();
138 ExtensibilityElement bodyElem = findExtensibilityElement(bindingInput.getExtensibilityElements(), "body");
139 if (bodyElem != null && bodyElem instanceof SOAPBody) {
140 SOAPBody soapBody = (SOAPBody) bodyElem;
141 List styles = soapBody.getEncodingStyles();
142 String encodingStyle = null;
143 if (styles != null) {
144 encodingStyle = styles.get(0).toString();
145 }
146 if (encodingStyle == null) {
147 encodingStyle = DEFAULT_SOAP_ENCODING_STYLE;
148 }
149 operationInfo.setEncodingStyle(encodingStyle.toString());
150 operationInfo.setTargetObjectURI(soapBody.getNamespaceURI());
151 }
152 Input inDef = oper.getInput();
153 if (inDef != null) {
154 Message inMsg = inDef.getMessage();
155 if (inMsg != null) {
156 operationInfo.setInputMessageName(inMsg.getQName().getLocalPart());
157 // Set the body of the operation's input message
158 // TODO:operationInfo.setInputMessageText(buildMessageText(operationInfo,
159 // inMsg));
160 }
161 }
162 Output outDef = oper.getOutput();
163 if (outDef != null) {
164 Message outMsg = outDef.getMessage();
165 if (outMsg != null) {
166 operationInfo.setOutputMessageName(outMsg.getQName().getLocalPart());
167 // Set the body of the operation's output message
168 // TODO:operationInfo.setOutputMessageText(buildMessageText(operationInfo,
169 // outMsg));
170 }
171 }
172 return operationInfo;
173 }
174 private ExtensibilityElement findExtensibilityElement(List extensibilityElements, String elementType) {
175 if (extensibilityElements != null) {
176 Iterator iter = extensibilityElements.iterator();
177 while (iter.hasNext()) {
178 ExtensibilityElement element = (ExtensibilityElement) iter.next();
179 if (element.getElementType().getLocalPart().equalsIgnoreCase(elementType)) {
180 return element;
181 }
182 }
183 }
184 return null;
185 }
186 public static class OperationInfo {
187 private String operationType = "";
188 private String encodingStyle = "";
189 private String targetURL = "";
190 private String namespaceURI = "";
191 private String targetObjectURI = "";
192 private String targetMethodName = "";
193 private String inputMessageText = "";
194 private String outputMessageText = "";
195 private String inputMessageName = "";
196 private String outputMessageName = "";
197 private String soapActionURI = "";
198 private String style = "document";
199 private String port;
200 private String service;
201 public OperationInfo(String style) {
202 super();
203 setStyle(style);
204 }
205 public void setEncodingStyle(String value) {
206 encodingStyle = value;
207 }
208 public String getEncodingStyle() {
209 return encodingStyle;
210 }
211 public void setTargetURL(String value) {
212 targetURL = value;
213 }
214 public String getTargetURL() {
215 return targetURL;
216 }
217 public void setNamespaceURI(String value) {
218 namespaceURI = value;
219 }
220 public String getNamespaceURI() {
221 return namespaceURI;
222 }
223 public void setTargetObjectURI(String value) {
224 targetObjectURI = value;
225 }
226 public String getTargetObjectURI() {
227 return targetObjectURI;
228 }
229 public void setTargetMethodName(String value) {
230 targetMethodName = value;
231 }
232 public String getTargetMethodName() {
233 return targetMethodName;
234 }
235 public void setInputMessageName(String value) {
236 inputMessageName = value;
237 }
238 public String getInputMessageName() {
239 return inputMessageName;
240 }
241 public void setOutputMessageName(String value) {
242 outputMessageName = value;
243 }
244 public String getOutputMessageName() {
245 return outputMessageName;
246 }
247 public void setInputMessageText(String value) {
248 inputMessageText = value;
249 }
250 public String getInputMessageText() {
251 return inputMessageText;
252 }
253 public void setOutputMessageText(String value) {
254 outputMessageText = value;
255 }
256 public String getOutputMessageText() {
257 return outputMessageText;
258 }
259 public void setSoapActionURI(String value) {
260 soapActionURI = value;
261 }
262 public String getSoapActionURI() {
263 return soapActionURI;
264 }
265 public void setStyle(String value) {
266 style = value;
267 }
268 public String getStyle() {
269 return style;
270 }
271 public String toString() {
272 return getTargetMethodName();
273 }
274 public String getOperationType() {
275 return operationType;
276 }
277 public void setOperationType(String operationType) {
278 this.operationType = operationType;
279 }
280 public String getPort() {
281 return port;
282 }
283 public void setPort(String port) {
284 this.port = port;
285 }
286 public String getService() {
287 return service;
288 }
289 public void setService(String service) {
290 this.service = service;
291 }
292 }
293 public List<OperationInfo> getOperations() {
294 return operations;
295 }
296 }