You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jm...@apache.org on 2007/02/11 07:55:32 UTC

svn commit: r505856 [1/2] - in /incubator/tuscany/java/sca/kernel: core/src/main/java/org/apache/tuscany/core/bootstrap/ core/src/main/java/org/apache/tuscany/core/builder/ core/src/main/java/org/apache/tuscany/core/component/ core/src/main/java/org/ap...

Author: jmarino
Date: Sat Feb 10 22:55:31 2007
New Revision: 505856

URL: http://svn.apache.org/viewvc?view=rev&rev=505856
Log:
move autowire to resolution phase; bring up standalone runtime

Modified:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/ComponentManagerImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStart.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStop.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeBuilder.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemCompositeBuilder.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemSingletonAtomicComponent.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/PojoObjectFactory.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/extension/AbstractExtensionDeployer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/bootstrap/BootstrapperTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorPostProcessTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SystemWireConnectionTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/deployer/BootstrapDeployerTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/PojoObjectFactoryTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderRefTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/resolver/DefaultAutowireResolverTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/ContractCompatibilityTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Component.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/CompositeComponent.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/CompositeComponentExtension.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/WireService.java

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java Sat Feb 10 22:55:31 2007
@@ -86,7 +86,7 @@
      *
      * @return a new primordial Connector
      */
-    Connector createConnector();
+    Connector getConnector();
 
     /**
      * Returns the AutowireResolver that resolves autowire targets

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java Sat Feb 10 22:55:31 2007
@@ -41,7 +41,6 @@
 import org.apache.tuscany.core.binding.local.LocalBindingDefinition;
 import org.apache.tuscany.core.binding.local.LocalBindingLoader;
 import org.apache.tuscany.core.builder.BuilderRegistryImpl;
-import org.apache.tuscany.core.builder.ConnectorImpl;
 import org.apache.tuscany.core.component.ComponentManager;
 import org.apache.tuscany.core.component.WorkContextImpl;
 import org.apache.tuscany.core.component.scope.CompositeScopeObjectFactory;
@@ -94,7 +93,8 @@
     private final XMLInputFactory xmlFactory;
     private final ComponentManager componentManager;
     private final TuscanyManagementService managementService;
-    private AutowireResolver resolver;
+    private final AutowireResolver resolver;
+    private final Connector connector;
 
     /**
      * Create a default bootstrapper.
@@ -103,18 +103,21 @@
      * @param xmlFactory        the XMLInputFactory to be used by the components to load XML artifacts
      * @param componentManager  the component manager for the runtime instance
      * @param resolver          the autowire resolver for the runtime instance
+     * @param connector         the connector for the runtime instance
      * @param managementService management service used by the runtime.
      */
     public DefaultBootstrapper(MonitorFactory monitorFactory,
                                XMLInputFactory xmlFactory,
                                ComponentManager componentManager,
                                AutowireResolver resolver,
+                               Connector connector,
                                TuscanyManagementService managementService) {
         this.monitorFactory = monitorFactory;
         this.xmlFactory = xmlFactory;
         this.componentManager = componentManager;
         this.managementService = managementService;
         this.resolver = resolver;
+        this.connector = connector;
     }
 
     /**
@@ -154,7 +157,7 @@
         JavaInterfaceProcessorRegistry interfaceIntrospector = new JavaInterfaceProcessorRegistryImpl();
         Introspector introspector = createIntrospector(interfaceIntrospector);
         LoaderRegistry loader = createLoader(new PropertyObjectFactoryImpl(), introspector);
-        DeployerImpl deployer = new DeployerImpl(xmlFactory, loader, builder, resolver);
+        DeployerImpl deployer = new DeployerImpl(xmlFactory, loader, builder, resolver, componentManager, connector);
         deployer.setMonitor(getMonitorFactory().getMonitor(ScopeContainerMonitor.class));
         return deployer;
     }
@@ -236,8 +239,8 @@
      *
      * @return a new Connector
      */
-    public Connector createConnector() {
-        return new ConnectorImpl(componentManager);
+    public Connector getConnector() {
+        return connector;
     }
 
 
@@ -267,7 +270,7 @@
         BuilderRegistryImpl builderRegistry =
             new BuilderRegistryImpl(scopeRegistry, new JDKWireService(), componentManager);
         SystemCompositeBuilder builder =
-            new SystemCompositeBuilder(builderRegistry, createConnector(), managementService);
+            new SystemCompositeBuilder(builderRegistry, getConnector(), managementService);
         builderRegistry.register(SystemCompositeImplementation.class, builder);
         builderRegistry.register(SystemImplementation.class, new SystemComponentBuilder());
         builderRegistry.register(LocalBindingDefinition.class, new LocalBindingBuilder());

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java Sat Feb 10 22:55:31 2007
@@ -36,9 +36,7 @@
 import org.apache.tuscany.spi.component.Service;
 import org.apache.tuscany.spi.component.ServiceBinding;
 import org.apache.tuscany.spi.component.TargetInvokerCreationException;
-import org.apache.tuscany.spi.component.TargetResolutionException;
 import org.apache.tuscany.spi.component.WorkContext;
-import org.apache.tuscany.spi.idl.java.JavaServiceContract;
 import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.model.Scope;
 import org.apache.tuscany.spi.model.ServiceContract;
@@ -55,7 +53,6 @@
 import org.apache.tuscany.spi.wire.WireService;
 
 import org.apache.tuscany.core.component.ComponentManager;
-import org.apache.tuscany.core.wire.LoopBackWire;
 import org.apache.tuscany.core.wire.NonBlockingBridgingInterceptor;
 import org.apache.tuscany.core.wire.SynchronousBridgingInterceptor;
 import org.apache.tuscany.core.wire.WireUtils;
@@ -327,108 +324,34 @@
         sourceChain.addInterceptor(new SynchronousBridgingInterceptor(head));
     }
 
-    protected void connect(SCAObject source, OutboundWire sourceWire, Reference target) throws WiringException {
-        InboundWire targetWire = null;
-        for (ReferenceBinding binding : target.getReferenceBindings()) {
-            InboundWire candidate = binding.getInboundWire();
-            if (sourceWire.getBindingType().equals(candidate.getBindingType())) {
-                targetWire = candidate;
-                break;
-            }
-        }
-        if (targetWire == null) {
-            if (target.getReferenceBindings().size() > 0 && source instanceof Component) {
-                // TODO create a pluggable algorithm for selecting the binding type
-                targetWire = target.getReferenceBindings().get(0).getInboundWire();
-            }
-            if (targetWire == null) {
-                throw new NoCompatibleBindingsException(sourceWire.getUri(), sourceWire.getTargetUri());
-            }
-        }
-        checkIfWireable(sourceWire, targetWire);
-        boolean optimizable = isOptimizable(source.getScope(), target.getScope());
-        connect(sourceWire, targetWire, optimizable);
-    }
-
-    protected void connect(SCAObject source, OutboundWire sourceWire, Service target) throws WiringException {
-        InboundWire targetWire = null;
-        for (ServiceBinding binding : target.getServiceBindings()) {
-            InboundWire candidate = binding.getInboundWire();
-            if (sourceWire.getBindingType().equals(candidate.getBindingType())) {
-                targetWire = candidate;
-                break;
-            }
-        }
-        if (targetWire == null) {
-            throw new NoCompatibleBindingsException(sourceWire.getUri(), sourceWire.getTargetUri());
-        }
-        checkIfWireable(sourceWire, targetWire);
-        boolean optimizable = isOptimizable(source.getScope(), target.getScope());
-        connect(sourceWire, targetWire, optimizable);
-    }
-
-    protected void connect(SCAObject source, OutboundWire sourceWire, Component target)
-        throws WiringException {
-        URI targetUri = sourceWire.getTargetUri();
-        assert targetUri != null;
-        InboundWire targetWire;
-        targetWire = target.getTargetWire(sourceWire.getTargetUri().getFragment());
-        if (targetWire == null) {
-            URI sourceUri = sourceWire.getUri();
-            throw new TargetServiceNotFoundException("Target not found ", sourceUri, targetUri);
-        }
-        checkIfWireable(sourceWire, targetWire);
-        boolean optimizable = isOptimizable(source.getScope(), target.getScope());
-        connect(sourceWire, targetWire, optimizable);
-    }
-
-    protected void autowire(OutboundWire outboundWire, CompositeComponent parent) throws WiringException {
-        InboundWire targetWire;
-        try {
-            Class interfaze = outboundWire.getServiceContract().getInterfaceClass();
-            if (CompositeComponent.class.equals(interfaze)) {
-                JavaServiceContract contract = new JavaServiceContract(CompositeComponent.class);
-                targetWire = new LoopBackWire();
-                targetWire.setServiceContract(contract);
-                targetWire.setContainer(parent);
-                outboundWire.setTargetWire(targetWire);
-                return;
-            }
-            targetWire = parent.resolveAutowire(interfaze);
-        } catch (TargetResolutionException e) {
-            URI sourceName = outboundWire.getUri();
-            URI targetName = outboundWire.getTargetUri();
-            throw new WireConnectException("Error resolving autowire target", sourceName, targetName, e);
-        }
-        if (targetWire == null) {
-            // autowire may return null if it is optional. The client must decide if an error should be thrown
-            return;
-        }
-        Scope sourceScope = outboundWire.getContainer().getScope();
-        Scope targetScope = targetWire.getContainer().getScope();
-        boolean optimizable = isOptimizable(sourceScope, targetScope);
-        connect(outboundWire, targetWire, optimizable);
-    }
-
-    protected void checkIfWireable(OutboundWire sourceWire, InboundWire targetWire)
+    protected boolean assertWireable(OutboundWire sourceWire, InboundWire targetWire, boolean silent)
         throws IncompatibleInterfacesException {
         if (wireService == null) {
             Class<?> sourceInterface = sourceWire.getServiceContract().getInterfaceClass();
             Class<?> targetInterface = targetWire.getServiceContract().getInterfaceClass();
             if (!sourceInterface.isAssignableFrom(targetInterface)) {
-                throw new IncompatibleInterfacesException(sourceWire.getUri(), targetWire.getUri());
+                if (!silent) {
+                    throw new IncompatibleInterfacesException(sourceWire.getUri(), targetWire.getUri());
+                } else {
+                    return false;
+                }
             }
         } else {
             try {
                 ServiceContract sourceContract = sourceWire.getServiceContract();
                 ServiceContract targetContract = targetWire.getServiceContract();
-                wireService.checkCompatibility(sourceContract, targetContract, false);
+                wireService.checkCompatibility(sourceContract, targetContract, false, silent);
             } catch (IncompatibleServiceContractException e) {
                 URI sourceUri = sourceWire.getUri();
                 URI targetUri = targetWire.getUri();
-                throw new IncompatibleInterfacesException(sourceUri, targetUri, e);
+                if (!silent) {
+                    throw new IncompatibleInterfacesException(sourceUri, targetUri, e);
+                } else {
+                    return false;
+                }
             }
         }
+        return true;
     }
 
     protected boolean isOptimizable(Scope pReferrer, Scope pReferee) {
@@ -487,7 +410,7 @@
             if (targetWire == null) {
                 throw new TargetServiceNotFoundException("Target not found", sourceUri, targetUri);
             }
-            checkIfWireable(outboundWire, targetWire);
+            assertWireable(outboundWire, targetWire, false);
             boolean optimizable = isOptimizable(service.getScope(), targetComponent.getScope());
             connect(outboundWire, targetWire, optimizable);
             connect(inboundWire, outboundWire, true);
@@ -529,30 +452,41 @@
         // connect outbound wires for component references to their targets
         for (List<OutboundWire> referenceWires : component.getOutboundWires().values()) {
             for (OutboundWire outboundWire : referenceWires) {
-                if (outboundWire.isAutowire()) {
-                    autowire(outboundWire, parent);
-                } else {
-                    if (outboundWire.getTargetUri() == null) {
-                        URI source = outboundWire.getUri();
-                        URI target = outboundWire.getTargetUri();
-                        throw new MissingWireTargetException("Target name was null", source, target);
+                if (outboundWire.getTargetUri() == null) {
+                    URI source = outboundWire.getUri();
+                    URI target = outboundWire.getTargetUri();
+                    throw new MissingWireTargetException("Target name was null", source, target);
+                }
+                URI sourceUri = outboundWire.getUri();
+                URI targetUri = outboundWire.getTargetUri();
+                String fragment = targetUri.getFragment();
+                URI defragUri = UriHelper.getDefragmentedName(targetUri);
+                Component targetComponent = componentManager.getComponent(defragUri);
+                if (targetComponent == null) {
+                    throw new TargetComponentNotFoundException("Target not found", sourceUri, targetUri);
+                }
+                InboundWire targetWire = null;
+                if (fragment == null) {
+                    // JFM TODO test
+                    // find a suitable wire since no specific service was named
+                    for (InboundWire wire : targetComponent.getInboundWires()) {
+                        if (assertWireable(outboundWire, wire, true)) {
+                            targetWire = wire;
+                            break;
+                        }
                     }
-                    URI sourceUri = outboundWire.getUri();
-                    URI targetUri = outboundWire.getTargetUri();
-                    String fragment = targetUri.getFragment();
-                    URI defragUri = UriHelper.getDefragmentedName(targetUri);
-                    Component targetComponent = componentManager.getComponent(defragUri);
-                    if (targetComponent == null) {
-                        throw new TargetComponentNotFoundException("Target not found", sourceUri, targetUri);
+                    if (targetWire == null) {
+                        throw new TargetServiceNotFoundException("Target not found", sourceUri, targetUri);
                     }
-                    InboundWire targetWire = targetComponent.getTargetWire(fragment);
+                } else {
+                    targetWire = targetComponent.getTargetWire(fragment);
                     if (targetWire == null) {
                         throw new TargetServiceNotFoundException("Target not found", sourceUri, targetUri);
                     }
-                    checkIfWireable(outboundWire, targetWire);
-                    boolean optimizable = isOptimizable(component.getScope(), component.getScope());
-                    connect(outboundWire, targetWire, optimizable);
+                    assertWireable(outboundWire, targetWire, false);
                 }
+                boolean optimizable = isOptimizable(component.getScope(), component.getScope());
+                connect(outboundWire, targetWire, optimizable);
             }
         }
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/ComponentManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/ComponentManagerImpl.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/ComponentManagerImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/ComponentManagerImpl.java Sat Feb 10 22:55:31 2007
@@ -151,6 +151,5 @@
                 }
             }
         }
-
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStart.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStart.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStart.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStart.java Sat Feb 10 22:55:31 2007
@@ -21,7 +21,7 @@
 import java.net.URI;
 
 /**
- * Propagated when a composite starts
+ * Propagated when a component starts
  *
  * @version $$Rev$$ $$Date$$
  */
@@ -30,10 +30,10 @@
     private URI uri;
 
     /**
-     * Creates a component stop event
+     * Creates a component start event
      *
      * @param source       the source of the event
-     * @param componentURI the uri of the component being stopped
+     * @param componentURI the uri of the component being started
      */
     public ComponentStart(Object source, URI componentURI) {
         super(source);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStop.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStop.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStop.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/event/ComponentStop.java Sat Feb 10 22:55:31 2007
@@ -30,10 +30,10 @@
     private URI uri;
 
     /**
-     * Creates a composite stop event
+     * Creates a component stop event
      *
      * @param source    the source of the event
-     * @param componentUri the composite component associated the composite being stopped
+     * @param componentUri the composite component associated the component being stopped
      */
     public ComponentStop(Object source, URI componentUri) {
         super(source);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java Sat Feb 10 22:55:31 2007
@@ -23,15 +23,17 @@
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.builder.Builder;
 import org.apache.tuscany.spi.builder.BuilderException;
-import org.apache.tuscany.spi.builder.BuilderInstantiationException;
 import org.apache.tuscany.spi.builder.BuilderRegistry;
+import org.apache.tuscany.spi.builder.Connector;
+import org.apache.tuscany.spi.builder.WiringException;
 import org.apache.tuscany.spi.component.Component;
-import org.apache.tuscany.spi.component.ComponentRegistrationException;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.component.PrepareException;
+import org.apache.tuscany.spi.component.Reference;
 import org.apache.tuscany.spi.component.SCAObject;
 import org.apache.tuscany.spi.component.ScopeContainer;
 import org.apache.tuscany.spi.component.ScopeContainerMonitor;
+import org.apache.tuscany.spi.component.Service;
 import org.apache.tuscany.spi.deployer.Deployer;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.event.Event;
@@ -40,10 +42,13 @@
 import org.apache.tuscany.spi.loader.LoaderException;
 import org.apache.tuscany.spi.loader.LoaderRegistry;
 import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.ComponentType;
+import org.apache.tuscany.spi.model.CompositeComponentType;
 import org.apache.tuscany.spi.model.Implementation;
 import org.apache.tuscany.spi.resolver.ResolutionException;
 
 import org.apache.tuscany.api.annotation.Monitor;
+import org.apache.tuscany.core.component.ComponentManager;
 import org.apache.tuscany.core.component.event.ComponentStop;
 import org.apache.tuscany.core.component.scope.CompositeScopeContainer;
 import org.apache.tuscany.core.resolver.AutowireResolver;
@@ -59,12 +64,21 @@
     private ScopeContainerMonitor monitor;
     private Loader loader;
     private AutowireResolver resolver;
+    private ComponentManager componentManager;
+    private Connector connector;
 
-    public DeployerImpl(XMLInputFactory xmlFactory, Loader loader, Builder builder, AutowireResolver resolver) {
+    public DeployerImpl(XMLInputFactory xmlFactory,
+                        Loader loader,
+                        Builder builder,
+                        AutowireResolver resolver,
+                        ComponentManager manager,
+                        Connector connector) {
         this.xmlFactory = xmlFactory;
         this.loader = loader;
         this.builder = builder;
         this.resolver = resolver;
+        this.componentManager = manager;
+        this.connector = connector;
     }
 
     public DeployerImpl() {
@@ -98,14 +112,11 @@
         scopeContainer.start();
         DeploymentContext deploymentContext = new RootDeploymentContext(null, xmlFactory, scopeContainer, null);
         deploymentContext.getPathNames().add(componentDefinition.getUri().toString());
-        try {
-            load(parent, componentDefinition, deploymentContext);
-        } catch (LoaderException e) {
-            e.addContextName(componentDefinition.getUri().toString());
-            throw e;
-        }
+        // load the model
+        load(parent, componentDefinition, deploymentContext);
         // resolve autowires
         resolver.resolve(null, componentDefinition);
+        // build runtime artifacts
         Component component = (Component) build(parent, componentDefinition, deploymentContext);
         // create a listener so the scope container is shutdown when the top-level composite stops
         RuntimeEventListener listener = new RuntimeEventListener() {
@@ -118,11 +129,7 @@
         };
         component.addListener(listener);
         component.prepare();
-        try {
-            parent.register(component);
-        } catch (ComponentRegistrationException e) {
-            throw new BuilderInstantiationException("Error registering component", e);
-        }
+        connect(component, componentDefinition);
         return component;
     }
 
@@ -154,4 +161,31 @@
         return builder.build(parent, componentDefinition, deploymentContext);
     }
 
+    /**
+     * JFM TODO move to connector
+     */
+    private void connect(Component component, ComponentDefinition componentDefinition) throws WiringException {
+        if (component instanceof CompositeComponent) {
+            CompositeComponent composite = (CompositeComponent) component;
+            for (Service service : composite.getServices()) {
+                connector.connect(service);
+            }
+            for (Reference reference : composite.getReferences()) {
+                connector.connect(reference);
+            }
+        }
+        ComponentType<?, ?, ?> type = componentDefinition.getImplementation().getComponentType();
+        if (type instanceof CompositeComponentType) {
+            CompositeComponentType<?, ?, ?> compositeType = (CompositeComponentType<?, ?, ?>) type;
+            for (ComponentDefinition<? extends Implementation<?>> definition : compositeType.getComponents().values()) {
+                Component child = componentManager.getComponent(definition.getUri());
+                assert child != null;
+                connect(child, definition);
+            }
+        } else {
+            connector.connect(component);
+        }
+
+    }
+    
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeBuilder.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeBuilder.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeBuilder.java Sat Feb 10 22:55:31 2007
@@ -26,11 +26,8 @@
                                     CompositeComponent component,
                                     CompositeComponentType<?, ?, ?> componentType,
                                     DeploymentContext deploymentContext) throws BuilderException {
-
         for (ComponentDefinition<? extends Implementation<?>> definition : componentType.getComponents().values()) {
             builderRegistry.build(component, definition, deploymentContext);
-            // JFM TODO
-            //component.register(child);
         }
         for (ServiceDefinition definition : componentType.getServices().values()) {
             try {
@@ -42,13 +39,14 @@
         }
         for (ReferenceDefinition definition : componentType.getReferences().values()) {
             try {
-                Reference child = builderRegistry.build(component, definition, deploymentContext);
-                component.register(child);
+                Reference reference = builderRegistry.build(component, definition, deploymentContext);
+                component.register(reference);
             } catch (ComponentRegistrationException e) {
                 throw new BuilderInstantiationException("Error registering reference", e);
             }
         }
         component.getExtensions().putAll(componentType.getExtensions());
+        // connect services and references before components
         return component;
     }
 

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemCompositeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemCompositeBuilder.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemCompositeBuilder.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemCompositeBuilder.java Sat Feb 10 22:55:31 2007
@@ -22,6 +22,7 @@
 
 import org.osoa.sca.annotations.Constructor;
 
+import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.builder.BuilderException;
 import org.apache.tuscany.spi.builder.BuilderRegistry;
 import org.apache.tuscany.spi.builder.Connector;
@@ -30,7 +31,6 @@
 import org.apache.tuscany.spi.model.ComponentDefinition;
 import org.apache.tuscany.spi.model.CompositeComponentType;
 import org.apache.tuscany.spi.services.management.TuscanyManagementService;
-import org.apache.tuscany.spi.annotation.Autowire;
 
 import org.apache.tuscany.core.implementation.system.model.SystemCompositeImplementation;
 
@@ -45,7 +45,7 @@
     @Constructor
     public SystemCompositeBuilder(@Autowire BuilderRegistry builderRegistry,
                                   @Autowire Connector connector,
-                                  @Autowire TuscanyManagementService managementService) {
+                                  @Autowire (required = false) TuscanyManagementService managementService) {
         this.builderRegistry = builderRegistry;
         this.connector = connector;
         this.managementService = managementService;

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemSingletonAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemSingletonAtomicComponent.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemSingletonAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/SystemSingletonAtomicComponent.java Sat Feb 10 22:55:31 2007
@@ -33,6 +33,8 @@
 import org.apache.tuscany.spi.component.TargetInitializationException;
 import org.apache.tuscany.spi.component.TargetResolutionException;
 import org.apache.tuscany.spi.extension.AbstractComponentExtension;
+import org.apache.tuscany.spi.idl.InvalidServiceContractException;
+import org.apache.tuscany.spi.idl.java.JavaInterfaceProcessorRegistry;
 import org.apache.tuscany.spi.idl.java.JavaServiceContract;
 import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.model.Scope;
@@ -43,6 +45,7 @@
 import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.WireService;
 
+import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
 import org.apache.tuscany.core.wire.jdk.JDKWireService;
 
 /**
@@ -54,14 +57,22 @@
     implements AtomicComponent {
     private T instance;
     private Map<String, InboundWire> inboundWires;
+    // JFM FIXME JDKWireService
     private WireService wireService = new JDKWireService();
+    // JFM FIXME remove
+    private JavaInterfaceProcessorRegistry interfaceProcessorRegistry = new JavaInterfaceProcessorRegistryImpl();
     private List<ServiceContract> serviceContracts = new ArrayList<ServiceContract>();
 
     public SystemSingletonAtomicComponent(URI name, CompositeComponent parent, Class<S> interfaze, T instance) {
         super(name, parent);
         this.instance = instance;
         inboundWires = new HashMap<String, InboundWire>();
-        initWire(interfaze);
+        try {
+            initWire(interfaze);
+        } catch (InvalidServiceContractException e) {
+            // JFM FIXME
+            e.printStackTrace();
+        }
     }
 
 
@@ -73,7 +84,12 @@
         this.instance = instance;
         inboundWires = new HashMap<String, InboundWire>();
         for (Class<?> interfaze : services) {
-            initWire(interfaze);
+            try {
+                initWire(interfaze);
+            } catch (InvalidServiceContractException e) {
+                // xcv ficme
+                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+            }
         }
     }
 
@@ -159,8 +175,8 @@
         return serviceContracts;
     }
 
-    private void initWire(Class<?> interfaze) {
-        JavaServiceContract serviceContract = new JavaServiceContract(interfaze);
+    private void initWire(Class<?> interfaze) throws InvalidServiceContractException {
+        JavaServiceContract serviceContract = interfaceProcessorRegistry.introspect(interfaze);
         // create a relative URI
         URI uri = URI.create("#" + interfaze.getName());
         ServiceDefinition def = new ServiceDefinition(uri, serviceContract, false);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/PojoObjectFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/PojoObjectFactory.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/PojoObjectFactory.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/PojoObjectFactory.java Sat Feb 10 22:55:31 2007
@@ -94,10 +94,11 @@
         for (int i = 0; i < size; i++) {
             ObjectFactory<?> objectFactory = initializerFactories[i];
             if (objectFactory == null) {
-                String name = ctr.getName();
-                throw new ObjectCallbackException("Null object factory for constructor parameter [" + i + "]", name);
+                // this can happen if a reference is optional
+                initargs[i] = null;
+            } else {
+                initargs[i] = objectFactory.getInstance();
             }
-            initargs[i] = objectFactory.getInstance();
         }
         try {
             ctr.setAccessible(true);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java Sat Feb 10 22:55:31 2007
@@ -21,6 +21,7 @@
 import java.lang.reflect.Type;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.List;
 import java.util.Map;
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilder;
@@ -247,12 +248,21 @@
         }
         URI targetURI;
         QualifiedName qName = new QualifiedName(target);
+        StringBuilder buf = new StringBuilder();
+        List<String> names = deploymentContext.getPathNames();
+        for (int i = 0; i < names.size() - 1; i++) {
+            buf.append("/");
+        }
+        if (names.size() > 0) {
+            buf.append(names.get(names.size() - 1));
+        }
+        String path = buf.toString();
         try {
             if (qName.getPortName() == null) {
-                targetURI = new URI(componentDefinition.getUri() + "/" + qName.getPartName());
+                targetURI = new URI(path + "/" + qName.getPartName());
             } else {
                 targetURI =
-                    new URI(componentDefinition.getUri() + "/" + qName.getPartName() + "#" + qName.getPortName());
+                    new URI(path + "/" + qName.getPartName() + "#" + qName.getPortName());
             }
         } catch (URISyntaxException e) {
             throw new InvalidReferenceException("Illegal URI", name, e);
@@ -279,7 +289,7 @@
             if (referenceTarget == null) {
                 referenceTarget = new ReferenceTarget();
                 try {
-                    referenceTarget.setReferenceName(new URI(componentDefinition.getUri() + "#" + name));
+                    referenceTarget.setReferenceName(new URI(path + "#" + name));
                 } catch (URISyntaxException e) {
                     throw new IllegalSCDLNameException(e);
                 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java Sat Feb 10 22:55:31 2007
@@ -62,7 +62,7 @@
                         ReferenceDefinition reference = childType.getReferences().get(fragment);
                         assert reference != null;
                         ServiceContract requiredContract = reference.getServiceContract();
-                        resolve(compositeType, requiredContract, target);
+                        resolve(compositeType, requiredContract, target, reference.isRequired());
                     }
                 }
             }
@@ -74,7 +74,8 @@
                     ReferenceDefinition reference = type.getReferences().get(fragment);
                     assert reference != null;
                     ServiceContract requiredContract = reference.getServiceContract();
-                    resolve(parentDefinition.getImplementation().getComponentType(), requiredContract, target);
+                    CompositeComponentType<?, ?, ?> ctype = parentDefinition.getImplementation().getComponentType();
+                    resolve(ctype, requiredContract, target, reference.isRequired());
                 }
             }
 
@@ -92,12 +93,14 @@
      * @param compositeType    the composite component type to resolve against
      * @param requiredContract the required target contract
      * @param target           the reference target
+     * @param required         true if the autowire is required
      * @throws AutowireTargetNotFoundException
      *
      */
     private void resolve(CompositeComponentType<?, ?, ?> compositeType,
                          ServiceContract requiredContract,
-                         ReferenceTarget target) throws AutowireTargetNotFoundException {
+                         ReferenceTarget target,
+                         boolean required) throws AutowireTargetNotFoundException {
         // for now, attempt to match on interface, assume the class can be loaded
         Class<?> requiredInterface = requiredContract.getInterfaceClass();
         if (requiredInterface == null) {
@@ -126,7 +129,9 @@
         if (targetUri == null) {
             if (candidateUri == null) {
                 candidateUri = resolvePrimordial(requiredContract);
-                if (candidateUri == null) {
+                if (candidateUri == null && !required) {
+                    return;
+                } else if (candidateUri == null) {
                     String refName = target.getReferenceName().toString();
                     throw new AutowireTargetNotFoundException("No matching target found", refName);
                 }
@@ -140,7 +145,7 @@
     private URI resolvePrimordial(ServiceContract contract) {
         Class<?> requiredClass = contract.getInterfaceClass();
         for (Map.Entry<ServiceContract, URI> entry : primordialAutowire.entrySet()) {
-            if (requiredClass.isAssignableFrom(contract.getInterfaceClass())) {
+            if (requiredClass.isAssignableFrom(entry.getKey().getInterfaceClass())) {
                 return entry.getValue();
             }
         }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java Sat Feb 10 22:55:31 2007
@@ -27,6 +27,7 @@
 import org.apache.tuscany.spi.bootstrap.ComponentNames;
 import org.apache.tuscany.spi.bootstrap.RuntimeComponent;
 import org.apache.tuscany.spi.builder.BuilderException;
+import org.apache.tuscany.spi.builder.Connector;
 import org.apache.tuscany.spi.component.Component;
 import org.apache.tuscany.spi.component.ComponentException;
 import org.apache.tuscany.spi.component.ComponentRegistrationException;
@@ -45,6 +46,7 @@
 import org.apache.tuscany.core.monitor.NullMonitorFactory;
 import org.apache.tuscany.core.resolver.AutowireResolver;
 import org.apache.tuscany.core.resolver.DefaultAutowireResolver;
+import org.apache.tuscany.core.builder.ConnectorImpl;
 import org.apache.tuscany.host.MonitorFactory;
 import org.apache.tuscany.host.RuntimeInfo;
 import org.apache.tuscany.host.management.ManagementService;
@@ -214,7 +216,8 @@
         TuscanyManagementService tms = (TuscanyManagementService) getManagementService();
         resolver = new DefaultAutowireResolver();
         componentManager = new ComponentManagerImpl(tms, resolver);
-        return new DefaultBootstrapper(getMonitorFactory(), xmlFactory, componentManager, resolver, tms);
+        Connector connector = new ConnectorImpl(componentManager);
+        return new DefaultBootstrapper(getMonitorFactory(), xmlFactory, componentManager, resolver, connector, tms);
     }
 
     protected void registerSystemComponents() throws InitializationException {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/extension/AbstractExtensionDeployer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/extension/AbstractExtensionDeployer.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/extension/AbstractExtensionDeployer.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/extension/AbstractExtensionDeployer.java Sat Feb 10 22:55:31 2007
@@ -19,24 +19,12 @@
 package org.apache.tuscany.core.services.extension;
 
 import java.io.File;
-import java.io.IOException;
 import java.net.MalformedURLException;
-import java.net.URI;
-
 import java.net.URL;
 
 import org.apache.tuscany.spi.annotation.Autowire;
-import org.apache.tuscany.spi.builder.BuilderException;
-import org.apache.tuscany.spi.component.Component;
-import org.apache.tuscany.spi.component.ComponentException;
 import org.apache.tuscany.spi.component.CompositeComponent;
-import org.apache.tuscany.spi.deployer.CompositeClassLoader;
 import org.apache.tuscany.spi.deployer.Deployer;
-import org.apache.tuscany.spi.loader.LoaderException;
-import org.apache.tuscany.spi.model.ComponentDefinition;
-import org.apache.tuscany.spi.resolver.ResolutionException;
-
-import org.apache.tuscany.core.implementation.system.model.SystemCompositeImplementation;
 
 /**
  * @version $Rev$ $Date$
@@ -50,10 +38,11 @@
         this.deployer = deployer;
     }
 
-    @Autowire
-    public void setParent(CompositeComponent parent) {
-        this.parent = parent;
-    }
+// JFM cannot autowire parents - need to come up with a better approach
+//    @Autowire
+//    public void setParent(CompositeComponent parent) {
+//        this.parent = parent;
+//    }
 
     protected void deployExtension(File file) {
         // extension name is file name less any extension
@@ -74,57 +63,58 @@
     }
 
     protected void deployExtension(String name, URL url) {
-        // FIXME for now, assume this class's ClassLoader is the Tuscany system classloader
-        // FIXME we should really use the one associated with the parent composite
-        CompositeClassLoader extensionCL = new CompositeClassLoader(getClass().getClassLoader());
-
-        // see if the URL points to a composite JAR by looking for a default SCDL file inside it
-        URL scdlLocation;
-        try {
-            scdlLocation = new URL("jar:" + url.toExternalForm() + "!/META-INF/sca/default.scdl");
-        } catch (MalformedURLException e) {
-            // the form of the jar: URL should be correct given url.toExternalForm() worked
-            throw new AssertionError();
-        }
-        try {
-            scdlLocation.openStream().close();
-            // we connected to the SCDL so let's add the JAR file to the classloader
-            extensionCL.addURL(url);
-        } catch (IOException e) {
-            // assume that the URL we were given is not a JAR file so just use the supplied resource
-            scdlLocation = url;
-        }
-
-        // create a ComponentDefinition to represent the component we are going to deploy
-        SystemCompositeImplementation implementation = new SystemCompositeImplementation();
-        implementation.setScdlLocation(scdlLocation);
-        implementation.setClassLoader(extensionCL);
-        URI uri = parent.getUri().resolve(name);
-        ComponentDefinition<SystemCompositeImplementation> definition =
-            new ComponentDefinition<SystemCompositeImplementation>(uri, implementation);
-
-        // FIXME: [rfeng] Should we reset the thread context class loader here?
-        // From the debugger with tomcat, the current TCCL is the RealmClassLoader
-        // ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
-        try {
-            // Thread.currentThread().setContextClassLoader(extensionCL);
-            Component component;
-            try {
-                component = deployer.deploy(parent, definition);
-                component.start();
-            } catch (BuilderException e) {
-                // FIXME JFM handle the exception
-                e.printStackTrace();
-            } catch (ComponentException e) {
-                // FIXME handle the exception
-                e.printStackTrace();
-            } catch (ResolutionException e) {
-                // FIXME handle the exception
-                e.printStackTrace();
-            }
-        } catch (LoaderException e) {
-            // FIXME handle the exception
-            e.printStackTrace();
-        }
+        throw new UnsupportedOperationException("");
+//        // FIXME for now, assume this class's ClassLoader is the Tuscany system classloader
+//        // FIXME we should really use the one associated with the parent composite
+//        CompositeClassLoader extensionCL = new CompositeClassLoader(getClass().getClassLoader());
+//
+//        // see if the URL points to a composite JAR by looking for a default SCDL file inside it
+//        URL scdlLocation;
+//        try {
+//            scdlLocation = new URL("jar:" + url.toExternalForm() + "!/META-INF/sca/default.scdl");
+//        } catch (MalformedURLException e) {
+//            // the form of the jar: URL should be correct given url.toExternalForm() worked
+//            throw new AssertionError();
+//        }
+//        try {
+//            scdlLocation.openStream().close();
+//            // we connected to the SCDL so let's add the JAR file to the classloader
+//            extensionCL.addURL(url);
+//        } catch (IOException e) {
+//            // assume that the URL we were given is not a JAR file so just use the supplied resource
+//            scdlLocation = url;
+//        }
+//
+//        // create a ComponentDefinition to represent the component we are going to deploy
+//        SystemCompositeImplementation implementation = new SystemCompositeImplementation();
+//        implementation.setScdlLocation(scdlLocation);
+//        implementation.setClassLoader(extensionCL);
+//        URI uri = parent.getUri().resolve(name);
+//        ComponentDefinition<SystemCompositeImplementation> definition =
+//            new ComponentDefinition<SystemCompositeImplementation>(uri, implementation);
+//
+//        // FIXME: [rfeng] Should we reset the thread context class loader here?
+//        // From the debugger with tomcat, the current TCCL is the RealmClassLoader
+//        // ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
+//        try {
+//            // Thread.currentThread().setContextClassLoader(extensionCL);
+//            Component component;
+//            try {
+//                component = deployer.deploy(parent, definition);
+//                component.start();
+//            } catch (BuilderException e) {
+//                // FIXME JFM handle the exception
+//                e.printStackTrace();
+//            } catch (ComponentException e) {
+//                // FIXME handle the exception
+//                e.printStackTrace();
+//            } catch (ResolutionException e) {
+//                // FIXME handle the exception
+//                e.printStackTrace();
+//            }
+//        } catch (LoaderException e) {
+//            // FIXME handle the exception
+//            e.printStackTrace();
+//        }
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java Sat Feb 10 22:55:31 2007
@@ -51,13 +51,11 @@
     private AtomicComponent targetComponent;
     private boolean optimizable;
 
-
     /**
      * Creates a local inbound wire
      */
     public InboundWireImpl() {
     }
-
 
     /**
      * Creates an inbound wire for the given binding type

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java Sat Feb 10 22:55:31 2007
@@ -75,7 +75,6 @@
         wire.setUri(service.getUri());
         for (Operation<?> operation : contract.getOperations().values()) {
             InboundInvocationChain chain = createInboundChain(operation);
-            // TODO handle policy
             chain.addInterceptor(new InvokerInterceptor());
             wire.addInvocationChain(operation, chain);
         }
@@ -154,7 +153,6 @@
             outboundWire.setCallbackInterface(contract.getCallbackClass());
             for (Operation<?> operation : contract.getCallbackOperations().values()) {
                 InboundInvocationChain callbackTargetChain = createInboundChain(operation);
-                // TODO handle policy
                 callbackTargetChain.addInterceptor(new InvokerInterceptor());
                 outboundWire.addTargetCallbackInvocationChain(operation, callbackTargetChain);
             }
@@ -195,7 +193,6 @@
             outboundWire.setCallbackInterface(contract.getCallbackClass());
             for (Operation<?> operation : contract.getCallbackOperations().values()) {
                 InboundInvocationChain callbackTargetChain = createInboundChain(operation);
-                // TODO handle policy
                 callbackTargetChain.addInterceptor(new InvokerInterceptor());
                 outboundWire.addTargetCallbackInvocationChain(operation, callbackTargetChain);
             }
@@ -204,64 +201,82 @@
         serviceBinding.setOutboundWire(outboundWire);
     }
 
-    /**
-     * Compares two operations for wiring compatibility as defined by the SCA assembly specification, namely: <p/> <ol>
-     * <li>compatibility for the individual method is defined as compatibility of the signature, that is method name,
-     * input types, and output types MUST BE the same. <li>the order of the input and output types also MUST BE the
-     * same. <li>the set of Faults and Exceptions expected by the source MUST BE the same or be a superset of those
-     * specified by the service. </ol>
-     *
-     * @param source the source contract to compare
-     * @param target the target contract to compare
-     * @throws org.apache.tuscany.spi.wire.IncompatibleServiceContractException
-     *          if the two contracts don't match
-     */
-    public void checkCompatibility(ServiceContract<?> source, ServiceContract<?> target, boolean ignoreCallback)
+    public boolean checkCompatibility(ServiceContract<?> source,
+                                      ServiceContract<?> target,
+                                      boolean ignoreCallback,
+                                      boolean silent)
         throws IncompatibleServiceContractException {
         if (source == target) {
             // Shortcut for performance
-            return;
+            return true;
         }
         if (source.isRemotable() != target.isRemotable()) {
-            throw new IncompatibleServiceContractException("Remotable settings do not match", source, target);
+            if (!silent) {
+                throw new IncompatibleServiceContractException("Remotable settings do not match", source, target);
+            } else {
+                return false;
+            }
         }
         if (source.getInteractionScope() != target.getInteractionScope()) {
-            throw new IncompatibleServiceContractException("Interaction scopes settings do not match", source, target);
+            if (!silent) {
+                throw new IncompatibleServiceContractException("Interaction scopes do not match", source, target);
+            } else {
+                return false;
+            }
         }
 
         for (Operation<?> operation : source.getOperations().values()) {
             Operation<?> targetOperation = target.getOperations().get(operation.getName());
             if (targetOperation == null) {
-                throw new IncompatibleServiceContractException("Operation not found on target", source, target);
+                if (!silent) {
+                    throw new IncompatibleServiceContractException("Operation not found on target", source, target);
+                } else {
+                    return false;
+                }
             }
             if (!operation.equals(targetOperation)) {
-                throw new IncompatibleServiceContractException("Target operations are not compatible", source, target);
+                if (!silent) {
+                    throw new IncompatibleServiceContractException("Target operations are not compatible", source,
+                        target);
+                } else {
+                    return false;
+                }
             }
         }
 
         if (ignoreCallback) {
-            return;
+            return true;
         }
 
         for (Operation<?> operation : source.getCallbackOperations().values()) {
             Operation<?> targetOperation = target.getCallbackOperations().get(operation.getName());
             if (targetOperation == null) {
-                throw new IncompatibleServiceContractException("Callback operation not found on target",
-                    source,
-                    target,
-                    null,
-                    targetOperation);
+                if (!silent) {
+                    throw new IncompatibleServiceContractException("Callback operation not found on target",
+                        source,
+                        target,
+                        null,
+                        targetOperation);
+                } else {
+                    return false;
+                }
             }
             if (!operation.equals(targetOperation)) {
-                throw new IncompatibleServiceContractException("Target callback operation is not compatible",
-                    source,
-                    target,
-                    operation,
-                    targetOperation);
+                if (!silent) {
+                    throw new IncompatibleServiceContractException("Target callback operation is not compatible",
+                        source,
+                        target,
+                        operation,
+                        targetOperation);
+                } else {
+                    return false;
+                }
             }
         }
+        return true;
     }
 
+
     /**
      * Creates a wire for flowing outbound invocations from a reference
      *
@@ -272,49 +287,27 @@
     protected List<OutboundWire> createWire(ReferenceTarget target, ReferenceDefinition definition) {
         ServiceContract<?> contract = definition.getServiceContract();
         List<OutboundWire> outboundWires = new ArrayList<OutboundWire>();
-        if (definition.isAutowire()) {
+        // NOTE: it is possible that targets are empty (e.g. when a reference is not required). 
+        // Return without creating wires
+        for (URI uri : target.getTargets()) {
             OutboundWire wire = new OutboundWireImpl();
-            wire.setAutowire(true);
             wire.setServiceContract(contract);
             wire.setUri(target.getReferenceName());
+            wire.setTargetUri(uri);
             for (Operation<?> operation : contract.getOperations().values()) {
-                // TODO handle policy
                 OutboundInvocationChain chain = createOutboundChain(operation);
                 wire.addInvocationChain(operation, chain);
+
             }
             if (contract.getCallbackName() != null) {
                 wire.setCallbackInterface(contract.getCallbackClass());
                 for (Operation<?> operation : contract.getCallbackOperations().values()) {
                     InboundInvocationChain callbackTargetChain = createInboundChain(operation);
-                    // TODO handle policy
                     callbackTargetChain.addInterceptor(new InvokerInterceptor());
                     wire.addTargetCallbackInvocationChain(operation, callbackTargetChain);
                 }
             }
             outboundWires.add(wire);
-        } else {
-            for (URI uri : target.getTargets()) {
-                OutboundWire wire = new OutboundWireImpl();
-                wire.setServiceContract(contract);
-                wire.setUri(target.getReferenceName());
-                wire.setTargetUri(uri);
-                for (Operation<?> operation : contract.getOperations().values()) {
-                    // TODO handle policy
-                    OutboundInvocationChain chain = createOutboundChain(operation);
-                    wire.addInvocationChain(operation, chain);
-
-                }
-                if (contract.getCallbackName() != null) {
-                    wire.setCallbackInterface(contract.getCallbackClass());
-                    for (Operation<?> operation : contract.getCallbackOperations().values()) {
-                        InboundInvocationChain callbackTargetChain = createInboundChain(operation);
-                        // TODO handle policy
-                        callbackTargetChain.addInterceptor(new InvokerInterceptor());
-                        wire.addTargetCallbackInvocationChain(operation, callbackTargetChain);
-                    }
-                }
-                outboundWires.add(wire);
-            }
         }
         return outboundWires;
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/bootstrap/BootstrapperTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/bootstrap/BootstrapperTestCase.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/bootstrap/BootstrapperTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/bootstrap/BootstrapperTestCase.java Sat Feb 10 22:55:31 2007
@@ -37,6 +37,6 @@
 
     protected void setUp() throws Exception {
         super.setUp();
-        bootstrapper = new DefaultBootstrapper(new NullMonitorFactory(), null, null, null, null);
+        bootstrapper = new DefaultBootstrapper(new NullMonitorFactory(), null, null, null, null, null);
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorPostProcessTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorPostProcessTestCase.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorPostProcessTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorPostProcessTestCase.java Sat Feb 10 22:55:31 2007
@@ -38,7 +38,6 @@
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
 
@@ -58,9 +57,8 @@
         registry.process(EasyMock.eq(iwire), EasyMock.eq(owire));
         replay(registry);
         WireService wireService = createMock(WireService.class);
-        wireService.checkCompatibility((ServiceContract<?>) EasyMock.anyObject(),
-            (ServiceContract<?>) EasyMock.anyObject(), EasyMock.eq(false));
-        expectLastCall().anyTimes();
+        EasyMock.expect(wireService.checkCompatibility((ServiceContract<?>) EasyMock.anyObject(),
+            (ServiceContract<?>) EasyMock.anyObject(), EasyMock.eq(false), EasyMock.eq(false))).andReturn(true);
         replay(wireService);
         ConnectorImpl connector = new ConnectorImpl(wireService, registry, null, null, null);
         connector.connect(iwire, owire, false);
@@ -89,11 +87,9 @@
         replay(registry);
 
         WireService wireService = createMock(WireService.class);
-        wireService.checkCompatibility((ServiceContract<?>) EasyMock.anyObject(),
-            (ServiceContract<?>) EasyMock.anyObject(), EasyMock.eq(false));
-        expectLastCall().anyTimes();
+        EasyMock.expect(wireService.checkCompatibility((ServiceContract<?>) EasyMock.anyObject(),
+            (ServiceContract<?>) EasyMock.anyObject(), EasyMock.eq(false), EasyMock.eq(false))).andReturn(true);
         replay(wireService);
-
         ConnectorImpl connector = new ConnectorImpl(wireService, registry, null, null, null);
         connector.connect(owire, iwire, false);
         verify(registry);

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SystemWireConnectionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SystemWireConnectionTestCase.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SystemWireConnectionTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SystemWireConnectionTestCase.java Sat Feb 10 22:55:31 2007
@@ -54,7 +54,6 @@
 
         OutboundWire outbound = EasyMock.createMock(OutboundWire.class);
         EasyMock.expect(outbound.getTargetUri()).andReturn(URI.create("scasystem://target#bar")).atLeastOnce();
-        EasyMock.expect(outbound.isAutowire()).andReturn(false);
         EasyMock.expect(outbound.getUri()).andReturn(URI.create("scasystem://target#bar"));
         outbound.getInvocationChains();
         EasyMock.expectLastCall().andReturn(Collections.emptyMap()).atLeastOnce();

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/deployer/BootstrapDeployerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/deployer/BootstrapDeployerTestCase.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/deployer/BootstrapDeployerTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/deployer/BootstrapDeployerTestCase.java Sat Feb 10 22:55:31 2007
@@ -25,9 +25,9 @@
 import javax.xml.stream.XMLInputFactory;
 
 import org.apache.tuscany.spi.bootstrap.ComponentNames;
+import org.apache.tuscany.spi.builder.Connector;
 import org.apache.tuscany.spi.component.Component;
 import org.apache.tuscany.spi.component.CompositeComponent;
-import org.apache.tuscany.spi.component.SCAObject;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.loader.LoaderException;
 import org.apache.tuscany.spi.model.BindingDefinition;
@@ -44,6 +44,7 @@
 import junit.framework.TestCase;
 import org.apache.tuscany.core.bootstrap.Bootstrapper;
 import org.apache.tuscany.core.bootstrap.DefaultBootstrapper;
+import org.apache.tuscany.core.builder.ConnectorImpl;
 import org.apache.tuscany.core.component.ComponentManager;
 import org.apache.tuscany.core.component.ComponentManagerImpl;
 import org.apache.tuscany.core.implementation.system.model.SystemCompositeImplementation;
@@ -52,7 +53,6 @@
 import org.apache.tuscany.core.resolver.DefaultAutowireResolver;
 import org.easymock.EasyMock;
 import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.isA;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
 
@@ -123,7 +123,6 @@
         CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
         URI uri = URI.create("sca://parent");
         EasyMock.expect(parent.getUri()).andReturn(uri).atLeastOnce();
-        parent.register(isA(SCAObject.class));
         replay(parent);
         // load the boot1 file using the bootstrap deployer
         componentDefinition.setUri(URI.create("sca://parent/simple"));
@@ -138,7 +137,6 @@
         CompositeComponent parent = createNiceMock(CompositeComponent.class);
         URI uri = URI.create(ComponentNames.TUSCANY_SYSTEM_ROOT + "/parent");
         EasyMock.expect(parent.getUri()).andReturn(uri).atLeastOnce();
-        parent.register(isA(SCAObject.class));
         replay(parent);
 
         // load the boot2 file using the bootstrap deployer
@@ -154,9 +152,11 @@
         XMLInputFactory xmlFactory = XMLInputFactory.newInstance();
         DefaultAutowireResolver resolver = new DefaultAutowireResolver();
         ComponentManager manager = new ComponentManagerImpl(null, resolver);
+        Connector connector = new ConnectorImpl(manager);
         manager.registerJavaObject(URI.create("ComponentManager"), ComponentManager.class, manager);
         NullMonitorFactory monitorFactory = new NullMonitorFactory();
-        Bootstrapper bootstrapper = new DefaultBootstrapper(monitorFactory, xmlFactory, manager, resolver, null);
+        Bootstrapper bootstrapper =
+            new DefaultBootstrapper(monitorFactory, xmlFactory, manager, resolver, connector, null);
         deployer = (DeployerImpl) bootstrapper.createDeployer();
         deploymentContext = new RootDeploymentContext(null, xmlFactory, null, null);
         implementation = new SystemCompositeImplementation();

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/PojoObjectFactoryTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/PojoObjectFactoryTestCase.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/PojoObjectFactoryTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/PojoObjectFactoryTestCase.java Sat Feb 10 22:55:31 2007
@@ -19,8 +19,8 @@
 package org.apache.tuscany.core.injection;
 
 import java.lang.reflect.Constructor;
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.tuscany.spi.ObjectFactory;
 
@@ -39,6 +39,18 @@
         PojoObjectFactory<Foo> factory = new PojoObjectFactory<Foo>(ctor, initializers);
         Foo foo = factory.getInstance();
         assertEquals("foo", foo.foo);
+    }
+
+    /**
+     * Verifies null parameters can be passed to a constructor. This is valid when a reference is optional during
+     * constructor injection
+     */
+    public void testConstructorInjectionOptionalParam() throws Exception {
+        List<ObjectFactory> initializers = new ArrayList<ObjectFactory>();
+        initializers.add(null);
+        PojoObjectFactory<Foo> factory = new PojoObjectFactory<Foo>(ctor, initializers);
+        Foo foo = factory.getInstance();
+        assertNull(foo.foo);
     }
 
     public void testConstructorInitializerInjection() throws Exception {

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderRefTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderRefTestCase.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderRefTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderRefTestCase.java Sat Feb 10 22:55:31 2007
@@ -19,10 +19,13 @@
 package org.apache.tuscany.core.loader;
 
 import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
 import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.implementation.java.PojoComponentType;
 import org.apache.tuscany.spi.loader.LoaderException;
 import org.apache.tuscany.spi.loader.LoaderRegistry;
@@ -56,11 +59,16 @@
         EasyMock.expect(reader.getAttributeValue(null, "name")).andReturn("reference");
         EasyMock.expect(reader.getElementText()).andReturn("target");
         EasyMock.replay(reader);
-        loader.loadReference(reader, null, definition);
+        DeploymentContext context = EasyMock.createMock(DeploymentContext.class);
+        List<String> names = new ArrayList<String>();
+        names.add("parent");
+        EasyMock.expect(context.getPathNames()).andReturn(names);
+        EasyMock.replay(context);
+        loader.loadReference(reader, context, definition);
         ReferenceTarget target = definition.getReferenceTargets().get("reference");
         assertEquals(1, target.getTargets().size());
         URI uri = target.getTargets().get(0);
-        assertEquals("component/target", uri.toString());
+        assertEquals("parent/target", uri.toString());
         assertNull(uri.getFragment());
         EasyMock.verify(reader);
     }
@@ -79,11 +87,16 @@
         EasyMock.expect(reader.getAttributeValue(null, "name")).andReturn("reference");
         EasyMock.expect(reader.getElementText()).andReturn("target/fragment");
         EasyMock.replay(reader);
-        loader.loadReference(reader, null, definition);
+        DeploymentContext context = EasyMock.createMock(DeploymentContext.class);
+        List<String> names = new ArrayList<String>();
+        names.add("parent");
+        EasyMock.expect(context.getPathNames()).andReturn(names);
+        EasyMock.replay(context);
+        loader.loadReference(reader, context, definition);
         ReferenceTarget target = definition.getReferenceTargets().get("reference");
         assertEquals(1, target.getTargets().size());
         URI uri = target.getTargets().get(0);
-        assertEquals("component/target#fragment", uri.toString());
+        assertEquals("parent/target#fragment", uri.toString());
         EasyMock.verify(reader);
     }
 

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/resolver/DefaultAutowireResolverTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/resolver/DefaultAutowireResolverTestCase.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/resolver/DefaultAutowireResolverTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/resolver/DefaultAutowireResolverTestCase.java Sat Feb 10 22:55:31 2007
@@ -131,6 +131,7 @@
         contract.setInterfaceClass(requiredInterface);
         ReferenceDefinition reference = new ReferenceDefinition(URI.create("#ref"), contract);
         reference.setAutowire(true);
+        reference.setRequired(true);
         MockComponentType type = new MockComponentType();
         type.add(reference);
         MockAtomicImpl impl = new MockAtomicImpl();

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/ContractCompatibilityTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/ContractCompatibilityTestCase.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/ContractCompatibilityTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/ContractCompatibilityTestCase.java Sat Feb 10 22:55:31 2007
@@ -59,7 +59,7 @@
     public void testNoOperation() throws Exception {
         ServiceContract source = new MockContract<Type>("FooContract");
         ServiceContract target = new MockContract<Type>("FooContract");
-        wireService.checkCompatibility(source, target, false);
+        wireService.checkCompatibility(source, target, false, false);
     }
 
     public void testBasic() throws Exception {
@@ -73,7 +73,7 @@
         Map<String, Operation<Type>> targetOperations = new HashMap<String, Operation<Type>>();
         targetOperations.put("op1", opSource2);
         target.setOperations(targetOperations);
-        wireService.checkCompatibility(source, target, false);
+        wireService.checkCompatibility(source, target, false, false);
     }
 
     public void testBasicIncompatibleOperationNames() throws Exception {
@@ -88,7 +88,7 @@
         targetOperations.put("op2", opSource2);
         target.setOperations(targetOperations);
         try {
-            wireService.checkCompatibility(source, target, false);
+            wireService.checkCompatibility(source, target, false, false);
             fail();
         } catch (IncompatibleServiceContractException e) {
             //expected
@@ -116,7 +116,7 @@
         Map<String, Operation<Type>> targetOperations = new HashMap<String, Operation<Type>>();
         targetOperations.put("op1", opTarget);
         target.setOperations(targetOperations);
-        wireService.checkCompatibility(source, target, false);
+        wireService.checkCompatibility(source, target, false, false);
     }
 
 
@@ -142,7 +142,7 @@
         targetOperations.put("op1", opTarget);
         target.setOperations(targetOperations);
         try {
-            wireService.checkCompatibility(source, target, false);
+            wireService.checkCompatibility(source, target, false, false);
             fail();
         } catch (IncompatibleServiceContractException e) {
             //expected
@@ -191,7 +191,7 @@
         Map<String, Operation<Type>> targetOperations = new HashMap<String, Operation<Type>>();
         targetOperations.put("op1", opTarget);
         target.setOperations(targetOperations);
-        wireService.checkCompatibility(source, target, false);
+        wireService.checkCompatibility(source, target, false, false);
     }
 
     /**
@@ -231,7 +231,7 @@
         targetOperations.put("op1", opTarget);
         target.setOperations(targetOperations);
         try {
-            wireService.checkCompatibility(source, target, false);
+            wireService.checkCompatibility(source, target, false, false);
             fail();
         } catch (IncompatibleServiceContractException e) {
             //expected
@@ -259,7 +259,7 @@
         Map<String, Operation<Type>> targetOperations = new HashMap<String, Operation<Type>>();
         targetOperations.put("op1", opTarget);
         target.setOperations(targetOperations);
-        wireService.checkCompatibility(source, target, false);
+        wireService.checkCompatibility(source, target, false, false);
     }
 
     public void testSourceFaultTargetNoFaultCompatibility() throws Exception {
@@ -278,7 +278,7 @@
         Map<String, Operation<Type>> targetOperations = new HashMap<String, Operation<Type>>();
         targetOperations.put("op1", opTarget);
         target.setOperations(targetOperations);
-        wireService.checkCompatibility(source, target, false);
+        wireService.checkCompatibility(source, target, false, false);
     }
 
     /**

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java Sat Feb 10 22:55:31 2007
@@ -131,16 +131,16 @@
         EasyMock.verify(invoker);
     }
 
-    public void testCreateAutowireReferenceWire() throws Exception {
+    /**
+     * Non-required references (including autowire references) may not have a target set. In this case, a wire should
+     * not be created. Verifies that a reference without a target does not have wires created.
+     */
+    public void testDoNotCreateWireForNonRequiredReferenceWithNoTarget() throws Exception {
         ReferenceDefinition definition = new ReferenceDefinition(URI.create("foo"), contract);
-        definition.setAutowire(true);
         ReferenceTarget target = new ReferenceTarget();
         target.setReferenceName(URI.create("#refName"));
-        OutboundWire wire = wireService.createWire(target, definition).get(0);
-        assertTrue(wire.isAutowire());
-        assertEquals("#refName", wire.getUri().toString());
-        assertEquals(contract, wire.getServiceContract());
-        assertEquals(Callback.class, wire.getCallbackInterface());
+        List<OutboundWire> wires = wireService.createWire(target, definition);
+        assertTrue(wires.isEmpty());
     }
 
     public void testCreateReferenceMultipleWire() throws Exception {

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Component.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Component.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Component.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Component.java Sat Feb 10 22:55:31 2007
@@ -39,6 +39,7 @@
 
     /**
      * Returns the SCA ComponentContext for this component.
+     *
      * @return the SCA ComponentContext for this component
      */
     ComponentContext getComponentContext();
@@ -82,6 +83,7 @@
      * Returns the inbound wire associated with the given target name or null if not found.  Targets can be services or
      * references in the case of composites.
      *
+     * @param targetName the target service name or null if the default service should be returned
      * @return the wire associated with the given service name or null if not found.
      */
     InboundWire getTargetWire(String targetName);

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/CompositeComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/CompositeComponent.java?view=diff&rev=505856&r1=505855&r2=505856
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/CompositeComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/CompositeComponent.java Sat Feb 10 22:55:31 2007
@@ -18,6 +18,8 @@
  */
 package org.apache.tuscany.spi.component;
 
+import java.util.List;
+
 import org.w3c.dom.Document;
 
 import org.apache.tuscany.spi.event.RuntimeEventListener;
@@ -60,6 +62,10 @@
      * Returns the child associated with a given name
      */
     SCAObject getChild(String name);
+
+    List<Service> getServices();
+
+    List<Reference> getReferences();
 
     /**
      * Invoked by child components to return an wire to a target based on matching type. Resolved targets may be



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org