wsdlflattener.java
来自「bpel执行引擎用来执行bpel业务流程」· Java 代码 · 共 264 行
JAVA
264 行
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.ode.jbi.util;import java.net.URI;import java.util.Collection;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import javax.wsdl.Definition;import javax.wsdl.Fault;import javax.wsdl.Import;import javax.wsdl.Input;import javax.wsdl.Message;import javax.wsdl.Operation;import javax.wsdl.Output;import javax.wsdl.Part;import javax.wsdl.PortType;import javax.wsdl.Types;import javax.wsdl.extensions.ExtensibilityElement;import javax.wsdl.extensions.schema.SchemaImport;import javax.wsdl.factory.WSDLFactory;import javax.xml.namespace.QName;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import com.ibm.wsdl.extensions.schema.SchemaImpl;public class WSDLFlattener { private static Log __log = LogFactory.getLog(WSDLFlattener.class); private Definition _definition; private SchemaCollection _schemas; private Map<QName, Definition> _flattened; private boolean _initialized; public WSDLFlattener(Definition definition) { this(definition, null); } public WSDLFlattener(Definition definition, SchemaCollection schemas) { if (definition == null) throw new NullPointerException("Null definition!"); this._definition = definition; this._flattened = new ConcurrentHashMap<QName, Definition>(); this._schemas = schemas; } /** * Parse the schemas referenced by the definition. * @throws Exception if an error occurs */ public void initialize() throws Exception { if (!_initialized) { if (_schemas == null) { this._schemas = new SchemaCollection(getUri(_definition.getDocumentBaseURI())); } parseSchemas(this._definition); _initialized = true; } } /** * Retrieve a flattened definition for a given port type name. * @param portType the port type to create a flat definition for * @return a flat definition for the port type * @throws Exception if an error occurs */ public Definition getDefinition(QName portType) throws Exception { Definition def = (Definition) _flattened.get(portType); if (def == null) { def = flattenDefinition(portType); _flattened.put(portType, def); } return def; } /** * @return Returns the definition. */ public Definition getDefinition() { return _definition; } /** * @param definition The definition to set. */ public void setDefinition(Definition definition) { this._definition = definition; } /** * @return Returns the schemas. */ public SchemaCollection getSchemas() throws Exception { return _schemas; } /** * @param schemas The schemas to set. */ public void setSchemas(SchemaCollection schemas) { this._schemas = schemas; } private Definition flattenDefinition(QName name) throws Exception { // Check that schemas have been loaded initialize(); // Create new definition Definition flat = WSDLFactory.newInstance().newDefinition(); flat.setTargetNamespace(name.getNamespaceURI()); addNamespaces(flat, _definition); // Create port type PortType defPort = _definition.getPortType(name); PortType flatPort = flat.createPortType(); flatPort.setQName(defPort.getQName()); flatPort.setUndefined(false); // Import all operations and related messages for (Iterator itOper = defPort.getOperations().iterator(); itOper.hasNext();) { Operation defOper = (Operation) itOper.next(); Operation flatOper = flat.createOperation(); flatOper.setName(defOper.getName()); flatOper.setStyle(defOper.getStyle()); flatOper.setUndefined(false); if (defOper.getInput() != null) { Input flatInput = flat.createInput(); flatInput.setName(defOper.getInput().getName()); if (defOper.getInput().getMessage() != null) { Message flatInputMsg = copyMessage(defOper.getInput().getMessage(), flat); flatInput.setMessage(flatInputMsg); flat.addMessage(flatInputMsg); } flatOper.setInput(flatInput); } if (defOper.getOutput() != null) { Output flatOutput = flat.createOutput(); flatOutput.setName(defOper.getOutput().getName()); if (defOper.getOutput().getMessage() != null) { Message flatOutputMsg = copyMessage(defOper.getOutput().getMessage(), flat); flatOutput.setMessage(flatOutputMsg); flat.addMessage(flatOutputMsg); } flatOper.setOutput(flatOutput); } for (Iterator itFault = defOper.getFaults().values().iterator(); itFault.hasNext();) { Fault defFault = (Fault) itFault.next(); Fault flatFault = flat.createFault(); flatFault.setName(defFault.getName()); if (defFault.getMessage() != null) { Message flatFaultMsg = copyMessage(defFault.getMessage(), flat); flatFault.setMessage(flatFaultMsg); flat.addMessage(flatFaultMsg); } flatOper.addFault(flatFault); } flatPort.addOperation(flatOper); } // Import schemas in definition if (_schemas.getSize() > 0) { Types types = flat.createTypes(); for (Iterator it = _schemas.getSchemas().iterator(); it.hasNext();) { javax.wsdl.extensions.schema.Schema imp = new SchemaImpl(); imp.setElement(((Schema)it.next()).getRoot()); imp.setElementType(new QName("http://www.w3.org/2001/XMLSchema", "schema")); types.addExtensibilityElement(imp); } flat.setTypes(types); } flat.addPortType(flatPort); return flat; } private void parseSchemas(Definition def) throws Exception { if (def.getTypes() != null && def.getTypes().getExtensibilityElements() != null) { for (Iterator iter = def.getTypes().getExtensibilityElements().iterator(); iter.hasNext();) { ExtensibilityElement element = (ExtensibilityElement) iter.next(); if (element instanceof javax.wsdl.extensions.schema.Schema) { javax.wsdl.extensions.schema.Schema schema = (javax.wsdl.extensions.schema.Schema) element; if (schema.getElement() != null) { _schemas.read(schema.getElement(), getUri(schema.getDocumentBaseURI())); } for (Iterator itImp = schema.getImports().values().iterator(); itImp.hasNext();) { Collection imps = (Collection) itImp.next(); for (Iterator itSi = imps.iterator(); itSi.hasNext();) { SchemaImport imp = (SchemaImport) itSi.next(); _schemas.read(imp.getSchemaLocationURI(), getUri(def.getDocumentBaseURI())); } } } } } if (def.getImports() != null) { for (Iterator itImp = def.getImports().values().iterator(); itImp.hasNext();) { Collection imps = (Collection) itImp.next(); for (Iterator iter = imps.iterator(); iter.hasNext();) { Import imp = (Import) iter.next(); parseSchemas(imp.getDefinition()); } } } } private void addNamespaces(Definition flat, Definition def) { for (Iterator itImport = def.getImports().values().iterator(); itImport.hasNext();) { List defImports = (List) itImport.next(); for (Iterator iter = defImports.iterator(); iter.hasNext();) { Import defImport = (Import) iter.next(); addNamespaces(flat, defImport.getDefinition()); } } for (Iterator itNs = def.getNamespaces().keySet().iterator(); itNs.hasNext();) { String key = (String) itNs.next(); String val = def.getNamespace(key); flat.addNamespace(key, val); } } private Message copyMessage(Message defMessage, Definition flat) { Message flatMsg = flat.createMessage(); flatMsg.setUndefined(false); if (defMessage.getQName() != null) { flatMsg.setQName(new QName(flat.getTargetNamespace(), defMessage.getQName().getLocalPart())); } for (Iterator itPart = defMessage.getParts().values().iterator(); itPart.hasNext();) { Part defPart = (Part) itPart.next(); Part flatPart = flat.createPart(); flatPart.setName(defPart.getName()); flatPart.setElementName(defPart.getElementName()); flatMsg.addPart(flatPart); } return flatMsg; } private URI getUri(String str) { if (str != null) { str = str.replaceAll(" ", "%20"); return URI.create(str); } return null; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?