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 23:45:27 UTC

svn commit: r672939 [3/3] - in /tuscany/java/sca: itest/validation/src/main/java/calculator/warning/ itest/validation/src/main/resources/NoMatchingBinding/ itest/validation/src/main/resources/ServiceNotFoundForComponentService/ itest/validation/src/mai...

Added: tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java (added)
+++ tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java Mon Jun 30 14:45:25 2008
@@ -0,0 +1,527 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.binding.ws.wsdlgen;
+
+//FIXME: trim the import list down to what's really needed
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Iterator;
+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.Import;
+import javax.wsdl.Port;
+import javax.wsdl.PortType;
+import javax.wsdl.Service;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.soap.SOAPAddress;
+import javax.wsdl.extensions.soap.SOAPBinding;
+import javax.wsdl.extensions.soap.SOAPOperation;
+import javax.wsdl.extensions.soap12.SOAP12Address;
+import javax.wsdl.extensions.soap12.SOAP12Binding;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLWriter;
+import javax.xml.namespace.QName;
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.dom.DOMSource;
+
+import org.apache.tuscany.sca.assembly.AbstractContract;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.CompositeService;
+import org.apache.tuscany.sca.assembly.builder.impl.ProblemImpl;
+import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
+import org.apache.tuscany.sca.interfacedef.Interface;
+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.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.Problem;
+import org.apache.tuscany.sca.monitor.Problem.Severity;
+import org.apache.tuscany.sca.policy.PolicySet;
+import org.apache.tuscany.sca.policy.PolicySetAttachPoint;
+import org.apache.tuscany.sca.policy.security.ws.Axis2ConfigParamPolicy;
+import org.apache.tuscany.sca.policy.util.PolicyHandler;
+import org.apache.tuscany.sca.policy.util.PolicyHandlerTuple;
+import org.apache.tuscany.sca.policy.util.PolicyHandlerUtils;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * WSDLServiceGenerator generates a binding WSDL service document.
+ *
+ * @version $Rev$ $Date$
+ */
+public class WSDLServiceGenerator {
+    // the following switch is temporary for debugging
+    public static boolean printWSDL;  // external code sets this to print generated WSDL
+    
+    private static final Logger logger = Logger.getLogger(WSDLServiceGenerator.class.getName());
+    private static final QName TRANSPORT_JMS_QUALIFIED_INTENT =
+        new QName("http://www.osoa.org/xmlns/sca/1.0", "transport.jms");
+    private static final String DEFAULT_QUEUE_CONNECTION_FACTORY = "TuscanyQueueConnectionFactory";
+    private static final String ADDRESS = "Address";
+
+    private WSDLServiceGenerator() {
+        // this class has static methods only and cannot be instantiated
+    }
+
+    /**
+     * Log a warning message.
+     * @param problem
+     */
+    private static void logWarning(Problem problem) {
+        Logger problemLogger = Logger.getLogger(problem.getSourceClassName(), problem.getBundleName());
+        if (problemLogger != null){
+            problemLogger.logp(Level.WARNING, problem.getSourceClassName(), null, problem.getMessageId(), problem.getMessageParams());
+        } else {
+            logger.severe("Can't get logger " + problem.getSourceClassName()+ " with bundle " + problem.getBundleName());
+        }
+    }
+
+    /**
+     * Report a warning.
+     * @param message
+     * @param binding
+     * @param parameters
+     */
+    private static void warning(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) {
+        Problem problem = new ProblemImpl(WSDLServiceGenerator.class.getName(), "wsdlgen-validation-messages", Severity.WARNING, wsBinding, message, (Object[])messageParameters);
+        if (monitor != null) {
+            monitor.problem(problem);
+        } else {
+            logWarning(problem);
+        }
+    }
+
+    /**
+     * Report an error.
+     * @param message
+     * @param binding
+     * @param parameters
+     */
+    private static void error(Monitor monitor, String message, WebServiceBinding wsBinding, String... messageParameters) {
+        Problem problem = new ProblemImpl(WSDLServiceGenerator.class.getName(), "wsdlgen-validation-messages", Severity.ERROR, wsBinding, message, (Object[])messageParameters);
+        if (monitor != null) {
+            monitor.problem(problem);
+        } else {
+            throw new WSDLGenerationException(problem.toString(), null, problem);
+        }
+    }
+
+    /**
+     * Generate a suitably configured WSDL definition
+     */
+    protected static Definition configureWSDLDefinition(WebServiceBinding wsBinding,
+                                                        Component component,
+                                                        AbstractContract contract,
+                                                        Monitor monitor) {
+
+        // For every promoted composite service, the underlying component
+        // gets a copy of the service with the name prefixed by "$promoted$."
+        String contractName = (contract instanceof CompositeService ? "$promoted$." : "") + contract.getName();
+
+        List<Port> ports = new ArrayList<Port>();
+        WSDLDefinition wsdlDefinition = wsBinding.getWSDLDefinition();
+        if (wsdlDefinition == null) {
+            return null;
+        }
+        Definition def = wsdlDefinition.getDefinition();
+        if (wsdlDefinition.getBinding() == null) {
+            // The WSDL document was provided by the user.  Generate a new
+            // WSDL document with imports from the user-provided document.
+            WSDLFactory factory = null;
+            try {
+                factory = WSDLFactory.newInstance();
+            } catch (WSDLException e) {
+                throw new WSDLGenerationException(e);
+            }
+            Definition newDef = factory.newDefinition();
+
+            // Construct a target namespace from the base URI of the user's
+            // WSDL document (is this what we should be using?) and a path
+            // computed according to the SCA Web Service binding spec.
+            String nsName = component.getName() + "/" + contractName;
+            String namespaceURI = null;
+            try {
+                URI userTNS = new URI(def.getTargetNamespace());
+                namespaceURI = userTNS.resolve("/" + nsName).toString();
+            } catch (URISyntaxException e1) {
+                throw new WSDLGenerationException(e1);
+            } catch (IllegalArgumentException e2) {
+                throw new WSDLGenerationException(e2);
+            }
+
+            // set name and targetNamespace attributes on the definition
+            String defsName = component.getName() + "." + contractName;
+            newDef.setQName(new QName(namespaceURI, defsName));
+            newDef.setTargetNamespace(namespaceURI);
+            newDef.addNamespace("tns", namespaceURI);
+
+            // set wsdl namespace prefix on the definition
+            newDef.addNamespace("wsdl", "http://schemas.xmlsoap.org/wsdl/");
+
+            // import the service or reference interface portType
+            List<WSDLDefinition> imports = new ArrayList<WSDLDefinition>();
+            Interface interfaze = wsBinding.getBindingInterfaceContract().getInterface();
+            if (interfaze instanceof WSDLInterface) {
+                PortType portType = ((WSDLInterface)interfaze).getPortType();
+                boolean ok = importPortType(portType, wsdlDefinition, newDef, imports);
+                if (!ok) {
+                    error(monitor, "PortTypeNotFound", wsBinding, portType.getQName().toString(),
+                          component.getName(), contract.getName());
+                }
+            }
+
+            // import an existing binding if specified
+            Binding binding = wsBinding.getBinding();
+            if (binding != null) {
+                boolean ok = importBinding(binding, wsdlDefinition, newDef, imports);
+                if (ok) {
+                    boolean ok2 = importPortType(binding.getPortType(), wsdlDefinition, newDef, imports);
+                    if (!ok2) {
+                        error(monitor, "PortTypeNotFound", wsBinding, binding.getPortType().getQName().toString(),
+                              component.getName(), contract.getName());
+                    }
+                } else {
+                    error(monitor, "BindingNotFound", wsBinding, binding.getQName().toString(),
+                          component.getName(), contract.getName());
+                }
+            }
+
+            // import bindings and portTypes needed by services and ports 
+            QName serviceQName = wsBinding.getServiceName();
+            String portName = wsBinding.getPortName();
+            if (serviceQName != null) {
+                Service service = def.getService(serviceQName); 
+                if (portName != null) {
+                    Port port = service.getPort(portName);
+                    Port newPort = copyPort(newDef, port, wsBinding);
+                    if (newPort != null) {
+                        importBinding(port.getBinding(), wsdlDefinition, newDef, imports);
+                        ports.add(newPort);
+                    } else {
+                        error(monitor, "InvalidPort", wsBinding, serviceQName.toString(), portName,
+                              component.getName(), contract.getName());
+                    }
+                } else {
+                    for (Object port : service.getPorts().values()) {
+                        Port newPort = copyPort(newDef, (Port)port, wsBinding);
+                        if (newPort != null) {
+                            importBinding(((Port)port).getBinding(), wsdlDefinition, newDef, imports);
+                            ports.add(newPort);
+                        } else {
+                            // not an error, just ignore the port
+                            warning(monitor, "IgnoringPort", wsBinding, serviceQName.toString(), ((Port)port).getName(),
+                                    component.getName(), contract.getName());
+                        }
+                    }
+                    if (ports.size() == 0) {
+                        error(monitor, "NoValidPorts", wsBinding, serviceQName.toString(),
+                              component.getName(), contract.getName());
+                    }
+                }
+            }
+
+            // replace original WSDL definition by the generated definition
+            def = newDef;
+
+        } else {
+            // The WSDL definition was generated by Interface2WSDLGenerator.
+            // Reuse it instead of creating a new definition here.
+        }
+
+        // add a service and ports to the generated definition  
+        WSDLDefinitionGenerator helper =
+                new WSDLDefinitionGenerator(BindingWSDLGenerator.requiresSOAP12(wsBinding));
+        WSDLInterface wi = (WSDLInterface)wsBinding.getBindingInterfaceContract().getInterface();
+        PortType portType = wi.getPortType();
+        Service service = helper.createService(def, portType);
+        if (wsBinding.getBinding() == null && ports.size() == 0) {
+            Binding binding = helper.createBinding(def, portType);
+            if (BindingWSDLGenerator.requiresSOAP12(wsBinding)) {
+                def.addNamespace("soap12", "http://schemas.xmlsoap.org/wsdl/soap12/");
+            } else {
+                def.addNamespace("soap11", "http://schemas.xmlsoap.org/wsdl/soap/");
+            }
+            helper.createBindingOperations(def, binding, portType);
+            binding.setUndefined(false);
+            def.addBinding(binding);
+            
+            String endpointURI = computeActualURI(wsBinding, null);
+            Port port = helper.createPort(def, binding, service, endpointURI);
+            wsBinding.setService(service);
+            wsBinding.setPort(port);
+        } else {
+            if (ports.size() > 0) {
+                // there are one or more user-specified valid ports
+                for (Port port : ports) {
+                    service.addPort(port);
+                }
+                if (ports.size() == 1) {
+                    // only one port, so use it
+                    wsBinding.setPort(ports.get(0));
+                } else {
+                    // multiple ports, make them all available
+                    wsBinding.setPort(null);
+                }
+            } else {
+                // no valid user-specified ports, so create a suitably configured port
+                String endpointURI = computeActualURI(wsBinding, null);
+                Port port = helper.createPort(def, wsBinding.getBinding(), service, endpointURI);
+                if (BindingWSDLGenerator.requiresSOAP12(wsBinding)) {
+                    def.addNamespace("soap12", "http://schemas.xmlsoap.org/wsdl/soap12/");
+                } else {
+                    def.addNamespace("soap11", "http://schemas.xmlsoap.org/wsdl/soap/");
+                }
+                wsBinding.setPort(port);
+            }
+            wsBinding.setService(service);
+        }
+
+        // for debugging
+        if (printWSDL) {
+            try {
+                System.out.println("Generated WSDL for " + component.getName() + "/" + contractName);
+                WSDLWriter writer =  javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter();
+                writer.writeWSDL(def, System.out);
+            } catch (WSDLException e) {
+                throw new WSDLGenerationException(e);
+            }
+        }
+
+        return def;
+    }
+
+    private static boolean importPortType(PortType portType,
+                                          WSDLDefinition wsdlDef,
+                                          Definition newDef,
+                                          List<WSDLDefinition> imports) {
+        return addImport(portType.getQName(), PortType.class, wsdlDef, newDef, imports);
+    }
+    
+    private static boolean importBinding(Binding binding,
+                                         WSDLDefinition wsdlDef,
+                                         Definition newDef,
+                                         List<WSDLDefinition> imports) {
+        boolean ok = addImport(binding.getQName(), Binding.class, wsdlDef, newDef, imports);
+        if (ok) {
+            List bindingExtensions = binding.getExtensibilityElements();
+            for (final Object extension : bindingExtensions) {
+                if (extension instanceof SOAPBinding) {
+                    newDef.addNamespace("soap11", "http://schemas.xmlsoap.org/wsdl/soap/");
+                }
+                if (extension instanceof SOAP12Binding) {
+                    newDef.addNamespace("soap12", "http://schemas.xmlsoap.org/wsdl/soap12/");
+                }
+            }
+        }
+        return ok;
+    }
+    
+    private static boolean addImport(QName name,
+                                     Class type,
+                                     WSDLDefinition wsdlDef,
+                                     Definition newDef,
+                                     List<WSDLDefinition> imports) {
+        String namespace = name.getNamespaceURI();
+        if (newDef.getImports(namespace) == null) {
+            WSDLDefinition impDef = findDefinition(wsdlDef, name, type);
+            if (impDef != null) {
+                Import imp = newDef.createImport();
+                imp.setNamespaceURI(namespace);
+                imp.setLocationURI(impDef.getURI().toString());
+                imp.setDefinition(impDef.getDefinition());
+                newDef.addNamespace("ns" + imports.size(), namespace);
+                newDef.addImport(imp);
+                imports.add(impDef);
+                return true;
+            } else {
+                // import was not added because element not found
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static WSDLDefinition findDefinition(WSDLDefinition wsdlDef, QName name, Class type) {
+        if (wsdlDef == null || name == null) {
+            return wsdlDef;
+        }
+        if (wsdlDef.getURI() != null) {  // not a facade
+            Definition def = wsdlDef.getDefinition();
+            Map types = type == PortType.class ? def.getPortTypes() : def.getBindings();
+            if (types.get(name) != null) {
+                return wsdlDef;
+            }
+        }
+        for (WSDLDefinition impDef : wsdlDef.getImportedDefinitions()) {
+            WSDLDefinition d = findDefinition(impDef, name, type);
+            if (d != null) {
+                return d;
+            }
+        }
+        return null;
+    }
+
+    private static Port copyPort(Definition def, Port port, WebServiceBinding wsBinding) {
+        Port newPort = def.createPort();
+        newPort.setName(port.getName());
+        newPort.setBinding(port.getBinding());
+        List portExtensions = port.getExtensibilityElements();
+        for (final Object extension : portExtensions) {
+            ExtensibilityElement newExt = null;
+            if (extension instanceof SOAPAddress) {
+                def.addNamespace("soap11", "http://schemas.xmlsoap.org/wsdl/soap/");
+                try {
+                    newExt = def.getExtensionRegistry().createExtension(
+                             Port.class, WSDLDefinitionGenerator.SOAP_ADDRESS);
+                } catch (WSDLException e) {
+                }
+                String uri = computeActualURI(wsBinding, port);
+                ((SOAPAddress)newExt).setLocationURI(uri);
+                newPort.addExtensibilityElement(newExt);
+            } else if (extension instanceof SOAP12Address) {
+                def.addNamespace("soap12", "http://schemas.xmlsoap.org/wsdl/soap12/");
+                try {
+                    newExt = def.getExtensionRegistry().createExtension(
+                             Port.class, WSDLDefinitionGenerator.SOAP12_ADDRESS);
+                } catch (WSDLException e) {
+                }
+                String uri = computeActualURI(wsBinding, port);
+                ((SOAP12Address)newExt).setLocationURI(uri);
+                newPort.addExtensibilityElement(newExt);
+            } else {
+                // we don't support ports with other extensibility elements such as HTTPAddress
+                return null;
+            }
+        }
+        return newPort;
+    }
+
+    /**
+     * Compute the endpoint URI based on section 2.1.1 of the WS binding Specification 1.
+     * The URIs in the endpoint(s) of the referenced WSDL, which may be relative
+     * 2. The URI specified by the wsa:Address element of the
+     * wsa:EndpointReference, which may be relative 3. The explicitly stated URI
+     * in the "uri" attribute of the binding.ws element, which may be relative,
+     * 4. The implicit URI as defined by in section 1.7 in the SCA Assembly Specification
+     * If the <binding.ws> has no wsdlElement but does have a uri attribute then
+     * the uri takes precedence over any implicitly used WSDL.
+     * 
+     */
+    private static String computeActualURI(WebServiceBinding wsBinding, Port port) {
+
+        URI eprURI = null;
+        if (wsBinding.getEndPointReference() != null) {
+            eprURI = getEPR(wsBinding); 
+        }
+
+        URI wsdlURI = null;
+        if (wsBinding.getServiceName() != null && wsBinding.getBindingName() == null) {
+            // <binding.ws> explicitly points at a WSDL port, may be a relative URI
+            wsdlURI = getEndpoint(port);
+        }
+
+        // if the WSDL port/endpoint has an absolute URI use that
+        if (wsdlURI != null && wsdlURI.isAbsolute()) {
+            return wsdlURI.toString();
+        }
+
+        // if the wsa:EndpointReference has an address element with an absolute URI use that
+        if (eprURI != null && eprURI.isAbsolute()) {
+            return eprURI.toString();
+        }
+        
+        // either there is no WSDL port endpoint URI or that URI is relative
+        String actualURI = wsBinding.getURI();
+        if (eprURI != null && eprURI.toString().length() != 0) {
+            // there is a relative URI in the binding EPR
+            actualURI = actualURI + "/" + eprURI;
+        }
+
+        if (wsdlURI != null && wsdlURI.toString().length() != 0) {
+            // there is a relative URI in the WSDL port
+            actualURI = actualURI + "/" + wsdlURI;
+        }
+        
+        if (actualURI != null) {
+            actualURI = URI.create(actualURI).normalize().toString();
+        }
+        
+        return actualURI;
+    }
+
+    private static URI getEPR(WebServiceBinding wsBinding) {
+        NodeList nodeList = wsBinding.getEndPointReference().getChildNodes();
+        for (int i = 0; i < nodeList.getLength(); i++) {
+            Node childNode = nodeList.item(i);
+            if (childNode instanceof Element && ADDRESS.equals(childNode.getLocalName())) {
+                NodeList addrNodes = childNode.getChildNodes();
+                for (int j = 0; j < addrNodes.getLength(); j++) {
+                    Node addrNode = addrNodes.item(j);
+                    if (addrNode instanceof Text) {
+                        return URI.create(((Text)addrNode).getWholeText());
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the endpoint of a given port.
+     */
+    private static URI getEndpoint(Port wsdlPort) {
+        if (wsdlPort != null) {
+            List<?> wsdlPortExtensions = wsdlPort.getExtensibilityElements();
+            for (Object extension : wsdlPortExtensions) {
+                if (extension instanceof SOAPAddress) {
+                    String uri = ((SOAPAddress)extension).getLocationURI();
+                    return (uri == null || "".equals(uri)) ? null : URI.create(uri);
+                }
+                if (extension instanceof SOAP12Address) {
+                    SOAP12Address address = (SOAP12Address)extension;
+                    String uri = address.getLocationURI();
+                    return (uri == null || "".equals(uri)) ? null : URI.create(uri);
+                }
+            }
+        }
+        return null;
+    }
+
+}

Added: tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/resources/wsdlgen-validation-messages.properties
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/resources/wsdlgen-validation-messages.properties?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/resources/wsdlgen-validation-messages.properties (added)
+++ tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/resources/wsdlgen-validation-messages.properties Mon Jun 30 14:45:25 2008
@@ -0,0 +1,30 @@
+#
+#
+#    Licensed to the Apache Software Foundation (ASF) under one
+#    or more contributor license agreements. See the NOTICE file
+#    distributed with this work for additional information
+#    regarding copyright ownership. The ASF licenses this file
+#    to you under the Apache License, Version 2.0 (the
+#    "License"); you may not use this file except in compliance
+#    with the License. You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing,
+#    software distributed under the License is distributed on an
+#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#    KIND, either express or implied. See the License for the
+#    specific language governing permissions and limitations
+#    under the License.
+#
+#
+WsdlGenProblem = Unable to generate WSDL for {0}/{1}
+WsdlGenException = Exception while generating WSDL for {0}/{1}
+UnexpectedException = Exception thrown was: {0}
+MissingInterfaceContract = No interface contract for {0}/{1}
+InterfaceNotRemotable = Interface not remotable: {0}
+IgnoringPort = Port {0}/{1} in {2}/{3} is not supported and was ignored
+PortTypeNotFound = PortType {0} in {1}/{2} was not found
+BindingNotFound = Binding {0} in {1}/{2} was not found
+InvalidPort = Port {0}/{1} in {2}/{3} is not supported
+NoValidPorts = No valid ports for service {0} in {1}/{2}

Added: tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGeneratorTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGeneratorTestCase.java?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGeneratorTestCase.java (added)
+++ tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGeneratorTestCase.java Mon Jun 30 14:45:25 2008
@@ -0,0 +1,86 @@
+/*
+ * 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.Map;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Operation;
+import javax.wsdl.PortType;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.contribution.DefaultModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.core.databinding.processor.DataBindingJavaInterfaceProcessor;
+import org.apache.tuscany.sca.databinding.DefaultDataBindingExtensionPoint;
+import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
+import org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.java.jaxws.JAXWSFaultExceptionMapper;
+import org.apache.tuscany.sca.interfacedef.java.jaxws.JAXWSJavaInterfaceProcessor;
+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.xsd.XSDFactory;
+import org.apache.tuscany.sca.xsd.xml.XSDModelResolver;
+import org.osoa.sca.annotations.Remotable;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+public class BindingWSDLGeneratorTestCase extends TestCase {
+
+    public void testCreateWSDLInterfaceContract() throws InvalidInterfaceException {
+        DefaultModelFactoryExtensionPoint modelFactories = new DefaultModelFactoryExtensionPoint();
+        WSDLFactory wsdlFactory = modelFactories.getFactory(WSDLFactory.class);
+        XSDFactory xsdFactory = modelFactories.getFactory(XSDFactory.class);
+        DefaultJavaInterfaceFactory factory = new DefaultJavaInterfaceFactory();
+        JavaInterfaceContract javaIC = factory.createJavaInterfaceContract();
+        JavaInterface iface = factory.createJavaInterface(HelloWorld.class);
+        DefaultDataBindingExtensionPoint dataBindings = new DefaultDataBindingExtensionPoint();
+        JAXWSFaultExceptionMapper faultExceptionMapper = new JAXWSFaultExceptionMapper(dataBindings, null);
+        new JAXWSJavaInterfaceProcessor(dataBindings, faultExceptionMapper, null).visitInterface(iface);
+        new DataBindingJavaInterfaceProcessor(dataBindings).visitInterface(iface);
+        javaIC.setInterface(iface);
+        WSDLInterfaceContract wsdlIC = BindingWSDLGenerator.createWSDLInterfaceContract(javaIC, false, new XSDModelResolver(null, null), dataBindings, wsdlFactory, xsdFactory, null);
+        assertNotNull(wsdlIC);
+        WSDLInterface wsdlInterface = (WSDLInterface)wsdlIC.getInterface();
+        assertNotNull(wsdlInterface);
+        assertEquals(1, wsdlInterface.getOperations().size());
+        assertEquals("sayHello", wsdlInterface.getOperations().get(0).getName());
+        assertNotNull(wsdlInterface.getPortType());
+ 
+        JavaInterfaceContract javaIC2 = factory.createJavaInterfaceContract();
+        JavaInterface iface2 = factory.createJavaInterface(TestJavaInterface.class);
+        new JAXWSJavaInterfaceProcessor(dataBindings, faultExceptionMapper, null).visitInterface(iface2);
+        new DataBindingJavaInterfaceProcessor(dataBindings).visitInterface(iface2);
+        javaIC2.setInterface(iface2);
+        WSDLInterfaceContract wsdlIC2 = BindingWSDLGenerator.createWSDLInterfaceContract(javaIC2, false, new XSDModelResolver(null, null), dataBindings, wsdlFactory, xsdFactory, null);
+        assertNotNull(wsdlIC2);
+    }
+
+}
+
+@Remotable
+interface HelloWorld {
+    String sayHello(String s);
+}

Added: tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGeneratorTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGeneratorTestCase.java?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGeneratorTestCase.java (added)
+++ tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGeneratorTestCase.java Mon Jun 30 14:45:25 2008
@@ -0,0 +1,66 @@
+/*
+ * 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.io.StringWriter;
+
+import javax.wsdl.Definition;
+import javax.wsdl.xml.WSDLWriter;
+
+import org.apache.tuscany.sca.contribution.DefaultModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.core.databinding.processor.DataBindingJavaInterfaceProcessor;
+import org.apache.tuscany.sca.databinding.DefaultDataBindingExtensionPoint;
+import org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.jaxws.JAXWSFaultExceptionMapper;
+import org.apache.tuscany.sca.interfacedef.java.jaxws.JAXWSJavaInterfaceProcessor;
+import org.apache.tuscany.sca.interfacedef.wsdl.DefaultWSDLFactory;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
+import org.apache.tuscany.sca.xsd.DefaultXSDFactory;
+import org.apache.tuscany.sca.xsd.xml.XSDModelResolver;
+import org.junit.Test;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class Interface2WSDLGeneratorTestCase {
+
+    @Test
+    public void testGenerate() throws Exception {
+        DefaultJavaInterfaceFactory iFactory = new DefaultJavaInterfaceFactory();
+        JavaInterface iface = iFactory.createJavaInterface(TestJavaInterface.class);
+        DefaultDataBindingExtensionPoint dataBindings = new DefaultDataBindingExtensionPoint();
+        JAXWSFaultExceptionMapper faultExceptionMapper = new JAXWSFaultExceptionMapper(dataBindings, null);
+        new JAXWSJavaInterfaceProcessor(dataBindings, faultExceptionMapper, null).visitInterface(iface);
+        new DataBindingJavaInterfaceProcessor(dataBindings).visitInterface(iface);
+        DefaultModelFactoryExtensionPoint modelFactories = new DefaultModelFactoryExtensionPoint();
+        WSDLDefinition wsdlDefinition = new DefaultWSDLFactory(modelFactories).createWSDLDefinition();
+        DefaultXSDFactory factory = new DefaultXSDFactory();
+        Interface2WSDLGenerator generator = new Interface2WSDLGenerator(false, new XSDModelResolver(null, null), dataBindings, factory, null);
+        Definition definition = generator.generate(iface, wsdlDefinition);
+
+        // print the generated WSDL file and inline schemas
+        WSDLWriter writer = generator.getFactory().newWSDLWriter();
+        StringWriter sw = new StringWriter();
+        writer.writeWSDL(definition, sw);
+        System.out.println(sw.toString());
+    }
+
+}

Added: tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestException.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestException.java?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestException.java (added)
+++ tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestException.java Mon Jun 30 14:45:25 2008
@@ -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.binding.ws.wsdlgen;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+public class TestException extends Exception {
+
+    private String userdata;
+
+    public TestException(String message) {
+        super(message);
+    }
+
+    public TestException(String message, String userdata) {
+        super(message);
+        this.userdata = userdata;
+    }
+
+    public String getUserdata() {
+        return userdata;
+    }
+
+    public void setUserdata(String userdata) {
+        this.userdata = userdata;
+    }
+
+}

Added: tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestFault.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestFault.java?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestFault.java (added)
+++ tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestFault.java Mon Jun 30 14:45:25 2008
@@ -0,0 +1,46 @@
+/*
+ * 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 javax.xml.ws.WebFault;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+@WebFault(faultBean="org.apache.tuscany.sca.binding.ws.wsdlgen.TestFaultBean")
+public class TestFault extends Exception {
+
+    private TestFaultBean bean;
+
+    public TestFault(TestFaultBean bean, String message) {
+        super(message);
+        this.bean = bean;
+    }
+
+    public TestFault(TestFaultBean bean, String message, Throwable cause) {
+        super(message, cause);
+        this.bean = bean;
+    }
+
+    public TestFaultBean getFaultInfo() {
+        return bean;
+    }
+}

Added: tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestFaultBean.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestFaultBean.java?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestFaultBean.java (added)
+++ tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestFaultBean.java Mon Jun 30 14:45:25 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;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+public class TestFaultBean {
+    private String lastName;
+    private String firstName;
+    private float age;
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public float getAge() {
+        return age;
+    }
+
+    public void setAge(float age) {
+        this.age = age;
+    }
+}

Added: tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestJavaClass.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestJavaClass.java?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestJavaClass.java (added)
+++ tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestJavaClass.java Mon Jun 30 14:45:25 2008
@@ -0,0 +1,30 @@
+/*
+ * 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;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+public class TestJavaClass {
+    public String name;
+    public int number;
+    public float balance;
+}

Added: tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestJavaInterface.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestJavaInterface.java?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestJavaInterface.java (added)
+++ tuscany/java/sca/modules/binding-ws-wsdlgen/src/test/java/org/apache/tuscany/sca/binding/ws/wsdlgen/TestJavaInterface.java Mon Jun 30 14:45:25 2008
@@ -0,0 +1,57 @@
+/*
+ * 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 javax.jws.WebMethod;
+import javax.jws.WebService;
+
+import org.osoa.sca.annotations.OneWay;
+import org.osoa.sca.annotations.Remotable;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+@Remotable
+@WebService
+public interface TestJavaInterface {
+    String m1(String str);
+
+    @OneWay
+    @WebMethod
+    void m2(int i);
+
+    @WebMethod
+    String m3();
+
+    void m4();
+
+    @WebMethod
+    String m5(String str, int i);
+
+    @WebMethod(exclude = true)
+    void dummy();
+
+    @WebMethod
+    void m6(TestJavaClass info) throws TestException;
+
+    @WebMethod
+    void m7(TestJavaClass info) throws TestFault;
+}

Modified: tuscany/java/sca/modules/binding-ws-xml/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-xml/pom.xml?rev=672939&r1=672938&r2=672939&view=diff
==============================================================================
--- tuscany/java/sca/modules/binding-ws-xml/pom.xml (original)
+++ tuscany/java/sca/modules/binding-ws-xml/pom.xml Mon Jun 30 14:45:25 2008
@@ -55,6 +55,12 @@
         
         <dependency>
             <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-binding-ws-wsdlgen</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>

Added: tuscany/java/sca/modules/binding-ws-xml/src/main/java/org/apache/tuscany/sca/binding/ws/xml/BindingBuilderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-xml/src/main/java/org/apache/tuscany/sca/binding/ws/xml/BindingBuilderImpl.java?rev=672939&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-ws-xml/src/main/java/org/apache/tuscany/sca/binding/ws/xml/BindingBuilderImpl.java (added)
+++ tuscany/java/sca/modules/binding-ws-xml/src/main/java/org/apache/tuscany/sca/binding/ws/xml/BindingBuilderImpl.java Mon Jun 30 14:45:25 2008
@@ -0,0 +1,51 @@
+/*
+ * 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.xml;
+
+import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
+import org.apache.tuscany.sca.binding.ws.wsdlgen.BindingWSDLGenerator;
+import org.apache.tuscany.sca.assembly.AbstractContract;
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.builder.BindingBuilder;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.monitor.Monitor;
+
+/**
+ * A factory for the calculated WSDL document needed by Web Service bindings.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class BindingBuilderImpl implements BindingBuilder {
+    
+    private ExtensionPointRegistry extensionPoints;
+    
+    public BindingBuilderImpl(ExtensionPointRegistry extensionPoints) {
+        this.extensionPoints = extensionPoints;
+    }
+    
+    /**
+     * Create a calculated WSDL document and save it in the Web Service binding. 
+     */
+    public void build(Component component, AbstractContract contract, Binding binding, Monitor monitor) {
+        BindingWSDLGenerator.generateWSDL(component, contract, (WebServiceBinding)binding, extensionPoints, monitor);
+    }  
+    
+}

Modified: tuscany/java/sca/modules/binding-ws-xml/src/main/java/org/apache/tuscany/sca/binding/ws/xml/WebServiceBindingProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-xml/src/main/java/org/apache/tuscany/sca/binding/ws/xml/WebServiceBindingProcessor.java?rev=672939&r1=672938&r2=672939&view=diff
==============================================================================
--- tuscany/java/sca/modules/binding-ws-xml/src/main/java/org/apache/tuscany/sca/binding/ws/xml/WebServiceBindingProcessor.java (original)
+++ tuscany/java/sca/modules/binding-ws-xml/src/main/java/org/apache/tuscany/sca/binding/ws/xml/WebServiceBindingProcessor.java Mon Jun 30 14:45:25 2008
@@ -47,6 +47,8 @@
 import org.apache.tuscany.sca.contribution.service.ContributionReadException;
 import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
 import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
 import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
 import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
 import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory;
@@ -54,6 +56,7 @@
 import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract;
 import org.apache.tuscany.sca.interfacedef.wsdl.WSDLObject;
 import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.MonitorFactory;
 import org.apache.tuscany.sca.monitor.Problem;
 import org.apache.tuscany.sca.monitor.Problem.Severity;
 import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
@@ -66,6 +69,7 @@
  */
 public class WebServiceBindingProcessor implements StAXArtifactProcessor<WebServiceBinding>, WebServiceConstants {
 
+    private ExtensionPointRegistry extensionPoints;
     private WSDLFactory wsdlFactory;
     private WebServiceBindingFactory wsFactory;
     private PolicyFactory policyFactory;
@@ -74,13 +78,19 @@
     private ConfiguredOperationProcessor configuredOperationProcessor;
     private Monitor monitor;
     
-    public WebServiceBindingProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+    public WebServiceBindingProcessor(ExtensionPointRegistry extensionPoints) {
+        this.extensionPoints = extensionPoints;
+        ModelFactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
         this.policyFactory = modelFactories.getFactory(PolicyFactory.class);
         this.wsFactory = new DefaultWebServiceBindingFactory();
         this.wsdlFactory = modelFactories.getFactory(WSDLFactory.class);
         this.policyProcessor = new PolicyAttachPointProcessor(policyFactory);
         this.intentAttachPointTypeFactory = modelFactories.getFactory(IntentAttachPointTypeFactory.class);
-        this.monitor = monitor;
+        UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+        MonitorFactory monitorFactory = utilities.getUtility(MonitorFactory.class);
+        if (monitorFactory != null) {
+            this.monitor = monitorFactory.createMonitor();
+        }
         this.configuredOperationProcessor = new ConfiguredOperationProcessor(modelFactories, this.monitor);
     }
     
@@ -121,6 +131,7 @@
         bindingType.setUnresolved(true);
         ((PolicySetAttachPoint)wsBinding).setType(bindingType);*/
         wsBinding.setUnresolved(true);
+        wsBinding.setBuilder(new BindingBuilderImpl(extensionPoints));
 
         // Read policies
         policyProcessor.readPolicies(wsBinding, reader);

Modified: tuscany/java/sca/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/WebServiceBinding.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/WebServiceBinding.java?rev=672939&r1=672938&r2=672939&view=diff
==============================================================================
--- tuscany/java/sca/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/WebServiceBinding.java (original)
+++ tuscany/java/sca/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/WebServiceBinding.java Mon Jun 30 14:45:25 2008
@@ -24,6 +24,7 @@
 import javax.xml.namespace.QName;
 
 import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.builder.BindingBuilderExtension;
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
 import org.w3c.dom.Element;
@@ -34,7 +35,7 @@
  * 
  * @version $Rev$ $Date$
  */
-public interface WebServiceBinding extends Binding {
+public interface WebServiceBinding extends Binding, BindingBuilderExtension {
 
     /**
      * Sets the WSDL location. 

Modified: tuscany/java/sca/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java?rev=672939&r1=672938&r2=672939&view=diff
==============================================================================
--- tuscany/java/sca/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java (original)
+++ tuscany/java/sca/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java Mon Jun 30 14:45:25 2008
@@ -31,6 +31,7 @@
 import org.apache.tuscany.sca.assembly.ConfiguredOperation;
 import org.apache.tuscany.sca.assembly.Extensible;
 import org.apache.tuscany.sca.assembly.OperationsConfigurator;
+import org.apache.tuscany.sca.assembly.builder.BindingBuilder;
 import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
 import org.apache.tuscany.sca.interfacedef.Interface;
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
@@ -71,6 +72,7 @@
     private InterfaceContract bindingInterfaceContract;
     private Element endPointReference;
     private Definition generatedWSDLDocument;
+    private BindingBuilder builder;
     
     protected WebServiceBindingImpl() {
     }
@@ -283,6 +285,14 @@
         this.generatedWSDLDocument = definition;
     }
 
+    public BindingBuilder getBuilder() {
+        return builder;
+    }
+
+    public void setBuilder(BindingBuilder builder) {
+        this.builder = builder;
+    }
+
     public void setPolicySets(List<PolicySet> policySets) {
         this.policySets = policySets; 
     }

Modified: tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java?rev=672939&r1=672938&r2=672939&view=diff
==============================================================================
--- tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java (original)
+++ tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java Mon Jun 30 14:45:25 2008
@@ -34,6 +34,7 @@
 import org.apache.tuscany.sca.assembly.OptimizableBinding;
 import org.apache.tuscany.sca.assembly.Reference;
 import org.apache.tuscany.sca.assembly.SCABinding;
+import org.apache.tuscany.sca.assembly.builder.BindingBuilderExtension;
 import org.apache.tuscany.sca.core.assembly.CompositeActivator;
 import org.apache.tuscany.sca.core.assembly.CompositeActivatorImpl;
 import org.apache.tuscany.sca.core.assembly.EndpointReferenceImpl;
@@ -344,6 +345,9 @@
                         }
                     this.businessInterface = (Class<B>)javaInterface.getJavaClass();
                 }
+                if (binding instanceof BindingBuilderExtension) {
+                    ((BindingBuilderExtension)binding).getBuilder().build(component, reference, binding, null);
+                }
                 this.proxyFactory = compositeActivator.getProxyFactory();
             }
         } else {