1 17 package org.apache.servicemix.common.tools.wsdl; 18 19 import java.net.URI ; 20 import java.util.Collection ; 21 import java.util.HashMap ; 22 import java.util.HashSet ; 23 import java.util.Iterator ; 24 import java.util.List ; 25 import java.util.Map ; 26 import java.util.Set ; 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 ; 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 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 (); 68 this.schemas = schemas; 69 } 70 71 75 public void initialize() throws Exception { 76 if (!initialized) { 77 if (schemas == null) { 78 URI 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 95 public Definition getDefinition(QName portType) throws Exception { 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 107 public Definition getDefinition() { 108 return definition; 109 } 110 111 114 public void setDefinition(Definition definition) { 115 this.definition = definition; 116 } 117 118 121 public SchemaCollection getSchemas() throws Exception { 122 return schemas; 123 } 124 125 128 public void setSchemas(SchemaCollection schemas) { 129 this.schemas = schemas; 130 } 131 132 private Definition flattenDefinition(QName name) throws Exception { 133 initialize(); 135 Definition flat = WSDLFactory.newInstance().newDefinition(); 137 flat.setTargetNamespace(name.getNamespaceURI()); 138 addNamespaces(flat, definition); 139 PortType defPort = definition.getPortType(name); 141 PortType flatPort = flat.createPortType(); 142 flatPort.setQName(defPort.getQName()); 143 flatPort.setUndefined(false); 144 for (Iterator 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 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 Set namespaces = new HashSet (); 186 for (Iterator itMsg = flat.getMessages().values().iterator(); itMsg.hasNext();) { 187 Message msg = (Message) itMsg.next(); 188 for (Iterator itPart = msg.getParts().values().iterator(); itPart.hasNext();) { 189 Part part = (Part) itPart.next(); 190 QName 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 iter = schema.getImports().iterator(); iter.hasNext();) { 196 String ns = (String ) iter.next(); 197 namespaces.add(ns); 198 } 199 } 200 } 201 } 202 } 203 if (namespaces.size() > 0) { 205 Types types = flat.createTypes(); 206 for (Iterator iter = namespaces.iterator(); iter.hasNext();) { 207 String ns = (String ) iter.next(); 208 javax.wsdl.extensions.schema.Schema imp = new SchemaImpl(); 209 imp.setElement(schemas.getSchema(ns).getRoot()); 210 imp.setElementType(new QName ("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 { 220 if (def.getTypes() != null && def.getTypes().getExtensibilityElements() != null) { 221 for (Iterator 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 itImp = schema.getImports().values().iterator(); itImp.hasNext();) { 226 Collection imps = (Collection ) itImp.next(); 227 for (Iterator itSi = imps.iterator(); itSi.hasNext();) { 228 SchemaImport imp = (SchemaImport) itSi.next(); 229 schemas.read(imp.getSchemaLocationURI(), new URI (def.getDocumentBaseURI())); 230 } 231 } 232 } 233 } 234 } 235 if (def.getImports() != null) { 236 for (Iterator itImp = def.getImports().values().iterator(); itImp.hasNext();) { 237 Collection imps = (Collection ) itImp.next(); 238 for (Iterator 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 itImport = def.getImports().values().iterator(); itImport.hasNext();) { 248 List defImports = (List ) itImport.next(); 249 for (Iterator iter = defImports.iterator(); iter.hasNext();) { 250 Import defImport = (Import) iter.next(); 251 addNamespaces(flat, defImport.getDefinition()); 252 } 253 } 254 for (Iterator itNs = def.getNamespaces().keySet().iterator(); itNs.hasNext();) { 255 String key = (String ) itNs.next(); 256 String 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 (flat.getTargetNamespace(), defMessage.getQName().getLocalPart())); 266 } 267 for (Iterator 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 |