You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by na...@apache.org on 2008/06/30 18:02:57 UTC

svn commit: r672803 [2/3] - in /tuscany/branches/sca-java-1.3: itest/validation/src/main/java/calculator/warning/ itest/validation/src/main/resources/NoMatchingBinding/ itest/validation/src/main/resources/ServiceNotFoundForComponentService/ itest/valid...

Added: tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/LICENSE
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/LICENSE?rev=672803&view=auto
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/LICENSE (added)
+++ tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/LICENSE Mon Jun 30 09:02:54 2008
@@ -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.
+
+
+

Added: tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/NOTICE
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/NOTICE?rev=672803&view=auto
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/NOTICE (added)
+++ tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/NOTICE Mon Jun 30 09:02:54 2008
@@ -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/).
+

Added: tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/pom.xml?rev=672803&view=auto
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/pom.xml (added)
+++ tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/pom.xml Mon Jun 30 09:02:54 2008
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    * 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.    
+-->
+<project>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.tuscany.sca</groupId>
+        <artifactId>tuscany-modules</artifactId>
+        <version>1.4-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>tuscany-binding-ws-wsdlgen</artifactId>
+    <name>Apache Tuscany SCA Web Service binding WSDL Generator</name>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-binding-ws</artifactId>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-interface-wsdl</artifactId>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-interface-wsdl-xml</artifactId>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-interface-java</artifactId>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-interface-java-jaxws</artifactId>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>        
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-xsd</artifactId>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-xsd-xml</artifactId>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-databinding</artifactId>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-policy-security-ws</artifactId>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-core-databinding</artifactId>
+            <version>1.4-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+
+                <configuration>
+                    <instructions>
+                        <Bundle-Version>${tuscany.version}</Bundle-Version>
+                        <Bundle-SymbolicName>org.apache.tuscany.sca.binding.ws.wsdlgen</Bundle-SymbolicName>
+                        <Bundle-Description>${pom.name}</Bundle-Description>
+                        <Export-Package>org.apache.tuscany.sca.binding.ws.wsdlgen*</Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

Added: tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java?rev=672803&view=auto
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java (added)
+++ tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java Mon Jun 30 09:02:54 2008
@@ -0,0 +1,353 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.binding.ws.wsdlgen;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.wsdl.Definition;
+import javax.wsdl.PortType;
+import javax.wsdl.WSDLException;
+import javax.wsdl.xml.WSDLWriter;
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.assembly.AbstractContract;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.builder.BindingBuilderExtension;
+import org.apache.tuscany.sca.assembly.builder.impl.ProblemImpl;
+import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ResolverExtension;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.wsdl.impl.InvalidWSDLException;
+import org.apache.tuscany.sca.interfacedef.wsdl.impl.WSDLInterfaceIntrospectorImpl;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.Problem;
+import org.apache.tuscany.sca.monitor.Problem.Severity;
+import org.apache.tuscany.sca.policy.Intent;
+import org.apache.tuscany.sca.policy.IntentAttachPoint;
+import org.apache.tuscany.sca.xsd.XSDFactory;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class BindingWSDLGenerator {
+    private static final Logger logger = Logger.getLogger(BindingWSDLGenerator.class.getName());
+    private static final QName SOAP12_INTENT = new QName("http://www.osoa.org/xmlns/sca/1.0", "soap.1_2");
+
+    public static boolean printWSDL;     // external code sets this to print generated WSDL
+
+    private BindingWSDLGenerator() {
+        // this class has static methods only and cannot be instantiated
+    }
+
+    /**
+     * Log a warning message.
+     * @param problem
+     */
+    private static void logWarning(Problem problem) {
+        Logger problemLogger = Logger.getLogger(problem.getSourceClassName(), problem.getBundleName());
+        if (problemLogger != null){
+            problemLogger.logp(Level.WARNING, problem.getSourceClassName(), null, problem.getMessageId(), problem.getMessageParams());
+        } else {
+            logger.severe("Can't get logger " + problem.getSourceClassName()+ " with bundle " + problem.getBundleName());
+        }
+    }
+
+    /**
+     * Report a warning.
+     * @param message
+     * @param binding
+     * @param parameters
+     */
+    private static void warning(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) {
+        Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.WARNING, wsBinding, message, (Object[])messageParameters);
+        if (monitor != null) {
+            monitor.problem(problem);
+        } else {
+            logWarning(problem);
+        }
+    }
+
+    /**
+     * Report an error.
+     * @param message
+     * @param binding
+     * @param parameters
+     */
+    private static void error(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) {
+        Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR, wsBinding, message, (Object[])messageParameters);
+        if (monitor != null) {
+            monitor.problem(problem);
+        } else {
+            throw new WSDLGenerationException(problem.toString(), null, problem);
+        }
+    }
+  
+    /**
+     * Report an exception error.
+     * @param message
+     * @param binding
+     * @param exception
+     */
+    private static void error(Monitor monitor, String message, WebServiceBinding wsBinding, Exception ex) {
+        Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR, wsBinding, message, ex);
+        if (monitor != null) {
+            monitor.problem(problem);
+        } else {
+            throw new WSDLGenerationException(problem.toString(), ex, problem);
+        }
+    }
+  
+    /**
+     * Report a fatal error.
+     * @param message
+     * @param binding
+     * @param exception
+     */
+    private static void fatal(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) {
+        Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR,wsBinding, message, (Object[])messageParameters);
+        throw new WSDLGenerationException(problem.toString(), null, problem);
+    }
+  
+    /**
+     * Report a fatal exception error.
+     * @param message
+     * @param binding
+     * @param exception
+     */
+    private static void fatal(Monitor monitor, String message, WebServiceBinding wsBinding, Exception ex) {
+        Problem problem = new ProblemImpl(BindingWSDLGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR, wsBinding, message, ex);
+        throw new WSDLGenerationException(problem.toString(), ex, problem);
+    }
+
+    /**
+     * This method can be called from the binding builder or from the runtime.
+     * Report problems and exceptions in the most appropriate way for both
+     * of these cases.
+     */
+    public static void generateWSDL(Component component,
+                                    AbstractContract contract,
+                                    WebServiceBinding wsBinding,
+                                    ExtensionPointRegistry extensionPoints,
+                                    Monitor monitor) {
+        try {
+            createWSDLDocument(component, contract, wsBinding, extensionPoints, monitor);
+        } catch (WSDLGenerationException ex) {
+            if (ex.getProblem() != null) {
+                warning(monitor, "WsdlGenProblem", wsBinding, component.getName(), contract.getName());
+                if (monitor != null) {
+                    monitor.problem(ex.getProblem());
+                } else {
+                    throw ex;
+                }
+            } else if (ex.getCause() instanceof Exception) {
+                warning(monitor, "WsdlGenException", wsBinding, component.getName(), contract.getName());
+                error(monitor, "UnexpectedException", wsBinding, (Exception)ex.getCause());
+            } else { // should never happen
+                throw new IllegalStateException(ex);
+            }
+        } catch (RuntimeException ex) {
+            warning(monitor, "WsdlGenException", wsBinding, component.getName(), contract.getName());
+            error(monitor, "UnexpectedException", wsBinding, ex);
+        }    
+    }        
+
+    private static void createWSDLDocument(Component component,
+                                           AbstractContract contract,
+                                           WebServiceBinding wsBinding,
+                                           ExtensionPointRegistry extensionPoints,
+                                           Monitor monitor) {
+        ModelFactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
+        DataBindingExtensionPoint dataBindings = extensionPoints.getExtensionPoint(DataBindingExtensionPoint.class);
+        WSDLFactory wsdlFactory = modelFactories.getFactory(WSDLFactory.class);
+        XSDFactory xsdFactory = modelFactories.getFactory(XSDFactory.class);
+        System.out.println("$$createWSDLDocument: wsBinding " + wsBinding);
+
+        if (contract.getInterfaceContract() == null) {
+            // can happen if incorrect component service name
+            fatal(monitor, "MissingInterfaceContract", wsBinding, component.getName(), contract.getName()); 
+        }
+
+        InterfaceContract icontract = wsBinding.getBindingInterfaceContract();
+        if (icontract == null) {
+            System.out.println("$$null bindingInterfaceContract: wsBinding " + wsBinding);
+            icontract = contract.getInterfaceContract().makeUnidirectional(false);
+            if (icontract instanceof JavaInterfaceContract) {
+                ModelResolver resolver = component instanceof ResolverExtension ?
+                                             ((ResolverExtension)component).getModelResolver() : null;
+                System.out.println("$$calling createWSDLInterfaceContract(): wsBinding " + wsBinding);
+                icontract = createWSDLInterfaceContract(
+                                    (JavaInterfaceContract)icontract,
+                                    requiresSOAP12(wsBinding),
+                                    resolver,
+                                    dataBindings,
+                                    wsdlFactory,
+                                    xsdFactory,
+                                    monitor);
+                System.out.println("$$returned from createWSDLInterfaceContract(): wsBinding " + wsBinding);
+            } else {
+                try {
+                    //TUSCANY-2316 Cloning the Interface Contract to avoid overriding data binding information 
+                    icontract = (InterfaceContract)icontract.clone();
+                } catch (Exception e) {
+                    //ignore
+                }
+            }
+            System.out.println("$$calling setBindingInterfaceContract(): wsBinding " + wsBinding);
+            System.out.println("$$icontract: " + icontract);
+            if (icontract.getInterface() instanceof WSDLInterface) {
+                System.out.println("$$wsdlDefinition: " + ((WSDLInterface)icontract.getInterface()).getWsdlDefinition());
+            }
+            wsBinding.setBindingInterfaceContract(icontract);
+        }
+        
+        // TODO - fix up the conversational flag and operation sequences in case the contract has come from WSDL
+        // as we don't yet support requires="conversational" or sca:endConversation annotations
+        // in WSDL interface descriptions (see section 1.5.4 of the Assembly Specification V1.0)
+        if (contract.getInterfaceContract().getInterface() != null ) {
+            icontract.getInterface().setConversational(contract.getInterfaceContract().getInterface().isConversational());
+            
+            for (Operation operation : icontract.getInterface().getOperations()){
+                Operation serviceOperation = null;
+                
+                for (Operation tmpOp : contract.getInterfaceContract().getInterface().getOperations()){
+                    if (operation.getName().equals(tmpOp.getName())) {
+                        serviceOperation = tmpOp;
+                        break;
+                    }
+                }
+                
+                if (serviceOperation != null ){
+                    operation.setConversationSequence(serviceOperation.getConversationSequence());
+                }
+            }
+        }
+
+        /*
+        // Look at all the Web Service bindings of the SCA service to see if any
+        // of them have an existing generated WSDL definitions document.  If found,
+        // use it for this binding as well.  If not found, generate a new document.
+        Definition definition = null;
+        for (Binding binding : contract.getBindings()) {
+            if (binding instanceof WebServiceBinding) {
+                definition = ((WebServiceBinding)binding).getWSDLDocument();
+                if (definition != null) {
+                    wsBinding.setWSDLDocument(definition);
+                    break;
+                }
+            }
+        }
+        */
+        // The above code is currently not used.  Instead, we only look
+        // for a WSDL definitions document in this binding and don't
+        // attempt to share the same document across multiple bindings.
+
+        // generate a WSDL definitions document if needed
+        Definition definition = wsBinding.getWSDLDocument();
+        if (definition == null) {
+            definition = WSDLServiceGenerator.configureWSDLDefinition(wsBinding, component, contract, monitor);
+            wsBinding.setWSDLDocument(definition);
+        }
+    }
+
+    protected static boolean requiresSOAP12(WebServiceBinding wsBinding) {
+        if (wsBinding instanceof IntentAttachPoint) {
+            List<Intent> intents = ((IntentAttachPoint)wsBinding).getRequiredIntents();
+            for (Intent intent : intents) {
+                if (SOAP12_INTENT.equals(intent.getName())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Create a WSDLInterfaceContract from a JavaInterfaceContract
+     */
+    protected static WSDLInterfaceContract createWSDLInterfaceContract(JavaInterfaceContract contract,
+                                                                       boolean requiresSOAP12,
+                                                                       ModelResolver resolver,
+                                                                       DataBindingExtensionPoint dataBindings,
+                                                                       WSDLFactory wsdlFactory,
+                                                                       XSDFactory xsdFactory,
+                                                                       Monitor monitor) {
+
+        WSDLInterfaceContract wsdlContract = wsdlFactory.createWSDLInterfaceContract();
+        WSDLInterface wsdlInterface = wsdlFactory.createWSDLInterface();
+        wsdlContract.setInterface(wsdlInterface);
+
+        WSDLDefinition wsdlDefinition = wsdlFactory.createWSDLDefinition();
+        JavaInterface iface = (JavaInterface)contract.getInterface();
+
+        Definition def = null;
+        try {
+            Interface2WSDLGenerator wsdlGenerator =
+                new Interface2WSDLGenerator(requiresSOAP12, resolver, dataBindings, xsdFactory, monitor);
+            def = wsdlGenerator.generate(iface, wsdlDefinition);
+        } catch (WSDLException e) {
+            throw new WSDLGenerationException(e);
+        }
+
+        // for debugging
+        if (printWSDL) {
+            try {
+                System.out.println("Generated WSDL for Java interface " + iface.getName() + " class " + iface.getJavaClass().getName());
+                WSDLWriter writer =  javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter();
+                writer.writeWSDL(def, System.out);
+            } catch (WSDLException e) {
+                throw new WSDLGenerationException(e);
+            }
+        }
+
+        wsdlDefinition.setDefinition(def);
+        wsdlInterface.setWsdlDefinition(wsdlDefinition);
+        wsdlInterface.setRemotable(true);
+        wsdlInterface.setConversational(contract.getInterface().isConversational());
+        wsdlInterface.setUnresolved(false);
+        wsdlInterface.setRemotable(true);
+        PortType portType = (PortType)def.getAllPortTypes().values().iterator().next();
+        wsdlInterface.setPortType(portType);
+
+        try {
+            for (Operation op : iface.getOperations()) {
+                javax.wsdl.Operation wsdlOp = portType.getOperation(op.getName(), null, null);
+                wsdlInterface.getOperations().add(WSDLInterfaceIntrospectorImpl.getOperation(
+                                                      wsdlOp, wsdlDefinition, resolver, xsdFactory));
+            }
+        } catch (InvalidWSDLException e) {
+            throw new WSDLGenerationException(e);
+        }
+
+        return wsdlContract;
+    }
+
+}

Added: tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java?rev=672803&view=auto
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java (added)
+++ tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java Mon Jun 30 09:02:54 2008
@@ -0,0 +1,726 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.binding.ws.wsdlgen;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.wsdl.Binding;
+import javax.wsdl.BindingOperation;
+import javax.wsdl.Definition;
+import javax.wsdl.Fault;
+import javax.wsdl.Input;
+import javax.wsdl.Message;
+import javax.wsdl.OperationType;
+import javax.wsdl.Output;
+import javax.wsdl.Part;
+import javax.wsdl.PortType;
+import javax.wsdl.Types;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.schema.Schema;
+import javax.wsdl.factory.WSDLFactory;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.tuscany.sca.assembly.builder.impl.ProblemImpl;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.databinding.DataBinding;
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.databinding.XMLTypeHelper;
+import org.apache.tuscany.sca.databinding.jaxb.JAXBDataBinding;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.Interface;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaOperation;
+import org.apache.tuscany.sca.interfacedef.util.ElementInfo;
+import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper;
+import org.apache.tuscany.sca.interfacedef.util.TypeInfo;
+import org.apache.tuscany.sca.interfacedef.util.WrapperInfo;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.Problem;
+import org.apache.tuscany.sca.monitor.Problem.Severity;
+import org.apache.tuscany.sca.xsd.XSDFactory;
+import org.apache.tuscany.sca.xsd.XSDefinition;
+import org.apache.ws.commons.schema.XmlSchema;
+import org.apache.ws.commons.schema.XmlSchemaCollection;
+import org.apache.ws.commons.schema.XmlSchemaException;
+import org.apache.ws.commons.schema.utils.NamespaceMap;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @version $Rev: 670103 $ $Date: 2008-06-21 01:35:00 +0100 (Sat, 21 Jun 2008) $
+ */
+public class Interface2WSDLGenerator {
+    private static final Logger logger = Logger.getLogger(Interface2WSDLGenerator.class.getName());
+    private static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";
+    private static final String SCHEMA_NAME = "schema";
+    private static final QName SCHEMA_QNAME = new QName(SCHEMA_NS, SCHEMA_NAME);
+    private static final String XMLNS_NS = "http://www.w3.org/2000/xmlns/";
+    
+    private static final String ANYTYPE_NAME = "anyType";
+    private static final QName ANYTYPE_QNAME = new QName(SCHEMA_NS, ANYTYPE_NAME);
+
+
+    private WSDLFactory factory;
+    private DataBindingExtensionPoint dataBindings;
+    private WSDLDefinitionGenerator definitionGenerator;
+    private boolean requiresSOAP12;
+    private ModelResolver resolver;
+    private XSDFactory xsdFactory;
+    private Monitor monitor;
+
+    public Interface2WSDLGenerator(boolean requiresSOAP12,
+                                   ModelResolver resolver,
+                                   DataBindingExtensionPoint dataBindings,
+                                   XSDFactory xsdFactory,
+                                   Monitor monitor) throws WSDLException {
+        super();
+        this.requiresSOAP12 = requiresSOAP12; 
+        this.resolver = resolver; 
+        definitionGenerator = new WSDLDefinitionGenerator(requiresSOAP12);
+        this.dataBindings = dataBindings;
+        this.xsdFactory = xsdFactory;
+        this.monitor = monitor;
+        this.factory = WSDLFactory.newInstance();
+    }
+
+    /**
+     * Log a warning message.
+     * @param problem
+     */
+    private static void logWarning(Problem problem) {
+        Logger problemLogger = Logger.getLogger(problem.getSourceClassName(), problem.getBundleName());
+        if (problemLogger != null){
+            problemLogger.logp(Level.WARNING, problem.getSourceClassName(), null, problem.getMessageId(), problem.getMessageParams());
+        } else {
+            logger.severe("Can't get logger " + problem.getSourceClassName()+ " with bundle " + problem.getBundleName());
+        }
+    }
+
+    /**
+     * Report a warning.
+     * @param message
+     * @param binding
+     * @param parameters
+     */
+    private void warning(String message, Interface interfaze, String... messageParameters) {
+        Problem problem = new ProblemImpl(this.getClass().getName(), "wsdlgen-validation-messages", Severity.WARNING, interfaze, message, (Object[])messageParameters);
+        if (monitor != null) {
+            monitor.problem(problem);
+        } else {
+            logWarning(problem);
+        }
+    }
+
+    /**
+     * Report a fatal error.
+     * @param message
+     * @param binding
+     * @param parameters
+     */
+    private void fatal(String message, Interface interfaze, String... messageParameters) {
+        Problem problem = new ProblemImpl(this.getClass().getName(), "wsdlgen-validation-messages", Severity.ERROR, interfaze, message, (Object[])messageParameters);
+        throw new WSDLGenerationException(problem.toString(), null, problem);
+    }
+    
+    private void addDataType(Map<String, List<DataType>> map, DataType type) {
+        if (type == null) {
+            return;
+        }
+        String db = type.getDataBinding();
+        if (db == null) {
+            return;
+        }
+        if ("java:array".equals(db)) {
+            DataType dt = (DataType)type.getLogical();
+            db = dt.getDataBinding();
+        }
+        List<DataType> types = map.get(db);
+        if (types == null) {
+            types = new ArrayList<DataType>();
+            map.put(db, types);
+        }
+        types.add(type);
+    }
+    
+    private Map<String, List<DataType>> getDataTypes(Interface intf, boolean useWrapper) {
+        Map<String, List<DataType>> dataTypes = new HashMap<String, List<DataType>>();
+        for (Operation op : intf.getOperations()) {
+            WrapperInfo wrapper = op.getWrapper();
+            if (useWrapper && wrapper != null) {
+                DataType dt1 = wrapper.getInputWrapperType();
+                addDataType(dataTypes, dt1);
+                DataType dt2 = wrapper.getOutputWrapperType();
+                addDataType(dataTypes, dt2);
+            } else {
+                for (DataType dt1 : op.getInputType().getLogical()) {
+                    addDataType(dataTypes, dt1);
+                }
+                DataType dt2 = op.getOutputType();
+                addDataType(dataTypes, dt2);
+            }
+            for (DataType<DataType> dt3 : op.getFaultTypes()) {
+                DataType dt4 = dt3.getLogical();
+                addDataType(dataTypes, dt4);
+            }
+        }
+        return dataTypes;
+    }
+
+
+    public Definition generate(Interface interfaze, WSDLDefinition wsdlDefinition) throws WSDLException {
+        if (interfaze == null) {
+            return null;
+        }
+        if (interfaze instanceof WSDLInterface) {
+            return ((WSDLInterface)interfaze).getWsdlDefinition().getDefinition();
+        }
+        JavaInterface iface = (JavaInterface)interfaze;
+        if (!interfaze.isRemotable()) {
+            fatal("InterfaceNotRemotable", interfaze, iface.getName());
+        }
+        QName name = getQName(iface);
+        Definition definition = factory.newDefinition();
+        if (requiresSOAP12) {
+            definition.addNamespace("soap12", "http://schemas.xmlsoap.org/wsdl/soap12/");
+        } else {
+            definition.addNamespace("soap", "http://schemas.xmlsoap.org/wsdl/soap/");
+        }
+        definition.addNamespace("wsdl", "http://schemas.xmlsoap.org/wsdl/");
+        definition.addNamespace("xs", SCHEMA_NS);
+
+        String namespaceURI = name.getNamespaceURI();
+        definition.setTargetNamespace(namespaceURI);
+        definition.setQName(new QName(namespaceURI, name.getLocalPart() + "Service", name.getPrefix()));
+        definition.addNamespace(name.getPrefix(), namespaceURI);
+
+        PortType portType = definition.createPortType();
+        portType.setQName(name);
+        Binding binding = definitionGenerator.createBinding(definition, portType);
+        Map<String, XMLTypeHelper> helpers = new HashMap<String, XMLTypeHelper>();
+        Map<QName, List<ElementInfo>> wrappers = new HashMap<QName, List<ElementInfo>>();
+        for (Operation op : interfaze.getOperations()) {
+            javax.wsdl.Operation operation = generateOperation(definition, op, helpers, wrappers);
+            portType.addOperation(operation);
+            String action = ((JavaOperation)op).getAction();
+            BindingOperation bindingOp = definitionGenerator.createBindingOperation(definition, operation, action);
+            binding.addBindingOperation(bindingOp);
+        }
+        portType.setUndefined(false);
+        definition.addPortType(portType);
+        binding.setUndefined(false);
+        definition.addBinding(binding);
+        wsdlDefinition.setBinding(binding);
+
+        // call each helper in turn to populate the wsdl.types element
+        XmlSchemaCollection schemaCollection = new XmlSchemaCollection(); 
+
+        for (Map.Entry<String, List<DataType>> en: getDataTypes(interfaze, false).entrySet()) {
+            XMLTypeHelper helper = helpers.get(en.getKey());
+            if (helper == null) {
+                continue;
+            }
+            List<XSDefinition> xsDefinitions = helper.getSchemaDefinitions(xsdFactory, resolver, en.getValue());
+            for (XSDefinition xsDef: xsDefinitions) {
+                addSchemaExtension(xsDef, schemaCollection, wsdlDefinition, definition);
+            }
+        }
+
+        // remove global wrapper elements with schema definitions from generation list
+        for (QName wrapperName: new HashSet<QName>(wrappers.keySet())) {
+            if (wsdlDefinition.getXmlSchemaElement(wrapperName) != null) {
+                wrappers.remove(wrapperName);
+            }
+        }
+
+        // generate schema elements for wrappers that aren't defined in the schemas
+        if (wrappers.size() > 0) {
+            int i = 0;
+            Map<String, XSDefinition> wrapperXSDs = new HashMap<String, XSDefinition>();
+            Map<Element, Map<String, String>> prefixMaps = new HashMap<Element, Map<String, String>>();
+            for (Map.Entry<QName, List<ElementInfo>> entry: wrappers.entrySet()) {
+                String targetNS = entry.getKey().getNamespaceURI();
+                Document schemaDoc = null;
+                Element schema = null;
+                XSDefinition xsDef = wrapperXSDs.get(targetNS);
+                if (xsDef != null) {
+                    schemaDoc = xsDef.getDocument();
+                    schema = schemaDoc.getDocumentElement();
+                } else {
+                    schemaDoc = createDocument();
+                    schema = schemaDoc.createElementNS(SCHEMA_NS, "xs:schema");
+                    // The elementFormDefault should be set to unqualified, see TUSCANY-2388
+                    schema.setAttribute("elementFormDefault", "unqualified");
+                    schema.setAttribute("attributeFormDefault", "qualified");
+                    schema.setAttribute("targetNamespace", targetNS);
+                    schema.setAttributeNS(XMLNS_NS, "xmlns:xs", SCHEMA_NS);
+                    schemaDoc.appendChild(schema);
+                    Schema schemaExt = createSchemaExt(definition);
+                    schemaExt.setElement(schema);
+                    prefixMaps.put(schema, new HashMap<String, String>());
+                    xsDef = xsdFactory.createXSDefinition();
+                    xsDef.setUnresolved(true);
+                    xsDef.setNamespace(targetNS);
+                    xsDef.setDocument(schemaDoc);
+                    wrapperXSDs.put(targetNS, xsDef);
+                }
+                Element wrapper = schemaDoc.createElementNS(SCHEMA_NS, "xs:element");
+                schema.appendChild(wrapper);
+                wrapper.setAttribute("name", entry.getKey().getLocalPart());
+                if (entry.getValue().size() == 1 && entry.getValue().get(0).getQName() == null) {
+                    // special case for global fault element
+                    QName typeName = entry.getValue().get(0).getType().getQName();
+                    wrapper.setAttribute("type", typeName.getLocalPart());
+                } else {
+                    // normal wrapper containing type definition inline
+                    Element complexType = schemaDoc.createElementNS(SCHEMA_NS, "xs:complexType");
+                    wrapper.appendChild(complexType);
+                    if (entry.getValue().size() > 0) {
+                        Element sequence = schemaDoc.createElementNS(SCHEMA_NS, "xs:sequence");
+                        complexType.appendChild(sequence);
+                        for (ElementInfo element: entry.getValue()) {
+                            Element xsElement = schemaDoc.createElementNS(SCHEMA_NS, "xs:element"); 
+                            if (element.isMany()) {
+                                xsElement.setAttribute("maxOccurs", "unbounded");
+                            }
+                            xsElement.setAttribute("minOccurs", "0");
+                            xsElement.setAttribute("name", element.getQName().getLocalPart());
+                            if (element.isNillable()) {
+                                xsElement.setAttribute("nillable", "true");
+                            }
+                            QName typeName = element.getType().getQName();
+                            String nsURI = typeName.getNamespaceURI();
+                            if ("".equals(nsURI) || targetNS.equals(nsURI)) {
+                                xsElement.setAttribute("type", typeName.getLocalPart());
+                            } else if (SCHEMA_NS.equals(nsURI)) {
+                                xsElement.setAttribute("type", "xs:" + typeName.getLocalPart());
+                            } else {
+                                Map<String, String> prefixMap = prefixMaps.get(schema);
+                                String prefix = prefixMap.get(nsURI);
+                                if (prefix == null) {
+                                    prefix = "ns" + i++;
+                                    prefixMap.put(nsURI, prefix);
+                                    schema.setAttributeNS(XMLNS_NS, "xmlns:" + prefix, nsURI);
+                                }
+                                xsElement.setAttribute("type", prefix + ":" + typeName.getLocalPart());
+                            }
+                            sequence.appendChild(xsElement);
+                        }
+                    }
+                }
+            }
+ 
+            // resolve XSDefinitions containing generated wrappers
+            for (XSDefinition xsDef: wrapperXSDs.values()) {
+                loadXSD(schemaCollection, xsDef);
+                wsdlDefinition.getXmlSchemas().add(xsDef);
+            }
+        }
+
+        return definition;
+    }
+    
+    private void addSchemaExtension(XSDefinition xsDef,
+                                    XmlSchemaCollection schemaCollection,
+                                    WSDLDefinition wsdlDefinition,
+                                    Definition definition) throws WSDLException {
+        if (xsDef.getAggregatedDefinitions() != null) {
+            for (XSDefinition xsd: xsDef.getAggregatedDefinitions()) {
+                addSchemaExtension(xsd, schemaCollection, wsdlDefinition, definition);
+            }
+        } else {
+            String nsURI = xsDef.getNamespace();
+            Document document = xsDef.getDocument();
+            if (document == null) {
+                try {
+                    NamespaceMap prefixMap = new NamespaceMap();
+                    prefixMap.add("xs", SCHEMA_NS);
+                    prefixMap.add("tns", nsURI);
+                    XmlSchema schemaDef = xsDef.getSchema();
+                    schemaDef.setNamespaceContext(prefixMap);
+                    Document[] docs = schemaDef.getAllSchemas();
+                    document = docs[docs.length-1];
+                    document.setDocumentURI(xsDef.getLocation().toString());
+                    xsDef.setDocument(document);
+                } catch (XmlSchemaException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+            loadXSD(schemaCollection, xsDef);
+            wsdlDefinition.getXmlSchemas().add(xsDef);
+            Element schema = document.getDocumentElement();
+            Schema schemaExt = createSchemaExt(definition);
+            schemaExt.setDocumentBaseURI(document.getDocumentURI());
+            schemaExt.setElement(schema);
+        }
+    }
+
+    private static void loadXSD(XmlSchemaCollection schemaCollection, XSDefinition definition) {
+        if (definition.getSchema() != null) {
+            return;
+        }
+        if (definition.getDocument() != null) {
+            String uri = null;
+            if (definition.getLocation() != null) {
+                uri = definition.getLocation().toString();
+            }
+            XmlSchema schema = schemaCollection.read(definition.getDocument(), uri, null);
+            if (definition.getSchemaCollection() == null) {
+                definition.setSchemaCollection(schemaCollection);
+            }
+            if (definition.getSchema() == null) {
+                definition.setSchema(schema);
+            }
+        }
+    }
+
+    public Schema createSchemaExt(Definition definition) throws WSDLException {
+        Types types = definition.getTypes();
+        if (types == null) {
+            types = definition.createTypes();
+            definition.setTypes(types);
+        }
+
+        Schema schemaExt = createSchema(definition);
+        types.addExtensibilityElement(schemaExt);
+
+        return schemaExt;
+    }
+
+    public Schema createSchema(Definition definition) throws WSDLException {
+        return (Schema)definition.getExtensionRegistry().createExtension(Types.class, SCHEMA_QNAME);
+    }
+
+    private DocumentBuilderFactory documentBuilderFactory;
+
+    public Document createDocument() {
+        Document document;
+        try {
+            if (documentBuilderFactory == null) {
+                documentBuilderFactory = DocumentBuilderFactory.newInstance();
+                documentBuilderFactory.setNamespaceAware(true);
+            }
+            document = documentBuilderFactory.newDocumentBuilder().newDocument();
+        } catch (ParserConfigurationException ex) {
+            throw new WSDLGenerationException(ex);
+         }
+        // document.setDocumentURI("http://");
+        return document;
+    }
+
+    protected QName getQName(Interface interfaze) {
+        JavaInterface iface = (JavaInterface)interfaze;
+        QName qname = iface.getQName();
+        if (qname != null) {
+            return qname;
+        } else {
+            Class<?> javaClass = iface.getJavaClass();
+            return new QName(JavaXMLMapper.getNamespace(javaClass), javaClass.getSimpleName(), "tns");
+        }
+    }
+
+    public javax.wsdl.Operation generateOperation(Definition definition,
+                                                  Operation op,
+                                                  Map<String, XMLTypeHelper> helpers,
+                                                  Map<QName, List<ElementInfo>> wrappers)
+                                              throws WSDLException {
+        javax.wsdl.Operation operation = definition.createOperation();
+        operation.setName(op.getName());
+        operation.setUndefined(false);
+
+        Input input = definition.createInput();
+        Message inputMsg = definition.createMessage();
+        String namespaceURI = definition.getQName().getNamespaceURI();
+        QName inputMsgName = new QName(namespaceURI, op.getName());
+        inputMsg.setQName(inputMsgName);
+        inputMsg.setUndefined(false);
+        definition.addMessage(inputMsg);
+
+        // FIXME: By default, java interface is mapped to doc-lit-wrapper style WSDL
+        if (op.getWrapper() != null) {
+            // Generate doc-lit-wrapper style
+            inputMsg.addPart(generateWrapperPart(definition, op, helpers, wrappers, true));
+        } else {
+            // Bare style
+            int i = 0;
+            for (DataType d : op.getInputType().getLogical()) {
+                inputMsg.addPart(generatePart(definition, d, "arg" + i));
+                i++;
+            }
+        }
+        input.setMessage(inputMsg);
+        operation.setInput(input);
+
+        if (!op.isNonBlocking()) {
+            Output output = definition.createOutput();
+            Message outputMsg = definition.createMessage();
+            QName outputMsgName = new QName(namespaceURI, op.getName() + "Response");
+            outputMsg.setQName(outputMsgName);
+            outputMsg.setUndefined(false);
+            definition.addMessage(outputMsg);
+
+            if (op.getWrapper() != null) {
+                outputMsg.addPart(generateWrapperPart(definition, op, helpers, wrappers, false));
+            } else {
+                outputMsg.addPart(generatePart(definition, op.getOutputType(), "return"));
+            }
+            output.setMessage(outputMsg);
+
+            operation.setOutput(output);
+            operation.setStyle(OperationType.REQUEST_RESPONSE);
+        } else {
+            operation.setStyle(OperationType.ONE_WAY);
+        }
+
+        for (DataType<DataType> faultType: op.getFaultTypes()) {
+            Fault fault = definition.createFault();
+            QName faultName = ((XMLType)faultType.getLogical().getLogical()).getElementName();
+            fault.setName(faultName.getLocalPart());
+            Message faultMsg = definition.getMessage(faultName);
+            if (faultMsg == null) {
+                faultMsg = definition.createMessage();
+                faultMsg.setQName(faultName);
+                faultMsg.setUndefined(false);
+                definition.addMessage(faultMsg);
+                faultMsg.addPart(generatePart(definition, faultType.getLogical(), faultName.getLocalPart()));
+            }
+            fault.setMessage(faultMsg);
+            operation.addFault(fault);
+            List<ElementInfo> elements = null;
+            if (faultType.getLogical().getPhysical() != faultType.getPhysical()) {
+                // create special wrapper for type indirection to real fault bean
+                elements = new ArrayList<ElementInfo>(1);
+                DataType logical = faultType.getLogical();
+                elements.add(getElementInfo(logical.getPhysical(), logical, null, helpers));
+             } else {
+                // convert synthesized fault bean to a wrapper type
+                elements = new ArrayList<ElementInfo>();
+                for (DataType<XMLType> propDT: op.getFaultBeans().get(faultName)) {
+                    XMLType logical = propDT.getLogical();
+                    elements.add(getElementInfo(propDT.getPhysical(), propDT, logical.getElementName(), helpers));
+                }
+            }
+            wrappers.put(faultName, elements);
+        }
+
+        operation.setUndefined(false);
+        return operation;
+    }
+
+    public Part generatePart(Definition definition, DataType arg, String partName) {
+        Part part = definition.createPart();
+        part.setName(partName);
+        if (arg != null && arg.getLogical() instanceof XMLType) {
+            XMLType xmlType = (XMLType)arg.getLogical();
+            QName elementName = xmlType.getElementName();
+            part.setElementName(elementName);
+            addNamespace(definition, elementName);
+            if (xmlType.getElementName() == null) {
+                QName typeName = xmlType.getTypeName();
+                part.setTypeName(typeName);
+                addNamespace(definition, typeName);
+            }
+        }
+        return part;
+    }
+
+    public Part generateWrapperPart(Definition definition,
+                                    Operation operation,
+                                    Map<String, XMLTypeHelper> helpers, 
+                                    Map<QName, List<ElementInfo>> wrappers,
+                                    boolean input) throws WSDLException {
+        Part part = definition.createPart();
+        String partName = input ? operation.getName() : (operation.getName() + "Response");
+        part.setName(partName);
+        WrapperInfo opWrapper = operation.getWrapper();
+        if (opWrapper != null) {
+            ElementInfo elementInfo =
+                input ? opWrapper.getInputWrapperElement() : opWrapper.getOutputWrapperElement();
+            List<ElementInfo> elements =
+                input ? opWrapper.getInputChildElements() : opWrapper.getOutputChildElements();
+            QName wrapperName = elementInfo.getQName();
+            part.setElementName(wrapperName);
+            addNamespace(definition, wrapperName);
+            wrappers.put(wrapperName, elements);
+
+            // FIXME: [rfeng] Ideally, we should try to register the wrappers only. But we are
+            // expriencing the problem that we cannot handle XSD imports 
+            /*
+            Class<?> wrapperClass = input ? opWrapper.getInputWrapperClass() : opWrapper.getOutputWrapperClass();
+            DataType wrapperDT = input ? opWrapper.getInputWrapperType() : opWrapper.getOutputWrapperType();
+            if (wrapperClass != null) {
+                getElementInfo(wrapperClass, wrapperDT, wrapperName, helpers);
+                return part;
+            }
+            */
+
+            Method method = ((JavaOperation)operation).getJavaMethod();
+            if (input) {
+                Class<?>[] paramTypes = method.getParameterTypes();
+                for (int i = 0; i < paramTypes.length; i++) {
+                    DataType dataType = operation.getInputType().getLogical().get(i);
+                    elements.set(i, getElementInfo(paramTypes[i], dataType, elements.get(i).getQName(), helpers));
+                }
+            } else {
+                Class<?> returnType = method.getReturnType();
+                if (returnType != Void.TYPE) {
+                    DataType dataType = operation.getOutputType();
+                    elements.set(0, getElementInfo(returnType, dataType, elements.get(0).getQName(), helpers));
+                }
+            }
+        }
+        return part;
+    }
+
+    private ElementInfo getElementInfo(Class javaType,
+                                       DataType dataType,
+                                       QName name,
+                                       Map<String, XMLTypeHelper> helpers) {
+        String db = dataType.getDataBinding();
+        while ("java:array".equals(db)) {
+            dataType = (DataType)dataType.getLogical();
+            db = dataType.getDataBinding();
+        }
+        XMLTypeHelper helper = helpers.get(db);
+        if (helper == null) {
+            DataBinding dataBinding = dataBindings.getDataBinding(db);
+            if (dataBinding == null) {
+                QName element = name;
+                if (element == null || dataType.getLogical() instanceof XMLType) {
+                    XMLType xmlType = (XMLType)dataType.getLogical();
+                    if (xmlType.getElementName() != null) {
+                        element = xmlType.getElementName();
+                    }
+                }
+                return new ElementInfo(element, new TypeInfo(ANYTYPE_QNAME, false, null));
+                // throw new ServiceRuntimeException("No data binding for " + db);
+            }
+
+            helper = dataBinding.getXMLTypeHelper();
+            if (helper == null) {
+                // Default to JAXB
+                helper = helpers.get(JAXBDataBinding.NAME);
+                if (helper == null) {
+                    helper = dataBindings.getDataBinding(JAXBDataBinding.NAME).getXMLTypeHelper();
+                    helpers.put(JAXBDataBinding.NAME, helper);
+                }
+            }
+            helpers.put(db, helper);
+        }
+        TypeInfo typeInfo = helper.getTypeInfo(javaType.isArray() ? javaType.getComponentType() : javaType,
+                                               dataType.getLogical());
+        ElementInfo element = new ElementInfo(name, typeInfo);
+        element.setMany(byte[].class != javaType && javaType.isArray());
+        element.setNillable(!javaType.isPrimitive());
+        return element;
+    }
+
+    private static void addNamespace(Definition definition, QName name) {
+        String namespace = name.getNamespaceURI();
+        if (definition.getPrefix(namespace) == null) {
+            definition.addNamespace("ns" + definition.getNamespaces().size(), namespace);
+        }
+    }
+
+    /*
+    // currently not using the next three methods
+    public XmlSchemaType getXmlSchemaType(DataType type) {
+        return null;
+    }
+
+    // FIXME: WE need to add databinding-specific Java2XSD generation
+    public Element generateXSD(DataType dataType) {
+        DataBinding dataBinding = dataBindings.getDataBinding(dataType.getDataBinding());
+        if (dataBinding != null) {
+            // return dataBinding.generateSchema(dataType);
+        }
+        return null;
+    }
+
+    public void generateWrapperElements(Operation op) {
+        XmlSchemaCollection collection = new XmlSchemaCollection();
+        String ns = getQName(op.getInterface()).getNamespaceURI();
+        XmlSchema schema = new XmlSchema(ns, collection);
+        schema.setAttributeFormDefault(new XmlSchemaForm(XmlSchemaForm.QUALIFIED));
+        schema.setElementFormDefault(new XmlSchemaForm(XmlSchemaForm.QUALIFIED));
+
+        XmlSchemaElement inputElement = new XmlSchemaElement();
+        inputElement.setQName(new QName(ns, op.getName()));
+        XmlSchemaComplexType inputType = new XmlSchemaComplexType(schema);
+        inputType.setName("");
+        XmlSchemaSequence inputSeq = new XmlSchemaSequence();
+        inputType.setParticle(inputSeq);
+        List<DataType> argTypes = op.getInputType().getLogical();
+        for (DataType argType : argTypes) {
+            XmlSchemaElement child = new XmlSchemaElement();
+            Object logical = argType.getLogical();
+            if (logical instanceof XMLType) {
+                child.setName(((XMLType)logical).getElementName().getLocalPart());
+                XmlSchemaType type = getXmlSchemaType(argType);
+                child.setType(type);
+            }
+            inputSeq.getItems().add(child);
+        }
+        inputElement.setType(inputType);
+
+        XmlSchemaElement outputElement = new XmlSchemaElement();
+        outputElement.setQName(new QName(ns, op.getName() + "Response"));
+        XmlSchemaComplexType outputType = new XmlSchemaComplexType(schema);
+        outputType.setName("");
+        XmlSchemaSequence outputSeq = new XmlSchemaSequence();
+        outputType.setParticle(outputSeq);
+        DataType returnType = op.getOutputType();
+        XmlSchemaElement child = new XmlSchemaElement();
+        Object logical = returnType.getLogical();
+        if (logical instanceof XMLType) {
+            child.setName(((XMLType)logical).getElementName().getLocalPart());
+            XmlSchemaType type = getXmlSchemaType(returnType);
+            child.setType(type);
+        }
+        outputSeq.getItems().add(child);
+        outputElement.setType(outputType);
+
+        schema.getElements().add(inputElement.getQName(), inputElement);
+        schema.getElements().add(outputElement.getQName(), outputElement);
+
+    }
+    */
+
+    public WSDLFactory getFactory() {
+        return factory;
+    }
+
+    public void setFactory(WSDLFactory factory) {
+        this.factory = factory;
+    }
+
+}

Added: tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLDefinitionGenerator.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLDefinitionGenerator.java?rev=672803&view=auto
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLDefinitionGenerator.java (added)
+++ tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLDefinitionGenerator.java Mon Jun 30 09:02:54 2008
@@ -0,0 +1,304 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.binding.ws.wsdlgen;
+
+import java.util.Iterator;
+
+import javax.wsdl.Binding;
+import javax.wsdl.BindingFault;
+import javax.wsdl.BindingInput;
+import javax.wsdl.BindingOperation;
+import javax.wsdl.BindingOutput;
+import javax.wsdl.Definition;
+import javax.wsdl.Fault;
+import javax.wsdl.Input;
+import javax.wsdl.Operation;
+import javax.wsdl.Output;
+import javax.wsdl.Port;
+import javax.wsdl.PortType;
+import javax.wsdl.Service;
+import javax.wsdl.Types;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.soap.SOAPAddress;
+import javax.wsdl.extensions.soap.SOAPBinding;
+import javax.wsdl.extensions.soap.SOAPBody;
+import javax.wsdl.extensions.soap.SOAPFault;
+import javax.wsdl.extensions.soap.SOAPOperation;
+import javax.wsdl.extensions.soap12.SOAP12Address;
+import javax.wsdl.extensions.soap12.SOAP12Binding;
+import javax.wsdl.extensions.soap12.SOAP12Body;
+import javax.wsdl.extensions.soap12.SOAP12Fault;
+import javax.wsdl.extensions.soap12.SOAP12Operation;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Element;
+
+/**
+ * 
+ * @version $Rev: 668025 $ $Date: 2008-06-16 01:06:34 +0100 (Mon, 16 Jun 2008) $
+ */
+public class WSDLDefinitionGenerator {
+    private static final String SOAP_NS = "http://schemas.xmlsoap.org/wsdl/soap/";
+    public static final QName SOAP_ADDRESS = new QName(SOAP_NS, "address");
+    private static final QName SOAP_BINDING = new QName(SOAP_NS, "binding");
+    private static final QName SOAP_BODY = new QName(SOAP_NS, "body");
+    private static final QName SOAP_FAULT = new QName(SOAP_NS, "fault");
+    private static final QName SOAP_OPERATION = new QName(SOAP_NS, "operation");
+    private static final String SOAP12_NS = "http://schemas.xmlsoap.org/wsdl/soap12/";
+    public static final QName SOAP12_ADDRESS = new QName(SOAP12_NS, "address");
+    private static final QName SOAP12_BINDING = new QName(SOAP12_NS, "binding");
+    private static final QName SOAP12_BODY = new QName(SOAP12_NS, "body");
+    private static final QName SOAP12_FAULT = new QName(SOAP12_NS, "fault");
+    private static final QName SOAP12_OPERATION = new QName(SOAP12_NS, "operation");
+
+    private static final String BINDING_SUFFIX = "Binding";
+    private static final String SERVICE_SUFFIX = "Service";
+    private static final String PORT_SUFFIX = "Port";
+
+    private boolean requiresSOAP12;
+    private QName soapAddress;
+    private QName soapBinding;
+    private QName soapBody;
+    private QName soapFault;
+    private QName soapOperation;
+
+    public WSDLDefinitionGenerator(boolean requiresSOAP12) {
+        super();
+        this.requiresSOAP12 = requiresSOAP12;
+        soapAddress = requiresSOAP12 ? SOAP12_ADDRESS : SOAP_ADDRESS;
+        soapBinding = requiresSOAP12 ? SOAP12_BINDING : SOAP_BINDING;
+        soapBody = requiresSOAP12 ? SOAP12_BODY : SOAP_BODY;
+        soapFault = requiresSOAP12 ? SOAP12_FAULT : SOAP_FAULT;
+        soapOperation = requiresSOAP12 ? SOAP12_OPERATION : SOAP_OPERATION;
+    }
+
+    public Definition cloneDefinition(WSDLFactory factory, Definition definition) throws WSDLException {
+        Element root = definition.getDocumentationElement();
+        root = (Element)root.cloneNode(true);
+        WSDLReader reader = factory.newWSDLReader();
+        return reader.readWSDL(definition.getDocumentBaseURI(), root);
+    }
+    
+    public Types createTypes(Definition definition) {
+        Types types = definition.createTypes();
+        definition.setTypes(types);
+        return types;
+    }
+
+    public Binding createBinding(Definition definition, PortType portType) {
+        try {
+            Binding binding = definition.createBinding();
+            binding.setPortType(portType);
+            configureBinding(definition, binding, portType);
+            ExtensibilityElement bindingExtension =
+                definition.getExtensionRegistry().createExtension(Binding.class, soapBinding);
+            if (requiresSOAP12) {
+                ((SOAP12Binding)bindingExtension).setStyle("document");
+                ((SOAP12Binding)bindingExtension).setTransportURI("http://schemas.xmlsoap.org/soap/http");
+            } else {
+                ((SOAPBinding)bindingExtension).setStyle("document");
+                ((SOAPBinding)bindingExtension).setTransportURI("http://schemas.xmlsoap.org/soap/http");
+            }
+            binding.addExtensibilityElement(bindingExtension);
+            return binding;
+        } catch (WSDLException e) {
+            throw new WSDLGenerationException(e);
+        }
+    }
+
+    protected void configureBinding(Definition definition, Binding binding, PortType portType) throws WSDLException {
+        QName portTypeName = portType.getQName();
+        if (portTypeName != null) {
+            // Choose <porttype>Binding if available.  If this name is in use, insert
+            // separating underscores until there is no clash.
+            for (String suffix = BINDING_SUFFIX; ; suffix = "_" + suffix) { 
+                QName name = new QName(definition.getTargetNamespace(), portTypeName.getLocalPart() + suffix);
+                if (definition.getBinding(name) == null) {
+                    binding.setQName(name);
+                    break;
+                }
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public void createBindingOperations(Definition definition, Binding binding, PortType portType) {
+        try {
+            for (Iterator oi = portType.getOperations().iterator(); oi.hasNext();) {
+                Operation operation = (Operation)oi.next();
+                BindingOperation bindingOperation = createBindingOperation(definition, operation, "");
+                binding.addBindingOperation(bindingOperation);
+            }
+        } catch (WSDLException e) {
+            throw new WSDLGenerationException(e);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public BindingOperation createBindingOperation(Definition definition, Operation operation, String action)
+        throws WSDLException {
+        BindingOperation bindingOperation = definition.createBindingOperation();
+        bindingOperation.setOperation(operation);
+        configureBindingOperation(bindingOperation, operation);
+        ExtensibilityElement operationExtension =
+            definition.getExtensionRegistry().createExtension(BindingOperation.class, soapOperation);
+        if (requiresSOAP12) {
+            ((SOAP12Operation)operationExtension).setSoapActionURI(action);
+        } else {
+            ((SOAPOperation)operationExtension).setSoapActionURI(action);
+        }
+        bindingOperation.addExtensibilityElement(operationExtension);
+        if (operation.getInput() != null) {
+            BindingInput bindingInput = definition.createBindingInput();
+            configureBindingInput(bindingInput, operation.getInput());
+            ExtensibilityElement inputExtension =
+                definition.getExtensionRegistry().createExtension(BindingInput.class, soapBody);
+            if (requiresSOAP12) {
+                ((SOAP12Body)inputExtension).setUse("literal");
+            } else {
+                ((SOAPBody)inputExtension).setUse("literal");
+            }
+            bindingInput.addExtensibilityElement(inputExtension);
+            bindingOperation.setBindingInput(bindingInput);
+        }
+        if (operation.getOutput() != null) {
+            BindingOutput bindingOutput = definition.createBindingOutput();
+            configureBindingOutput(bindingOutput, operation.getOutput());
+            ExtensibilityElement outputExtension =
+                definition.getExtensionRegistry().createExtension(BindingOutput.class, soapBody);
+            if (requiresSOAP12) {
+                ((SOAP12Body)outputExtension).setUse("literal");
+            } else {
+                ((SOAPBody)outputExtension).setUse("literal");
+            }
+            bindingOutput.addExtensibilityElement(outputExtension);
+            bindingOperation.setBindingOutput(bindingOutput);
+        }
+        for (Iterator fi = operation.getFaults().values().iterator(); fi.hasNext();) {
+            Fault fault = (Fault)fi.next();
+            BindingFault bindingFault = definition.createBindingFault();
+            ExtensibilityElement faultExtension =
+                definition.getExtensionRegistry().createExtension(BindingFault.class, soapFault);
+            configureBindingFault(bindingFault, faultExtension, fault);
+            bindingFault.addExtensibilityElement(faultExtension);
+            bindingOperation.addBindingFault(bindingFault);
+        }
+        return bindingOperation;
+    }
+
+    protected void configureBindingOperation(BindingOperation bindingOperation, Operation operation)
+        throws WSDLException {
+        bindingOperation.setName(operation.getName());
+    }
+
+    protected void configureBindingInput(BindingInput bindingInput, Input input) throws WSDLException {
+        bindingInput.setName(input.getName());
+    }
+
+    protected void configureBindingOutput(BindingOutput bindingOutput, Output output) throws WSDLException {
+        bindingOutput.setName(output.getName());
+    }
+
+    protected void configureBindingFault(BindingFault bindingFault,
+                                         ExtensibilityElement faultExtension,
+                                         Fault fault)
+                                     throws WSDLException {
+        String faultName = fault.getName();
+        bindingFault.setName(faultName);
+        if (requiresSOAP12) {
+            ((SOAP12Fault)faultExtension).setName(faultName);
+            ((SOAP12Fault)faultExtension).setUse("literal");
+        } else {
+            ((SOAPFault)faultExtension).setName(faultName);
+            ((SOAPFault)faultExtension).setUse("literal");
+        }
+    }
+
+    public Service createService(Definition definition, PortType portType) {
+        try {
+            Service service = definition.createService();
+            configureService(definition, service, portType);
+            // createPort(definition, binding, service);
+            definition.addService(service);
+            return service;
+        } catch (WSDLException e) {
+            throw new WSDLGenerationException(e);
+        }
+    }
+
+    public Service createService(Definition definition, Binding binding) {
+        try {
+            Service service = definition.createService();
+            configureService(definition, service, binding.getPortType());
+            // createPort(definition, binding, service);
+            definition.addService(service);
+            return service;
+        } catch (WSDLException e) {
+            throw new WSDLGenerationException(e);
+        }
+    }
+
+    protected void configureService(Definition definition, Service service, PortType portType) throws WSDLException {
+        QName portTypeName = portType.getQName();
+        if (portTypeName != null) {
+            // Choose <porttype>Service if available.  If this name is in use, insert
+            // separating underscores until there is no clash.
+            for (String suffix = SERVICE_SUFFIX; ; suffix = "_" + suffix) {
+                QName name = new QName(definition.getTargetNamespace(), portTypeName.getLocalPart() + suffix);
+                if (definition.getService(name) == null) {
+                    service.setQName(name);
+                    break;
+                }
+            }
+        }
+    }
+
+    public Port createPort(Definition definition, Binding binding, Service service, String uri) {
+        try {
+            Port port = definition.createPort();
+            port.setBinding(binding);
+            configurePort(port, binding);
+            if (uri != null) {
+                ExtensibilityElement portExtension =
+                    definition.getExtensionRegistry().createExtension(Port.class, soapAddress);
+                if (requiresSOAP12) {
+                    ((SOAP12Address)portExtension).setLocationURI(uri);
+                } else {
+                    ((SOAPAddress)portExtension).setLocationURI(uri);
+                }
+                port.addExtensibilityElement(portExtension);
+            }
+            service.addPort(port);
+            return port;
+        } catch (WSDLException e) {
+            throw new WSDLGenerationException(e);
+        }
+    }
+
+    protected void configurePort(Port port, Binding binding) throws WSDLException {
+        if (binding.getPortType() != null && binding.getPortType().getQName() != null) {
+            port.setName(binding.getPortType().getQName().getLocalPart() + PORT_SUFFIX);
+        }
+    }
+
+}

Added: tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLGenerationException.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLGenerationException.java?rev=672803&view=auto
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLGenerationException.java (added)
+++ tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLGenerationException.java Mon Jun 30 09:02:54 2008
@@ -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.binding.ws.wsdlgen;
+
+import org.apache.tuscany.sca.monitor.Problem;
+import org.osoa.sca.ServiceRuntimeException;
+
+public class WSDLGenerationException extends ServiceRuntimeException {
+    private static final long serialVersionUID = 1L;
+    private Problem problem;
+
+    public WSDLGenerationException() {
+        super();
+    }
+
+    public WSDLGenerationException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public WSDLGenerationException(String message) {
+        super(message);
+    }
+
+    public WSDLGenerationException(Throwable cause) {
+        super(cause);
+    }
+
+    public WSDLGenerationException(String message, Throwable cause, Problem problem) {
+        super(message, cause);
+        this.problem = problem;
+    }
+
+    public Problem getProblem() {
+        return problem;
+    }
+
+}