KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > servicemix > common > tools > wsdl > WSDLFlattener


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */

17 package org.apache.servicemix.common.tools.wsdl;
18
19 import java.net.URI JavaDoc;
20 import java.util.Collection JavaDoc;
21 import java.util.HashMap JavaDoc;
22 import java.util.HashSet JavaDoc;
23 import java.util.Iterator JavaDoc;
24 import java.util.List JavaDoc;
25 import java.util.Map JavaDoc;
26 import java.util.Set JavaDoc;
27
28 import javax.wsdl.Definition;
29 import javax.wsdl.Fault;
30 import javax.wsdl.Import;
31 import javax.wsdl.Input;
32 import javax.wsdl.Message;
33 import javax.wsdl.Operation;
34 import javax.wsdl.Output;
35 import javax.wsdl.Part;
36 import javax.wsdl.PortType;
37 import javax.wsdl.Types;
38 import javax.wsdl.extensions.ExtensibilityElement;
39 import javax.wsdl.extensions.schema.SchemaImport;
40 import javax.wsdl.factory.WSDLFactory;
41 import javax.xml.namespace.QName JavaDoc;
42
43 import org.apache.commons.logging.Log;
44 import org.apache.commons.logging.LogFactory;
45
46 import com.ibm.wsdl.extensions.schema.SchemaImpl;
47
48 public class WSDLFlattener {
49
50     private static Log log = LogFactory.getLog(WSDLFlattener.class);
51     
52     private Definition definition;
53     private SchemaCollection schemas;
54     private Map JavaDoc flattened;
55     private boolean initialized;
56     
57     public WSDLFlattener() {
58         this(null, null);
59     }
60         
61     public WSDLFlattener(Definition definition) {
62         this(definition, null);
63     }
64         
65     public WSDLFlattener(Definition definition, SchemaCollection schemas) {
66         this.definition = definition;
67         this.flattened = new HashMap JavaDoc();
68         this.schemas = schemas;
69     }
70     
71     /**
72      * Parse the schemas referenced by the definition.
73      * @throws Exception if an error occurs
74      */

75     public void initialize() throws Exception JavaDoc {
76         if (!initialized) {
77             if (schemas == null) {
78                 URI JavaDoc uri = null;
79                 if (this.definition.getDocumentBaseURI() != null) {
80                     uri = URI.create(this.definition.getDocumentBaseURI());
81                 }
82                 this.schemas = new SchemaCollection(uri);
83             }
84             parseSchemas(this.definition);
85             initialized = true;
86         }
87     }
88     
89     /**
90      * Retrieve a flattened definition for a given port type name.
91      * @param portType the port type to create a flat definition for
92      * @return a flat definition for the port type
93      * @throws Exception if an error occurs
94      */

95     public Definition getDefinition(QName JavaDoc portType) throws Exception JavaDoc {
96         Definition def = (Definition) flattened.get(portType);
97         if (def == null) {
98             def = flattenDefinition(portType);
99             flattened.put(portType, def);
100         }
101         return def;
102     }
103
104     /**
105      * @return Returns the definition.
106      */

107     public Definition getDefinition() {
108         return definition;
109     }
110
111     /**
112      * @param definition The definition to set.
113      */

114     public void setDefinition(Definition definition) {
115         this.definition = definition;
116     }
117
118     /**
119      * @return Returns the schemas.
120      */

121     public SchemaCollection getSchemas() throws Exception JavaDoc {
122         return schemas;
123     }
124
125     /**
126      * @param schemas The schemas to set.
127      */

128     public void setSchemas(SchemaCollection schemas) {
129         this.schemas = schemas;
130     }
131     
132     private Definition flattenDefinition(QName JavaDoc name) throws Exception JavaDoc {
133         // Check that schemas have been loaded
134
initialize();
135         // Create new definition
136
Definition flat = WSDLFactory.newInstance().newDefinition();
137         flat.setTargetNamespace(name.getNamespaceURI());
138         addNamespaces(flat, definition);
139         // Create port type
140
PortType defPort = definition.getPortType(name);
141         PortType flatPort = flat.createPortType();
142         flatPort.setQName(defPort.getQName());
143         flatPort.setUndefined(false);
144         // Import all operations and related messages
145
for (Iterator JavaDoc itOper = defPort.getOperations().iterator(); itOper.hasNext();) {
146             Operation defOper = (Operation) itOper.next();
147             Operation flatOper = flat.createOperation();
148             flatOper.setName(defOper.getName());
149             flatOper.setStyle(defOper.getStyle());
150             flatOper.setUndefined(false);
151             if (defOper.getInput() != null) {
152                 Input flatInput = flat.createInput();
153                 flatInput.setName(defOper.getInput().getName());
154                 if (defOper.getInput().getMessage() != null) {
155                     Message flatInputMsg = copyMessage(defOper.getInput().getMessage(), flat);
156                     flatInput.setMessage(flatInputMsg);
157                     flat.addMessage(flatInputMsg);
158                 }
159                 flatOper.setInput(flatInput);
160             }
161             if (defOper.getOutput() != null) {
162                 Output flatOutput = flat.createOutput();
163                 flatOutput.setName(defOper.getOutput().getName());
164                 if (defOper.getOutput().getMessage() != null) {
165                     Message flatOutputMsg = copyMessage(defOper.getOutput().getMessage(), flat);
166                     flatOutput.setMessage(flatOutputMsg);
167                     flat.addMessage(flatOutputMsg);
168                 }
169                 flatOper.setOutput(flatOutput);
170             }
171             for (Iterator JavaDoc itFault = defOper.getFaults().values().iterator(); itFault.hasNext();) {
172                 Fault defFault = (Fault) itFault.next();
173                 Fault flatFault = flat.createFault();
174                 flatFault.setName(defFault.getName());
175                 if (defFault.getMessage() != null) {
176                     Message flatFaultMsg = copyMessage(defFault.getMessage(), flat);
177                     flatFault.setMessage(flatFaultMsg);
178                     flat.addMessage(flatFaultMsg);
179                 }
180                 flatOper.addFault(flatFault);
181             }
182             flatPort.addOperation(flatOper);
183         }
184         // Get all needed direct schemas
185
Set JavaDoc namespaces = new HashSet JavaDoc();
186         for (Iterator JavaDoc itMsg = flat.getMessages().values().iterator(); itMsg.hasNext();) {
187             Message msg = (Message) itMsg.next();
188             for (Iterator JavaDoc itPart = msg.getParts().values().iterator(); itPart.hasNext();) {
189                 Part part = (Part) itPart.next();
190                 QName JavaDoc elemName = part.getElementName();
191                 if (elemName != null) {
192                     namespaces.add(elemName.getNamespaceURI());
193                     Schema schema = schemas.getSchema(elemName.getNamespaceURI());
194                     if (schema.getImports() != null) {
195                         for (Iterator JavaDoc iter = schema.getImports().iterator(); iter.hasNext();) {
196                             String JavaDoc ns = (String JavaDoc) iter.next();
197                             namespaces.add(ns);
198                         }
199                     }
200                 }
201             }
202         }
203         // Import schemas in definition
204
if (namespaces.size() > 0) {
205             Types types = flat.createTypes();
206             for (Iterator JavaDoc iter = namespaces.iterator(); iter.hasNext();) {
207                 String JavaDoc ns = (String JavaDoc) iter.next();
208                 javax.wsdl.extensions.schema.Schema imp = new SchemaImpl();
209                 imp.setElement(schemas.getSchema(ns).getRoot());
210                 imp.setElementType(new QName JavaDoc("http://www.w3.org/2001/XMLSchema", "schema"));
211                 types.addExtensibilityElement(imp);
212             }
213             flat.setTypes(types);
214         }
215         flat.addPortType(flatPort);
216         return flat;
217     }
218     
219     private void parseSchemas(Definition def) throws Exception JavaDoc {
220         if (def.getTypes() != null && def.getTypes().getExtensibilityElements() != null) {
221             for (Iterator JavaDoc iter = def.getTypes().getExtensibilityElements().iterator(); iter.hasNext();) {
222                 ExtensibilityElement element = (ExtensibilityElement) iter.next();
223                 if (element instanceof javax.wsdl.extensions.schema.Schema) {
224                     javax.wsdl.extensions.schema.Schema schema = (javax.wsdl.extensions.schema.Schema) element;
225                     for (Iterator JavaDoc itImp = schema.getImports().values().iterator(); itImp.hasNext();) {
226                         Collection JavaDoc imps = (Collection JavaDoc) itImp.next();
227                         for (Iterator JavaDoc itSi = imps.iterator(); itSi.hasNext();) {
228                             SchemaImport imp = (SchemaImport) itSi.next();
229                             schemas.read(imp.getSchemaLocationURI(), new URI JavaDoc(def.getDocumentBaseURI()));
230                         }
231                     }
232                 }
233             }
234         }
235         if (def.getImports() != null) {
236             for (Iterator JavaDoc itImp = def.getImports().values().iterator(); itImp.hasNext();) {
237                 Collection JavaDoc imps = (Collection JavaDoc) itImp.next();
238                 for (Iterator JavaDoc iter = imps.iterator(); iter.hasNext();) {
239                     Import imp = (Import) iter.next();
240                     parseSchemas(imp.getDefinition());
241                 }
242             }
243         }
244     }
245
246     private void addNamespaces(Definition flat, Definition def) {
247         for (Iterator JavaDoc itImport = def.getImports().values().iterator(); itImport.hasNext();) {
248             List JavaDoc defImports = (List JavaDoc) itImport.next();
249             for (Iterator JavaDoc iter = defImports.iterator(); iter.hasNext();) {
250                 Import defImport = (Import) iter.next();
251                 addNamespaces(flat, defImport.getDefinition());
252             }
253         }
254         for (Iterator JavaDoc itNs = def.getNamespaces().keySet().iterator(); itNs.hasNext();) {
255             String JavaDoc key = (String JavaDoc) itNs.next();
256             String JavaDoc val = def.getNamespace(key);
257             flat.addNamespace(key, val);
258         }
259     }
260     
261     private Message copyMessage(Message defMessage, Definition flat) {
262         Message flatMsg = flat.createMessage();
263         flatMsg.setUndefined(false);
264         if (defMessage.getQName() != null) {
265             flatMsg.setQName(new QName JavaDoc(flat.getTargetNamespace(), defMessage.getQName().getLocalPart()));
266         }
267         for (Iterator JavaDoc itPart = defMessage.getParts().values().iterator(); itPart.hasNext();) {
268             Part defPart = (Part) itPart.next();
269             Part flatPart = flat.createPart();
270             flatPart.setName(defPart.getName());
271             flatPart.setElementName(defPart.getElementName());
272             flatMsg.addPart(flatPart);
273         }
274         return flatMsg;
275     }
276
277 }
278
Popular Tags