From 60744a36aae604ac3c4499ed54f1082ab8f5947d Mon Sep 17 00:00:00 2001 From: lresende Date: Wed, 19 Nov 2008 00:10:54 +0000 Subject: Copying modules from Equinox branch, to start merging the delta changes from 1.x/original trunk git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@718815 13f79535-47bb-0310-9956-ffa450edef68 --- java/sca/modules/interface-wsdl/LICENSE | 205 +++++++ .../modules/interface-wsdl/META-INF/MANIFEST.MF | 36 ++ java/sca/modules/interface-wsdl/NOTICE | 6 + java/sca/modules/interface-wsdl/pom.xml | 84 +++ .../interfacedef/wsdl/BPELPartnerLinkTypeExt.java | 79 +++ .../sca/interfacedef/wsdl/DefaultWSDLFactory.java | 35 ++ .../sca/interfacedef/wsdl/WSDLDefinition.java | 140 +++++ .../tuscany/sca/interfacedef/wsdl/WSDLFactory.java | 70 +++ .../sca/interfacedef/wsdl/WSDLInterface.java | 67 +++ .../interfacedef/wsdl/WSDLInterfaceContract.java | 43 ++ .../tuscany/sca/interfacedef/wsdl/WSDLObject.java | 54 ++ .../sca/interfacedef/wsdl/WSDLOperation.java | 40 ++ .../wsdl/impl/InvalidWSDLException.java | 35 ++ .../interfacedef/wsdl/impl/WSDLDefinitionImpl.java | 284 ++++++++++ .../interfacedef/wsdl/impl/WSDLFactoryImpl.java | 75 +++ .../wsdl/impl/WSDLInterfaceContractImpl.java | 47 ++ .../interfacedef/wsdl/impl/WSDLInterfaceImpl.java | 99 ++++ .../wsdl/impl/WSDLInterfaceIntrospectorImpl.java | 159 ++++++ .../sca/interfacedef/wsdl/impl/WSDLObjectImpl.java | 61 +++ .../interfacedef/wsdl/impl/WSDLOperationImpl.java | 81 +++ .../wsdl/impl/WSDLOperationIntrospectorImpl.java | 602 +++++++++++++++++++++ ...pache.tuscany.sca.interfacedef.wsdl.WSDLFactory | 18 + .../interfacedef/wsdl/AbstractWSDLTestCase.java | 68 +++ .../WSDLInterfaceIntrospectorTestCase.java | 83 +++ .../WSDLOperationIntrospectorTestCase.java | 117 ++++ ...licyAnnotatedInterfaceIntrospectorTestCase.java | 87 +++ .../introspect/WrapperStyleOperationTestCase.java | 70 +++ 27 files changed, 2745 insertions(+) create mode 100644 java/sca/modules/interface-wsdl/LICENSE create mode 100644 java/sca/modules/interface-wsdl/META-INF/MANIFEST.MF create mode 100644 java/sca/modules/interface-wsdl/NOTICE create mode 100644 java/sca/modules/interface-wsdl/pom.xml create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/BPELPartnerLinkTypeExt.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/DefaultWSDLFactory.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLDefinition.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLFactory.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLInterface.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLInterfaceContract.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLObject.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLOperation.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/InvalidWSDLException.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLDefinitionImpl.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLFactoryImpl.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceContractImpl.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceImpl.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLObjectImpl.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLOperationImpl.java create mode 100644 java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLOperationIntrospectorImpl.java create mode 100644 java/sca/modules/interface-wsdl/src/main/resources/META-INF/services/org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory create mode 100644 java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/AbstractWSDLTestCase.java create mode 100644 java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLInterfaceIntrospectorTestCase.java create mode 100644 java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLOperationIntrospectorTestCase.java create mode 100644 java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLPolicyAnnotatedInterfaceIntrospectorTestCase.java create mode 100644 java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WrapperStyleOperationTestCase.java (limited to 'java/sca/modules/interface-wsdl') diff --git a/java/sca/modules/interface-wsdl/LICENSE b/java/sca/modules/interface-wsdl/LICENSE new file mode 100644 index 0000000000..8aa906c321 --- /dev/null +++ b/java/sca/modules/interface-wsdl/LICENSE @@ -0,0 +1,205 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. + + + diff --git a/java/sca/modules/interface-wsdl/META-INF/MANIFEST.MF b/java/sca/modules/interface-wsdl/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..0719e71d94 --- /dev/null +++ b/java/sca/modules/interface-wsdl/META-INF/MANIFEST.MF @@ -0,0 +1,36 @@ +Manifest-Version: 1.0 +Export-Package: org.apache.tuscany.sca.interfacedef.wsdl;uses:="org.ap + ache.ws.commons.schema,org.apache.tuscany.sca.assembly,org.apache.tus + cany.sca.contribution.resolver,javax.wsdl.extensions,org.apache.tusca + ny.sca.core,org.apache.tuscany.sca.interfacedef,javax.wsdl,javax.xml. + namespace";version="1.4" +Private-Package: org.apache.tuscany.sca.interfacedef.wsdl.impl;version + ="1.4" +Tool: Bnd-0.0.255 +Bundle-Name: Apache Tuscany SCA WSDL Interface Model +Created-By: 1.6.0_07 (Sun Microsystems Inc.) +Bundle-Vendor: The Apache Software Foundation +Bundle-Version: 1.4 +Bnd-LastModified: 1225397282593 +Bundle-ManifestVersion: 2 +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-Description: Apache Tuscany SCA WSDL Interface Model +Import-Package: javax.wsdl, + javax.wsdl.extensions, + javax.xml.namespace, + org.apache.tuscany.sca.assembly;version="1.4", + org.apache.tuscany.sca.contribution;version="1.4.0";resolution:=optional, + org.apache.tuscany.sca.contribution.processor;version="1.4.0";resolution:=optional, + org.apache.tuscany.sca.contribution.resolver;version="1.4", + org.apache.tuscany.sca.core;version="1.4", + org.apache.tuscany.sca.interfacedef;version="1.4", + org.apache.tuscany.sca.interfacedef.impl;version="1.4", + org.apache.tuscany.sca.interfacedef.util;version="1.4", + org.apache.tuscany.sca.interfacedef.wsdl;version="1.4", + org.apache.tuscany.sca.monitor;version="1.4.0";resolution:=optional, + org.apache.tuscany.sca.policy;version="1.4", + org.apache.tuscany.sca.xsd;version="1.4", + org.apache.ws.commons.schema +Bundle-SymbolicName: org.apache.tuscany.sca.interface.wsdl +Bundle-DocURL: http://www.apache.org/ + diff --git a/java/sca/modules/interface-wsdl/NOTICE b/java/sca/modules/interface-wsdl/NOTICE new file mode 100644 index 0000000000..fdfa0e9faa --- /dev/null +++ b/java/sca/modules/interface-wsdl/NOTICE @@ -0,0 +1,6 @@ +${pom.name} +Copyright (c) 2005 - 2008 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + diff --git a/java/sca/modules/interface-wsdl/pom.xml b/java/sca/modules/interface-wsdl/pom.xml new file mode 100644 index 0000000000..47a2203743 --- /dev/null +++ b/java/sca/modules/interface-wsdl/pom.xml @@ -0,0 +1,84 @@ + + + + 4.0.0 + + org.apache.tuscany.sca + tuscany-modules + 1.4-EQUINOX-SNAPSHOT + ../pom.xml + + tuscany-interface-wsdl + Apache Tuscany SCA WSDL Interface Model + + + + org.apache.tuscany.sca + tuscany-interface + 1.4-EQUINOX-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-xsd + 1.4-EQUINOX-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-contribution + 1.4-EQUINOX-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-policy + 1.4-EQUINOX-SNAPSHOT + + + + org.apache.ws.commons.schema + XmlSchema + 1.4.2 + + + + wsdl4j + wsdl4j + 1.6.2 + + + + + + + apache.ws.zone + Apache WS Zone Repository + http://ws.zones.apache.org/repository2 + + true + + + false + + + + + diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/BPELPartnerLinkTypeExt.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/BPELPartnerLinkTypeExt.java new file mode 100644 index 0000000000..0d6f23e732 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/BPELPartnerLinkTypeExt.java @@ -0,0 +1,79 @@ +/* + * 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.interfacedef.wsdl; + +import javax.wsdl.extensions.ExtensibilityElement; +import javax.xml.namespace.QName; + +/** + * A class to serve as the extensibility element for BPEL partnerLinkType elements + * + * @version $Rev$ $Date$ + */ +public class BPELPartnerLinkTypeExt implements ExtensibilityElement { + + private QName elementType = null; + private String linkTypeName = null; + private String[] roleNames = new String[2]; + private QName[] rolePortTypes = new QName[2]; + + // -- methods required by the Extensibility Element interface + public QName getElementType() { + return elementType; + } + + public Boolean getRequired() { + return true; + } + + public void setElementType(QName theName ) { + elementType = theName; + } + + public void setRequired(Boolean required) { + // intentionally left blank + } + + // -- other methods + + public void setName( String theName ) { + linkTypeName = theName; + } + + public String getName() { + return linkTypeName; + } + + public void setRole( int i, String name, QName portType ) { + if( i > 1 ) return; + roleNames[i] = name; + rolePortTypes[i] = portType; + } + + public String getRoleName( int i ) { + if( i > 1 ) return null; + return roleNames[i]; + } + + public QName getRolePortType( int i ) { + if( i > 1 ) return null; + return rolePortTypes[i]; + } + +} // end BPELPartnerLinkTypeExt diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/DefaultWSDLFactory.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/DefaultWSDLFactory.java new file mode 100644 index 0000000000..8d571a4404 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/DefaultWSDLFactory.java @@ -0,0 +1,35 @@ +/* + * 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.interfacedef.wsdl; + +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.interfacedef.wsdl.impl.WSDLFactoryImpl; + +/** + * A factory for the WSDL model. + * + * @version $Rev$ $Date$ + */ +public class DefaultWSDLFactory extends WSDLFactoryImpl implements WSDLFactory { + + public DefaultWSDLFactory(FactoryExtensionPoint modelFactories) { + super(modelFactories); + } + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLDefinition.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLDefinition.java new file mode 100644 index 0000000000..039e75f437 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLDefinition.java @@ -0,0 +1,140 @@ +/* + * 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.interfacedef.wsdl; + +import java.net.URI; +import java.util.List; + +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.WSDLElement; +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.assembly.Base; +import org.apache.tuscany.sca.xsd.XSDefinition; +import org.apache.ws.commons.schema.XmlSchemaElement; +import org.apache.ws.commons.schema.XmlSchemaType; + +/** + * Represents a WSDL definition. + * WSDLDefinition + * + * @version $Rev$ $Date$ + */ +public interface WSDLDefinition extends Base { + + /** + * Returns the WSDL definition model, if there are more than one WSDL definition under the + * same namespace, the definition will be a facade which imports all the physical WSDL + * definitions + * + * @return the WSDL definition model + */ + Definition getDefinition(); + + /** + * Sets the WSDL definition model + * @param definition the WSDL definition model + */ + void setDefinition(Definition definition); + + /** + * Returns the namespace of this WSDL definition. + * @return the namespace of this WSDL definition + */ + String getNamespace(); + + /** + * Sets the namespace of this WSDL definition. + * @param namespace the namespace of this WSDL definition + */ + void setNamespace(String namespace); + + /** + * Get a list of inline XML schema definitions + * @return A list of inline XML schema definitions + */ + List getXmlSchemas(); + + /** + * Get the location of the WSDL file + * @return The location of the WSDL file + */ + URI getLocation(); + + /** + * Set the location of the WSDL file + * @param url + */ + void setLocation(URI url); + + /** + * Get the contribution artifact URI of the WSDL document + * @return The URI of the WSDL document + */ + URI getURI(); + + /** + * Set the contribution artifact URI of the WSDL document + * @param uri + */ + void setURI(URI uri); + + /** + * Get the WSDL definitions imported by this definition + * @return A list of imported WSDL definitions + */ + List getImportedDefinitions(); + + /** + * Get an XSD element by QName + * @param name + * @return + */ + XmlSchemaElement getXmlSchemaElement(QName name); + + /** + * Get an XSD type by QName + * @param name + * @return + */ + XmlSchemaType getXmlSchemaType(QName name); + + /** + * Get the WSDL object by type and name + * @param + * @param type javax.wsdl.Service/PortType/Binding/Message.class + * @param name The QName of the object + * @return WSDLObject + */ + WSDLObject getWSDLObject(Class type, QName name); + + /** + * Get the generated binding for a WSDLDefinition + * @return the WSDL binding + */ + Binding getBinding(); + + /** + * Set the generated binding for a WSDLDefinition + * @param binding the WSDL binding + */ + void setBinding(Binding binding); +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLFactory.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLFactory.java new file mode 100644 index 0000000000..95985dcc28 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLFactory.java @@ -0,0 +1,70 @@ +/* + * 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.interfacedef.wsdl; + +import javax.wsdl.PortType; + +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; + +/** + * Factory for the WSDL model. + * + * @version $Rev$ $Date$ + */ +public interface WSDLFactory { + + /** + * Creates a new WSDL interface. + * + * @return a new WSDL interface + */ + WSDLInterface createWSDLInterface(); + + /** + * Creates a new WSDL interface from a WSDL portType. + * + * @param portType the portType to inspect + * @return a WSDLInterface corresponding to the WSDL portType + */ + WSDLInterface createWSDLInterface(PortType portType, WSDLDefinition wsdlDefinition, ModelResolver resolver) throws InvalidInterfaceException; + + /** + * Creates the contents of a WSDL interface from a WSDL portType. + * + * @param portType the portType to inspect + * @return a WSDLInterface corresponding to the WSDL portType + */ + void createWSDLInterface(WSDLInterface wsdlInterface, PortType portType, WSDLDefinition wsdlDefinition, ModelResolver resolver) throws InvalidInterfaceException; + + /** + * Creates a new WSDL definition. + * + * @return a new WSDL definition + */ + WSDLDefinition createWSDLDefinition(); + + /** + * Creates a new WSDL interface contract. + * + * @return + */ + WSDLInterfaceContract createWSDLInterfaceContract(); + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLInterface.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLInterface.java new file mode 100644 index 0000000000..c0da060af2 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLInterface.java @@ -0,0 +1,67 @@ +/* + * 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.interfacedef.wsdl; + +import javax.wsdl.PortType; +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.assembly.Base; +import org.apache.tuscany.sca.interfacedef.Interface; + + +/** + * Represents a WSDL interface. + * + * @version $Rev$ $Date$ + */ +public interface WSDLInterface extends Interface, Base { + + /** + * Returns the name of the WSDL interface. + * + * @return the name of the WSDL interface + */ + QName getName(); + + /** + * Sets the name of the WSDL interface. + * + * @param interfaceName the name of the WSDL interface + */ + void setName(QName interfaceName); + + /** + * Returns the WSDL interface portType. + * + * @return the WSDL interface portType + */ + PortType getPortType(); + + /** + * Sets the WSDL interface portType + * + * @param portType the WSDL interface portType + */ + void setPortType(PortType portType); + + WSDLDefinition getWsdlDefinition(); + + void setWsdlDefinition(WSDLDefinition wsdlDefinition); + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLInterfaceContract.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLInterfaceContract.java new file mode 100644 index 0000000000..59db17116b --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLInterfaceContract.java @@ -0,0 +1,43 @@ +/* + * 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.interfacedef.wsdl; + +import org.apache.tuscany.sca.interfacedef.InterfaceContract; + + +/** + * Represents a WSDL interface contract. + * + * @version $Rev$ $Date$ + */ +public interface WSDLInterfaceContract extends InterfaceContract { + + /** + * Sets the WSDL location. + * @param location the WSDL location + */ + void setLocation(String location); + + /** + * Returns the WSDL location + * @return the WSDL location + */ + String getLocation(); + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLObject.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLObject.java new file mode 100644 index 0000000000..0b707163da --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLObject.java @@ -0,0 +1,54 @@ +/* + * 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.interfacedef.wsdl; + +import java.io.Serializable; + +import javax.wsdl.Definition; + +/** + * Model for objects in a WSDL definition + * @version $Rev$ $Date$ + */ +public interface WSDLObject { + /** + * Get the owning definition where the element is declared + * @return The owning definition + */ + Definition getDefinition(); + + /** + * Set the owning definition + * @param definition + */ + void setDefinition(Definition definition); + + /** + * Get the WSDL element such as Service, PortType, Binding or Message + * @return The WSDL element + */ + T getElement(); + + /** + * Set the WSDL element + * @param element + */ + void setElement(T element); +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLOperation.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLOperation.java new file mode 100644 index 0000000000..d73cccb714 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/WSDLOperation.java @@ -0,0 +1,40 @@ +/* + * 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.interfacedef.wsdl; + +import org.apache.tuscany.sca.interfacedef.Operation; + +/** + * WSDL 1.1 Operation + * @version $Rev$ $Date$ + */ +public interface WSDLOperation extends Operation { + /** + * Get the underlying WSDL operation + * @return + */ + javax.wsdl.Operation getWsdlOperation(); + + /** + * Set the underlying WSDL operation + * @param operation + */ + void setWsdlOperation(javax.wsdl.Operation operation); +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/InvalidWSDLException.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/InvalidWSDLException.java new file mode 100644 index 0000000000..1e7b4faa32 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/InvalidWSDLException.java @@ -0,0 +1,35 @@ +/* + * 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.interfacedef.wsdl.impl; + +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; + +/** + * An exception to indicate the WSDL definition is invalid + * + * @version $Rev$ $Date$ + */ +public class InvalidWSDLException extends InvalidInterfaceException { + private static final long serialVersionUID = 3742887584293256519L; + + public InvalidWSDLException(String message) { + super(message); + } +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLDefinitionImpl.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLDefinitionImpl.java new file mode 100644 index 0000000000..82a7aa1200 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLDefinitionImpl.java @@ -0,0 +1,284 @@ +/* + * 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.interfacedef.wsdl.impl; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Import; +import javax.wsdl.Message; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.wsdl.WSDLElement; +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLObject; +import org.apache.tuscany.sca.xsd.XSDefinition; +import org.apache.ws.commons.schema.XmlSchemaCollection; +import org.apache.ws.commons.schema.XmlSchemaElement; +import org.apache.ws.commons.schema.XmlSchemaType; + +/** + * Represents a WSDL definition. + * + * @version $Rev$ $Date$ + */ +public class WSDLDefinitionImpl implements WSDLDefinition { + + private Definition definition; + private String namespace; + private URI location; + private URI uri; + private List imported = new ArrayList(); + private List schemas = new ArrayList(); + private boolean unresolved; + private Binding binding; + + protected WSDLDefinitionImpl() { + } + + public Definition getDefinition() { + return definition; + } + + public void setDefinition(Definition definition) { + this.definition = definition; + } + + public boolean isUnresolved() { + return unresolved; + } + + public void setUnresolved(boolean undefined) { + this.unresolved = undefined; + } + + public String getNamespace() { + if (isUnresolved()) { + return namespace; + } else if (definition != null) { + return definition.getTargetNamespace(); + } else { + return namespace; + } + } + + public void setNamespace(String namespace) { + if (!isUnresolved()) { + throw new IllegalStateException(); + } else { + this.namespace = namespace; + } + } + + /* + @Override + public int hashCode() { + return String.valueOf(getNamespace()).hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } else if (obj instanceof WSDLDefinition) { + WSDLDefinition def = (WSDLDefinition)obj; + if (getNamespace() != null) { + return getNamespace().equals(def.getNamespace()); + } else { + return def.getNamespace() == null; + } + } else { + return false; + } + } + */ + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition#getXmlSchemas() + */ + public List getXmlSchemas() { + return schemas; + } + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition#getLocation() + */ + public URI getLocation() { + return location; + } + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition#setLocation(java.net.URI) + */ + public void setLocation(URI url) { + this.location = url; + } + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition#getURI() + */ + public URI getURI() { + return uri; + } + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition#setURI(java.net.URI) + */ + public void setURI(URI uri) { + this.uri = uri; + } + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition#getImportedDefinitions() + */ + public List getImportedDefinitions() { + return imported; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((location == null) ? 0 : location.hashCode()); + result = prime * result + ((namespace == null) ? 0 : namespace.hashCode()); + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof WSDLDefinitionImpl)) + return false; + final WSDLDefinitionImpl other = (WSDLDefinitionImpl)obj; + if (location == null) { + if (other.location != null) + return false; + } else if (!location.equals(other.location)) + return false; + if (namespace == null) { + if (other.namespace != null) + return false; + } else if (!namespace.equals(other.namespace)) + return false; + return true; + } + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition#getXmlSchemaElement(javax.xml.namespace.QName) + */ + public XmlSchemaElement getXmlSchemaElement(QName name) { + XmlSchemaCollection schemaCollection = null; + for (XSDefinition xsd : schemas) { + if (schemaCollection == null && xsd.getSchemaCollection() != null) { + schemaCollection = xsd.getSchemaCollection(); + } + XmlSchemaElement element = xsd.getXmlSchemaElement(name); + if (element != null) { + return element; + } + } + if (schemaCollection != null) { + return schemaCollection.getElementByQName(name); + } + return null; + } + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition#getXmlSchemaType(javax.xml.namespace.QName) + */ + public XmlSchemaType getXmlSchemaType(QName name) { + XmlSchemaCollection schemaCollection = null; + for (XSDefinition xsd : schemas) { + if (xsd.getSchemaCollection() != null) { + schemaCollection = xsd.getSchemaCollection(); + } + XmlSchemaType type = xsd.getXmlSchemaType(name); + if (type != null) { + return type; + } + } + if (schemaCollection != null) { + return schemaCollection.getTypeByQName(name); + } + return null; + } + + @SuppressWarnings("unchecked") + private static WSDLObject getWSDLObject(Definition definition, Class type, QName name) { + if (definition == null) { + return null; + } + Map map = null; + if (type == PortType.class) { + map = definition.getPortTypes(); + } else if (type == Service.class) { + map = definition.getServices(); + } else if (type == Binding.class) { + map = definition.getBindings(); + } else if (type == Message.class) { + map = definition.getMessages(); + } else { + throw new IllegalArgumentException("Invalid type: " + type.getName()); + } + if (map.containsKey(name)) { + return (WSDLObject)new WSDLObjectImpl(definition, map.get(name)); + } else { + for (Object imports : definition.getImports().values()) { + List importList = (List)imports; + for (Import i : importList) { + definition = i.getDefinition(); + WSDLObject element = getWSDLObject(definition, type, name); + if (element != null) { + return element; + } + } + } + } + return null; + } + + public WSDLObject getWSDLObject(Class type, QName name) { + return getWSDLObject(definition, type, name); + } + + public Binding getBinding() { + return binding; + } + + public void setBinding(Binding binding) { + this.binding = binding; + } + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLFactoryImpl.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLFactoryImpl.java new file mode 100644 index 0000000000..883b6b1567 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLFactoryImpl.java @@ -0,0 +1,75 @@ +/* + * 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.interfacedef.wsdl.impl; + +import javax.wsdl.PortType; + +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; +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; + +/** + * A factory for the WSDL model. + * + * @version $Rev$ $Date$ + */ +public abstract class WSDLFactoryImpl implements WSDLFactory { + + private WSDLInterfaceIntrospectorImpl introspector; + + public WSDLFactoryImpl(FactoryExtensionPoint modelFactories) { + introspector = new WSDLInterfaceIntrospectorImpl(modelFactories); + } + + public WSDLInterface createWSDLInterface() { + return new WSDLInterfaceImpl(); + } + + public WSDLInterface createWSDLInterface(PortType portType, + WSDLDefinition wsdlDefinition, + ModelResolver resolver) throws InvalidInterfaceException { + WSDLInterface wsdlInterface = createWSDLInterface(); + introspector.introspectPortType(wsdlInterface, portType, wsdlDefinition, resolver); + return wsdlInterface; + } + + public void createWSDLInterface(WSDLInterface wsdlInterface, + PortType portType, + WSDLDefinition wsdlDefinition, + ModelResolver resolver) throws InvalidInterfaceException { + introspector.introspectPortType(wsdlInterface, portType, wsdlDefinition, resolver); + } + + public WSDLDefinition createWSDLDefinition() { + return new WSDLDefinitionImpl(); + } + + public WSDLInterfaceContract createWSDLInterfaceContract() { + return new WSDLInterfaceContractImpl(); + } + + public WSDLInterfaceIntrospectorImpl getWSDLInterfaceIntrospector() { + return introspector; + } + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceContractImpl.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceContractImpl.java new file mode 100644 index 0000000000..e10bc0d178 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceContractImpl.java @@ -0,0 +1,47 @@ +/* + * 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.interfacedef.wsdl.impl; + +import org.apache.tuscany.sca.interfacedef.impl.InterfaceContractImpl; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract; + +/** + * Represents a WSDL interface contract. + * + * @version $Rev$ $Date$ + */ +public class WSDLInterfaceContractImpl extends InterfaceContractImpl implements WSDLInterfaceContract { + private String location; + + protected WSDLInterfaceContractImpl() { + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + @Override + public WSDLInterfaceContractImpl clone() throws CloneNotSupportedException { + return (WSDLInterfaceContractImpl) super.clone(); + } +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceImpl.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceImpl.java new file mode 100644 index 0000000000..3719bbd79a --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceImpl.java @@ -0,0 +1,99 @@ +/* + * 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.interfacedef.wsdl.impl; + +import javax.wsdl.PortType; +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.interfacedef.impl.InterfaceImpl; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; + +/** + * Represents a WSDL interface. + * + * @version $Rev$ $Date$ + */ +public class WSDLInterfaceImpl extends InterfaceImpl implements WSDLInterface { + + private QName name; + private PortType portType; + private WSDLDefinition wsdlDefinition; + + protected WSDLInterfaceImpl() { + setRemotable(true); + } + + public QName getName() { + if (isUnresolved()) { + return name; + } else { + return portType.getQName(); + } + } + + public void setName(QName interfaceName) { + if (!isUnresolved()) { + throw new IllegalStateException(); + } + this.name = interfaceName; + } + + public PortType getPortType() { + return portType; + } + + public void setPortType(PortType portType) { + this.portType = portType; + } + + @Override + public int hashCode() { + return String.valueOf(getName()).hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } else if (obj instanceof WSDLInterface) { + if (getName() != null) { + return getName().equals(((WSDLInterface)obj).getName()); + } else { + return ((WSDLInterface)obj).getName() == null; + } + } else { + return false; + } + } + + public WSDLDefinition getWsdlDefinition() { + return wsdlDefinition; + } + + public void setWsdlDefinition(WSDLDefinition wsdlDefinition) { + this.wsdlDefinition = wsdlDefinition; + } + + @Override + public WSDLInterfaceImpl clone() throws CloneNotSupportedException { + return (WSDLInterfaceImpl) super.clone(); + } + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java new file mode 100644 index 0000000000..377f7b307d --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java @@ -0,0 +1,159 @@ +/* + * 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.interfacedef.wsdl.impl; + +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Vector; + +import javax.wsdl.PortType; +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.interfacedef.ConversationSequence; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; +import org.apache.tuscany.sca.policy.Intent; +import org.apache.tuscany.sca.policy.PolicyFactory; +import org.apache.tuscany.sca.xsd.XSDFactory; + +/** + * Introspector for creating WSDLInterface definitions from WSDL PortTypes. + * + * @version $Rev$ $Date$ + */ +public class WSDLInterfaceIntrospectorImpl { + private static final QName POLICY_REQUIRES = new QName("http://www.osoa.org/xmlns/sca/1.0", "requires"); + private static final QName POLICY_CONVERSATIONAL = new QName("http://www.osoa.org/xmlns/sca/1.0", "conversational"); + public static final QName POLICY_END_CONVERSATION = new QName("http://www.osoa.org/xmlns/sca/1.0", "endsConversation"); + + private XSDFactory xsdFactory; + private PolicyFactory policyFactory; + + public WSDLInterfaceIntrospectorImpl(FactoryExtensionPoint modelFactories) { + this.xsdFactory = modelFactories.getFactory(XSDFactory.class);; + this.policyFactory = modelFactories.getFactory(PolicyFactory.class);; + } + + // FIXME: Do we want to deal with document-literal wrapped style based on the JAX-WS Specification? + private List introspectOperations(PortType portType, WSDLDefinition wsdlDefinition, ModelResolver resolver) throws InvalidWSDLException { + List operations = new ArrayList(); + for (Object o : portType.getOperations()) { + javax.wsdl.Operation wsdlOp = (javax.wsdl.Operation)o; + Operation operation = getOperation(wsdlOp, wsdlDefinition, resolver, xsdFactory); + if(isEndConversation(wsdlOp)) { + operation.setConversationSequence(ConversationSequence.CONVERSATION_END); + } + operations.add(operation); + } + return operations; + } + + public void introspectPortType(WSDLInterface wsdlInterface, PortType portType, WSDLDefinition wsdlDefinition, ModelResolver resolver) throws InvalidWSDLException { + processIntents(wsdlInterface, portType); + wsdlInterface.setPortType(portType); + wsdlInterface.getOperations().addAll(introspectOperations(portType, wsdlDefinition, resolver)); + wsdlInterface.setConversational(isConversational(portType)); + } + + public static Operation getOperation(javax.wsdl.Operation wsdlOp, + WSDLDefinition wsdlDefinition, + ModelResolver resolver, + XSDFactory xsdFactory) throws InvalidWSDLException { + WSDLOperationIntrospectorImpl op = new WSDLOperationIntrospectorImpl(xsdFactory, wsdlOp, wsdlDefinition, null, resolver); + return op.getOperation(); + } + + private void processIntents(WSDLInterface wsdlInterface, PortType portType) { + Object o; + try { + o = portType.getExtensionAttribute(POLICY_REQUIRES); + } catch (NoSuchMethodError e) { + // That method does not exist on older WSDL4J levels + o = null; + } + if(o != null && o instanceof Vector) { + Vector policyAttributes = (Vector) o; + + Enumeration policyItents = policyAttributes.elements(); + while(policyItents.hasMoreElements()) { + QName intentName = policyItents.nextElement(); + + //ignores conversational, as it will have it's own + //attribute in the wsdl interface model + if(! intentName.equals(POLICY_CONVERSATIONAL)) { + //process the intent + System.out.println(">>> Intent : " + intentName); + + // Add each intent to the list + Intent intent = policyFactory.createIntent(); + intent.setName(intentName); + + wsdlInterface.getRequiredIntents().add(intent); + } + } + + } + } + + private boolean isConversational(PortType portType) { + boolean conversational = false; + + Object o; + try { + o = portType.getExtensionAttribute(POLICY_REQUIRES); + } catch (NoSuchMethodError e) { + // That method does not exist on older WSDL4J levels + o =null; + } + if(o != null && o instanceof Vector) { + Vector policyAttributes = (Vector) o; + + if(policyAttributes.contains(POLICY_CONVERSATIONAL)) { + return true; + } + + } + + return conversational; + } + + private boolean isEndConversation(javax.wsdl.Operation operation) { + boolean endConversation = false; + + Object o; + try { + o = operation.getExtensionAttribute(POLICY_END_CONVERSATION); + } catch (NoSuchMethodError e) { + // That method does not exist on older WSDL4J levels + o = null; + } + if(o != null && o instanceof String) { + endConversation = Boolean.valueOf((String)o); + } + + return endConversation; + + } + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLObjectImpl.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLObjectImpl.java new file mode 100644 index 0000000000..f18eaef27b --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLObjectImpl.java @@ -0,0 +1,61 @@ +/* + * 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.interfacedef.wsdl.impl; + +import java.io.Serializable; + +import javax.wsdl.Definition; + +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLObject; + +/** + * @version $Rev$ $Date$ + */ +public class WSDLObjectImpl implements WSDLObject { + private Definition definition; + private T element; + + public WSDLObjectImpl() { + super(); + } + + public WSDLObjectImpl(Definition definition, T element) { + super(); + this.definition = definition; + this.element = element; + } + + public Definition getDefinition() { + return definition; + } + + public void setDefinition(Definition definition) { + this.definition = definition; + } + + public T getElement() { + return element; + } + + public void setElement(T element) { + this.element = element; + } + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLOperationImpl.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLOperationImpl.java new file mode 100644 index 0000000000..317b9cce81 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLOperationImpl.java @@ -0,0 +1,81 @@ +/* + * 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.interfacedef.wsdl.impl; + +import javax.wsdl.Operation; + +import org.apache.tuscany.sca.interfacedef.impl.OperationImpl; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLOperation; + +/** + * @version $Rev$ $Date$ + */ +public class WSDLOperationImpl extends OperationImpl implements WSDLOperation { + private Operation operation; + + public WSDLOperationImpl() { + super(); + } + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLOperation#getWsdlOperation() + */ + public Operation getWsdlOperation() { + return operation; + } + + /** + * @see org.apache.tuscany.sca.interfacedef.wsdl.WSDLOperation#setWsdlOperation(javax.wsdl.Operation) + */ + public void setWsdlOperation(Operation operation) { + this.operation = operation; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((operation == null) ? 0 : operation.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + final WSDLOperationImpl other = (WSDLOperationImpl)obj; + if (operation == null) { + if (other.operation != null) + return false; + } else if (!operation.equals(other.operation)) + return false; + return true; + } + + @Override + public String toString() { + return operation == null ? null : operation.toString(); + } + +} diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLOperationIntrospectorImpl.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLOperationIntrospectorImpl.java new file mode 100644 index 0000000000..ab6467bfd7 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLOperationIntrospectorImpl.java @@ -0,0 +1,602 @@ +/* + * 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.interfacedef.wsdl.impl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.wsdl.Fault; +import javax.wsdl.Input; +import javax.wsdl.Message; +import javax.wsdl.Output; +import javax.wsdl.Part; +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.interfacedef.ConversationSequence; +import org.apache.tuscany.sca.interfacedef.DataType; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl; +import org.apache.tuscany.sca.interfacedef.util.ElementInfo; +import org.apache.tuscany.sca.interfacedef.util.FaultException; +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.WSDLOperation; +import org.apache.tuscany.sca.xsd.XSDefinition; +import org.apache.tuscany.sca.xsd.XSDFactory; + +import org.apache.ws.commons.schema.XmlSchemaComplexType; +import org.apache.ws.commons.schema.XmlSchemaElement; +import org.apache.ws.commons.schema.XmlSchemaObject; +import org.apache.ws.commons.schema.XmlSchemaObjectCollection; +import org.apache.ws.commons.schema.XmlSchemaParticle; +import org.apache.ws.commons.schema.XmlSchemaSequence; +import org.apache.ws.commons.schema.XmlSchemaSimpleType; +import org.apache.ws.commons.schema.XmlSchemaType; + +/** + * Metadata for a WSDL operation + * + * @version $Rev$ $Date$ + */ +public class WSDLOperationIntrospectorImpl { + private static final Logger logger = Logger.getLogger(WSDLOperationIntrospectorImpl.class.getName()); + private static final QName ANY = new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "any"); + + private XSDFactory xsdFactory; + private ModelResolver resolver; + private WSDLDefinition wsdlDefinition; + private javax.wsdl.Operation operation; + private WSDLOperation operationModel; + private DataType> inputType; + private DataType outputType; + private List faultTypes; + private String dataBinding; + + /** + * @param wsdlFactory The WSDLFactory to use + * @param operation The WSDL4J operation + * @param wsdlDefinition The WSDL Definition + * @param dataBinding The default databinding + * @param resolver The ModelResolver to use + */ + public WSDLOperationIntrospectorImpl(XSDFactory xsdFactory, + javax.wsdl.Operation operation, + WSDLDefinition wsdlDefinition, + String dataBinding, + ModelResolver resolver) { + super(); + this.xsdFactory = xsdFactory; + this.operation = operation; + this.wsdlDefinition = wsdlDefinition; + this.resolver = resolver; + this.dataBinding = dataBinding; + this.wrapper = new Wrapper(); + } + + private Wrapper wrapper; + + private Boolean wrapperStyle; + + /** + * Test if the operation qualifies wrapper style as defined by the JAX-WS + * 2.0 Specification + * + * @return true if the operation qualifies wrapper style, otherwise false + */ + public boolean isWrapperStyle() throws InvalidWSDLException { + if (wrapperStyle == null) { + wrapperStyle = + (operation.getInput() == null || operation.getInput().getMessage() == null + || operation.getInput().getMessage().getParts().size() == 0 || wrapper.getInputChildElements() != null) && (operation + .getOutput() == null || operation.getOutput().getMessage() == null + || operation.getOutput().getMessage().getParts().size() == 0 || wrapper.getOutputChildElements() != null); + } + return wrapperStyle; + } + + public Wrapper getWrapper() throws InvalidWSDLException { + if (!isWrapperStyle()) { + throw new IllegalStateException("The operation is not wrapper style."); + } else { + return wrapper; + } + } + + /** + * @return + * @throws InvalidServiceContractException + */ + public DataType> getInputType() throws InvalidWSDLException { + if (inputType == null) { + Input input = operation.getInput(); + Message message = (input == null) ? null : input.getMessage(); + inputType = getMessageType(message); + inputType.setDataBinding("idl:input"); + } + return inputType; + } + + /** + * @return + * @throws NotSupportedWSDLException + */ + @SuppressWarnings("unchecked") + public DataType getOutputType() throws InvalidWSDLException { + if (outputType == null) { + Output output = operation.getOutput(); + Message outputMsg = (output == null) ? null : output.getMessage(); + + List outputParts = (outputMsg == null) ? null : outputMsg.getOrderedParts(null); + if (outputParts != null && outputParts.size() > 0) { + if (outputParts.size() > 1) { + // We don't support output with multiple parts + if (logger.isLoggable(Level.WARNING)) { + logger.warning("Multi-part output is not supported, please use BARE parameter style."); + } + // throw new InvalidWSDLException("Multi-part output is not supported"); + } + Part part = (Part)outputParts.get(0); + outputType = new WSDLPart(part, Object.class).getDataType(); + // outputType.setMetadata(WSDLOperation.class.getName(), this); + } + } + return outputType; + } + + /** + * @return + * @throws NotSupportedWSDLException + */ + public List getFaultTypes() throws InvalidWSDLException { + if (faultTypes == null) { + Collection faults = operation.getFaults().values(); + faultTypes = new ArrayList(); + for (Object f : faults) { + Fault fault = (Fault)f; + Message faultMsg = fault.getMessage(); + List faultParts = faultMsg.getOrderedParts(null); + if (faultParts.size() != 1) { + throw new InvalidWSDLException("The fault message MUST have a single part"); + } + Part part = (Part)faultParts.get(0); + WSDLPart wsdlPart = new WSDLPart(part, Object.class); + faultTypes.add(new DataTypeImpl(FaultException.class, wsdlPart.getDataType())); + } + } + return faultTypes; + } + + private DataType> getMessageType(Message message) throws InvalidWSDLException { + List partTypes = new ArrayList(); + if (message != null) { + Collection parts = message.getOrderedParts(null); + for (Object p : parts) { + WSDLPart part = new WSDLPart((Part)p, Object.class); + DataType partType = part.getDataType(); + partTypes.add(partType); + } + } + return new DataTypeImpl>(dataBinding, Object[].class, partTypes); + } + + /** + * @return + * @throws NotSupportedWSDLException + */ + public Operation getOperation() throws InvalidWSDLException { + if (operationModel == null) { + boolean oneway = (operation.getOutput() == null); + operationModel = new WSDLOperationImpl(); + operationModel.setWsdlOperation(operation); + operationModel.setName(operation.getName()); + operationModel.setFaultTypes(getFaultTypes()); + operationModel.setNonBlocking(oneway); + operationModel.setConversationSequence(ConversationSequence.CONVERSATION_NONE); + operationModel.setInputType(getInputType()); + operationModel.setOutputType(getOutputType()); + + operationModel.setWrapperStyle(isWrapperStyle()); + if (isWrapperStyle()) { + WrapperInfo wrapperInfo = getWrapper().getWrapperInfo(); + operationModel.setWrapper(wrapperInfo); + } + } + return operationModel; + } + + private XmlSchemaElement getElement(QName elementName) { + + XmlSchemaElement element = wsdlDefinition.getXmlSchemaElement(elementName); + if (element == null) { + XSDefinition definition = xsdFactory.createXSDefinition(); + definition.setUnresolved(true); + definition.setNamespace(elementName.getNamespaceURI()); + definition = resolver.resolveModel(XSDefinition.class, definition); + if (definition.getSchema() != null) { + element = definition.getSchema().getElementByName(elementName); + } + } + return element; + } + + private XmlSchemaType getType(QName typeName) { + XmlSchemaType type = wsdlDefinition.getXmlSchemaType(typeName); + if (type == null) { + XSDefinition definition = xsdFactory.createXSDefinition(); + definition.setUnresolved(true); + definition.setNamespace(typeName.getNamespaceURI()); + definition = resolver.resolveModel(XSDefinition.class, definition); + if (definition.getSchema() != null) { + type = definition.getSchema().getTypeByName(typeName); + } + } + return type; + } + + /** + * Metadata for a WSDL part + */ + public class WSDLPart { + private Part part; + + private XmlSchemaElement element; + + private DataType dataType; + + public WSDLPart(Part part, Class javaType) throws InvalidWSDLException { + this.part = part; + QName elementName = part.getElementName(); + if (elementName != null) { + element = WSDLOperationIntrospectorImpl.this.getElement(elementName); + if (element == null) { + throw new InvalidWSDLException("Element cannot be resolved: " + elementName.toString()); + } + } else { + // Create an faked XSD element to host the metadata + element = new XmlSchemaElement(); + element.setName(part.getName()); + element.setQName(new QName(null, part.getName())); + QName typeName = part.getTypeName(); + if (typeName != null) { + XmlSchemaType type = WSDLOperationIntrospectorImpl.this.getType(typeName); + if (type == null) { + throw new InvalidWSDLException("Type cannot be resolved: " + typeName.toString()); + } + element.setSchemaType(type); + element.setSchemaTypeName(type.getQName()); + } + } + XMLType xmlType = new XMLType(getElementInfo(element)); + xmlType.setNillable(element.isNillable()); + xmlType.setMany(element.getMaxOccurs() > 1); + dataType = new DataTypeImpl(dataBinding, javaType, xmlType); + } + + /** + * @return the element + */ + public XmlSchemaElement getElement() { + return element; + } + + /** + * @return the part + */ + public Part getPart() { + return part; + } + + /** + * @return the dataType + */ + public DataType getDataType() { + return dataType; + } + } + + /** + * The "Wrapper Style" WSDL operation is defined by The Java API for + * XML-Based Web Services (JAX-WS) 2.0 specification, section 2.3.1.2 + * Wrapper Style.

A WSDL operation qualifies for wrapper style mapping + * only if the following criteria are met: + *

    + *
  • (i) The operation�s input and output messages (if present) each + * contain only a single part + *
  • (ii) The input message part refers to a global element declaration + * whose localname is equal to the operation name + *
  • (iii) The output message part refers to a global element declaration + *
  • (iv) The elements referred to by the input and output message parts + * (henceforth referred to as wrapper elements) are both complex types + * defined using the xsd:sequence compositor + *
  • (v) The wrapper elements only contain child elements, they must not + * contain other structures such as wildcards (element or attribute), + * xsd:choice, substitution groups (element references are not permitted) or + * attributes; furthermore, they must not be nillable. + *
+ */ + public class Wrapper { + private XmlSchemaElement inputWrapperElement; + + private XmlSchemaElement outputWrapperElement; + + private List inputElements; + + private List outputElements; + + // private DataType>> unwrappedInputType; + // + // private DataType unwrappedOutputType; + + private transient WrapperInfo wrapperInfo; + + private List getChildElements(XmlSchemaElement element) throws InvalidWSDLException { + if (element == null) { + return null; + } + if (element.isNillable()) { + // Wrapper element cannot be nillable + return null; + } + XmlSchemaType type = element.getSchemaType(); + if (type == null) { + String qName = element.getQName().toString(); + throw new InvalidWSDLException("The XML schema element does not have a type: " + qName); + } + if (!(type instanceof XmlSchemaComplexType)) { + // Has to be a complexType + return null; + } + XmlSchemaComplexType complexType = (XmlSchemaComplexType)type; + if (complexType.getAttributes().getCount() != 0 || complexType.getAnyAttribute() != null) { + // No attributes + return null; + } + XmlSchemaParticle particle = complexType.getParticle(); + if (particle == null) { + // No particle + return Collections.emptyList(); + } + if (!(particle instanceof XmlSchemaSequence)) { + return null; + } + XmlSchemaSequence sequence = (XmlSchemaSequence)complexType.getParticle(); + XmlSchemaObjectCollection items = sequence.getItems(); + List childElements = new ArrayList(); + for (int i = 0; i < items.getCount(); i++) { + XmlSchemaObject schemaObject = items.getItem(i); + if (!(schemaObject instanceof XmlSchemaElement)) { + // Should contain elements only + return null; + } + XmlSchemaElement childElement = (XmlSchemaElement)schemaObject; + /* + if (childElement.getSubstitutionGroup() != null) { + return null; + } + */ + if (childElement.getName() == null || childElement.getRefName() != null) { + XmlSchemaElement ref = getElement(childElement.getRefName()); + if (ref == null) { + throw new InvalidWSDLException("XML schema element ref cannot be resolved: " + childElement); + } + childElement = ref; + } + if (ANY.equals(childElement.getQName())) { + // Wildcard is not allowed + return null; + } + // TODO: Do we support maxOccurs >1 ? + if (childElement.getMaxOccurs() > 1) { + // TODO: [rfeng] To be implemented + /* + if(logger.isLoggable(Level.WARNING)) { + logger.warning("Support for elements with maxOccurs>1 is not implemented."); + } + */ + // return null; + } + childElements.add(childElement); + } + return childElements; + } + + /** + * Return a list of child XSD elements under the wrapped request element + * + * @return a list of child XSD elements or null if if the request + * element is not wrapped + */ + public List getInputChildElements() throws InvalidWSDLException { + if (inputElements != null) { + return inputElements; + } + Input input = operation.getInput(); + if (input != null) { + Message inputMsg = input.getMessage(); + Collection parts = inputMsg.getParts().values(); + if (parts.size() != 1) { + return null; + } + Part part = (Part)parts.iterator().next(); + QName elementName = part.getElementName(); + if (elementName == null) { + return null; + } + if (!operation.getName().equals(elementName.getLocalPart())) { + return null; + } + inputWrapperElement = getElement(elementName); + if (inputWrapperElement == null) { + throw new InvalidWSDLException("The element is not declared in a XML schema: " + elementName + .toString()); + } + if (inputWrapperElement.isNillable()) { + // The wrapper element cannot be nilable + return null; + } + inputElements = getChildElements(inputWrapperElement); + return inputElements; + } else { + return null; + } + } + + /** + * Return a list of child XSD elements under the wrapped response + * element + * + * @return a list of child XSD elements or null if if the response + * element is not wrapped + */ + public List getOutputChildElements() throws InvalidWSDLException { + if (outputElements != null) { + return outputElements; + } + Output output = operation.getOutput(); + if (output != null) { + Message outputMsg = output.getMessage(); + Collection parts = outputMsg.getParts().values(); + if (parts.size() != 1) { + return null; + } + Part part = (Part)parts.iterator().next(); + QName elementName = part.getElementName(); + if (elementName == null) { + throw new InvalidWSDLException("The element is not declared in the XML schema: " + part.getName()); + } + outputWrapperElement = WSDLOperationIntrospectorImpl.this.getElement(elementName); + if (outputWrapperElement == null) { + return null; + } + if (outputWrapperElement.isNillable()) { + // The wrapper element cannot be nilable + return null; + } + outputElements = getChildElements(outputWrapperElement); + // FIXME: Do we support multiple child elements for the response? + return outputElements; + } else { + return null; + } + } + + /** + * @return the inputWrapperElement + */ + public XmlSchemaElement getInputWrapperElement() { + return inputWrapperElement; + } + + /** + * @return the outputWrapperElement + */ + public XmlSchemaElement getOutputWrapperElement() { + return outputWrapperElement; + } + + /* + public DataType>> getUnwrappedInputType() throws InvalidWSDLException { + if (unwrappedInputType == null) { + List> childTypes = new ArrayList>(); + for (XmlSchemaElement element : getInputChildElements()) { + DataType type = + new DataType(dataBinding, Object.class, new XMLType(getElementInfo(element))); + // type.setMetadata(ElementInfo.class.getName(), getElementInfo(element)); + childTypes.add(type); + } + unwrappedInputType = + new DataType>>("idl:unwrapped.input", Object[].class, childTypes); + } + return unwrappedInputType; + } + + public DataType getUnwrappedOutputType() throws InvalidServiceContractException { + if (unwrappedOutputType == null) { + List elements = getOutputChildElements(); + if (elements != null && elements.size() > 0) { + if (elements.size() > 1) { + // We don't support output with multiple parts + throw new NotSupportedWSDLException("Multi-part output is not supported"); + } + XmlSchemaElement element = elements.get(0); + unwrappedOutputType = + new DataType(dataBinding, Object.class, new XMLType(getElementInfo(element))); + // unwrappedOutputType.setMetadata(ElementInfo.class.getName(), getElementInfo(element)); + } + } + return unwrappedOutputType; + } + */ + + public WrapperInfo getWrapperInfo() throws InvalidWSDLException { + if (wrapperInfo == null) { + ElementInfo in = getElementInfo(getInputWrapperElement()); + ElementInfo out = getElementInfo(getOutputWrapperElement()); + List inChildren = new ArrayList(); + if (in != null) { + for (XmlSchemaElement e : getInputChildElements()) { + inChildren.add(getElementInfo(e)); + } + } + List outChildren = new ArrayList(); + if (out != null) { + for (XmlSchemaElement e : getOutputChildElements()) { + outChildren.add(getElementInfo(e)); + } + } + wrapperInfo = new WrapperInfo(dataBinding, in, out, inChildren, outChildren); + } + return wrapperInfo; + } + } + + private static ElementInfo getElementInfo(XmlSchemaElement element) { + if (element == null) { + return null; + } + ElementInfo elementInfo = new ElementInfo(element.getQName(), getTypeInfo(element.getSchemaType())); + elementInfo.setMany(element.getMaxOccurs() > 1); + elementInfo.setNillable(element.isNillable()); + return elementInfo; + } + + private static TypeInfo getTypeInfo(XmlSchemaType type) { + if (type == null) { + return null; + } + XmlSchemaType baseType = (XmlSchemaType)type.getBaseSchemaType(); + QName name = type.getQName(); + boolean simple = (type instanceof XmlSchemaSimpleType); + if (baseType == null) { + return new TypeInfo(name, simple, null); + } else { + return new TypeInfo(name, simple, getTypeInfo(baseType)); + } + } + +} diff --git a/java/sca/modules/interface-wsdl/src/main/resources/META-INF/services/org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory b/java/sca/modules/interface-wsdl/src/main/resources/META-INF/services/org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory new file mode 100644 index 0000000000..c11d22d7b2 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/main/resources/META-INF/services/org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory @@ -0,0 +1,18 @@ +# 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. + +org.apache.tuscany.sca.interfacedef.wsdl.DefaultWSDLFactory \ No newline at end of file diff --git a/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/AbstractWSDLTestCase.java b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/AbstractWSDLTestCase.java new file mode 100644 index 0000000000..8ed7ba395b --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/AbstractWSDLTestCase.java @@ -0,0 +1,68 @@ +/* + * 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.interfacedef.wsdl; + +import junit.framework.TestCase; + +import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.contribution.ContributionFactory; +import org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor; +import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor; +import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint; +import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint; +import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.xsd.XSDFactory; + +/** + * Test case for WSDLOperation. + * + * @version $Rev$ $Date$ + */ +public abstract class AbstractWSDLTestCase extends TestCase { + protected URLArtifactProcessor documentProcessor; + protected ModelResolver resolver; + protected WSDLFactory wsdlFactory; + protected XSDFactory xsdFactory; + + /** + * @see junit.framework.TestCase#setUp() + */ + @Override + protected void setUp() throws Exception { + ExtensionPointRegistry extensionPoints = new DefaultExtensionPointRegistry(); + FactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class); + wsdlFactory = modelFactories.getFactory(WSDLFactory.class); + xsdFactory = modelFactories.getFactory(XSDFactory.class); + + ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class); + Contribution contribution = contributionFactory.createContribution(); + ModelResolverExtensionPoint modelResolvers = extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class); + resolver = new ExtensibleModelResolver(contribution, modelResolvers, modelFactories); + contribution.setModelResolver(resolver); + + URLArtifactProcessorExtensionPoint documentProcessors = extensionPoints.getExtensionPoint(URLArtifactProcessorExtensionPoint.class); + documentProcessor = new ExtensibleURLArtifactProcessor(documentProcessors, null); + } + +} diff --git a/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLInterfaceIntrospectorTestCase.java b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLInterfaceIntrospectorTestCase.java new file mode 100644 index 0000000000..dc7e1ced38 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLInterfaceIntrospectorTestCase.java @@ -0,0 +1,83 @@ +/* + * 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.interfacedef.wsdl.introspect; + +import java.net.URI; +import java.net.URL; +import java.util.List; + +import javax.wsdl.PortType; +import javax.xml.namespace.QName; + +import junit.framework.Assert; + +import org.apache.tuscany.sca.interfacedef.DataType; +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.util.XMLType; +import org.apache.tuscany.sca.interfacedef.wsdl.AbstractWSDLTestCase; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; + +/** + * Test case for InterfaceWSDLIntrospectorImpl. + * + * @version $Rev$ $Date$ + */ +public class WSDLInterfaceIntrospectorTestCase extends AbstractWSDLTestCase { + private static final QName PORTTYPE_NAME = new QName("http://example.com/stockquote.wsdl", "StockQuotePortType"); + + private PortType portType; + private WSDLDefinition definition; + + /** + * @see junit.framework.TestCase#setUp() + */ + @Override + protected void setUp() throws Exception { + super.setUp(); + + URL url = getClass().getResource("../xml/stockquote.wsdl"); + definition = (WSDLDefinition)documentProcessor.read(null, new URI("stockquote.wsdl"), url); + resolver.addModel(definition); + definition = resolver.resolveModel(WSDLDefinition.class, definition); + portType = definition.getDefinition().getPortType(PORTTYPE_NAME); + } + + @SuppressWarnings("unchecked") + public final void testIntrospectPortType() throws InvalidInterfaceException { + WSDLInterface contract = wsdlFactory.createWSDLInterface(portType, definition, resolver); + Assert.assertEquals(contract.getName().getLocalPart(), "StockQuotePortType"); + List operations = contract.getOperations(); + Assert.assertEquals(1, operations.size()); + Operation operation = operations.get(0); + Assert.assertEquals("getLastTradePrice", operation.getName()); + DataType> inputType = operation.getInputType(); + Assert.assertEquals(1, inputType.getLogical().size()); + DataType returnType = operation.getOutputType(); + Assert.assertNotNull(returnType); + Assert.assertEquals(0, operation.getFaultTypes().size()); + // Assert.assertEquals(1, + // operation.getWrapper().getInputChildElements().size()); + // Assert.assertEquals(1, + // operation.getWrapper().getOutputChildElements().size()); + } + +} diff --git a/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLOperationIntrospectorTestCase.java b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLOperationIntrospectorTestCase.java new file mode 100644 index 0000000000..c392b92f8a --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLOperationIntrospectorTestCase.java @@ -0,0 +1,117 @@ +/* + * 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.interfacedef.wsdl.introspect; + +import java.net.URI; +import java.net.URL; +import java.util.List; + +import javax.wsdl.Operation; +import javax.wsdl.PortType; +import javax.xml.namespace.QName; + +import junit.framework.Assert; + +import org.apache.tuscany.sca.interfacedef.DataType; +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; +import org.apache.tuscany.sca.interfacedef.util.XMLType; +import org.apache.tuscany.sca.interfacedef.wsdl.AbstractWSDLTestCase; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.impl.WSDLOperationIntrospectorImpl; + +/** + * Test case for WSDLOperation. + * + * @version $Rev$ $Date$ + */ +public class WSDLOperationIntrospectorTestCase extends AbstractWSDLTestCase { + private static final QName PORTTYPE_NAME = + new QName("http://example.com/stockquote.wsdl", "StockQuotePortType"); + + + @SuppressWarnings("unchecked") + public final void testWrappedOperation() throws Exception { + URL url = getClass().getResource("../xml/stockquote.wsdl"); + WSDLDefinition definition = (WSDLDefinition)documentProcessor.read(null, new URI("stockquote.wsdl"), url); + resolver.addModel(definition); + definition = resolver.resolveModel(WSDLDefinition.class, definition); + PortType portType = definition.getDefinition().getPortType(PORTTYPE_NAME); + Operation operation = portType.getOperation("getLastTradePrice", null, null); + + WSDLOperationIntrospectorImpl op = new WSDLOperationIntrospectorImpl(xsdFactory, operation, definition, "org.w3c.dom.Node", resolver); + + DataType> inputType = op.getInputType(); + Assert.assertEquals(1, inputType.getLogical().size()); + DataType type = inputType.getLogical().get(0); + Assert.assertEquals(new QName("http://example.com/stockquote.xsd", "getLastTradePrice"), type.getLogical().getElementName()); + + DataType outputType = op.getOutputType(); + Assert.assertEquals(new QName("http://example.com/stockquote.xsd", "getLastTradePriceResponse"), + outputType.getLogical().getElementName()); + Assert.assertTrue(op.isWrapperStyle()); + + DataType> unwrappedInputType = op.getWrapper().getWrapperInfo().getUnwrappedInputType(); + List childTypes = unwrappedInputType.getLogical(); + Assert.assertEquals(1, childTypes.size()); + DataType childType = childTypes.get(0); + Assert.assertEquals(new QName(null, "tickerSymbol"), childType.getLogical().getElementName()); + + childType = op.getWrapper().getWrapperInfo().getUnwrappedOutputType(); + Assert.assertEquals(new QName(null, "price"), childType.getLogical().getElementName()); + } + + public final void testUnwrappedOperation() throws Exception { + URL url = getClass().getResource("../xml/unwrapped-stockquote.wsdl"); + WSDLDefinition definition = (WSDLDefinition)documentProcessor.read(null, new URI("unwrapped-stockquote.wsdl"), url); + resolver.addModel(definition); + definition = resolver.resolveModel(WSDLDefinition.class, definition); + PortType portType = definition.getDefinition().getPortType(PORTTYPE_NAME); + + Operation operation = portType.getOperation("getLastTradePrice1", null, null); + WSDLOperationIntrospectorImpl op = new WSDLOperationIntrospectorImpl(xsdFactory, operation, definition, "org.w3c.dom.Node", resolver); + Assert.assertFalse(op.isWrapperStyle()); + Assert.assertEquals(1, op.getInputType().getLogical().size()); + + operation = portType.getOperation("getLastTradePrice2", null, null); + op = new WSDLOperationIntrospectorImpl(xsdFactory, operation, definition, "org.w3c.dom.Node", resolver); + Assert.assertFalse(op.isWrapperStyle()); + Assert.assertEquals(2, op.getInputType().getLogical().size()); + } + + public final void testInvalidWSDL() throws Exception { + URL url = getClass().getResource("../xml/invalid-stockquote.wsdl"); + WSDLDefinition definition = (WSDLDefinition)documentProcessor.read(null, new URI("invalid-stockquote.wsdl"), url); + resolver.addModel(definition); + definition = resolver.resolveModel(WSDLDefinition.class, definition); + PortType portType = definition.getDefinition().getPortType(PORTTYPE_NAME); + + Operation operation = portType.getOperation("getLastTradePrice", null, null); + WSDLOperationIntrospectorImpl op = new WSDLOperationIntrospectorImpl(xsdFactory, operation, definition, "org.w3c.dom.Node", resolver); + + try { + op.isWrapperStyle(); + fail("InvalidWSDLException should have been thrown"); + } catch (InvalidInterfaceException e) { + // Expected + } + + } + +} diff --git a/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLPolicyAnnotatedInterfaceIntrospectorTestCase.java b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLPolicyAnnotatedInterfaceIntrospectorTestCase.java new file mode 100644 index 0000000000..cf379a1b11 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WSDLPolicyAnnotatedInterfaceIntrospectorTestCase.java @@ -0,0 +1,87 @@ +/* + * 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.interfacedef.wsdl.introspect; + +import java.net.URI; +import java.net.URL; + +import javax.wsdl.PortType; +import javax.xml.namespace.QName; + +import junit.framework.Assert; + +import org.apache.tuscany.sca.interfacedef.ConversationSequence; +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.wsdl.AbstractWSDLTestCase; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; +import org.apache.tuscany.sca.policy.Intent; + +/** + * Test case for InterfaceWSDLIntrospectorImpl. + * + * @version $Rev$ $Date$ + */ +public class WSDLPolicyAnnotatedInterfaceIntrospectorTestCase extends AbstractWSDLTestCase { + private static final QName PORTTYPE_NAME = new QName("http://example.com/stockquote.wsdl", "StockQuotePortType"); + private static final QName INTENT = new QName("http://example.com/stockquote.wsdl", "PolicyIntent"); + + private PortType portType; + private WSDLDefinition definition; + + /** + * @see junit.framework.TestCase#setUp() + */ + @Override + protected void setUp() throws Exception { + super.setUp(); + + URL url = getClass().getResource("/policy/stockquote_policy.wsdl"); + definition = (WSDLDefinition)documentProcessor.read(null, new URI("stockquote.wsdl"), url); + resolver.addModel(definition); + definition = resolver.resolveModel(WSDLDefinition.class, definition); + portType = definition.getDefinition().getPortType(PORTTYPE_NAME); + } + + @SuppressWarnings("unchecked") + public final void testIntrospectPortType() throws InvalidInterfaceException { + WSDLInterface contract = wsdlFactory.createWSDLInterface(portType, definition, resolver); + Assert.assertEquals(contract.getName().getLocalPart(), "StockQuotePortType"); + Assert.assertTrue(contract.isConversational()); + + boolean foundIntent = false; + + for(Intent intent : contract.getRequiredIntents()) { + if(INTENT.equals(intent.getName())) { + foundIntent = true; + } + } + + Assert.assertTrue(foundIntent); + + for(Operation operation : contract.getOperations()) { + if(operation.getName().equals("cancel")) { + Assert.assertEquals(operation.getConversationSequence(), ConversationSequence.CONVERSATION_END); + } + } + + } +} diff --git a/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WrapperStyleOperationTestCase.java b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WrapperStyleOperationTestCase.java new file mode 100644 index 0000000000..ff18c65c69 --- /dev/null +++ b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/introspect/WrapperStyleOperationTestCase.java @@ -0,0 +1,70 @@ +/* + * 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.interfacedef.wsdl.introspect; + +import java.net.URI; +import java.net.URL; + +import javax.wsdl.Operation; +import javax.wsdl.PortType; +import javax.xml.namespace.QName; + +import junit.framework.Assert; + +import org.apache.tuscany.sca.interfacedef.wsdl.AbstractWSDLTestCase; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.impl.WSDLOperationIntrospectorImpl; + +/** + * Test case for WSDLOperation. + * + * @version $Rev$ $Date$ + */ +public class WrapperStyleOperationTestCase extends AbstractWSDLTestCase { + private static final QName PORTTYPE_NAME = new QName("http://example.com/stockquote.wsdl", "StockQuotePortType"); + + public final void testWrappedOperation() throws Exception { + URL url = getClass().getResource("../xml/stockquote.wsdl"); + WSDLDefinition definition = (WSDLDefinition)documentProcessor.read(null, new URI("stockquote.wsdl"), url); + resolver.addModel(definition); + definition = resolver.resolveModel(WSDLDefinition.class, definition); + PortType portType = definition.getDefinition().getPortType(PORTTYPE_NAME); + Operation operation = portType.getOperation("getLastTradePrice", null, null); + WSDLOperationIntrospectorImpl op = new WSDLOperationIntrospectorImpl(xsdFactory, operation, definition, "org.w3c.dom.Node", resolver); + Assert.assertTrue(op.isWrapperStyle()); + Assert.assertEquals(1, op.getWrapper().getInputChildElements().size()); + Assert.assertEquals(1, op.getWrapper().getOutputChildElements().size()); + } + + public final void testUnwrappedOperation() throws Exception { + URL url = getClass().getResource("../xml/unwrapped-stockquote.wsdl"); + WSDLDefinition definition = (WSDLDefinition)documentProcessor.read(null, new URI("unwrapped-stockquote.wsdl"), url); + resolver.addModel(definition); + definition = resolver.resolveModel(WSDLDefinition.class, definition); + PortType portType = definition.getDefinition().getPortType(PORTTYPE_NAME); + Operation operation = portType.getOperation("getLastTradePrice1", null, null); + WSDLOperationIntrospectorImpl op = new WSDLOperationIntrospectorImpl(xsdFactory, operation, definition, "org.w3c.dom.Node", resolver); + Assert.assertFalse(op.isWrapperStyle()); + operation = portType.getOperation("getLastTradePrice2", null, null); + op = new WSDLOperationIntrospectorImpl(xsdFactory, operation, definition, "org.w3c.dom.Node", resolver); + Assert.assertFalse(op.isWrapperStyle()); + } + +} -- cgit v1.2.3