You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2006/02/25 03:56:21 UTC

svn commit: r380888 [1/2] - in /incubator/tuscany/java/sca: binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/ binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/ binding.axis/src/main/java/org/apache/tuscany/bind...

Author: jsdelfino
Date: Fri Feb 24 18:56:18 2006
New Revision: 380888

URL: http://svn.apache.org/viewcvs?rev=380888&view=rev
Log:
integrated WSDL loading and Java interface generation

Added:
    incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/
    incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java   (with props)
    incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java   (with props)
    incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment
Removed:
    incubator/tuscany/java/sca/binding.axis/src/test/resources/tuscany-model.config
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/pojo/
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/sdo/
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/config/
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/xsd/
    incubator/tuscany/java/sca/model/src/main/java/org/osoa/
Modified:
    incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java
    incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java
    incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java
    incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java
    incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module
    incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java
    incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java
    incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java
    incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java
    incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java
    incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java
    incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd
    incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd
    incubator/tuscany/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/SCDLAssemblyLoaderTestCase.java

Modified: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java (original)
+++ incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java Fri Feb 24 18:56:18 2006
@@ -16,10 +16,15 @@
  */
 package org.apache.tuscany.binding.axis.assembly.impl;
 
+import java.util.Collection;
+import java.util.List;
+
 import javax.wsdl.Definition;
 import javax.wsdl.Port;
+import javax.wsdl.Service;
 
 import org.apache.tuscany.binding.axis.assembly.WebServiceBinding;
+import org.apache.tuscany.model.assembly.AssemblyModelContext;
 import org.apache.tuscany.model.assembly.impl.BindingImpl;
 
 /**
@@ -29,6 +34,7 @@
     
     private Definition definition;
     private Port port;
+    private String portURI;
 
     /**
      * Constructor
@@ -65,5 +71,46 @@
         checkNotFrozen();
         this.definition=definition;
     }
-
+    
+    /**
+     * @param portURI The portURI to set.
+     */
+    public void setPortURI(String portURI) {
+        this.portURI = portURI;
+    }
+    
+    /**
+     * @see org.apache.tuscany.model.assembly.impl.BindingImpl#initialize(org.apache.tuscany.model.assembly.AssemblyModelContext)
+     */
+    public void initialize(AssemblyModelContext modelContext) {
+        if (isInitialized())
+            return;
+        super.initialize(modelContext);
+        
+        // Get the WSDL port namespace and name
+        if (port==null && portURI!=null) {
+            int h=portURI.indexOf('#');
+            String portNamespace=portURI.substring(0,h);
+            String portName=portURI.substring(h+1);
+    
+            // Load the WSDL definitions for the given namespace
+            List<Definition> definitions=modelContext.getAssemblyLoader().loadDefinitions(portNamespace);
+            if (definitions==null)
+                throw new IllegalArgumentException("Cannot find WSDL definition for "+portNamespace);
+            for (Definition definition: definitions) {
+    
+                // Find the port with the given name
+                for (Service service : (Collection<Service>)definition.getServices().values()) {
+                    Port port=service.getPort(portName);
+                    if (port!=null) {
+                        this.definition=definition;
+                        this.port=port;
+                        return;
+                    }
+                }
+            }
+            throw new IllegalArgumentException("Cannot find WSDL port "+portURI);
+        }
+    }
+    
 }

Added: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java?rev=380888&view=auto
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java (added)
+++ incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java Fri Feb 24 18:56:18 2006
@@ -0,0 +1,348 @@
+package org.apache.tuscany.binding.axis.builder;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.tuscany.container.java.assembly.JavaImplementation;
+import org.apache.tuscany.container.java.config.JavaComponentRuntimeConfiguration;
+import org.apache.tuscany.core.builder.BuilderConfigException;
+import org.apache.tuscany.core.builder.BuilderException;
+import org.apache.tuscany.core.builder.NoAccessorException;
+import org.apache.tuscany.core.builder.RuntimeConfigurationBuilder;
+import org.apache.tuscany.core.builder.impl.ProxyObjectFactory;
+import org.apache.tuscany.core.config.JavaIntrospectionHelper;
+import org.apache.tuscany.core.context.AggregateContext;
+import org.apache.tuscany.core.context.QualifiedName;
+import org.apache.tuscany.core.injection.EventInvoker;
+import org.apache.tuscany.core.injection.FactoryInitException;
+import org.apache.tuscany.core.injection.FieldInjector;
+import org.apache.tuscany.core.injection.Injector;
+import org.apache.tuscany.core.injection.MethodEventInvoker;
+import org.apache.tuscany.core.injection.MethodInjector;
+import org.apache.tuscany.core.injection.SDOObjectFactory;
+import org.apache.tuscany.core.injection.SingletonObjectFactory;
+import org.apache.tuscany.core.invocation.InvocationConfiguration;
+import org.apache.tuscany.core.invocation.ProxyConfiguration;
+import org.apache.tuscany.core.invocation.impl.InvokerInterceptor;
+import org.apache.tuscany.core.invocation.spi.ProxyFactory;
+import org.apache.tuscany.core.invocation.spi.ProxyFactoryFactory;
+import org.apache.tuscany.core.message.MessageFactory;
+import org.apache.tuscany.core.runtime.RuntimeContext;
+import org.apache.tuscany.core.system.annotation.Autowire;
+import org.apache.tuscany.model.assembly.AssemblyModelObject;
+import org.apache.tuscany.model.assembly.ConfiguredProperty;
+import org.apache.tuscany.model.assembly.ConfiguredReference;
+import org.apache.tuscany.model.assembly.ConfiguredService;
+import org.apache.tuscany.model.assembly.Scope;
+import org.apache.tuscany.model.assembly.Service;
+import org.apache.tuscany.model.assembly.ServiceContract;
+import org.apache.tuscany.model.assembly.SimpleComponent;
+import org.osoa.sca.annotations.ComponentName;
+import org.osoa.sca.annotations.Context;
+import org.osoa.sca.annotations.Destroy;
+import org.osoa.sca.annotations.Init;
+
+import commonj.sdo.DataObject;
+
+/**
+ * Builds runtime configurations for component implementations that map to
+ * {@link org.apache.tuscany.container.java.assembly.JavaImplementation}. The logical model is then decorated with the
+ * runtime configuration.
+ * 
+ * @see org.apache.tuscany.core.builder.RuntimeConfiguration
+ * 
+ * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $
+ */
+@org.osoa.sca.annotations.Scope("MODULE")
+public class JavaComponentContextBuilder implements RuntimeConfigurationBuilder<AggregateContext> {
+    
+    private RuntimeContext runtimeContext;
+    private ProxyFactoryFactory proxyFactoryFactory;
+    private MessageFactory messageFactory;
+    private RuntimeConfigurationBuilder referenceBuilder;
+
+    @Init(eager=true)
+    public void init() {
+        runtimeContext.addBuilder(this);
+    }
+
+    /**
+     * @param runtimeContext The runtimeContext to set.
+     */
+    @Autowire
+    public void setRuntimeContext(RuntimeContext runtimeContext) {
+        this.runtimeContext = runtimeContext;
+    }
+    
+    /**
+     * Sets the factory used to construct proxies implmementing the business interface required by a reference
+     */
+    @Autowire
+    public void setProxyFactoryFactory(ProxyFactoryFactory factory) {
+        this.proxyFactoryFactory = factory;
+    }
+
+    /**
+     * Sets the factory used to construct invocation messages
+     * 
+     * @param msgFactory
+     */
+    @Autowire
+    public void setMessageFactory(MessageFactory msgFactory) {
+        this.messageFactory = msgFactory;
+    }
+
+    /**
+     * Sets a builder responsible for creating source-side and target-side invocation chains for a reference. The
+     * reference builder may be hierarchical, containing other child reference builders that operate on specific
+     * metadata used to construct and invocation chain.
+     * 
+     * @see org.apache.tuscany.core.builder.impl.HierarchicalBuilder
+     */
+    public void setReferenceBuilder(RuntimeConfigurationBuilder builder) {
+        this.referenceBuilder = builder;
+    }
+
+    // ----------------------------------
+    // Constructors
+    // ----------------------------------
+
+    public JavaComponentContextBuilder() {
+    }
+
+    // ----------------------------------
+    // Methods
+    // ----------------------------------
+
+    public void build(AssemblyModelObject modelObject, AggregateContext parentContext) throws BuilderException {
+        if (!(modelObject instanceof SimpleComponent)) {
+            return;
+        }
+        SimpleComponent component = (SimpleComponent) modelObject;
+        if (component.getComponentImplementation() instanceof JavaImplementation) {
+            JavaImplementation javaImpl = (JavaImplementation) component.getComponentImplementation();
+            // FIXME scope
+            Scope scope = component.getComponentImplementation().getComponentType().getServices().get(0).getServiceContract()
+                    .getScope();
+            Class implClass = null;
+            Set<Field> fields;
+            Set<Method> methods;
+            try {
+                implClass = javaImpl.getImplementationClass();
+                fields = JavaIntrospectionHelper.getAllFields(implClass);
+                methods = JavaIntrospectionHelper.getAllUniqueMethods(implClass);
+                String name = component.getName();
+                Constructor ctr = implClass.getConstructor((Class[]) null);
+
+                List<Injector> injectors = new ArrayList();
+
+                EventInvoker initInvoker = null;
+                boolean eagerInit = false;
+                EventInvoker destroyInvoker = null;
+                // FIXME this should be run as part of the LCM load
+                for (Field field : fields) {
+                    ComponentName compName = field.getAnnotation(ComponentName.class);
+                    if (compName != null) {
+                        Injector injector = new FieldInjector(field, new SingletonObjectFactory(name));
+                        injectors.add(injector);
+                    }
+                    Context context = field.getAnnotation(Context.class);
+                    if (context != null) {
+                        Injector injector = new FieldInjector(field, new SingletonObjectFactory(parentContext));
+                        injectors.add(injector);
+                    }
+                }
+                for (Method method : methods) {
+                    // FIXME Java5
+                    Init init = method.getAnnotation(Init.class);
+                    if (init != null && initInvoker == null) {
+                        initInvoker = new MethodEventInvoker(method);
+                        eagerInit = init.eager();
+                        continue;
+                    }
+                    // @spec - should we allow the same method to have @init and
+                    // @destroy?
+                    Destroy destroy = method.getAnnotation(Destroy.class);
+                    if (destroy != null && destroyInvoker == null) {
+                        destroyInvoker = new MethodEventInvoker(method);
+                        continue;
+                    }
+                    ComponentName compName = method.getAnnotation(ComponentName.class);
+                    if (compName != null) {
+                        Injector injector = new MethodInjector(method, new SingletonObjectFactory(name));
+                        injectors.add(injector);
+                    }
+                    Context context = method.getAnnotation(Context.class);
+                    if (context != null) {
+                        Injector injector = new MethodInjector(method, new SingletonObjectFactory(parentContext));
+                        injectors.add(injector);
+                    }
+                }
+                // handle properties
+                List<ConfiguredProperty> configuredProperties = component.getConfiguredProperties();
+                // FIXME should return empty properties - does it?
+                if (configuredProperties != null) {
+                    for (ConfiguredProperty property : configuredProperties) {
+                        Injector injector = createPropertyInjector(property, fields, methods);
+                        injectors.add(injector);
+                    }
+                }
+                JavaComponentRuntimeConfiguration config = new JavaComponentRuntimeConfiguration(name, JavaIntrospectionHelper
+                        .getDefaultConstructor(implClass), eagerInit, initInvoker, destroyInvoker, scope);
+                component.getComponentImplementation().setRuntimeConfiguration(config);
+
+                // create target-side invocation chains for each service offered by the implementation
+                for (ConfiguredService configuredService : component.getConfiguredServices()) {
+                    Service service = configuredService.getService();
+                    ServiceContract serviceContract = service.getServiceContract();
+                    Map<Method, InvocationConfiguration> iConfigMap = new HashMap();
+                    ProxyFactory proxyFactory = proxyFactoryFactory.createProxyFactory();
+                    Set<Method> javaMethods = JavaIntrospectionHelper.getAllUniqueMethods(serviceContract.getInterface());
+                    for (Method method : javaMethods) {
+                        InvocationConfiguration iConfig = new InvocationConfiguration(method);
+                        iConfigMap.put(method, iConfig);
+                    }
+                    QualifiedName qName = new QualifiedName(component.getName() + "/" + service.getName());
+                    ProxyConfiguration pConfiguration = new ProxyConfiguration(qName, iConfigMap, null, messageFactory);
+                    proxyFactory.setBusinessInterface(serviceContract.getInterface());
+                    proxyFactory.setProxyConfiguration(pConfiguration);
+                    config.addTargetProxyFactory(service.getName(), proxyFactory);
+                    configuredService.setProxyFactory(proxyFactory);
+                    if (referenceBuilder != null) {
+                        // invoke the reference builder to handle target-side metadata
+                        referenceBuilder.build(configuredService, parentContext);
+                    }
+                    // add tail interceptor
+                    for (InvocationConfiguration iConfig : (Collection<InvocationConfiguration>) iConfigMap.values()) {
+                        iConfig.addTargetInterceptor(new InvokerInterceptor());
+                    }
+
+                }
+
+                // handle references
+                List<ConfiguredReference> configuredReferences = component.getConfiguredReferences();
+                if (configuredReferences != null) {
+                    for (ConfiguredReference reference : configuredReferences) {
+                        ProxyFactory proxyFactory = proxyFactoryFactory.createProxyFactory();
+                        ServiceContract serviceContract = reference.getReference().getServiceContract();
+                        Map<Method, InvocationConfiguration> iConfigMap = new HashMap();
+                        Set<Method> javaMethods = JavaIntrospectionHelper.getAllUniqueMethods(serviceContract.getInterface());
+                        for (Method method : javaMethods) {
+                            InvocationConfiguration iConfig = new InvocationConfiguration(method);
+                            iConfigMap.put(method, iConfig);
+                        }
+                        String targetCompName = reference.getTargetConfiguredServices().get(0).getAggregatePart().getName();
+                        String targetSerivceName = reference.getTargetConfiguredServices().get(0).getService().getName();
+
+                        QualifiedName qName = new QualifiedName(targetCompName + "/" + targetSerivceName);
+                        // QualifiedName qName = new QualifiedName(reference.getAggregatePart().getName() + "/"
+                        // + reference.getPort().getName());
+                        ProxyConfiguration pConfiguration = new ProxyConfiguration(qName, iConfigMap, null, messageFactory);
+                        proxyFactory.setBusinessInterface(serviceContract.getInterface());
+                        proxyFactory.setProxyConfiguration(pConfiguration);
+                        config.addSourceProxyFactory(reference.getReference().getName(), proxyFactory);
+                        reference.setProxyFactory(proxyFactory);
+                        if (referenceBuilder != null) {
+                            // invoke the reference builder to handle metadata associated with the reference
+                            referenceBuilder.build(reference, parentContext);
+                        }
+                        Injector injector = createReferenceInjector(reference.getReference().getName(), proxyFactory, fields,
+                                methods);
+                        injectors.add(injector);
+                    }
+                }
+                config.setSetters(injectors);
+            } catch (BuilderException e) {
+                e.addContextName(component.getName());
+                e.addContextName(parentContext.getName());
+                throw e;
+            } catch (NoSuchMethodException e) {
+                BuilderConfigException ce = new BuilderConfigException("Class does not have a no-arg constructor", e);
+                ce.setIdentifier(implClass.getName());
+                ce.addContextName(component.getName());
+                ce.addContextName(parentContext.getName());
+                throw ce;
+            }
+        }
+    }
+
+    // ----------------------------------
+    // Private methods
+    // ----------------------------------
+
+    /**
+     * Creates an <code>Injector</code> for component properties
+     */
+    private Injector createPropertyInjector(ConfiguredProperty property, Set<Field> fields, Set<Method> methods)
+            throws NoAccessorException {
+        Object value = property.getValue();
+        String propName = property.getProperty().getName();
+        // @FIXME is this how to get property type of object
+        Class type = value.getClass();
+
+        // There is no efficient way to do this
+        Method method = null;
+        Field field = JavaIntrospectionHelper.findClosestMatchingField(propName, type, fields);
+        if (field == null) {
+            method = JavaIntrospectionHelper.findClosestMatchingMethod(propName, new Class[] { type }, methods);
+            if (method == null) {
+                throw new NoAccessorException(propName);
+            }
+        }
+        Injector injector = null;
+        // FIXME support types other than String
+        if (value instanceof DataObject) {
+            if (field != null) {
+                injector = new FieldInjector(field, new SDOObjectFactory((DataObject) value));
+            } else {
+                injector = new MethodInjector(method, new SDOObjectFactory((DataObject) value));
+            }
+        } else if (JavaIntrospectionHelper.isImmutable(type)) {
+            if (field != null) {
+                injector = new FieldInjector(field, new SingletonObjectFactory(value));
+            } else {
+                injector = new MethodInjector(method, new SingletonObjectFactory(value));
+            }
+        }
+        return injector;
+
+    }
+
+    /**
+     * Creates an <code>Injector</code> for service references
+     */
+    private Injector createReferenceInjector(String refName, ProxyFactory proxyFactory, Set<Field> fields, Set<Method> methods)
+            throws NoAccessorException, BuilderConfigException {
+        Method method = null;
+        Field field = JavaIntrospectionHelper.findClosestMatchingField(refName, proxyFactory.getBusinessInterface(), fields);
+        if (field == null) {
+            method = JavaIntrospectionHelper.findClosestMatchingMethod(refName,
+                    new Class[] { proxyFactory.getBusinessInterface() }, methods);
+            if (method == null) {
+                throw new NoAccessorException(refName);
+            }
+        }
+        Injector injector;
+        try {
+            if (field != null) {
+                injector = new FieldInjector(field, new ProxyObjectFactory(proxyFactory));
+            } else {
+                injector = new MethodInjector(method, new ProxyObjectFactory(proxyFactory));
+            }
+        } catch (FactoryInitException e) {
+            BuilderConfigException ce = new BuilderConfigException("Error configuring reference", e);
+            ce.setIdentifier(refName);
+            throw ce;
+        }
+        return injector;
+
+    }
+
+}

Propchange: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java?rev=380888&view=auto
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java (added)
+++ incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java Fri Feb 24 18:56:18 2006
@@ -0,0 +1,75 @@
+/**
+ * 
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ * 
+ * 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.
+ */
+package org.apache.tuscany.binding.axis.builder;
+
+import org.apache.tuscany.container.java.config.JavaComponentRuntimeConfiguration;
+import org.apache.tuscany.container.java.handler.ScopedJavaComponentInvoker;
+import org.apache.tuscany.core.builder.BuilderConfigException;
+import org.apache.tuscany.core.builder.WireBuilder;
+import org.apache.tuscany.core.context.ScopeContext;
+import org.apache.tuscany.core.invocation.InvocationConfiguration;
+import org.apache.tuscany.core.invocation.spi.ProxyFactory;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Scope;
+
+/**
+ * Completes a wire to a Java-based target component by adding a scoped java invoker to the source chain
+ * 
+ * @version $Rev$ $Date$
+ */
+@Scope("MODULE")
+public class JavaTargetWireBuilder implements WireBuilder {
+
+    public JavaTargetWireBuilder() {
+    }
+
+    @Init(eager = true)
+    public void init() {
+    }
+
+    public void connect(ProxyFactory sourceFactory, ProxyFactory targetFactory, Class targetType, boolean downScope,
+            ScopeContext targetScopeContext) throws BuilderConfigException {
+        if (!(JavaComponentRuntimeConfiguration.class.isAssignableFrom(targetType))) {
+            return;
+        }
+        for (InvocationConfiguration sourceInvocationConfig : sourceFactory.getProxyConfiguration().getInvocationConfigurations()
+                .values()) {
+            ScopedJavaComponentInvoker invoker = new ScopedJavaComponentInvoker(sourceFactory.getProxyConfiguration()
+                    .getTargetName(), sourceInvocationConfig.getMethod(), targetScopeContext);
+            if (downScope) {
+                // the source scope is shorter than the target, so the invoker can cache the target instance
+                invoker.setCacheable(true);
+            } else {
+                invoker.setCacheable(false);
+            }
+            sourceInvocationConfig.setTargetInvoker(invoker);
+        }
+    }
+
+    public void completeTargetChain(ProxyFactory targetFactory, Class targetType, ScopeContext targetScopeContext)
+            throws BuilderConfigException {
+        // TODO implement.
+        // if (!(JavaComponentRuntimeConfiguration.class.isAssignableFrom(targetType))) {
+        // return;
+        // }
+        // for (InvocationConfiguration targetInvocationConfig :
+        // targetFactory.getProxyConfiguration().getInvocationConfigurations()
+        // .values()) {
+        // ScopedJavaComponentInvoker invoker = new ScopedJavaComponentInvoker(targetFactory.getProxyConfiguration()
+        // .getTargetName(), ((JavaOperationType) targetInvocationConfig.getOperationType()).getJavaMethod(),
+        // targetScopeContext);
+        // targetInvocationConfig.setTargetInvoker(invoker);
+        // }
+    }
+}

Propchange: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Modified: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java (original)
+++ incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java Fri Feb 24 18:56:18 2006
@@ -1,23 +1,21 @@
 package org.apache.tuscany.binding.axis.loader;
 
 import java.util.Collection;
+import java.util.List;
 
 import javax.wsdl.Definition;
 import javax.wsdl.Port;
 import javax.wsdl.Service;
-import javax.wsdl.WSDLException;
-import javax.wsdl.factory.WSDLFactory;
-import javax.wsdl.xml.WSDLReader;
 
 import org.apache.tuscany.binding.axis.assembly.WebServiceAssemblyFactory;
 import org.apache.tuscany.binding.axis.assembly.WebServiceBinding;
 import org.apache.tuscany.binding.axis.assembly.impl.WebServiceAssemblyFactoryImpl;
+import org.apache.tuscany.binding.axis.assembly.impl.WebServiceBindingImpl;
 import org.apache.tuscany.core.runtime.RuntimeContext;
 import org.apache.tuscany.core.system.annotation.Autowire;
 import org.apache.tuscany.model.assembly.AssemblyModelContext;
 import org.apache.tuscany.model.assembly.AssemblyModelObject;
 import org.apache.tuscany.model.scdl.loader.SCDLModelLoader;
-import org.apache.tuscany.model.util.XMLNameUtil;
 import org.osoa.sca.annotations.Init;
 
 /**
@@ -32,7 +30,7 @@
     /**
      * Constructs a new WebServiceSCDLModelLoader.
      */
-    public WebServiceSCDLModelLoader(AssemblyModelContext modelContext) {
+    public WebServiceSCDLModelLoader() {
         this.wsFactory=new WebServiceAssemblyFactoryImpl();
     }
 
@@ -58,35 +56,11 @@
             WebServiceBinding binding=wsFactory.createWebServiceBinding();
             binding.setURI(scdlBinding.getUri());
             
-            // Get the WSDL port namespace and name
-            String portURI=scdlBinding.getPort();
-            int h=portURI.indexOf('#');
-            String portNamespace=portURI.substring(0,h);
-            String portName=portURI.substring(h+1);
-            
-            // Load the WSDL file
-            String packageName=XMLNameUtil.getPackageNameFromNamespace(portNamespace);
-            String fileName=XMLNameUtil.getValidNameFromXMLName(portName, false);
-            String wsdlURI=packageName+'/'+fileName+".wsdl";
-            Definition definition;
-            try {
-                WSDLReader reader=WSDLFactory.newInstance().newWSDLReader();
-                definition = reader.readWSDL(wsdlURI);
-            } catch (WSDLException e) {
-                throw new IllegalArgumentException(e);
-            }
-            binding.setWSDLDefinition(definition);
-
-            // Find the specified port
-            for (Service service : (Collection<Service>)definition.getServices().values()) {
-                Port port=service.getPort(portName);
-                if (port!=null) {
-                    binding.setWSDLPort(port);
-                    break;
-                }
-            }
+            // Set the port URI into the assembly binding, it'll be resolved in the initialize method
+            ((WebServiceBindingImpl)binding).setPortURI(scdlBinding.getPort());
             
             return binding;
+            
         } else
             return null;
     }

Added: incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment?rev=380888&view=auto
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment (added)
+++ incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment Fri Feb 24 18:56:18 2006
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--
+  Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+  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.
+ -->
+<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+        xmlns:system="http://org.apache.tuscany/xmlns/system/0.9"
+		name="org.apache.tuscany.binding.axis">
+
+    <component name="org.apache.tuscany.container.java.builder.JavaComponentContextBuilder">
+        <system:implementation.system class="org.apache.tuscany.container.java.builder.JavaComponentContextBuilder"/>
+    </component>
+
+    <component name="org.apache.tuscany.container.java.builder.JavaTargetWireBuilder">
+        <system:implementation.system class="org.apache.tuscany.container.java.builder.JavaTargetWireBuilder"/>
+    </component>
+    <!-- this needs to be wired to the defailt wire builder in the core system.fragment
+    <wire>
+        <source.uri>org.apache.tuscany.core.builder.impl.DefaultWireBuilder/wireBuilders</source.uri>
+        <target.uri>org.apache.tuscany.container.java.builder.JavaTargetWireBuilder</target.uri>
+    </wire>
+    -->
+    <component name="org.apache.tuscany.container.java.loader.JavaSCDLModelLoader">
+        <system:implementation.system class="org.apache.tuscany.container.java.loader.JavaSCDLModelLoader"/>
+    </component>
+    
+    
+    
+
+</moduleFragment>

Modified: incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java (original)
+++ incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java Fri Feb 24 18:56:18 2006
@@ -16,25 +16,33 @@
  */
 package org.apache.tuscany.binding.axis.assembly.tests;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import junit.framework.Assert;
 import junit.framework.TestCase;
 
 import org.apache.tuscany.binding.axis.assembly.WebServiceBinding;
+import org.apache.tuscany.binding.axis.loader.WebServiceSCDLModelLoader;
+import org.apache.tuscany.common.resource.ResourceLoader;
+import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl;
+import org.apache.tuscany.model.assembly.AssemblyFactory;
 import org.apache.tuscany.model.assembly.AssemblyModelContext;
 import org.apache.tuscany.model.assembly.Binding;
 import org.apache.tuscany.model.assembly.Component;
 import org.apache.tuscany.model.assembly.EntryPoint;
 import org.apache.tuscany.model.assembly.ExternalService;
 import org.apache.tuscany.model.assembly.Module;
+import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl;
 import org.apache.tuscany.model.assembly.impl.AssemblyModelContextImpl;
 import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader;
+import org.apache.tuscany.model.scdl.loader.SCDLModelLoader;
+import org.apache.tuscany.model.scdl.loader.impl.SCDLAssemblyModelLoaderImpl;
 
 /**
  */
 public class WebServiceAssemblyLoaderTestCase extends TestCase {
 
-    private AssemblyModelContext modelContext;
-
     /**
      *
      */
@@ -44,8 +52,15 @@
 
     public void testLoader() {
 
-        AssemblyModelLoader loader = modelContext.getAssemblyLoader();
-        Module module = loader.getModule(getClass().getResource("sca.module").toString());
+        ResourceLoader resourceLoader=new ResourceLoaderImpl(Thread.currentThread().getContextClassLoader());
+        WebServiceSCDLModelLoader wsLoader=new WebServiceSCDLModelLoader();
+        List<SCDLModelLoader> scdlLoaders=new ArrayList<SCDLModelLoader>();
+        scdlLoaders.add(wsLoader);
+        AssemblyModelLoader assemblyLoader=new SCDLAssemblyModelLoaderImpl(scdlLoaders);
+        AssemblyFactory assemblyFactory=new AssemblyFactoryImpl();
+        AssemblyModelContext modelContext=new AssemblyModelContextImpl(assemblyFactory, assemblyLoader, resourceLoader);
+
+        Module module = assemblyLoader.loadModule(getClass().getResource("sca.module").toString());
         module.initialize(modelContext);
 
         Assert.assertTrue(module.getName().equals("tuscany.binding.axis.assembly.tests.bigbank.account"));
@@ -67,7 +82,6 @@
         super.setUp();
 
         Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
-        modelContext = new AssemblyModelContextImpl();
     }
 
 }

Modified: incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java (original)
+++ incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java Fri Feb 24 18:56:18 2006
@@ -70,7 +70,7 @@
         modelContext = new AssemblyModelContextImpl();
 
         AssemblyModelLoader loader = modelContext.getAssemblyLoader();
-        Module module = loader.getModule(getClass().getResource("sca.module").toString());
+        Module module = loader.loadModule(getClass().getResource("sca.module").toString());
         module.initialize(modelContext);
 
         AssemblyFactory factory = new AssemblyFactoryImpl();

Modified: incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module (original)
+++ incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module Fri Feb 24 18:56:18 2006
@@ -20,19 +20,18 @@
 
     <entryPoint name="AccountService">
         <interface.java interface="org.apache.tuscany.binding.axis.assembly.tests.bigbank.account.services.account.AccountService"/>
-        <binding.ws port="http://www.bigbank.com/AccountService#AccountServiceSOAP"/>
+        <binding.ws port="http://www.bigbank.com/AccountService/#AccountServiceSOAP"/>
         <reference>AccountServiceComponent</reference>
     </entryPoint>
 
+    <entryPoint name="AccountService2">
+        <interface.wsdl interface="http://www.bigbank.com/AccountService/#AccountService"/>
+        <binding.ws port="http://www.bigbank.com/AccountService/#AccountServiceSOAP"/>
+        <reference>AccountServiceComponent</reference>
+    </entryPoint>
+
     <component name="AccountServiceComponent">
         <implementation.java class="org.apache.tuscany.binding.axis.assembly.tests.bigbank.account.services.account.AccountServiceImpl"/>
-        <properties>
-            <v:currency>EURO</v:currency>
-        </properties>
-        <references>
-            <v:accountDataService>AccountDataServiceComponent</v:accountDataService>
-            <v:stockQuoteService>StockQuoteService</v:stockQuoteService>
-        </references>
     </component>
 
     <component name="AccountDataServiceComponent">
@@ -47,8 +46,16 @@
 
     <externalService name="StockQuoteService">
         <interface.java interface="org.apache.tuscany.binding.axis.assembly.tests.bigbank.account.services.stockquote.StockQuoteService"/>
-        <binding.ws port="http://www.quickstockquote.com/StockQuoteService#StockQuoteServiceSOAP"/>
-    </externalService>
-
+        <binding.ws port="http://webservice.stockquote#StockQuoteWebService"/>
+    </externalService>
+    
+	<import.wsdl
+		location="org/apache/tuscany/binding/axis/assembly/tests/bigbank/account/services/account/AccountService.wsdl"
+		namespace="http://www.bigbank.com/AccountService/"/>
+
+	<import.wsdl
+		location="org/apache/tuscany/binding/axis/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl"
+		namespace="http://webservice.stockquote"/>
+
 </module>
 	

Modified: incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java (original)
+++ incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java Fri Feb 24 18:56:18 2006
@@ -49,6 +49,13 @@
     Class<?> loadClass(String name) throws ClassNotFoundException;
 
     /**
+     * Converts an array of bytes into a Class.
+     * @param bytes
+     * @return
+     */
+    Class<?> addClass(byte[] bytes);
+    
+    /**
      * Finds the first resource with the given name.
      * <p/>
      * Each parent is searched first (in the order returned by {@link #getParents()})

Modified: incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java (original)
+++ incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java Fri Feb 24 18:56:18 2006
@@ -35,14 +35,39 @@
  */
 public class ResourceLoaderImpl implements ResourceLoader {
     private final WeakReference<ClassLoader> classLoaderReference;
+    private WeakReference<GeneratedClassLoader> generatedClassLoaderReference;
     private final List<ResourceLoader> parents;
 
     /**
+     * A class loader that allows new classes to be defined from an array of bytes
+     */
+    private class GeneratedClassLoader extends ClassLoader {
+        
+        /**
+         * Constructs a new ResourceLoaderImpl.GeneratedClassLoader.
+         */
+        public GeneratedClassLoader(ClassLoader classLoader) {
+            super(classLoader);
+        }
+
+        /**
+         * Converts an array of bytes into a Class.
+         * @param bytes
+         * @return
+         */
+        private Class<?> addClass(byte[] bytes) {
+            return defineClass(null, bytes, 0, bytes.length);
+        }
+        
+    }
+
+    /**
      * Constructs a new ResourceLoaderImpl.
      * @param classLoader
      */
     public ResourceLoaderImpl(ClassLoader classLoader) {
         classLoaderReference = new WeakReference(classLoader);
+        generatedClassLoaderReference = new WeakReference(new GeneratedClassLoader(classLoader));
         ClassLoader parentCL = classLoader.getParent();
         parents = parentCL == null ? Collections.EMPTY_LIST : Collections.singletonList(new ResourceLoaderImpl(parentCL));
     }
@@ -68,6 +93,15 @@
 
     public Class loadClass(String name) throws ClassNotFoundException {
         return getClassLoader().loadClass(name);
+    }
+    
+    public Class<?> addClass(byte[] bytes) {
+        GeneratedClassLoader cl = generatedClassLoaderReference.get();
+        if (cl == null) {
+            cl=new GeneratedClassLoader(getClassLoader());
+            generatedClassLoaderReference = new WeakReference(cl);
+        }
+        return cl.addClass(bytes);
     }
 
     public Iterator<URL> getResources(String name) throws IOException {

Modified: incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java (original)
+++ incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java Fri Feb 24 18:56:18 2006
@@ -82,7 +82,7 @@
         String baseName = JavaIntrospectionHelper.getBaseName(implClass);
         URL componentTypeFile = implClass.getResource(baseName + ".componentType");
         if (componentTypeFile != null) {
-            return modelContext.getAssemblyLoader().getComponentType(componentTypeFile.toString());
+            return modelContext.getAssemblyLoader().loadComponentType(componentTypeFile.toString());
         } else {
             JavaAssemblyFactory factory = new JavaAssemblyFactoryImpl();
             ComponentTypeIntrospector introspector = new Java5ComponentTypeIntrospector(factory);

Modified: incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java (original)
+++ incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java Fri Feb 24 18:56:18 2006
@@ -58,7 +58,7 @@
         AssemblyFactory assemblyFactory=new AssemblyFactoryImpl();
         AssemblyModelContext modelContext=new AssemblyModelContextImpl(assemblyFactory, assemblyLoader, resourceLoader);
 
-        Module module = assemblyLoader.getModule(getClass().getResource("sca.module").toString());
+        Module module = assemblyLoader.loadModule(getClass().getResource("sca.module").toString());
         module.initialize(modelContext);
         Assert.assertTrue(module.getName().equals("tuscany.container.java.assembly.tests.bigbank.account"));
 

Modified: incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java (original)
+++ incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java Fri Feb 24 18:56:18 2006
@@ -105,7 +105,7 @@
         String prefix = script.substring(0,script.lastIndexOf('.'));
         URL componentTypeFile = resourceLoader.getResource(prefix + ".componentType");
         if (componentTypeFile != null) {
-            return modelContext.getAssemblyLoader().getComponentType(componentTypeFile.toString());
+            return modelContext.getAssemblyLoader().loadComponentType(componentTypeFile.toString());
         } else {
             // TODO we could introspect the JavaScript source
             return modelContext.getAssemblyFactory().createComponentType();

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java Fri Feb 24 18:56:18 2006
@@ -119,12 +119,12 @@
     public ModuleComponent loadModuleComponent(String name, String uri, String moduleUri, Collection<String> moduleFragmentUris) throws ConfigurationLoadException {
 
         // Load the module file
-        Module module=modelLoader.getModule(moduleUri);
+        Module module=modelLoader.loadModule(moduleUri);
 
         // Load the sca.fragment files
         if (moduleFragmentUris!=null) {
             for (String moduleFragmentUri : moduleFragmentUris) {
-                ModuleFragment moduleFragment=modelLoader.getModuleFragment(moduleFragmentUri);
+                ModuleFragment moduleFragment=modelLoader.loadModuleFragment(moduleFragmentUri);
                 module.getModuleFragments().add(moduleFragment);
             }
         }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java Fri Feb 24 18:56:18 2006
@@ -70,7 +70,7 @@
         String baseName = getBaseName(implClass);
         URL componentTypeFile = implClass.getResource(baseName + ".componentType");
         if (componentTypeFile != null) {
-            return modelContext.getAssemblyLoader().getComponentType(componentTypeFile.toString());
+            return modelContext.getAssemblyLoader().loadComponentType(componentTypeFile.toString());
         } else {
             //FIXME Return a made-up component type for now
             // We need to introspect the component implementation class, support a subset of what

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java Fri Feb 24 18:56:18 2006
@@ -18,6 +18,8 @@
 
 import java.util.List;
 
+import javax.wsdl.Import;
+
 /**
  * Represents an aggregate. An aggregate contains AggregateParts (e.g. components, entry points
  * and external services).
@@ -92,5 +94,18 @@
      * @return
      */
     List<Wire> getWires();
+    
+    /**
+     * Returns the WSDL imports.
+     * @return
+     */
+    List<Import> getWSDLImports();
+    
+    /**
+     * Returns the WSDL imports for the given namespace. 
+     * @param namespace
+     * @return
+     */
+    List<Import> getWSDLImports(String namespace);
     
 }

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java Fri Feb 24 18:56:18 2006
@@ -16,12 +16,19 @@
  */
 package org.apache.tuscany.model.assembly.impl;
 
+import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import javax.wsdl.Definition;
+import javax.wsdl.Import;
+import javax.wsdl.xml.WSDLReader;
+
+import org.apache.tuscany.common.resource.ResourceLoader;
 import org.apache.tuscany.model.assembly.Aggregate;
 import org.apache.tuscany.model.assembly.AggregatePart;
 import org.apache.tuscany.model.assembly.AssemblyModelContext;
@@ -47,6 +54,8 @@
     private Map<String, ExternalService> externalServicesMap;
     private List<AggregatePart> aggregateParts;
     private List<Wire> wires=new ArrayList<Wire>();
+    private List<Import> wsdlImports=new ArrayList<Import>();
+    private Map<String, List<Import>> wsdlImportsMap;
 
     /**
      * Constructor
@@ -130,6 +139,21 @@
     }
     
     /**
+     * @see org.apache.tuscany.model.assembly.Aggregate#getWSDLImports()
+     */
+    public List<Import> getWSDLImports() {
+        return wsdlImports;
+    }
+    
+    /**
+     * @see org.apache.tuscany.model.assembly.Aggregate#getWSDLImports(java.lang.String)
+     */
+    public List<Import> getWSDLImports(String namespace) {
+        checkInitialized();
+        return wsdlImportsMap.get(namespace);
+    }
+    
+    /**
      * @see org.apache.tuscany.model.assembly.Aggregate#getConfiguredService(org.apache.tuscany.model.assembly.ServiceURI)
      */
     public ConfiguredService getConfiguredService(ServiceURI address) {
@@ -164,6 +188,35 @@
         if (isInitialized())
             return;
         super.initialize(modelContext);
+        
+        // Populate map of WSDL imports
+        ResourceLoader resourceLoader=modelContext.getResourceLoader();
+        WSDLReader reader=null;
+        wsdlImportsMap = new HashMap<String, List<Import>>();
+        for (Import wsdlImport : wsdlImports) {
+            String namespace=wsdlImport.getNamespaceURI();
+            List<Import> list=wsdlImportsMap.get(namespace);
+            if (list==null) {
+                list=new ArrayList<Import>();
+                wsdlImportsMap.put(namespace, list);
+            }
+            list.add(wsdlImport);
+            
+            // Load the WSDL definition if necessary
+            if (wsdlImport.getDefinition()==null) {
+                String location=wsdlImport.getLocationURI();
+                Definition definition;
+                try {
+                    URL url=resourceLoader.getResource(location);
+                    if (url==null)
+                        throw new IllegalArgumentException("Cannot find "+location);
+                    definition = modelContext.getAssemblyLoader().loadDefinition(url.toString());
+                } catch (IOException e) {
+                    throw new IllegalArgumentException(e);
+                }
+                wsdlImport.setDefinition(definition);
+            }
+        }
 
         // Populate maps of components, entry points and external services
         aggregateParts = new ArrayList<AggregatePart>();
@@ -202,6 +255,8 @@
         super.freeze();
         
         // Freeze lists
+        wsdlImports=Collections.unmodifiableList(wsdlImports);
+        freeze(wsdlImports);
         components=Collections.unmodifiableList(components);
         freeze(components);
         entryPoints=Collections.unmodifiableList(entryPoints);

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java Fri Feb 24 18:56:18 2006
@@ -39,10 +39,10 @@
             this.assemblyFactory = assemblyFactory;
         else
             this.assemblyFactory = new AssemblyFactoryImpl();
+        this.resourceLoader = resourceLoader;
         this.assemblyLoader = assemblyLoader;
         if (assemblyLoader!=null)
             assemblyLoader.setModelContext(this);
-        this.resourceLoader = resourceLoader;
     }
 
     /**

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java Fri Feb 24 18:56:18 2006
@@ -99,7 +99,8 @@
         for (ModuleFragment moduleFragment : moduleFragments) {
             moduleFragmentsMap.put(moduleFragment.getName(), moduleFragment);
             
-            // Add all components, entry points and external services from the module fragments
+            // Add all WSDL imports, components, entry points and external services from the module fragments
+            getWSDLImports().addAll(moduleFragment.getWSDLImports());
             getComponents().addAll(moduleFragment.getComponents());
             getEntryPoints().addAll(moduleFragment.getEntryPoints());
             getExternalServices().addAll(moduleFragment.getExternalServices());

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java Fri Feb 24 18:56:18 2006
@@ -16,6 +16,11 @@
  */
 package org.apache.tuscany.model.assembly.loader;
 
+import java.util.List;
+
+import javax.wsdl.Definition;
+import javax.wsdl.PortType;
+
 import org.apache.tuscany.model.assembly.AssemblyModelContext;
 import org.apache.tuscany.model.assembly.ComponentType;
 import org.apache.tuscany.model.assembly.Module;
@@ -38,27 +43,46 @@
      * @param uri
      * @return
      */
-    Module getModule(String uri);
+    Module loadModule(String uri);
 
     /**
      * Returns the module at the given uri
      * @param uri
      * @return
      */
-    ModuleFragment getModuleFragment(String uri);
+    ModuleFragment loadModuleFragment(String uri);
 
     /**
      * Returns the component type at the given uri
      * @param uri
      * @return
      */
-    ComponentType getComponentType(String uri);
+    ComponentType loadComponentType(String uri);
 
     /**
      * Returns the subsystem at the given uri.
      * @param uri
      * @return
      */
-    Subsystem getSubsystem(String uri);
+    Subsystem loadSubsystem(String uri);
+
+    /**
+     * Load a WSDL definition
+     */
+    Definition loadDefinition(String uri);
+    
+    /**
+     * Load definitions by namespace
+     * @param uri
+     * @return
+     */
+    List<Definition> loadDefinitions(String namespace);
+    
+    /**
+     * Load a class
+     * @param uri
+     * @return
+     */
+    Class loadClass(String className) throws ClassNotFoundException;
     
 }

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java Fri Feb 24 18:56:18 2006
@@ -16,6 +16,7 @@
  */
 package org.apache.tuscany.model.scdl.loader;
 
+import org.apache.tuscany.model.assembly.Aggregate;
 import org.apache.tuscany.model.assembly.AssemblyModelContext;
 import org.apache.tuscany.model.assembly.AssemblyModelObject;
 

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java Fri Feb 24 18:56:18 2006
@@ -18,9 +18,17 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
+import javax.wsdl.Definition;
+import javax.wsdl.WSDLException;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+
+import org.apache.tuscany.common.resource.ResourceLoader;
 import org.apache.tuscany.model.assembly.AssemblyModelContext;
 import org.apache.tuscany.model.assembly.ComponentType;
 import org.apache.tuscany.model.assembly.Module;
@@ -37,10 +45,19 @@
 public class SCDLAssemblyModelLoaderImpl implements AssemblyModelLoader {
     
     private SCDLXMLReader xmlReader=new SCDLXMLReader();
+    private WSDLReader wsdlReader;
     private AssemblyModelContext modelContext;
+    private ResourceLoader resourceLoader;
     
     private List<SCDLModelLoader> scdlModelLoaders;
     
+    private Map<String, ComponentType> componentTypes=new HashMap<String, ComponentType>();
+    private Map<String, Module> modules=new HashMap<String, Module>();
+    private Map<String, ModuleFragment> moduleFragments=new HashMap<String, ModuleFragment>();
+    private Map<String, Subsystem> subsystems=new HashMap<String, Subsystem>();
+    private Map<String, Definition> definitions=new HashMap<String, Definition>();
+    private Map<String, List<Definition>> definitionsByNamespace=new HashMap<String, List<Definition>>();
+    
     /**
      * Constructor
      */
@@ -53,55 +70,125 @@
      */
     public void setModelContext(AssemblyModelContext modelContext) {
         this.modelContext = modelContext;
+        this.resourceLoader=this.modelContext.getResourceLoader();
     }
 
     /**
-     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#getComponentType(java.lang.String)
+     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadComponentType(java.lang.String)
      */
-    public ComponentType getComponentType(String uri) {
+    public ComponentType loadComponentType(String uri) {
+        ComponentType componentType=componentTypes.get(uri);
+        if (componentType!=null)
+            return componentType;
 
         // Load the SCDL component type
         org.apache.tuscany.model.scdl.ComponentType scdlComponentType=xmlReader.getComponentType(uri);
         
         // Transform it to an assembly component type
-        return transform(scdlComponentType).getComponentType();
+        componentType=transform(scdlComponentType).getComponentType();
+        
+        componentTypes.put(uri, componentType);
+        return componentType;
     }
 
     /**
-     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#getModule(java.lang.String)
+     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadModule(java.lang.String)
      */
-    public Module getModule(String uri) {
+    public Module loadModule(String uri) {
+        Module module=modules.get(uri);
+        if (module!=null)
+            return module;
 
         // Load the SCDL module
         org.apache.tuscany.model.scdl.Module scdlModule=xmlReader.getModule(uri);
         
         // Transform it to an assembly module
-        return transform(scdlModule).getModule();
+        module=transform(scdlModule).getModule();
+        
+        modules.put(uri, module);
+        return module;
     }
 
     /**
-     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#getModuleFragment(java.lang.String)
+     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadModuleFragment(java.lang.String)
      */
-    public ModuleFragment getModuleFragment(String uri) {
+    public ModuleFragment loadModuleFragment(String uri) {
+        ModuleFragment moduleFragment=moduleFragments.get(uri);
+        if (moduleFragment!=null)
+            return moduleFragment;
 
         // Load the SCDL module fragment
         org.apache.tuscany.model.scdl.ModuleFragment scdlFragment=xmlReader.getModuleFragment(uri);
         
         // Transform it to an assembly module fragment
-        return transform(scdlFragment).getModuleFragment();
+        moduleFragment=transform(scdlFragment).getModuleFragment();
+        
+        moduleFragments.put(uri, moduleFragment);
+        return moduleFragment;
     }
     
     /**
-     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#getSubsystem(java.lang.String)
+     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadSubsystem(java.lang.String)
      */
-    public Subsystem getSubsystem(String uri) {
+    public Subsystem loadSubsystem(String uri) {
+        Subsystem subsystem=subsystems.get(uri);
+        if (subsystem!=null)
+            return subsystem;
 
         // Load the SCDL subsystem
         org.apache.tuscany.model.scdl.Subsystem scdlSubsystem=xmlReader.getSubsystem(uri);
         
-        return transform(scdlSubsystem).getSubsystem();
+        subsystem=transform(scdlSubsystem).getSubsystem();
+        
+        subsystems.put(uri, subsystem);
+        return subsystem;
+    }
+    
+    /**
+     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadDefinition(java.lang.String)
+     */
+    public Definition loadDefinition(String uri) {
+        Definition definition=definitions.get(uri);
+        if (definition!=null)
+            return definition;
+        
+        try {
+            if (wsdlReader==null)
+                wsdlReader=WSDLFactory.newInstance().newWSDLReader();
+            definition = wsdlReader.readWSDL(uri);
+        } catch (WSDLException e) {
+            throw new IllegalArgumentException(e);
+        }
+        if (definition==null)
+            throw new IllegalArgumentException("Could not load WSDL definition at "+uri);
+        
+        definitions.put(uri, definition);
+        
+        String namespace=definition.getTargetNamespace();
+        List<Definition> list=definitionsByNamespace.get(namespace);
+        if (list==null) {
+            list=new ArrayList<Definition>();
+            definitionsByNamespace.put(namespace, list);
+        }
+        list.add(definition);
+       
+        return definition;
+    }
+    
+    /**
+     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadDefinitions(java.lang.String)
+     */
+    public List<Definition> loadDefinitions(String namespace) {
+        return definitionsByNamespace.get(namespace);
     }
 
+    /**
+     * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadClass(java.lang.String)
+     */
+    public Class loadClass(String className) throws ClassNotFoundException {
+        return resourceLoader.loadClass(className);
+    }
+    
     /**
      * Transform a model and return the handler containing the result of the transformation.
      * @param object

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java Fri Feb 24 18:56:18 2006
@@ -19,6 +19,11 @@
 import java.util.List;
 import java.util.Map;
 
+import javax.wsdl.Definition;
+import javax.wsdl.Import;
+import javax.wsdl.WSDLException;
+import javax.wsdl.factory.WSDLFactory;
+
 import org.apache.tuscany.model.assembly.Aggregate;
 import org.apache.tuscany.model.assembly.AssemblyFactory;
 import org.apache.tuscany.model.assembly.AssemblyModelContext;
@@ -51,11 +56,13 @@
 import org.apache.tuscany.model.scdl.Service;
 import org.apache.tuscany.model.scdl.Subsystem;
 import org.apache.tuscany.model.scdl.SystemWire;
+import org.apache.tuscany.model.scdl.WSDLImport;
 import org.apache.tuscany.model.scdl.WSDLPortType;
 import org.apache.tuscany.model.scdl.loader.SCDLModelLoader;
 import org.apache.tuscany.model.scdl.util.ScdlSwitch;
 import org.apache.tuscany.model.types.java.JavaServiceContract;
 import org.apache.tuscany.model.types.wsdl.WSDLServiceContract;
+import org.apache.tuscany.model.types.wsdl.impl.WSDLServiceContractImpl;
 import org.apache.tuscany.model.util.ModelContentHandler;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.util.FeatureMap;
@@ -87,6 +94,7 @@
     private org.apache.tuscany.model.assembly.ModuleFragment currentModuleFragment;
     private org.apache.tuscany.model.assembly.Subsystem currentSubsystem;
     private org.apache.tuscany.model.assembly.ModuleComponent currentModuleComponent;
+    private Definition definition;
     
     /**
      * Constructor
@@ -247,15 +255,42 @@
      */
     public Object caseWSDLPortType(WSDLPortType object) {
         final WSDLServiceContract serviceContract=factory.createWSDLServiceContract();
-        serviceContract.setInterface(null);
-        serviceContract.setCallbackInterface(null);
         serviceContract.setScope(Scope.INSTANCE);
         
+        ((WSDLServiceContractImpl)serviceContract).setPortTypeURI(object.getInterface());
+        ((WSDLServiceContractImpl)serviceContract).setCallbackPortTypeURI(object.getCallbackInterface());
+        
         linkServiceContract(object, serviceContract);
 
         return serviceContract;
     }
 
+    /**
+     * @see org.apache.tuscany.model.scdl.util.ScdlSwitch#caseWSDLImport(org.apache.tuscany.model.scdl.WSDLImport)
+     */
+    public Object caseWSDLImport(WSDLImport object) {
+        if (definition==null) {
+            try {
+                WSDLFactory wsdlFactory=WSDLFactory.newInstance();
+                definition=wsdlFactory.newDefinition();
+            } catch (WSDLException e) {
+                throw new IllegalStateException(e);
+            }
+            
+        }
+        final Import wsdlImport=definition.createImport();
+        wsdlImport.setNamespaceURI(object.getNamespace());
+        wsdlImport.setLocationURI(object.getLocation());
+
+        linkers.add(new Runnable() {
+            public void run() {
+                currentAggregate.getWSDLImports().add(wsdlImport);
+            };
+        });
+
+        return wsdlImport;
+    }
+    
     /**
      * Link a service contract with the correct owner.
      * @param object

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java Fri Feb 24 18:56:18 2006
@@ -16,13 +16,28 @@
  */
 package org.apache.tuscany.model.types.wsdl.impl;
 
+import static org.objectweb.asm.Opcodes.ACC_ABSTRACT;
+import static org.objectweb.asm.Opcodes.ACC_INTERFACE;
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.V1_5;
+
+import java.util.List;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Operation;
 import javax.wsdl.PortType;
 import javax.xml.namespace.QName;
 
+import org.apache.tuscany.common.resource.ResourceLoader;
 import org.apache.tuscany.model.assembly.AssemblyModelContext;
 import org.apache.tuscany.model.assembly.impl.ServiceContractImpl;
+import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader;
 import org.apache.tuscany.model.types.wsdl.WSDLServiceContract;
 import org.apache.tuscany.model.util.XMLNameUtil;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Type;
+
+import commonj.sdo.DataObject;
 
 /**
  * An implementation of WSDLServiceContract.
@@ -31,7 +46,9 @@
 
     private PortType portType;
     private PortType callbackPortType;
-
+    private String portTypeURI;
+    private String callbackPortTypeURI;
+    
     /**
      * Constructor
      */
@@ -69,34 +86,127 @@
     }
 
     /**
+     * @param portTypeURI The portTypeURI to set.
+     */
+    public void setPortTypeURI(String portTypeURI) {
+        this.portTypeURI = portTypeURI;
+    }
+    
+    /**
+     * @param callbackPortTypeURI The callbackPortTypeURI to set.
+     */
+    public void setCallbackPortTypeURI(String callbackPortTypeURI) {
+        this.callbackPortTypeURI = callbackPortTypeURI;
+    }
+    
+    /**
      * @see org.apache.tuscany.model.assembly.impl.ExtensibleImpl#initialize(org.apache.tuscany.model.assembly.AssemblyModelContext)
      */
     public void initialize(AssemblyModelContext modelContext) {
         if (isInitialized())
             return;
         super.initialize(modelContext);
+        
+        // Resolve the WSDL portType and callback portType
+        AssemblyModelLoader modelLoader=modelContext.getAssemblyLoader();
+        if (portTypeURI!=null && portType==null) {
+            portType=getPortType(modelLoader, portTypeURI);
+        }
+        if (callbackPortTypeURI!=null && callbackPortType==null) {
+            callbackPortType=getPortType(modelLoader, callbackPortTypeURI);
+        }
 
         // Load the Java interface for the portType 
         if (portType!=null && getInterface()==null) {
             QName qname=portType.getQName();
-            String interfaceName=XMLNameUtil.getPackageNameFromNamespace(qname.getNamespaceURI())+XMLNameUtil.getValidNameFromXMLName(qname.getLocalPart(), true);
+            String interfaceName=XMLNameUtil.getFullyQualifiedClassNameFromQName(qname.getNamespaceURI(), qname.getLocalPart());
+            Class interfaceClass;
             try {
-                super.setInterface(modelContext.getResourceLoader().loadClass(interfaceName));
+                // Load the interface
+                interfaceClass=modelLoader.loadClass(interfaceName);
             } catch (ClassNotFoundException e) {
-                throw new IllegalArgumentException(e);
+                // Generate the interface on the fly
+                interfaceClass=generateJavaInterface(modelContext.getResourceLoader(), portType, interfaceName);
             }
+            super.setInterface(interfaceClass);
         }
 
         // Load the Java interface for the callback portType 
         if (callbackPortType!=null && getCallbackInterface()==null) {
             QName qname=callbackPortType.getQName();
-            String interfaceName=XMLNameUtil.getPackageNameFromNamespace(qname.getNamespaceURI())+XMLNameUtil.getValidNameFromXMLName(qname.getLocalPart(), true);
+            String interfaceName=XMLNameUtil.getFullyQualifiedClassNameFromQName(qname.getNamespaceURI(), qname.getLocalPart());
+            Class interfaceClass;
             try {
-                super.setCallbackInterface(modelContext.getResourceLoader().loadClass(interfaceName));
+                // Load the interface
+                interfaceClass=modelLoader.loadClass(interfaceName);
             } catch (ClassNotFoundException e) {
-                throw new IllegalArgumentException(e);
+                // Generate the interface on the fly
+                interfaceClass=generateJavaInterface(modelContext.getResourceLoader(), portType, interfaceName);
             }
+            super.setCallbackInterface(interfaceClass);
+        }
+    }
+
+    /**
+     * Get a portType from the given uri
+     * @param loader
+     * @param uri
+     * @return
+     */
+    private PortType getPortType(AssemblyModelLoader loader, String uri) {
+
+        // Get the WSDL port namespace and name
+        int h=uri.indexOf('#');
+        String namespace=uri.substring(0,h);
+        String name=uri.substring(h+1);
+        QName qname=new QName(namespace, name);
+
+        // Load the WSDL definitions for the given namespace
+        List<Definition> definitions=loader.loadDefinitions(namespace);
+        if (definitions==null)
+            throw new IllegalArgumentException("Cannot find WSDL definition for "+namespace);
+        for (Definition definition: definitions) {
+
+            // Find the port with the given name
+            PortType portType=definition.getPortType(qname);
+            return portType;
+        }
+        throw new IllegalArgumentException("Cannot find WSDL portType "+uri);
+    }
+    
+    /**
+     * Generate a Java interface from a WSDL portType.
+     * @param portType
+     * @param interfaceName
+     * @return
+     */
+    private Class generateJavaInterface(ResourceLoader resourceLoader, PortType portType, String interfaceName) {
+        ClassWriter cw=new ClassWriter(false);
+        
+        // Generate the interface
+        interfaceName=interfaceName.replace('.', '/');
+        cw.visit(V1_5, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, interfaceName, null, "java/lang/Object", new String[0]);
+        
+        
+        // Generate methods from the WSDL operations
+        for (Operation operation : (List<Operation>)portType.getOperations()) {
+            String methodName=XMLNameUtil.getJavaNameFromXMLName(operation.getName(), false);
+            
+            //FIXME integrate XSD to Java type mapping here
+            String inputType = Type.getDescriptor(DataObject.class);
+            String outputType = Type.getDescriptor(DataObject.class);
+            
+            cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, methodName, "("+inputType+")"+outputType, null, null).visitEnd();
         }
+
+        // Generate the bytecodes
+        cw.visitEnd();
+        byte[] bytes=cw.toByteArray();
+        
+        // Add the class to the resource loader
+        Class interfaceClass=(Class)resourceLoader.addClass(bytes);
+        
+        return interfaceClass; 
     }
     
 }

Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java Fri Feb 24 18:56:18 2006
@@ -84,7 +84,7 @@
                 if (qualifiedPackageName.length() > 0) {
                     qualifiedPackageName.append('.');
                 }
-                qualifiedPackageName.append(getValidNameFromXMLName(packageName, false));
+                qualifiedPackageName.append(getJavaNameFromXMLName(packageName, false));
             }
         }
         return qualifiedPackageName.toString();
@@ -151,13 +151,13 @@
     }
 
     /**
-     * Returns a valid name from an XML Name
+     * Returns a valid Java name from an XML Name
      *
      * @param name
      * @param isUpperCase
      * @return
      */
-    public static String getValidNameFromXMLName(String name, boolean isUpperCase) {
+    public static String getJavaNameFromXMLName(String name, boolean isUpperCase) {
         List parsedName = parseName(name, '_');
         StringBuffer result = new StringBuffer();
         for (Iterator i = parsedName.iterator(); i.hasNext();) {
@@ -175,6 +175,16 @@
         return result.length() == 0 ? "_" : Character.isJavaIdentifierStart(result.charAt(0)) ? isUpperCase ? result.toString() : decapitalizeName(result.toString()) : "_" + result;
     }
 
+    /**
+     * Returns a valid fully qualified class name from a QName
+     * @param namespace
+     * @param name
+     * @return
+     */
+    public static String getFullyQualifiedClassNameFromQName(String namespace, String name) {
+        return XMLNameUtil.getPackageNameFromNamespace(namespace)+'.'+XMLNameUtil.getJavaNameFromXMLName(name, true);
+    }
+    
     /**
      * Decapitalize a name.
      * @param name

Modified: incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd (original)
+++ incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd Fri Feb 24 18:56:18 2006
@@ -61,6 +61,8 @@
 			<element minOccurs="0" maxOccurs="unbounded" name="component" type="sca:Component"/>
 			<element minOccurs="0" maxOccurs="unbounded" name="externalService" type="sca:ExternalService"/>
 			<element minOccurs="0" maxOccurs="unbounded" name="wire" type="sca:ModuleWire"/>
+			<!--  This is a Tuscany extension  -->
+			<element minOccurs="0" maxOccurs="unbounded" name="import" type="sca:Import"/>
 			<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
 		</sequence>
 		<attribute name="name" type="NCName" use="required"/>
@@ -215,5 +217,9 @@
 			<enumeration value="must"/>
 		</restriction>
 	</simpleType>
+
+	<!-- This is a Tuscany extension  -->
+	<element name="import" type="sca:Import"/>
+	<complexType name="Import"/>
 
 </schema>

Modified: incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd (original)
+++ incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd Fri Feb 24 18:56:18 2006
@@ -20,4 +20,20 @@
 			</extension>
 		</complexContent>
 	</complexType>
+	
+	<!-- This is a Tuscany extension -->
+	<element name="import.wsdl" type="sca:WSDLImport" substitutionGroup="sca:import"/>
+	<complexType name="WSDLImport">
+		<complexContent>
+			<extension base="sca:Import">
+				<sequence>
+					<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="namespace" type="anyURI" use="required"/>
+				<attribute name="location" type="anyURI" use="required"/>
+				<anyAttribute namespace="##any" processContents="lax"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	
 </schema>