diff options
Diffstat (limited to 'branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main')
6 files changed, 0 insertions, 2462 deletions
diff --git a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java b/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java deleted file mode 100644 index 6bfd00220e..0000000000 --- a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * 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.tuscany.sca.binding.ws.wsdlgen; - -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.wsdl.Definition; -import javax.wsdl.PortType; -import javax.wsdl.WSDLException; -import javax.wsdl.xml.WSDLWriter; -import javax.xml.namespace.QName; - -import org.apache.tuscany.sca.assembly.AbstractContract; -import org.apache.tuscany.sca.assembly.Component; -import org.apache.tuscany.sca.assembly.Contract; -import org.apache.tuscany.sca.assembly.builder.BindingBuilderExtension; -import org.apache.tuscany.sca.binding.ws.WebServiceBinding; -import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; -import org.apache.tuscany.sca.contribution.resolver.ModelResolver; -import org.apache.tuscany.sca.contribution.resolver.ResolverExtension; -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint; -import org.apache.tuscany.sca.interfacedef.InterfaceContract; -import org.apache.tuscany.sca.interfacedef.Operation; -import org.apache.tuscany.sca.interfacedef.java.JavaInterface; -import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract; -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory; -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract; -import org.apache.tuscany.sca.interfacedef.wsdl.impl.InvalidWSDLException; -import org.apache.tuscany.sca.interfacedef.wsdl.impl.WSDLInterfaceIntrospectorImpl; -import org.apache.tuscany.sca.monitor.Monitor; -import org.apache.tuscany.sca.monitor.Problem; -import org.apache.tuscany.sca.monitor.Problem.Severity; -import org.apache.tuscany.sca.monitor.impl.ProblemImpl; -import org.apache.tuscany.sca.policy.Intent; -import org.apache.tuscany.sca.policy.IntentAttachPoint; -import org.apache.tuscany.sca.xsd.XSDFactory; - -/** - * @version $Rev$ $Date$ - */ -public class BindingWSDLGenerator { - private static final Logger logger = Logger.getLogger(BindingWSDLGenerator.class.getName()); - private static final QName SOAP12_INTENT = new QName("http://www.osoa.org/xmlns/sca/1.0", "SOAP.1_2"); - - public static boolean printWSDL; // external code sets this to print generated WSDL - - private BindingWSDLGenerator() { - // this class has static methods only and cannot be instantiated - } - - /** - * Log a warning message. - * @param problem - */ - private static void logWarning(Problem problem) { - Logger problemLogger = Logger.getLogger(problem.getSourceClassName(), problem.getBundleName()); - if (problemLogger != null){ - problemLogger.logp(Level.WARNING, problem.getSourceClassName(), null, problem.getMessageId(), problem.getMessageParams()); - } else { - logger.severe("Can't get logger " + problem.getSourceClassName()+ " with bundle " + problem.getBundleName()); - } - } - - /** - * Report a warning. - * @param message - * @param binding - * @param parameters - */ - private static void warning(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) { - Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.WARNING, wsBinding, message, (Object[])messageParameters); - if (monitor != null) { - monitor.problem(problem); - } else { - logWarning(problem); - } - } - - /** - * Report an error. - * @param message - * @param binding - * @param parameters - */ - private static void error(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) { - Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR, wsBinding, message, (Object[])messageParameters); - if (monitor != null) { - monitor.problem(problem); - } else { - throw new WSDLGenerationException(problem.toString(), null, problem); - } - } - - /** - * Report an exception error. - * @param message - * @param binding - * @param exception - */ - private static void error(Monitor monitor, String message, WebServiceBinding wsBinding, Exception ex) { - Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR, wsBinding, message, ex); - if (monitor != null) { - monitor.problem(problem); - } else { - throw new WSDLGenerationException(problem.toString(), ex, problem); - } - } - - /** - * Report a fatal error. - * @param message - * @param binding - * @param exception - */ - private static void fatal(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) { - Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR,wsBinding, message, (Object[])messageParameters); - throw new WSDLGenerationException(problem.toString(), null, problem); - } - - /** - * Report a fatal exception error. - * @param message - * @param binding - * @param exception - */ - private static void fatal(Monitor monitor, String message, WebServiceBinding wsBinding, Exception ex) { - Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR, wsBinding, message, ex); - throw new WSDLGenerationException(problem.toString(), ex, problem); - } - - /** - * This method can be called from the binding builder or from the runtime. - * Report problems and exceptions in the most appropriate way for both - * of these cases. - */ - public static void generateWSDL(Component component, - AbstractContract contract, - WebServiceBinding wsBinding, - ExtensionPointRegistry extensionPoints, - Monitor monitor) { - try { - createWSDLDocument(component, contract, wsBinding, extensionPoints, monitor); - } catch (WSDLGenerationException ex) { - if (ex.getProblem() != null) { - warning(monitor, "WsdlGenProblem", wsBinding, component.getName(), contract.getName()); - if (monitor != null) { - monitor.problem(ex.getProblem()); - } else { - throw ex; - } - } else if (ex.getCause() instanceof Exception) { - warning(monitor, "WsdlGenException", wsBinding, component.getName(), contract.getName()); - error(monitor, "UnexpectedException", wsBinding, (Exception)ex.getCause()); - } else { // should never happen - throw new IllegalStateException(ex); - } - } catch (RuntimeException ex) { - warning(monitor, "WsdlGenException", wsBinding, component.getName(), contract.getName()); - error(monitor, "UnexpectedException", wsBinding, ex); - } - } - - private static void createWSDLDocument(Component component, - AbstractContract contract, - WebServiceBinding wsBinding, - ExtensionPointRegistry extensionPoints, - Monitor monitor) { - ModelFactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class); - DataBindingExtensionPoint dataBindings = extensionPoints.getExtensionPoint(DataBindingExtensionPoint.class); - WSDLFactory wsdlFactory = modelFactories.getFactory(WSDLFactory.class); - XSDFactory xsdFactory = modelFactories.getFactory(XSDFactory.class); - - if (((Contract)contract).getInterfaceContract(wsBinding) == null) { - // can happen if incorrect component service name - fatal(monitor, "MissingInterfaceContract", wsBinding, component.getName(), contract.getName()); - } - - InterfaceContract icontract = wsBinding.getBindingInterfaceContract(); - if (icontract == null) { - icontract = ((Contract)contract).getInterfaceContract(wsBinding).makeUnidirectional(false); - if (icontract instanceof JavaInterfaceContract) { - ModelResolver resolver = component instanceof ResolverExtension ? - ((ResolverExtension)component).getModelResolver() : null; - icontract = createWSDLInterfaceContract( - (JavaInterfaceContract)icontract, - requiresSOAP12(wsBinding), - resolver, - dataBindings, - wsdlFactory, - xsdFactory, - monitor); - } else { - try { - //TUSCANY-2316 Cloning the Interface Contract to avoid overriding data binding information - icontract = (InterfaceContract)icontract.clone(); - } catch (Exception e) { - //ignore - } - } - wsBinding.setBindingInterfaceContract(icontract); - } - - // TODO - fix up the conversational flag and operation sequences in case the contract has come from WSDL - // as we don't yet support requires="conversational" or sca:endConversation annotations - // in WSDL interface descriptions (see section 1.5.4 of the Assembly Specification V1.0) - if (contract.getInterfaceContract().getInterface() != null ) { - icontract.getInterface().setConversational(contract.getInterfaceContract().getInterface().isConversational()); - - for (Operation operation : icontract.getInterface().getOperations()){ - Operation serviceOperation = null; - - for (Operation tmpOp : contract.getInterfaceContract().getInterface().getOperations()){ - if (operation.getName().equals(tmpOp.getName())) { - serviceOperation = tmpOp; - break; - } - } - - if (serviceOperation != null ){ - operation.setConversationSequence(serviceOperation.getConversationSequence()); - } - } - } - - /* - // Look at all the Web Service bindings of the SCA service to see if any - // of them have an existing generated WSDL definitions document. If found, - // use it for this binding as well. If not found, generate a new document. - Definition definition = null; - for (Binding binding : contract.getBindings()) { - if (binding instanceof WebServiceBinding) { - definition = ((WebServiceBinding)binding).getWSDLDocument(); - if (definition != null) { - wsBinding.setWSDLDocument(definition); - break; - } - } - } - */ - // The above code is currently not used. Instead, we only look - // for a WSDL definitions document in this binding and don't - // attempt to share the same document across multiple bindings. - - // generate a WSDL definitions document if needed - Definition definition = wsBinding.getWSDLDocument(); - if (definition == null) { - definition = WSDLServiceGenerator.configureWSDLDefinition(wsBinding, component, contract, monitor); - wsBinding.setWSDLDocument(definition); - } - } - - protected static boolean requiresSOAP12(WebServiceBinding wsBinding) { - if (wsBinding instanceof IntentAttachPoint) { - List<Intent> intents = ((IntentAttachPoint)wsBinding).getRequiredIntents(); - for (Intent intent : intents) { - if (SOAP12_INTENT.equals(intent.getName())) { - return true; - } - } - } - return false; - } - - /** - * Create a WSDLInterfaceContract from a JavaInterfaceContract - */ - protected static WSDLInterfaceContract createWSDLInterfaceContract(JavaInterfaceContract contract, - boolean requiresSOAP12, - ModelResolver resolver, - DataBindingExtensionPoint dataBindings, - WSDLFactory wsdlFactory, - XSDFactory xsdFactory, - Monitor monitor) { - - WSDLInterfaceContract wsdlContract = wsdlFactory.createWSDLInterfaceContract(); - WSDLInterface wsdlInterface = wsdlFactory.createWSDLInterface(); - wsdlContract.setInterface(wsdlInterface); - - WSDLDefinition wsdlDefinition = wsdlFactory.createWSDLDefinition(); - JavaInterface iface = (JavaInterface)contract.getInterface(); - - Definition def = null; - try { - Interface2WSDLGenerator wsdlGenerator = - new Interface2WSDLGenerator(requiresSOAP12, resolver, dataBindings, xsdFactory, monitor); - def = wsdlGenerator.generate(iface, wsdlDefinition); - } catch (WSDLException e) { - throw new WSDLGenerationException(e); - } - - // for debugging - if (printWSDL) { - try { - System.out.println("Generated WSDL for Java interface " + iface.getName() + " class " + iface.getJavaClass().getName()); - WSDLWriter writer = javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter(); - writer.writeWSDL(def, System.out); - } catch (WSDLException e) { - throw new WSDLGenerationException(e); - } - } - - wsdlDefinition.setDefinition(def); - wsdlInterface.setWsdlDefinition(wsdlDefinition); - wsdlInterface.setRemotable(true); - wsdlInterface.setConversational(contract.getInterface().isConversational()); - wsdlInterface.setUnresolved(false); - wsdlInterface.setRemotable(true); - PortType portType = (PortType)def.getAllPortTypes().values().iterator().next(); - wsdlInterface.setPortType(portType); - - try { - for (Operation op : iface.getOperations()) { - javax.wsdl.Operation wsdlOp = portType.getOperation(op.getName(), null, null); - wsdlInterface.getOperations().add(WSDLInterfaceIntrospectorImpl.getOperation( - wsdlOp, wsdlDefinition, resolver, xsdFactory)); - } - } catch (InvalidWSDLException e) { - throw new WSDLGenerationException(e); - } - - return wsdlContract; - } - -} diff --git a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java b/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java deleted file mode 100644 index bfa882ebf7..0000000000 --- a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java +++ /dev/null @@ -1,1174 +0,0 @@ -/* - * 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.tuscany.sca.binding.ws.wsdlgen; - -import java.lang.reflect.Method; -import java.net.URI; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.wsdl.Binding; -import javax.wsdl.BindingOperation; -import javax.wsdl.Definition; -import javax.wsdl.Fault; -import javax.wsdl.Input; -import javax.wsdl.Message; -import javax.wsdl.OperationType; -import javax.wsdl.Output; -import javax.wsdl.Part; -import javax.wsdl.PortType; -import javax.wsdl.Types; -import javax.wsdl.WSDLException; -import javax.wsdl.extensions.schema.Schema; -import javax.wsdl.factory.WSDLFactory; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.namespace.QName; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.apache.tuscany.sca.contribution.resolver.ModelResolver; -import org.apache.tuscany.sca.databinding.DataBinding; -import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint; -import org.apache.tuscany.sca.databinding.XMLTypeHelper; -import org.apache.tuscany.sca.databinding.jaxb.JAXBDataBinding; -import org.apache.tuscany.sca.interfacedef.DataType; -import org.apache.tuscany.sca.interfacedef.Interface; -import org.apache.tuscany.sca.interfacedef.Operation; -import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl; -import org.apache.tuscany.sca.interfacedef.java.JavaInterface; -import org.apache.tuscany.sca.interfacedef.java.JavaOperation; -import org.apache.tuscany.sca.interfacedef.util.ElementInfo; -import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper; -import org.apache.tuscany.sca.interfacedef.util.TypeInfo; -import org.apache.tuscany.sca.interfacedef.util.WrapperInfo; -import org.apache.tuscany.sca.interfacedef.util.XMLType; -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; -import org.apache.tuscany.sca.monitor.Monitor; -import org.apache.tuscany.sca.monitor.Problem; -import org.apache.tuscany.sca.monitor.Problem.Severity; -import org.apache.tuscany.sca.monitor.impl.ProblemImpl; -import org.apache.tuscany.sca.xsd.XSDFactory; -import org.apache.tuscany.sca.xsd.XSDefinition; -import org.apache.tuscany.sca.xsd.impl.XSDefinitionImpl; -import org.apache.ws.commons.schema.XmlSchema; -import org.apache.ws.commons.schema.XmlSchemaCollection; -import org.apache.ws.commons.schema.XmlSchemaElement; -import org.apache.ws.commons.schema.XmlSchemaException; -import org.apache.ws.commons.schema.utils.NamespaceMap; -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -/** - * @version $Rev: 670103 $ $Date: 2008-06-21 01:35:00 +0100 (Sat, 21 Jun 2008) $ - */ -public class Interface2WSDLGenerator { - private static final Logger logger = Logger.getLogger(Interface2WSDLGenerator.class.getName()); - private static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema"; - private static final String SCHEMA_NAME = "schema"; - private static final QName SCHEMA_QNAME = new QName(SCHEMA_NS, SCHEMA_NAME); - private static final String XMLNS_NS = "http://www.w3.org/2000/xmlns/"; - - private static final String ANYTYPE_NAME = "anyType"; - private static final QName ANYTYPE_QNAME = new QName(SCHEMA_NS, ANYTYPE_NAME); - - - private WSDLFactory factory; - private DataBindingExtensionPoint dataBindings; - private WSDLDefinitionGenerator definitionGenerator; - private boolean requiresSOAP12; - private ModelResolver resolver; - private XSDFactory xsdFactory; - private Monitor monitor; - - public Interface2WSDLGenerator(boolean requiresSOAP12, - ModelResolver resolver, - DataBindingExtensionPoint dataBindings, - XSDFactory xsdFactory, - Monitor monitor) throws WSDLException { - super(); - this.requiresSOAP12 = requiresSOAP12; - this.resolver = resolver; - definitionGenerator = new WSDLDefinitionGenerator(requiresSOAP12, false); - this.dataBindings = dataBindings; - this.xsdFactory = xsdFactory; - this.monitor = monitor; - this.factory = WSDLFactory.newInstance(); - } - - /** - * Log a warning message. - * @param problem - */ - private static void logWarning(Problem problem) { - Logger problemLogger = Logger.getLogger(problem.getSourceClassName(), problem.getBundleName()); - if (problemLogger != null){ - problemLogger.logp(Level.WARNING, problem.getSourceClassName(), null, problem.getMessageId(), problem.getMessageParams()); - } else { - logger.severe("Can't get logger " + problem.getSourceClassName()+ " with bundle " + problem.getBundleName()); - } - } - - /** - * Report a warning. - * @param message - * @param binding - * @param parameters - */ - private void warning(String message, Interface interfaze, String... messageParameters) { - Problem problem = new ProblemImpl(this.getClass().getName(), "wsdlgen-validation-messages", Severity.WARNING, interfaze, message, (Object[])messageParameters); - if (monitor != null) { - monitor.problem(problem); - } else { - logWarning(problem); - } - } - - /** - * Report a fatal error. - * @param message - * @param binding - * @param parameters - */ - private void fatal(String message, Interface interfaze, String... messageParameters) { - Problem problem = new ProblemImpl(this.getClass().getName(), "wsdlgen-validation-messages", Severity.ERROR, interfaze, message, (Object[])messageParameters); - throw new WSDLGenerationException(problem.toString(), null, problem); - } - - private XMLTypeHelper getTypeHelper(DataType type, Map<String, XMLTypeHelper> helpers) { - if (type == null) { - return null; - } - String db = type.getDataBinding(); - if (db == null) { - return null; - } - if ("java:array".equals(db)) { - DataType dt = (DataType)type.getLogical(); - db = dt.getDataBinding(); - } - return helpers.get(db); - } - - private boolean inputTypesCompatible(DataType wrapperType, DataType<List<DataType>> inputType, Map<String, XMLTypeHelper> helpers) { - XMLTypeHelper wrapperHelper = getTypeHelper(wrapperType, helpers); - for (DataType dt : inputType.getLogical()) { - if (getTypeHelper(dt, helpers) != wrapperHelper) { - return false; - } - } - return true; - } - - private boolean outputTypeCompatible(DataType wrapperType, DataType outputType, Map<String, XMLTypeHelper> helpers) { - if (getTypeHelper(outputType, helpers) != getTypeHelper(wrapperType, helpers)) { - return false; - } else { - return true; - } - } - - private void addDataType(Map<XMLTypeHelper, List<DataType>> map, DataType type, Map<String, XMLTypeHelper> helpers) { - if (type == null) { - return; - } - String db = type.getDataBinding(); - if (db == null) { - return; - } - if ("java:array".equals(db)) { - DataType dt = (DataType)type.getLogical(); - db = dt.getDataBinding(); - } - XMLTypeHelper helper = helpers.get(db); - List<DataType> types = map.get(helper); - if (types == null) { - types = new ArrayList<DataType>(); - map.put(helper, types); - } - types.add(type); - } - - private Map<XMLTypeHelper, List<DataType>> getDataTypes(Interface intf, boolean useWrapper, Map<String, XMLTypeHelper> helpers) { - Map<XMLTypeHelper, List<DataType>> dataTypes = new HashMap<XMLTypeHelper, List<DataType>>(); - for (Operation op : intf.getOperations()) { - WrapperInfo inputWrapper = op.getInputWrapper(); - DataType dt1 = null; - boolean useInputWrapper = useWrapper & inputWrapper != null; - if (useInputWrapper) { - dt1 = inputWrapper.getWrapperType(); - useInputWrapper &= inputTypesCompatible(dt1, op.getInputType(), helpers); - } - if (useInputWrapper) { - addDataType(dataTypes, dt1, helpers); - } else { - for (DataType dt : op.getInputType().getLogical()) { - addDataType(dataTypes, dt, helpers); - } - } - - DataType dt2 = null; - WrapperInfo outputWrapper = op.getOutputWrapper(); - boolean useOutputWrapper = useWrapper & outputWrapper != null; - if (useOutputWrapper) { - dt2 = outputWrapper.getWrapperType(); - useOutputWrapper &= outputTypeCompatible(dt2, op.getOutputType(), helpers); - } - if (useOutputWrapper) { - addDataType(dataTypes, dt2, helpers); - } else { - dt2 = op.getOutputType(); - addDataType(dataTypes, dt2, helpers); - } - - for (DataType<DataType> dt3 : op.getFaultTypes()) { - DataType dt4 = dt3.getLogical(); - addDataType(dataTypes, dt4, helpers); - } - } - // Adding classes referenced by @XmlSeeAlso in the java interface - if (intf instanceof JavaInterface) { - JavaInterface javaInterface = (JavaInterface)intf; - Class<?>[] seeAlso = getSeeAlso(javaInterface.getJavaClass()); - if (seeAlso != null) { - for (Class<?> cls : seeAlso) { - DataType dt = new DataTypeImpl<XMLType>(JAXBDataBinding.NAME, cls, XMLType.UNKNOWN); - addDataType(dataTypes, dt, helpers); - } - } - seeAlso = getSeeAlso(javaInterface.getCallbackClass()); - if (seeAlso != null) { - for (Class<?> cls : seeAlso) { - DataType dt = new DataTypeImpl<XMLType>(JAXBDataBinding.NAME, cls, XMLType.UNKNOWN); - addDataType(dataTypes, dt, helpers); - } - } - } - return dataTypes; - } - - private static Class<?>[] getSeeAlso(Class<?> interfaze) { - if (interfaze == null) { - return null; - } - XmlSeeAlso seeAlso = interfaze.getAnnotation(XmlSeeAlso.class); - if (seeAlso == null) { - return null; - } else { - return seeAlso.value(); - } - } - - - public Definition generate(Interface interfaze, WSDLDefinition wsdlDefinition) throws WSDLException { - if (interfaze == null) { - return null; - } - if (interfaze instanceof WSDLInterface) { - return ((WSDLInterface)interfaze).getWsdlDefinition().getDefinition(); - } - JavaInterface iface = (JavaInterface)interfaze; - if (!interfaze.isRemotable()) { - fatal("InterfaceNotRemotable", interfaze, iface.getName()); - } - QName name = getQName(iface); - Definition definition = factory.newDefinition(); - if (requiresSOAP12) { - definition.addNamespace("SOAP12", "http://schemas.xmlsoap.org/wsdl/soap12/"); - } else { - definition.addNamespace("SOAP", "http://schemas.xmlsoap.org/wsdl/soap/"); - } - definition.addNamespace("wsdl", "http://schemas.xmlsoap.org/wsdl/"); - definition.addNamespace("xs", SCHEMA_NS); - - String namespaceURI = name.getNamespaceURI(); - definition.setTargetNamespace(namespaceURI); - definition.setQName(new QName(namespaceURI, name.getLocalPart() + "Service", name.getPrefix())); - definition.addNamespace(name.getPrefix(), namespaceURI); - - PortType portType = definition.createPortType(); - portType.setQName(name); - Binding binding = definitionGenerator.createBinding(definition, portType); - Map<String, XMLTypeHelper> helpers = new HashMap<String, XMLTypeHelper>(); - Map<QName, List<ElementInfo>> wrappers = new HashMap<QName, List<ElementInfo>>(); - for (Operation op : interfaze.getOperations()) { - javax.wsdl.Operation operation = generateOperation(definition, op, helpers, wrappers); - portType.addOperation(operation); - String action = ((JavaOperation)op).getAction(); - if ((action == null || "".equals(action)) && !op.isInputWrapperStyle() && op.getInputWrapper() == null) { - // Bare style - action = "urn:" + op.getName(); - } - BindingOperation bindingOp = definitionGenerator.createBindingOperation(definition, operation, action); - binding.addBindingOperation(bindingOp); - } - portType.setUndefined(false); - definition.addPortType(portType); - binding.setUndefined(false); - definition.addBinding(binding); - wsdlDefinition.setBinding(binding); - - // call each helper in turn to populate the wsdl.types element - XmlSchemaCollection schemaCollection = new XmlSchemaCollection(); - - for (Map.Entry<XMLTypeHelper, List<DataType>> en: getDataTypes(interfaze, false, helpers).entrySet()) { - XMLTypeHelper helper = en.getKey(); - if (helper == null) { - continue; - } - List<XSDefinition> xsDefinitions = helper.getSchemaDefinitions(xsdFactory, resolver, en.getValue()); - - for (XSDefinition xsDef: xsDefinitions) { - - Document doc = xsDef.getDocument(); - if (doc != null) { - // TUSCANY-2757 and TUSCANY-3267 - flip global wrapper elements with nillable - // set true to be set to false. The JAXB RI seems to be generating this setting - // incorrectly according to the JAXB spec. - NodeList nodes = doc.getFirstChild().getChildNodes(); - for (int i = 0; i < nodes.getLength(); i++) { - Node aNode = nodes.item(i); - if (aNode.getLocalName() != null && aNode.getLocalName().equals("element")) { - NamedNodeMap attributes = aNode.getAttributes(); - Node nameAttr = attributes.getNamedItem("name"); - if (nameAttr != null) { - QName elementName = new QName(xsDef.getNamespace(), nameAttr.getNodeValue()); - if (wrappers.containsKey(elementName)) { - Node nillable = attributes.getNamedItem("nillable"); - if (nillable != null) { - nillable.setNodeValue("false"); - } - } - } - } - } - } - - loadXSD(schemaCollection, xsDef); - wsdlDefinition.getXmlSchemas().add(xsDef); - } - } - - // remove global wrapper elements with schema definitions from generation list - for (QName wrapperName: new HashSet<QName>(wrappers.keySet())) { - if (wsdlDefinition.getXmlSchemaElement(wrapperName) != null) { - wrappers.remove(wrapperName); - } - } - - schemaCollection = new XmlSchemaCollection(); - - // generate schema elements for wrappers that aren't defined in the schemas - if (wrappers.size() > 0) { - int i = 0; - int index = 0; - Map<String, XSDefinition> wrapperXSDs = new HashMap<String, XSDefinition>(); - Map<Element, Map<String, String>> prefixMaps = new HashMap<Element, Map<String, String>>(); - for (Map.Entry<QName, List<ElementInfo>> entry: wrappers.entrySet()) { - String targetNS = entry.getKey().getNamespaceURI(); - Document schemaDoc = null; - Element schema = null; - XSDefinition xsDef = wrapperXSDs.get(targetNS); - if (xsDef != null) { - schemaDoc = xsDef.getDocument(); - schema = schemaDoc.getDocumentElement(); - } else { - xsDef = wsdlDefinition.getSchema(targetNS); - if (xsDef != null) { - schemaDoc = xsDef.getDocument(); - schema = schemaDoc.getDocumentElement(); - wrapperXSDs.put(targetNS, xsDef); - Map<String, String> prefixMap = prefixMaps.get(schema); - if (prefixMap == null){ - prefixMap = new HashMap<String, String>(); - prefixMaps.put(schema, prefixMap); - String [] prefixes = xsDef.getSchema().getNamespaceContext().getDeclaredPrefixes(); - for (int j = 0; j < prefixes.length; j++){ - prefixMap.put(xsDef.getSchema().getNamespaceContext().getNamespaceURI(prefixes[j]), - prefixes[j]); - } - } - } else { - schemaDoc = createDocument(); - schema = schemaDoc.createElementNS(SCHEMA_NS, "xs:schema"); - // The elementFormDefault should be set to unqualified, see TUSCANY-2388 - schema.setAttribute("elementFormDefault", "unqualified"); - schema.setAttribute("attributeFormDefault", "qualified"); - schema.setAttribute("targetNamespace", targetNS); - schema.setAttributeNS(XMLNS_NS, "xmlns:xs", SCHEMA_NS); - schema.setAttributeNS(XMLNS_NS, "xmlns:tns", targetNS); - schemaDoc.appendChild(schema); - prefixMaps.put(schema, new HashMap<String, String>()); - xsDef = xsdFactory.createXSDefinition(); - xsDef.setUnresolved(true); - xsDef.setNamespace(targetNS); - xsDef.setDocument(schemaDoc); - // TUSCANY-2465: Set the system id to avoid schema conflict - xsDef.setLocation(URI.create("xsd_" + index + ".xsd")); - index++; - wrapperXSDs.put(targetNS, xsDef); - } - } - Element wrapper = schemaDoc.createElementNS(SCHEMA_NS, "xs:element"); - schema.appendChild(wrapper); - wrapper.setAttribute("name", entry.getKey().getLocalPart()); - if (entry.getValue().size() == 1 && entry.getValue().get(0).getQName() == null) { - // special case for global fault element - QName typeName = entry.getValue().get(0).getType().getQName(); - String nsURI = typeName.getNamespaceURI(); - if ("".equals(nsURI)) { - wrapper.setAttribute("type", typeName.getLocalPart()); - addSchemaImport(schema, "", schemaDoc); - } else if (targetNS.equals(nsURI)) { - wrapper.setAttribute("type", typeName.getLocalPart()); - } else if (SCHEMA_NS.equals(nsURI)) { - wrapper.setAttribute("type", "xs:" + typeName.getLocalPart()); - } else { - Map<String, String> prefixMap = prefixMaps.get(schema); - String prefix = prefixMap.get(nsURI); - if (prefix == null) { - prefix = "ns" + i++; - while(prefixMap.containsValue(prefix)){ - prefix = "ns" + i++; - } - prefixMap.put(nsURI, prefix); - schema.setAttributeNS(XMLNS_NS, "xmlns:" + prefix, nsURI); - addSchemaImport(schema, nsURI, schemaDoc); - } - wrapper.setAttribute("type", prefix + ":" + typeName.getLocalPart()); - } - } else { - // normal wrapper containing type definition inline - Element complexType = schemaDoc.createElementNS(SCHEMA_NS, "xs:complexType"); - wrapper.appendChild(complexType); - if (entry.getValue().size() > 0) { - Element sequence = schemaDoc.createElementNS(SCHEMA_NS, "xs:sequence"); - complexType.appendChild(sequence); - for (ElementInfo element: entry.getValue()) { - Element xsElement = schemaDoc.createElementNS(SCHEMA_NS, "xs:element"); - if (element.isMany()) { - xsElement.setAttribute("maxOccurs", "unbounded"); - } - xsElement.setAttribute("minOccurs", "0"); - xsElement.setAttribute("name", element.getQName().getLocalPart()); - if (element.isNillable()) { - xsElement.setAttribute("nillable", "true"); - } - QName typeName = element.getType().getQName(); - String nsURI = typeName.getNamespaceURI(); - if ("".equals(nsURI)) { - xsElement.setAttribute("type", typeName.getLocalPart()); - addSchemaImport(schema, "", schemaDoc); - } else if (SCHEMA_NS.equals(nsURI)) { - xsElement.setAttribute("type", "xs:" + typeName.getLocalPart()); - } else { - Map<String, String> prefixMap = prefixMaps.get(schema); - String prefix = prefixMap.get(nsURI); - if (prefix == null) { - if (targetNS.equals(nsURI)) { - prefix = "tns"; - } else { - prefix = "ns" + i++; - while(prefixMap.containsValue(prefix)){ - prefix = "ns" + i++; - } - addSchemaImport(schema, nsURI, schemaDoc); - } - prefixMap.put(nsURI, prefix); - schema.setAttributeNS(XMLNS_NS, "xmlns:" + prefix, nsURI); - } - xsElement.setAttribute("type", prefix + ":" + typeName.getLocalPart()); - } - sequence.appendChild(xsElement); - } - } - } - } - - // resolve XSDefinitions containing generated wrappers - for (XSDefinition xsDef: wrapperXSDs.values()) { - if (wsdlDefinition.getSchema(xsDef.getNamespace()) == null) { - wsdlDefinition.getXmlSchemas().add(xsDef); - } - - xsDef.setSchema(null); - xsDef.setSchemaCollection(null); - loadXSD(schemaCollection, xsDef); - } - } - - XSDefinition noNamespaceSchema = null; - XSDefinition defaultNamespaceSchema = null; - - for (XSDefinition xsDef: wsdlDefinition.getXmlSchemas()) { - // only apply these changes if we have a DOM to work with - // this will generally come from the JAXB generation. SDO - // just goes straight to generating XmlSchema structures - Document doc = xsDef.getDocument(); - if (doc != null) { - // TUSCANY-3283 find any schema that has been generated without a namespace - // and any schema using the default WSDL schema so that we can - // merge the two together - if (xsDef.getNamespace().equals("")){ - noNamespaceSchema = xsDef; - } - if (xsDef.getNamespace().equals(namespaceURI)){ - defaultNamespaceSchema = xsDef; - } - } - } - - // TUSCANY-3283 merge the no namespace schema into the default namespace schema - if (noNamespaceSchema != null && defaultNamespaceSchema != null){ - // remove the no namespace schema from our list of schema - wsdlDefinition.getXmlSchemas().remove(noNamespaceSchema); - // merge the schema with no namespace into the schema with the default namspace for this WSDL - mergeSchema(noNamespaceSchema, defaultNamespaceSchema, wsdlDefinition.getXmlSchemas()); - - schemaCollection = new XmlSchemaCollection(); - defaultNamespaceSchema.setSchema(null); - defaultNamespaceSchema.setSchemaCollection(null); - loadXSD(schemaCollection, defaultNamespaceSchema); - } - - // push the schema into the WSDL - for (XSDefinition xsDef: wsdlDefinition.getXmlSchemas()){ - addSchemaExtension(xsDef, schemaCollection, wsdlDefinition, definition); - } - - // useful for debugging DOM issues - //System.out.println("======================= Schema DOM =======================" ); - //for (XSDefinition xsDef : wsdlDefinition.getXmlSchemas()) { - // if (xsDef.getDocument() != null) { - // printDOM(xsDef.getDocument()); - // } - //} - - return definition; - } - - /** - * TUSCANY-3283 - * Merge the no namespace schema into the defualt namespace schema - * Relies on being called just after the getSchemaDefinitions call when the XSDefinitions - * have only the DOM information set - * - * @param noNamespaceSchema - * @param defaultNamespaceSchema - * @param xsDefinitions - */ - private void mergeSchema(XSDefinition noNamespaceSchema, XSDefinition defaultNamespaceSchema, Collection<XSDefinition> xsDefinitions){ - Document fromDoc = noNamespaceSchema.getDocument(); - Document toDoc = defaultNamespaceSchema.getDocument(); - - // merge namespace definitions from the nonamespace schema into the default namespace schema - for(int i = 0; i < fromDoc.getDocumentElement().getAttributes().getLength(); i++){ - Attr attribute = (Attr)fromDoc.getDocumentElement().getAttributes().item(i); - String attribName = attribute.getName(); - if (attribName.startsWith("xmlns:")){ - - String fromPrefix = attribName.substring(attribName.indexOf(":") + 1); - - if (fromPrefix.equals("xs") != true){ - // create a new namespace prefix to prevent clashes - toDoc.getDocumentElement().setAttributeNS("http://www.w3.org/2000/xmlns/", - "xmlns:__" + fromPrefix, - attribute.getValue()); - - // fix up any references to the existing namespace prefix - fixUpNoNamespaceNamespaces(fromDoc, fromPrefix); - } - } - } - - Node toDocFirstChild = toDoc.getDocumentElement().getFirstChild(); - - // merge types from the no namespace schema into the default namespace schema - for(int i = 0; i < fromDoc.getDocumentElement().getChildNodes().getLength(); i++){ - // merge the DOM types - Node node = fromDoc.getDocumentElement().getChildNodes().item(i); - Node newNode = toDoc.importNode(node, true); - - if (newNode.getLocalName() != null && - (newNode.getLocalName().equals("import") || - newNode.getLocalName().equals("include") || - newNode.getLocalName().equals("redefine") || - newNode.getLocalName().equals("annotation") )){ - toDoc.getDocumentElement().insertBefore(newNode, toDocFirstChild); - } else { - toDoc.getDocumentElement().appendChild(newNode); - } - } - - // fix up any references to the types we've just moved - for(int i = 0; i < fromDoc.getDocumentElement().getChildNodes().getLength(); i++){ - Node node = fromDoc.getDocumentElement().getChildNodes().item(i); - - // correct any references to no name types in other schema - if (node.getLocalName() != null && - node.getLocalName().equals("complexType")){ - Node typeName = node.getAttributes().getNamedItem("name"); - fixUpNoNamespaceReferences(xsDefinitions, typeName.getNodeValue(), defaultNamespaceSchema.getNamespace()); - } - } - } - - /** - * TUSCANY-3283 - * Correct any namespace prefixes in the no namespace schema to prevent them from - * clashing when the no namespace schema is merged with the default schema - * - * @param fromSchema - * @param fromPrefix - * @param toPrefix - */ - private void fixUpNoNamespaceNamespaces(Document fromSchema, String fromPrefix){ - NodeList elements = fromSchema.getElementsByTagNameNS("http://www.w3.org/2001/XMLSchema","element"); - for (int k = 0; k < elements.getLength(); k++){ - Element element = (Element) elements.item(k); - if (element != null && element.getAttributes() != null) { - Node type = element.getAttributes().getNamedItem("type"); - - if (type != null && - type.getNodeValue().startsWith(fromPrefix)){ - type.setNodeValue("__" + type.getNodeValue()); - } - } - } - } - - /** - * TUSCANY-3283 - * Correct any references in the schema list that used to point to types in the - * no namespace schema - * - * @param fromSchema - * @param toSchema - */ - private void fixUpNoNamespaceReferences(Collection<XSDefinition> xsDefinitions, String typeName, String defaultNamespace){ - - // fix up any references in any other schema that points to this type - for (XSDefinition xsDef: xsDefinitions) { - - if (xsDef.getDocument() != null){ - // look for any imports of the no namespace schema - Document refSchema = xsDef.getDocument(); - NodeList imports = refSchema.getElementsByTagNameNS("http://www.w3.org/2001/XMLSchema","import"); - List<Node> importsToDelete = new ArrayList<Node>(); - - for (int j = 0; j < imports.getLength(); j++){ - Element _import = (Element)imports.item(j); - - // Fix up the import - if (_import.getAttributes().getLength() == 0){ - if (xsDef.getNamespace().equals(defaultNamespace)){ - // remove the import - //_import.getParentNode().removeChild(_import); - importsToDelete.add(_import); - } else { - // update the import to refer to the default namespace - _import.setAttribute("namespace", defaultNamespace); - } - } - } - - for (Node _import : importsToDelete){ - _import.getParentNode().removeChild(_import); - } - - // look for any type attributes that refer to the - // node being merged - NodeList elements = refSchema.getElementsByTagNameNS("http://www.w3.org/2001/XMLSchema","element"); - for (int k = 0; k < elements.getLength(); k++){ - Element element = (Element) elements.item(k); - if (element != null && element.getAttributes() != null) { - Node type = element.getAttributes().getNamedItem("type"); - - if (type != null && - type.getNodeValue().equals(typeName)){ - if (xsDef.getNamespace().equals(defaultNamespace)){ - // just add "tns" in front of the type name as - // we have merged the type into this schema - type.setNodeValue("tns:" + type.getNodeValue()); - } else { - // add a namespace - refSchema.getDocumentElement().setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:__nnns", defaultNamespace); - - // prefix the type name with the namespace - type.setNodeValue("__nnns:" + type.getNodeValue()); - } - } - } - } - } - } - } - - /* - * Just used when debugging DOM problems - */ - private void printDOM(Document document){ - try { - Transformer transformer = TransformerFactory.newInstance().newTransformer(); - Source source = new DOMSource(document); - Result result = new StreamResult(System.out); - transformer.transform(source, result); - } catch (Exception ex){ - ex.toString(); - } - } - - private static void addSchemaImport(Element schema, String nsURI, Document schemaDoc) { - Element imp = schemaDoc.createElementNS(SCHEMA_NS, "xs:import"); - if (!"".equals(nsURI)) { - imp.setAttribute("namespace", nsURI); - } - // Scan all xs:import elements to match namespace - NodeList childNodes = schema.getElementsByTagNameNS(SCHEMA_NS, "import"); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode instanceof Element) { - String ns = ((Element)childNode).getAttributeNS(SCHEMA_NS, "namespace"); - if (nsURI.equals(ns)) { - // The xs:import with the same namespace has been declared - return; - } - } - } - // Try to find the first node after the import elements - Node firstNodeAfterImport = null; - if (childNodes.getLength() > 0) { - firstNodeAfterImport = childNodes.item(childNodes.getLength() - 1).getNextSibling(); - } else { - firstNodeAfterImport = schema.getFirstChild(); - } - - if (firstNodeAfterImport == null) { - schema.appendChild(imp); - } else { - schema.insertBefore(imp, firstNodeAfterImport); - } - } - - private void addSchemaExtension(XSDefinition xsDef, - XmlSchemaCollection schemaCollection, - WSDLDefinition wsdlDefinition, - Definition definition) throws WSDLException { - if (xsDef.getAggregatedDefinitions() != null) { - for (XSDefinition xsd: xsDef.getAggregatedDefinitions()) { - addSchemaExtension(xsd, schemaCollection, wsdlDefinition, definition); - } - } else { - String nsURI = xsDef.getNamespace(); - Document document = xsDef.getDocument(); - if (document == null) { - try { - NamespaceMap prefixMap = new NamespaceMap(); - prefixMap.add("xs", SCHEMA_NS); - prefixMap.add("tns", nsURI); - XmlSchema schemaDef = xsDef.getSchema(); - schemaDef.setNamespaceContext(prefixMap); - Document[] docs = schemaDef.getAllSchemas(); - document = docs[docs.length-1]; - document.setDocumentURI(xsDef.getLocation().toString()); - xsDef.setDocument(document); - } catch (XmlSchemaException e) { - throw new RuntimeException(e); - } - } - //loadXSD(schemaCollection, xsDef); - //wsdlDefinition.getXmlSchemas().add(xsDef); - Element schema = document.getDocumentElement(); - Schema schemaExt = createSchemaExt(definition); - schemaExt.setDocumentBaseURI(document.getDocumentURI()); - schemaExt.setElement(schema); - } - } - - private static void loadXSD(XmlSchemaCollection schemaCollection, XSDefinition definition) { - if (definition.getSchema() != null) { - return; - } - if (definition.getDocument() != null) { - String uri = null; - if (definition.getLocation() != null) { - uri = definition.getLocation().toString(); - } - XmlSchema schema = schemaCollection.read(definition.getDocument(), uri, null); - if (definition.getSchemaCollection() == null) { - definition.setSchemaCollection(schemaCollection); - } - if (definition.getSchema() == null) { - definition.setSchema(schema); - } - } - } - - public Schema createSchemaExt(Definition definition) throws WSDLException { - Types types = definition.getTypes(); - if (types == null) { - types = definition.createTypes(); - definition.setTypes(types); - } - - Schema schemaExt = createSchema(definition); - types.addExtensibilityElement(schemaExt); - - return schemaExt; - } - - public Schema createSchema(Definition definition) throws WSDLException { - return (Schema)definition.getExtensionRegistry().createExtension(Types.class, SCHEMA_QNAME); - } - - private DocumentBuilderFactory documentBuilderFactory; - - public Document createDocument() { - Document document; - try { - if (documentBuilderFactory == null) { - documentBuilderFactory = DocumentBuilderFactory.newInstance(); - documentBuilderFactory.setNamespaceAware(true); - } - document = documentBuilderFactory.newDocumentBuilder().newDocument(); - } catch (ParserConfigurationException ex) { - throw new WSDLGenerationException(ex); - } - // document.setDocumentURI("http://"); - return document; - } - - protected QName getQName(Interface interfaze) { - JavaInterface iface = (JavaInterface)interfaze; - QName qname = iface.getQName(); - if (qname != null) { - return qname; - } else { - Class<?> javaClass = iface.getJavaClass(); - return new QName(JavaXMLMapper.getNamespace(javaClass), javaClass.getSimpleName(), "tns"); - } - } - - public javax.wsdl.Operation generateOperation(Definition definition, - Operation op, - Map<String, XMLTypeHelper> helpers, - Map<QName, List<ElementInfo>> wrappers) - throws WSDLException { - javax.wsdl.Operation operation = definition.createOperation(); - operation.setName(op.getName()); - operation.setUndefined(false); - - Input input = definition.createInput(); - Message inputMsg = definition.createMessage(); - String namespaceURI = definition.getQName().getNamespaceURI(); - QName inputMsgName = new QName(namespaceURI, op.getName()); - inputMsg.setQName(inputMsgName); - inputMsg.setUndefined(false); - definition.addMessage(inputMsg); - - List<ElementInfo> elements = null; - // FIXME: By default, java interface is mapped to doc-lit-wrapper style WSDL - if (op.getInputWrapper() != null) { - // Generate doc-lit-wrapper style - inputMsg.addPart(generateWrapperPart(definition, op, helpers, wrappers, true)); - } else { - // Bare style - int i = 0; - for (DataType d : op.getInputType().getLogical()) { - inputMsg.addPart(generatePart(definition, d, "arg" + i)); - elements = new ArrayList<ElementInfo>(); - ElementInfo element = getElementInfo(d.getPhysical(), d, null, helpers); - elements.add(element); - QName elementName = ((XMLType)d.getLogical()).getElementName(); - wrappers.put(elementName, elements); - i++; - } - } - input.setMessage(inputMsg); - operation.setInput(input); - - if (!op.isNonBlocking()) { - Output output = definition.createOutput(); - Message outputMsg = definition.createMessage(); - QName outputMsgName = new QName(namespaceURI, op.getName() + "Response"); - outputMsg.setQName(outputMsgName); - outputMsg.setUndefined(false); - definition.addMessage(outputMsg); - - if (op.getOutputWrapper() != null) { - outputMsg.addPart(generateWrapperPart(definition, op, helpers, wrappers, false)); - } else { - DataType outputType = op.getOutputType(); - if (outputType != null) { - outputMsg.addPart(generatePart(definition, outputType, "return")); - elements = new ArrayList<ElementInfo>(); - ElementInfo element = getElementInfo(outputType.getPhysical(), outputType, null, helpers); - elements.add(element); - QName elementName = ((XMLType)outputType.getLogical()).getElementName(); - wrappers.put(elementName, elements); - } - } - output.setMessage(outputMsg); - - operation.setOutput(output); - operation.setStyle(OperationType.REQUEST_RESPONSE); - } else { - operation.setStyle(OperationType.ONE_WAY); - } - - for (DataType<DataType> faultType: op.getFaultTypes()) { - Fault fault = definition.createFault(); - QName faultName = ((XMLType)faultType.getLogical().getLogical()).getElementName(); - fault.setName(faultName.getLocalPart()); - Message faultMsg = definition.getMessage(faultName); - if (faultMsg == null) { - faultMsg = definition.createMessage(); - faultMsg.setQName(faultName); - faultMsg.setUndefined(false); - definition.addMessage(faultMsg); - faultMsg.addPart(generatePart(definition, faultType.getLogical(), faultName.getLocalPart())); - } - fault.setMessage(faultMsg); - operation.addFault(fault); - if (faultType.getLogical().getPhysical() != faultType.getPhysical()) { - // create special wrapper for type indirection to real fault bean - DataType logical = faultType.getLogical(); - elements = new ArrayList<ElementInfo>(); - elements.add(getElementInfo(logical.getPhysical(), logical, null, helpers)); - } else { - // convert synthesized fault bean to a wrapper type - for (DataType<XMLType> propDT: op.getFaultBeans().get(faultName)) { - XMLType logical = propDT.getLogical(); - elements = new ArrayList<ElementInfo>(); - elements.add(getElementInfo(propDT.getPhysical(), propDT, logical.getElementName(), helpers)); - } - } - wrappers.put(faultName, elements); - } - - operation.setUndefined(false); - return operation; - } - - public Part generatePart(Definition definition, DataType arg, String partName) { - Part part = definition.createPart(); - part.setName(partName); - if (arg != null && arg.getLogical() instanceof XMLType) { - XMLType xmlType = (XMLType)arg.getLogical(); - QName elementName = xmlType.getElementName(); - part.setElementName(elementName); - addNamespace(definition, elementName); - if (xmlType.getElementName() == null) { - QName typeName = xmlType.getTypeName(); - part.setTypeName(typeName); - addNamespace(definition, typeName); - } - } - return part; - } - - public Part generateWrapperPart(Definition definition, - Operation operation, - Map<String, XMLTypeHelper> helpers, - Map<QName, List<ElementInfo>> wrappers, - boolean input) throws WSDLException { - Part part = definition.createPart(); - String partName = input ? operation.getName() : (operation.getName() + "Response"); - part.setName(partName); - WrapperInfo inputWrapperInfo = operation.getInputWrapper(); - WrapperInfo outputWrapperInfo = operation.getOutputWrapper(); - if ((inputWrapperInfo != null) && (outputWrapperInfo != null)) { - ElementInfo elementInfo = - input ? inputWrapperInfo.getWrapperElement() : outputWrapperInfo.getWrapperElement(); - List<ElementInfo> elements = - input ? inputWrapperInfo.getChildElements() : outputWrapperInfo.getChildElements(); - QName wrapperName = elementInfo.getQName(); - part.setElementName(wrapperName); - addNamespace(definition, wrapperName); - wrappers.put(wrapperName, elements); - - // FIXME: [rfeng] Ideally, we should try to register the wrappers only. But we are - // expriencing the problem that we cannot handle XSD imports - /* - Class<?> wrapperClass = input ? opWrapper.getInputWrapperClass() : opWrapper.getOutputWrapperClass(); - DataType wrapperDT = input ? opWrapper.getInputWrapperType() : opWrapper.getOutputWrapperType(); - if (wrapperClass != null) { - getElementInfo(wrapperClass, wrapperDT, wrapperName, helpers); - return part; - } - */ - - Method method = ((JavaOperation)operation).getJavaMethod(); - if (input) { - Class<?>[] paramTypes = method.getParameterTypes(); - for (int i = 0; i < paramTypes.length; i++) { - DataType dataType = operation.getInputType().getLogical().get(i); - elements.set(i, getElementInfo(paramTypes[i], dataType, elements.get(i).getQName(), helpers)); - } - } else { - Class<?> returnType = method.getReturnType(); - if (returnType != Void.TYPE) { - DataType dataType = operation.getOutputType(); - elements.set(0, getElementInfo(returnType, dataType, elements.get(0).getQName(), helpers)); - } - } - } - return part; - } - - private ElementInfo getElementInfo(Class javaType, - DataType dataType, - QName name, - Map<String, XMLTypeHelper> helpers) { - String db = dataType.getDataBinding(); - while ("java:array".equals(db)) { - dataType = (DataType)dataType.getLogical(); - db = dataType.getDataBinding(); - } - XMLTypeHelper helper = helpers.get(db); - if (helper == null) { - DataBinding dataBinding = dataBindings.getDataBinding(db); - if (dataBinding == null) { - QName element = name; - if (element == null || dataType.getLogical() instanceof XMLType) { - XMLType xmlType = (XMLType)dataType.getLogical(); - if (xmlType.getElementName() != null) { - element = xmlType.getElementName(); - } - } - return new ElementInfo(element, new TypeInfo(ANYTYPE_QNAME, false, null)); - // throw new ServiceRuntimeException("No data binding for " + db); - } - - helper = dataBinding.getXMLTypeHelper(); - if (helper == null) { - // Default to JAXB - helper = helpers.get(JAXBDataBinding.NAME); - if (helper == null) { - helper = dataBindings.getDataBinding(JAXBDataBinding.NAME).getXMLTypeHelper(); - helpers.put(JAXBDataBinding.NAME, helper); - } - } - helpers.put(db, helper); - } - TypeInfo typeInfo = helper.getTypeInfo(javaType.isArray() ? javaType.getComponentType() : javaType, - dataType.getLogical()); - ElementInfo element = new ElementInfo(name, typeInfo); - element.setMany(byte[].class != javaType && javaType.isArray()); - element.setNillable(!javaType.isPrimitive()); - return element; - } - - private static void addNamespace(Definition definition, QName name) { - String namespace = name.getNamespaceURI(); - if (definition.getPrefix(namespace) == null) { - definition.addNamespace("ns" + definition.getNamespaces().size(), namespace); - } - } - - /* - // currently not using the next three methods - public XmlSchemaType getXmlSchemaType(DataType type) { - return null; - } - - // FIXME: WE need to add databinding-specific Java2XSD generation - public Element generateXSD(DataType dataType) { - DataBinding dataBinding = dataBindings.getDataBinding(dataType.getDataBinding()); - if (dataBinding != null) { - // return dataBinding.generateSchema(dataType); - } - return null; - } - - public void generateWrapperElements(Operation op) { - XmlSchemaCollection collection = new XmlSchemaCollection(); - String ns = getQName(op.getInterface()).getNamespaceURI(); - XmlSchema schema = new XmlSchema(ns, collection); - schema.setAttributeFormDefault(new XmlSchemaForm(XmlSchemaForm.QUALIFIED)); - schema.setElementFormDefault(new XmlSchemaForm(XmlSchemaForm.QUALIFIED)); - - XmlSchemaElement inputElement = new XmlSchemaElement(); - inputElement.setQName(new QName(ns, op.getName())); - XmlSchemaComplexType inputType = new XmlSchemaComplexType(schema); - inputType.setName(""); - XmlSchemaSequence inputSeq = new XmlSchemaSequence(); - inputType.setParticle(inputSeq); - List<DataType> argTypes = op.getInputType().getLogical(); - for (DataType argType : argTypes) { - XmlSchemaElement child = new XmlSchemaElement(); - Object logical = argType.getLogical(); - if (logical instanceof XMLType) { - child.setName(((XMLType)logical).getElementName().getLocalPart()); - XmlSchemaType type = getXmlSchemaType(argType); - child.setType(type); - } - inputSeq.getItems().add(child); - } - inputElement.setType(inputType); - - XmlSchemaElement outputElement = new XmlSchemaElement(); - outputElement.setQName(new QName(ns, op.getName() + "Response")); - XmlSchemaComplexType outputType = new XmlSchemaComplexType(schema); - outputType.setName(""); - XmlSchemaSequence outputSeq = new XmlSchemaSequence(); - outputType.setParticle(outputSeq); - DataType returnType = op.getOutputType(); - XmlSchemaElement child = new XmlSchemaElement(); - Object logical = returnType.getLogical(); - if (logical instanceof XMLType) { - child.setName(((XMLType)logical).getElementName().getLocalPart()); - XmlSchemaType type = getXmlSchemaType(returnType); - child.setType(type); - } - outputSeq.getItems().add(child); - outputElement.setType(outputType); - - schema.getElements().add(inputElement.getQName(), inputElement); - schema.getElements().add(outputElement.getQName(), outputElement); - - } - */ - - public WSDLFactory getFactory() { - return factory; - } - - public void setFactory(WSDLFactory factory) { - this.factory = factory; - } - -} diff --git a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLDefinitionGenerator.java b/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLDefinitionGenerator.java deleted file mode 100644 index 989a12d43c..0000000000 --- a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLDefinitionGenerator.java +++ /dev/null @@ -1,316 +0,0 @@ -/* - * 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.tuscany.sca.binding.ws.wsdlgen; - -import java.util.Iterator; - -import javax.wsdl.Binding; -import javax.wsdl.BindingFault; -import javax.wsdl.BindingInput; -import javax.wsdl.BindingOperation; -import javax.wsdl.BindingOutput; -import javax.wsdl.Definition; -import javax.wsdl.Fault; -import javax.wsdl.Input; -import javax.wsdl.Operation; -import javax.wsdl.Output; -import javax.wsdl.Port; -import javax.wsdl.PortType; -import javax.wsdl.Service; -import javax.wsdl.Types; -import javax.wsdl.WSDLException; -import javax.wsdl.extensions.ExtensibilityElement; -import javax.wsdl.extensions.soap.SOAPAddress; -import javax.wsdl.extensions.soap.SOAPBinding; -import javax.wsdl.extensions.soap.SOAPBody; -import javax.wsdl.extensions.soap.SOAPFault; -import javax.wsdl.extensions.soap.SOAPOperation; -import javax.wsdl.extensions.soap12.SOAP12Address; -import javax.wsdl.extensions.soap12.SOAP12Binding; -import javax.wsdl.extensions.soap12.SOAP12Body; -import javax.wsdl.extensions.soap12.SOAP12Fault; -import javax.wsdl.extensions.soap12.SOAP12Operation; -import javax.wsdl.factory.WSDLFactory; -import javax.wsdl.xml.WSDLReader; -import javax.xml.namespace.QName; - -import org.w3c.dom.Element; - -/** - * - * @version $Rev: 668025 $ $Date: 2008-06-16 01:06:34 +0100 (Mon, 16 Jun 2008) $ - */ -public class WSDLDefinitionGenerator { - private static final String SOAP_NS = "http://schemas.xmlsoap.org/wsdl/soap/"; - public static final QName SOAP_ADDRESS = new QName(SOAP_NS, "address"); - private static final QName SOAP_BINDING = new QName(SOAP_NS, "binding"); - private static final QName SOAP_BODY = new QName(SOAP_NS, "body"); - private static final QName SOAP_FAULT = new QName(SOAP_NS, "fault"); - private static final QName SOAP_OPERATION = new QName(SOAP_NS, "operation"); - private static final String SOAP12_NS = "http://schemas.xmlsoap.org/wsdl/soap12/"; - public static final QName SOAP12_ADDRESS = new QName(SOAP12_NS, "address"); - private static final QName SOAP12_BINDING = new QName(SOAP12_NS, "binding"); - private static final QName SOAP12_BODY = new QName(SOAP12_NS, "body"); - private static final QName SOAP12_FAULT = new QName(SOAP12_NS, "fault"); - private static final QName SOAP12_OPERATION = new QName(SOAP12_NS, "operation"); - - private static final String BINDING_SUFFIX = "Binding"; - private static final String SERVICE_SUFFIX = "Service"; - private static final String PORT_SUFFIX = "Port"; - - private boolean requiresSOAP12; - private boolean requiresJMS; - private QName soapAddress; - private QName soapBinding; - private QName soapBody; - private QName soapFault; - private QName soapOperation; - - public WSDLDefinitionGenerator(boolean requiresSOAP12, boolean requiresJMS) { - super(); - this.requiresSOAP12 = requiresSOAP12; - this.requiresJMS = requiresJMS; - soapAddress = requiresSOAP12 ? SOAP12_ADDRESS : SOAP_ADDRESS; - soapBinding = requiresSOAP12 ? SOAP12_BINDING : SOAP_BINDING; - soapBody = requiresSOAP12 ? SOAP12_BODY : SOAP_BODY; - soapFault = requiresSOAP12 ? SOAP12_FAULT : SOAP_FAULT; - soapOperation = requiresSOAP12 ? SOAP12_OPERATION : SOAP_OPERATION; - } - - public Definition cloneDefinition(WSDLFactory factory, Definition definition) throws WSDLException { - Element root = definition.getDocumentationElement(); - root = (Element)root.cloneNode(true); - WSDLReader reader = factory.newWSDLReader(); - return reader.readWSDL(definition.getDocumentBaseURI(), root); - } - - public Types createTypes(Definition definition) { - Types types = definition.createTypes(); - definition.setTypes(types); - return types; - } - - public Binding createBinding(Definition definition, PortType portType) { - try { - Binding binding = definition.createBinding(); - binding.setPortType(portType); - configureBinding(definition, binding, portType); - ExtensibilityElement bindingExtension = - definition.getExtensionRegistry().createExtension(Binding.class, soapBinding); - if (requiresSOAP12) { - ((SOAP12Binding)bindingExtension).setStyle("document"); - if (requiresJMS){ - ((SOAP12Binding)bindingExtension).setTransportURI("http://schemas.xmlsoap.org/soap/jms"); - } else { - ((SOAP12Binding)bindingExtension).setTransportURI("http://schemas.xmlsoap.org/soap/http"); - } - } else { - ((SOAPBinding)bindingExtension).setStyle("document"); - if (requiresJMS){ - ((SOAPBinding)bindingExtension).setTransportURI("http://schemas.xmlsoap.org/soap/jms"); - } else { - ((SOAPBinding)bindingExtension).setTransportURI("http://schemas.xmlsoap.org/soap/http"); - } - } - binding.addExtensibilityElement(bindingExtension); - return binding; - } catch (WSDLException e) { - throw new WSDLGenerationException(e); - } - } - - - protected void configureBinding(Definition definition, Binding binding, PortType portType) throws WSDLException { - QName portTypeName = portType.getQName(); - if (portTypeName != null) { - // Choose <porttype>Binding if available. If this name is in use, insert - // separating underscores until there is no clash. - for (String suffix = BINDING_SUFFIX; ; suffix = "_" + suffix) { - QName name = new QName(definition.getTargetNamespace(), portTypeName.getLocalPart() + suffix); - if (definition.getBinding(name) == null) { - binding.setQName(name); - break; - } - } - } - } - - @SuppressWarnings("unchecked") - public void createBindingOperations(Definition definition, Binding binding, PortType portType) { - try { - for (Iterator oi = portType.getOperations().iterator(); oi.hasNext();) { - Operation operation = (Operation)oi.next(); - BindingOperation bindingOperation = - createBindingOperation(definition, operation, "urn:" + operation.getName()); - binding.addBindingOperation(bindingOperation); - } - } catch (WSDLException e) { - throw new WSDLGenerationException(e); - } - } - - @SuppressWarnings("unchecked") - public BindingOperation createBindingOperation(Definition definition, Operation operation, String action) - throws WSDLException { - BindingOperation bindingOperation = definition.createBindingOperation(); - bindingOperation.setOperation(operation); - configureBindingOperation(bindingOperation, operation); - ExtensibilityElement operationExtension = - definition.getExtensionRegistry().createExtension(BindingOperation.class, soapOperation); - if (requiresSOAP12) { - ((SOAP12Operation)operationExtension).setSoapActionURI(action); - } else { - ((SOAPOperation)operationExtension).setSoapActionURI(action); - } - bindingOperation.addExtensibilityElement(operationExtension); - if (operation.getInput() != null) { - BindingInput bindingInput = definition.createBindingInput(); - configureBindingInput(bindingInput, operation.getInput()); - ExtensibilityElement inputExtension = - definition.getExtensionRegistry().createExtension(BindingInput.class, soapBody); - if (requiresSOAP12) { - ((SOAP12Body)inputExtension).setUse("literal"); - } else { - ((SOAPBody)inputExtension).setUse("literal"); - } - bindingInput.addExtensibilityElement(inputExtension); - bindingOperation.setBindingInput(bindingInput); - } - if (operation.getOutput() != null) { - BindingOutput bindingOutput = definition.createBindingOutput(); - configureBindingOutput(bindingOutput, operation.getOutput()); - ExtensibilityElement outputExtension = - definition.getExtensionRegistry().createExtension(BindingOutput.class, soapBody); - if (requiresSOAP12) { - ((SOAP12Body)outputExtension).setUse("literal"); - } else { - ((SOAPBody)outputExtension).setUse("literal"); - } - bindingOutput.addExtensibilityElement(outputExtension); - bindingOperation.setBindingOutput(bindingOutput); - } - for (Iterator fi = operation.getFaults().values().iterator(); fi.hasNext();) { - Fault fault = (Fault)fi.next(); - BindingFault bindingFault = definition.createBindingFault(); - ExtensibilityElement faultExtension = - definition.getExtensionRegistry().createExtension(BindingFault.class, soapFault); - configureBindingFault(bindingFault, faultExtension, fault); - bindingFault.addExtensibilityElement(faultExtension); - bindingOperation.addBindingFault(bindingFault); - } - return bindingOperation; - } - - protected void configureBindingOperation(BindingOperation bindingOperation, Operation operation) - throws WSDLException { - bindingOperation.setName(operation.getName()); - } - - protected void configureBindingInput(BindingInput bindingInput, Input input) throws WSDLException { - bindingInput.setName(input.getName()); - } - - protected void configureBindingOutput(BindingOutput bindingOutput, Output output) throws WSDLException { - bindingOutput.setName(output.getName()); - } - - protected void configureBindingFault(BindingFault bindingFault, - ExtensibilityElement faultExtension, - Fault fault) - throws WSDLException { - String faultName = fault.getName(); - bindingFault.setName(faultName); - if (requiresSOAP12) { - ((SOAP12Fault)faultExtension).setName(faultName); - ((SOAP12Fault)faultExtension).setUse("literal"); - } else { - ((SOAPFault)faultExtension).setName(faultName); - ((SOAPFault)faultExtension).setUse("literal"); - } - } - - public Service createService(Definition definition, PortType portType) { - try { - Service service = definition.createService(); - configureService(definition, service, portType); - // createPort(definition, binding, service); - definition.addService(service); - return service; - } catch (WSDLException e) { - throw new WSDLGenerationException(e); - } - } - - public Service createService(Definition definition, Binding binding) { - try { - Service service = definition.createService(); - configureService(definition, service, binding.getPortType()); - // createPort(definition, binding, service); - definition.addService(service); - return service; - } catch (WSDLException e) { - throw new WSDLGenerationException(e); - } - } - - protected void configureService(Definition definition, Service service, PortType portType) throws WSDLException { - QName portTypeName = portType.getQName(); - if (portTypeName != null) { - // Choose <porttype>Service if available. If this name is in use, insert - // separating underscores until there is no clash. - for (String suffix = SERVICE_SUFFIX; ; suffix = "_" + suffix) { - QName name = new QName(definition.getTargetNamespace(), portTypeName.getLocalPart() + suffix); - if (definition.getService(name) == null) { - service.setQName(name); - break; - } - } - } - } - - public Port createPort(Definition definition, Binding binding, Service service, String uri) { - try { - Port port = definition.createPort(); - port.setBinding(binding); - configurePort(port, binding); - if (uri != null) { - ExtensibilityElement portExtension = - definition.getExtensionRegistry().createExtension(Port.class, soapAddress); - if (requiresSOAP12) { - ((SOAP12Address)portExtension).setLocationURI(uri); - } else { - ((SOAPAddress)portExtension).setLocationURI(uri); - } - port.addExtensibilityElement(portExtension); - } - service.addPort(port); - return port; - } catch (WSDLException e) { - throw new WSDLGenerationException(e); - } - } - - protected void configurePort(Port port, Binding binding) throws WSDLException { - if (binding.getPortType() != null && binding.getPortType().getQName() != null) { - port.setName(binding.getPortType().getQName().getLocalPart() + PORT_SUFFIX); - } - } - -} diff --git a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLGenerationException.java b/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLGenerationException.java deleted file mode 100644 index bf9e22f645..0000000000 --- a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLGenerationException.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.tuscany.sca.binding.ws.wsdlgen; - -import org.apache.tuscany.sca.monitor.Problem; -import org.osoa.sca.ServiceRuntimeException; - -public class WSDLGenerationException extends ServiceRuntimeException { - private static final long serialVersionUID = 1L; - private Problem problem; - - public WSDLGenerationException() { - super(); - } - - public WSDLGenerationException(String message, Throwable cause) { - super(message, cause); - } - - public WSDLGenerationException(String message) { - super(message); - } - - public WSDLGenerationException(Throwable cause) { - super(cause); - } - - public WSDLGenerationException(String message, Throwable cause, Problem problem) { - super(message, cause); - this.problem = problem; - } - - public Problem getProblem() { - return problem; - } - -} diff --git a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java b/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java deleted file mode 100644 index e57900f6cd..0000000000 --- a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java +++ /dev/null @@ -1,542 +0,0 @@ -/* - * 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.tuscany.sca.binding.ws.wsdlgen; - -//FIXME: trim the import list down to what's really needed - - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.wsdl.Binding; -import javax.wsdl.Definition; -import javax.wsdl.Import; -import javax.wsdl.Port; -import javax.wsdl.PortType; -import javax.wsdl.Service; -import javax.wsdl.WSDLException; -import javax.wsdl.extensions.ExtensibilityElement; -import javax.wsdl.extensions.soap.SOAPAddress; -import javax.wsdl.extensions.soap.SOAPBinding; -import javax.wsdl.extensions.soap12.SOAP12Address; -import javax.wsdl.extensions.soap12.SOAP12Binding; -import javax.wsdl.factory.WSDLFactory; -import javax.wsdl.xml.WSDLWriter; -import javax.xml.namespace.QName; - -import org.apache.tuscany.sca.assembly.AbstractContract; -import org.apache.tuscany.sca.assembly.Component; -import org.apache.tuscany.sca.assembly.CompositeService; -import org.apache.tuscany.sca.binding.ws.WebServiceBinding; -import org.apache.tuscany.sca.interfacedef.Interface; -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; -import org.apache.tuscany.sca.monitor.Monitor; -import org.apache.tuscany.sca.monitor.Problem; -import org.apache.tuscany.sca.monitor.Problem.Severity; -import org.apache.tuscany.sca.monitor.impl.ProblemImpl; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.Text; - -/** - * WSDLServiceGenerator generates a binding WSDL service document. - * - * @version $Rev$ $Date$ - */ -public class WSDLServiceGenerator { - // the following switch is temporary for debugging - public static boolean printWSDL; // external code sets this to print generated WSDL - - private static final Logger logger = Logger.getLogger(WSDLServiceGenerator.class.getName()); - private static final QName TRANSPORT_JMS_QUALIFIED_INTENT = - new QName("http://www.osoa.org/xmlns/sca/1.0", "transport.jms"); - private static final String DEFAULT_QUEUE_CONNECTION_FACTORY = "TuscanyQueueConnectionFactory"; - private static final String ADDRESS = "Address"; - - private WSDLServiceGenerator() { - // this class has static methods only and cannot be instantiated - } - - /** - * Log a warning message. - * @param problem - */ - private static void logWarning(Problem problem) { - Logger problemLogger = Logger.getLogger(problem.getSourceClassName(), problem.getBundleName()); - if (problemLogger != null){ - problemLogger.logp(Level.WARNING, problem.getSourceClassName(), null, problem.getMessageId(), problem.getMessageParams()); - } else { - logger.severe("Can't get logger " + problem.getSourceClassName()+ " with bundle " + problem.getBundleName()); - } - } - - /** - * Report a warning. - * @param message - * @param binding - * @param parameters - */ - private static void warning(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) { - Problem problem = new ProblemImpl(WSDLServiceGenerator.class.getName(), "wsdlgen-validation-messages", Severity.WARNING, wsBinding, message, (Object[])messageParameters); - if (monitor != null) { - monitor.problem(problem); - } else { - logWarning(problem); - } - } - - /** - * Report an error. - * @param message - * @param binding - * @param parameters - */ - private static void error(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) { - Problem problem = new ProblemImpl(WSDLServiceGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR, wsBinding, message, (Object[])messageParameters); - if (monitor != null) { - monitor.problem(problem); - } else { - throw new WSDLGenerationException(problem.toString(), null, problem); - } - } - - /** - * Generate a suitably configured WSDL definition - */ - protected static Definition configureWSDLDefinition(WebServiceBinding wsBinding, - Component component, - AbstractContract contract, - Monitor monitor) { - - //[nash] changes to the builder sequence avoid calling this for a CompositeService - assert !(contract instanceof CompositeService); - /* - // For every promoted composite service, the underlying component - // gets a copy of the service with the name prefixed by "$promoted$." - String contractName = (contract instanceof CompositeService ? "$promoted$." : "") + contract.getName(); - */ - String contractName = contract.getName(); - - List<Port> ports = new ArrayList<Port>(); - WSDLDefinition wsdlDefinition = wsBinding.getWSDLDefinition(); - if (wsdlDefinition == null) { - error(monitor, "NoWsdlInterface", wsBinding, component.getName(), contract.getName()); - return null; - } - Definition def = wsdlDefinition.getDefinition(); - - boolean wsdlProvidedByUser = (wsdlDefinition.getBinding() == null); - - if (wsdlProvidedByUser) { - // The WSDL document was provided by the user. Generate a new - // WSDL document with imports from the user-provided document. - WSDLFactory factory = null; - try { - factory = WSDLFactory.newInstance(); - } catch (WSDLException e) { - throw new WSDLGenerationException(e); - } - Definition newDef = factory.newDefinition(); - - // Construct a target namespace from the base URI of the user's - // WSDL document (is this what we should be using?) and a path - // computed according to the SCA Web Service binding spec. - String nsName = component.getName() + "/" + contractName; - String namespaceURI = null; - try { - URI userTNS = new URI(def.getTargetNamespace()); - namespaceURI = userTNS.resolve("/" + nsName).toString(); - } catch (URISyntaxException e1) { - throw new WSDLGenerationException(e1); - } catch (IllegalArgumentException e2) { - throw new WSDLGenerationException(e2); - } - - // set name and targetNamespace attributes on the definition - String defsName = component.getName() + "." + contractName; - newDef.setQName(new QName(namespaceURI, defsName)); - newDef.setTargetNamespace(namespaceURI); - newDef.addNamespace("tns", namespaceURI); - - // set wsdl namespace prefix on the definition - newDef.addNamespace("wsdl", "http://schemas.xmlsoap.org/wsdl/"); - - // import the service or reference interface portType - List<WSDLDefinition> imports = new ArrayList<WSDLDefinition>(); - Interface interfaze = wsBinding.getBindingInterfaceContract().getInterface(); - if (interfaze instanceof WSDLInterface) { - PortType portType = ((WSDLInterface)interfaze).getPortType(); - boolean ok = importPortType(portType, wsdlDefinition, newDef, imports); - if (!ok) { - error(monitor, "PortTypeNotFound", wsBinding, portType.getQName().toString(), - component.getName(), contract.getName()); - } - } - - // import an existing binding if specified - Binding binding = wsBinding.getBinding(); - if (binding != null) { - boolean ok = importBinding(binding, wsdlDefinition, newDef, imports); - if (ok) { - boolean ok2 = importPortType(binding.getPortType(), wsdlDefinition, newDef, imports); - if (!ok2) { - error(monitor, "PortTypeNotFound", wsBinding, binding.getPortType().getQName().toString(), - component.getName(), contract.getName()); - } - } else { - error(monitor, "BindingNotFound", wsBinding, binding.getQName().toString(), - component.getName(), contract.getName()); - } - } - - // import bindings and portTypes needed by services and ports - QName serviceQName = wsBinding.getServiceName(); - String portName = wsBinding.getPortName(); - if (serviceQName != null) { - Service service = def.getService(serviceQName); - if (portName != null) { - Port port = service.getPort(portName); - Port newPort = copyPort(newDef, port, wsBinding); - if (newPort != null) { - importBinding(port.getBinding(), wsdlDefinition, newDef, imports); - ports.add(newPort); - } else { - error(monitor, "InvalidPort", wsBinding, serviceQName.toString(), portName, - component.getName(), contract.getName()); - } - } else { - for (Object port : service.getPorts().values()) { - Port newPort = copyPort(newDef, (Port)port, wsBinding); - if (newPort != null) { - importBinding(((Port)port).getBinding(), wsdlDefinition, newDef, imports); - ports.add(newPort); - } else { - // not an error, just ignore the port - warning(monitor, "IgnoringPort", wsBinding, serviceQName.toString(), ((Port)port).getName(), - component.getName(), contract.getName()); - } - } - if (ports.size() == 0) { - error(monitor, "NoValidPorts", wsBinding, serviceQName.toString(), - component.getName(), contract.getName()); - } - } - } - - // replace original WSDL definition by the generated definition - def = newDef; - - } else { - // The WSDL definition was generated by Interface2WSDLGenerator. - // Reuse it instead of creating a new definition here. - } - - // add a service and ports to the generated definition - WSDLDefinitionGenerator helper = - new WSDLDefinitionGenerator(BindingWSDLGenerator.requiresSOAP12(wsBinding),false); - WSDLInterface wi = (WSDLInterface)wsBinding.getBindingInterfaceContract().getInterface(); - PortType portType = wi.getPortType(); - Service service = helper.createService(def, portType); - if (wsBinding.getBinding() == null && ports.size() == 0) { - Binding binding = helper.createBinding(def, portType); - if (BindingWSDLGenerator.requiresSOAP12(wsBinding)) { - def.addNamespace("SOAP12", "http://schemas.xmlsoap.org/wsdl/soap12/"); - } else { - def.addNamespace("SOAP11", "http://schemas.xmlsoap.org/wsdl/soap/"); - } - helper.createBindingOperations(def, binding, portType); - binding.setUndefined(false); - def.addBinding(binding); - - String endpointURI = computeActualURI(wsBinding, null); - Port port = helper.createPort(def, binding, service, endpointURI); - wsBinding.setService(service); - wsBinding.setPort(port); - } else { - if (ports.size() > 0) { - // there are one or more user-specified valid ports - for (Port port : ports) { - service.addPort(port); - } - if (ports.size() == 1) { - // only one port, so use it - wsBinding.setPort(ports.get(0)); - } else { - // multiple ports, make them all available - wsBinding.setPort(null); - } - } else { - // no valid user-specified ports, so create a suitably configured port - String endpointURI = computeActualURI(wsBinding, null); - Port port = helper.createPort(def, wsBinding.getBinding(), service, endpointURI); - if (BindingWSDLGenerator.requiresSOAP12(wsBinding)) { - def.addNamespace("SOAP12", "http://schemas.xmlsoap.org/wsdl/soap12/"); - } else { - def.addNamespace("SOAP11", "http://schemas.xmlsoap.org/wsdl/soap/"); - } - wsBinding.setPort(port); - } - wsBinding.setService(service); - } - - // TUSCANY-2900 - add jms binding and service port if required - // TODO - remove service/ports from any imported WSDL - // - find away to allow users to retrieve WSDL with JMS bindings - // as a jms binding on it's own provides not target for ?wsdl - if ((!wsdlProvidedByUser) && - (wsBinding.getURI() != null) && - (wsBinding.getURI().startsWith("jms"))){ - - // need to work out how to check if user has already specified a binding - - // create jms binding - helper = new WSDLDefinitionGenerator(BindingWSDLGenerator.requiresSOAP12(wsBinding),true); - Binding binding = helper.createBinding(def, portType); - helper.createBindingOperations(def, binding, portType); - binding.setUndefined(false); - def.addBinding(binding); - - // create a jms port - String endpointURI = computeActualURI(wsBinding, null); - Port port = helper.createPort(def, binding, service, endpointURI); - wsBinding.setService(service); - wsBinding.setPort(port); - - //printWSDL = true; - } - - // for debugging - if (printWSDL) { - try { - System.out.println("Generated WSDL for " + component.getName() + "/" + contractName); - WSDLWriter writer = javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter(); - writer.writeWSDL(def, System.out); - } catch (WSDLException e) { - throw new WSDLGenerationException(e); - } - } - - return def; - } - - private static boolean importPortType(PortType portType, - WSDLDefinition wsdlDef, - Definition newDef, - List<WSDLDefinition> imports) { - return addImport(portType.getQName(), PortType.class, wsdlDef, newDef, imports); - } - - private static boolean importBinding(Binding binding, - WSDLDefinition wsdlDef, - Definition newDef, - List<WSDLDefinition> imports) { - boolean ok = addImport(binding.getQName(), Binding.class, wsdlDef, newDef, imports); - if (ok) { - List bindingExtensions = binding.getExtensibilityElements(); - for (final Object extension : bindingExtensions) { - if (extension instanceof SOAPBinding) { - newDef.addNamespace("SOAP11", "http://schemas.xmlsoap.org/wsdl/soap/"); - } - if (extension instanceof SOAP12Binding) { - newDef.addNamespace("SOAP12", "http://schemas.xmlsoap.org/wsdl/soap12/"); - } - } - } - return ok; - } - - private static boolean addImport(QName name, - Class type, - WSDLDefinition wsdlDef, - Definition newDef, - List<WSDLDefinition> imports) { - String namespace = name.getNamespaceURI(); - if (newDef.getImports(namespace) == null) { - WSDLDefinition impDef = findDefinition(wsdlDef, name, type); - if (impDef != null) { - Import imp = newDef.createImport(); - imp.setNamespaceURI(namespace); - imp.setLocationURI(impDef.getURI().toString()); - imp.setDefinition(impDef.getDefinition()); - newDef.addNamespace("ns" + imports.size(), namespace); - newDef.addImport(imp); - imports.add(impDef); - return true; - } else { - // import was not added because element not found - return false; - } - } - return true; - } - - private static WSDLDefinition findDefinition(WSDLDefinition wsdlDef, QName name, Class type) { - if (wsdlDef == null || name == null) { - return wsdlDef; - } - if (wsdlDef.getURI() != null) { // not a facade - Definition def = wsdlDef.getDefinition(); - Map types = type == PortType.class ? def.getPortTypes() : def.getBindings(); - if (types.get(name) != null) { - return wsdlDef; - } - } - for (WSDLDefinition impDef : wsdlDef.getImportedDefinitions()) { - WSDLDefinition d = findDefinition(impDef, name, type); - if (d != null) { - return d; - } - } - return null; - } - - private static Port copyPort(Definition def, Port port, WebServiceBinding wsBinding) { - Port newPort = def.createPort(); - newPort.setName(port.getName()); - newPort.setBinding(port.getBinding()); - List portExtensions = port.getExtensibilityElements(); - for (final Object extension : portExtensions) { - ExtensibilityElement newExt = null; - if (extension instanceof SOAPAddress) { - def.addNamespace("SOAP11", "http://schemas.xmlsoap.org/wsdl/soap/"); - try { - newExt = def.getExtensionRegistry().createExtension( - Port.class, WSDLDefinitionGenerator.SOAP_ADDRESS); - } catch (WSDLException e) { - } - String uri = computeActualURI(wsBinding, port); - ((SOAPAddress)newExt).setLocationURI(uri); - newPort.addExtensibilityElement(newExt); - } else if (extension instanceof SOAP12Address) { - def.addNamespace("SOAP12", "http://schemas.xmlsoap.org/wsdl/soap12/"); - try { - newExt = def.getExtensionRegistry().createExtension( - Port.class, WSDLDefinitionGenerator.SOAP12_ADDRESS); - } catch (WSDLException e) { - } - String uri = computeActualURI(wsBinding, port); - ((SOAP12Address)newExt).setLocationURI(uri); - newPort.addExtensibilityElement(newExt); - } else { - // we don't support ports with other extensibility elements such as HTTPAddress - return null; - } - } - return newPort; - } - - /** - * Compute the endpoint URI based on section 2.1.1 of the WS binding Specification 1. - * The URIs in the endpoint(s) of the referenced WSDL, which may be relative - * 2. The URI specified by the wsa:Address element of the - * wsa:EndpointReference, which may be relative 3. The explicitly stated URI - * in the "uri" attribute of the binding.ws element, which may be relative, - * 4. The implicit URI as defined by in section 1.7 in the SCA Assembly Specification - * If the <binding.ws> has no wsdlElement but does have a uri attribute then - * the uri takes precedence over any implicitly used WSDL. - * - */ - private static String computeActualURI(WebServiceBinding wsBinding, Port port) { - - URI eprURI = null; - if (wsBinding.getEndPointReference() != null) { - eprURI = getEPR(wsBinding); - } - - URI wsdlURI = null; - if (wsBinding.getServiceName() != null && wsBinding.getBindingName() == null) { - // <binding.ws> explicitly points at a WSDL port, may be a relative URI - wsdlURI = getEndpoint(port); - } - - // if the WSDL port/endpoint has an absolute URI use that - if (wsdlURI != null && wsdlURI.isAbsolute()) { - return wsdlURI.toString(); - } - - // if the wsa:EndpointReference has an address element with an absolute URI use that - if (eprURI != null && eprURI.isAbsolute()) { - return eprURI.toString(); - } - - // either there is no WSDL port endpoint URI or that URI is relative - String actualURI = wsBinding.getURI(); - if (eprURI != null && eprURI.toString().length() != 0) { - // there is a relative URI in the binding EPR - actualURI = actualURI + "/" + eprURI; - } - - if (wsdlURI != null && wsdlURI.toString().length() != 0) { - // there is a relative URI in the WSDL port - actualURI = actualURI + "/" + wsdlURI; - } - - if (actualURI != null) { - actualURI = URI.create(actualURI).normalize().toString(); - } - - return actualURI; - } - - private static URI getEPR(WebServiceBinding wsBinding) { - NodeList nodeList = wsBinding.getEndPointReference().getChildNodes(); - for (int i = 0; i < nodeList.getLength(); i++) { - Node childNode = nodeList.item(i); - if (childNode instanceof Element && ADDRESS.equals(childNode.getLocalName())) { - NodeList addrNodes = childNode.getChildNodes(); - for (int j = 0; j < addrNodes.getLength(); j++) { - Node addrNode = addrNodes.item(j); - if (addrNode instanceof Text) { - return URI.create(((Text)addrNode).getWholeText()); - } - } - } - } - return null; - } - - /** - * Returns the endpoint of a given port. - */ - private static URI getEndpoint(Port wsdlPort) { - if (wsdlPort != null) { - List<?> wsdlPortExtensions = wsdlPort.getExtensibilityElements(); - for (Object extension : wsdlPortExtensions) { - if (extension instanceof SOAPAddress) { - String uri = ((SOAPAddress)extension).getLocationURI(); - return (uri == null || "".equals(uri)) ? null : URI.create(uri); - } - if (extension instanceof SOAP12Address) { - SOAP12Address address = (SOAP12Address)extension; - String uri = address.getLocationURI(); - return (uri == null || "".equals(uri)) ? null : URI.create(uri); - } - } - } - return null; - } - -} diff --git a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/resources/wsdlgen-validation-messages.properties b/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/resources/wsdlgen-validation-messages.properties deleted file mode 100644 index 4bfbdd2901..0000000000 --- a/branches/sca-java-1.5.2/modules/binding-ws-wsdlgen/src/main/resources/wsdlgen-validation-messages.properties +++ /dev/null @@ -1,31 +0,0 @@ -# -# -# 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. -# -# -WsdlGenProblem = Unable to generate WSDL for {0}/{1} -WsdlGenException = Exception while generating WSDL for {0}/{1} -UnexpectedException = Exception thrown was: {0} -MissingInterfaceContract = No interface contract for {0}/{1} -InterfaceNotRemotable = Interface not remotable: {0} -IgnoringPort = Port {0}/{1} in {2}/{3} is not supported and was ignored -PortTypeNotFound = PortType {0} in {1}/{2} was not found -BindingNotFound = Binding {0} in {1}/{2} was not found -InvalidPort = Port {0}/{1} in {2}/{3} is not supported -NoValidPorts = No valid ports for service {0} in {1}/{2} -NoWsdlInterface = No WSDL interface definition for {1}/{2} |