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 2006/11/04 05:06:50 UTC

svn commit: r471111 [1/2] - in /incubator/tuscany/java/sca/kernel: core/src/main/java/org/apache/tuscany/core/implementation/ core/src/main/java/org/apache/tuscany/core/implementation/java/ core/src/main/java/org/apache/tuscany/core/implementation/syst...

Author: jmarino
Date: Fri Nov  3 20:06:48 2006
New Revision: 471111

URL: http://svn.apache.org/viewvc?view=rev&rev=471111
Log:
add core support for @Resource; still need to enable in runtimes

Added:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceNotFoundException.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceObjectFactory.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/host/
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistry.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderResourceTestCase.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/ResourceInjectionTestCase.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/ResourceObjectFactoryTestCase.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/host/
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistryTestCase.java   (with props)
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHost.java   (with props)
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHostRegistry.java   (with props)
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceResolutionException.java   (with props)
Modified:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/builder/SystemComponentBuilder.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicHttpSessionScopeTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicModuleScopeTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicRequestScopeTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/HttpSessionScopeRestartTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ModuleScopeRestartTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/RequestScopeRestartTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/GetServiceByNameTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/wire/AtomicComponentWireInvocationTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/mock/factories/MockFactory.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ServletHost.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/Resource.java

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java Fri Nov  3 20:06:48 2006
@@ -43,6 +43,7 @@
 import org.apache.tuscany.core.injection.NoAccessorException;
 import org.apache.tuscany.core.injection.ObjectCallbackException;
 import org.apache.tuscany.core.injection.PojoObjectFactory;
+import org.apache.tuscany.core.injection.ResourceObjectFactory;
 
 /**
  * Base implementation of an {@link org.apache.tuscany.spi.component.AtomicComponent} whose type is a Java class
@@ -57,12 +58,13 @@
     protected List<String> constructorParamNames;
     protected List<Class<?>> serviceInterfaces;
     protected Map<String, Member> referenceSites;
+    protected Map<String, Member> resourceSites;
     protected Map<String, Member> propertySites;
     protected Map<String, Member> callbackSites;
     protected List<Injector<Object>> injectors;
 
-    public PojoAtomicComponent(String name, PojoConfiguration configuration) {
-        super(name,
+    public PojoAtomicComponent(PojoConfiguration configuration) {
+        super(configuration.getName(),
             configuration.getParent(),
             configuration.getScopeContainer(),
             configuration.getWireService(),
@@ -81,6 +83,8 @@
             : new HashMap<String, Member>();
         propertySites = configuration.getPropertySites() != null ? configuration.getPropertySites()
             : new HashMap<String, Member>();
+        resourceSites = configuration.getResourceSites() != null ? configuration.getResourceSites()
+            : new HashMap<String, Member>();
         callbackSites = configuration.getCallbackSite() != null ? configuration.getCallbackSite()
             : new HashMap<String, Member>();
     }
@@ -128,6 +132,24 @@
 
     public void addPropertyFactory(String name, ObjectFactory<?> factory) {
         Member member = propertySites.get(name);
+        if (member instanceof Field) {
+            injectors.add(new FieldInjector<Object>((Field) member, factory));
+        } else if (member instanceof Method) {
+            injectors.add(new MethodInjector<Object>((Method) member, factory));
+        }
+        // cycle through constructor param names as well
+        for (int i = 0; i < constructorParamNames.size(); i++) {
+            if (name.equals(constructorParamNames.get(i))) {
+                ObjectFactory[] initializerFactories = instanceFactory.getInitializerFactories();
+                initializerFactories[i] = factory;
+                break;
+            }
+        }
+        //FIXME throw an error if no injection site found
+    }
+
+    public void addResourceFactory(String name, ResourceObjectFactory<?> factory) {
+        Member member = resourceSites.get(name);
         if (member instanceof Field) {
             injectors.add(new FieldInjector<Object>((Field) member, factory));
         } else if (member instanceof Method) {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java Fri Nov  3 20:06:48 2006
@@ -42,6 +42,7 @@
  */
 public class PojoConfiguration {
 
+    private String name;
     private CompositeComponent parent;
     private ScopeContainer scopeContainer;
     private PojoObjectFactory<?> instanceFactory;
@@ -52,6 +53,7 @@
     private List<Injector> propertyInjectors = new ArrayList<Injector>();
     private Map<String, Member> referenceSites = new HashMap<String, Member>();
     private Map<String, Member> propertySites = new HashMap<String, Member>();
+    private Map<String, Member> resourceSites = new HashMap<String, Member>();
     private Map<String, Member> callbackSites = new HashMap<String, Member>();
     private List<Class<?>> serviceInterfaces = new ArrayList<Class<?>>();
     private WireService wireService;
@@ -59,6 +61,14 @@
     private WorkScheduler scheduler;
     private ExecutionMonitor monitor;
 
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
     public CompositeComponent getParent() {
         return parent;
     }
@@ -141,6 +151,14 @@
 
     public void addReferenceSite(String name, Member member) {
         referenceSites.put(name, member);
+    }
+
+    public Map<String, Member> getResourceSites() {
+        return resourceSites;
+    }
+
+    public void addResourceSite(String name, Member member) {
+        resourceSites.put(name, member);
     }
 
     public Map<String, Member> getCallbackSite() {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java Fri Nov  3 20:06:48 2006
@@ -25,7 +25,6 @@
 import org.apache.tuscany.spi.ObjectFactory;
 import org.apache.tuscany.spi.component.TargetException;
 import org.apache.tuscany.spi.component.TargetNotFoundException;
-import org.apache.tuscany.spi.extension.ExecutionMonitor;
 import static org.apache.tuscany.spi.idl.java.JavaIDLUtils.findMethod;
 import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.model.ServiceContract;
@@ -49,10 +48,8 @@
  */
 public class JavaAtomicComponent extends PojoAtomicComponent {
 
-    private ExecutionMonitor monitor;
-
-    public JavaAtomicComponent(String name, PojoConfiguration configuration) {
-        super(name, configuration);
+    public JavaAtomicComponent(PojoConfiguration configuration) {
+        super(configuration);
         this.scope = configuration.getScopeContainer().getScope();
     }
 
@@ -87,17 +84,6 @@
         Method method = findMethod(operation, methods);
         return new JavaTargetInvoker(method, this, callbackWire, workContext, monitor);
     }
-
-//    public TargetInvoker createAsyncTargetInvoker(InboundWire wire, Operation operation) {
-//        Method method;
-//        if (operation.isCallback()) {
-//            method = findMethod(operation, operation.getServiceContract().getCallbackClass().getMethods());
-//
-//        } else {
-//            method = findMethod(operation, operation.getServiceContract().getInterfaceClass().getMethods());
-//        }
-//        return new AsyncJavaTargetInvoker(method, wire, this, monitor, workContext);
-//    }
 
     protected void onServiceWire(InboundWire wire) {
         String name = wire.getCallbackReferenceName();

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java Fri Nov  3 20:06:48 2006
@@ -23,25 +23,27 @@
 import java.lang.reflect.Method;
 
 import org.apache.tuscany.spi.ObjectFactory;
-import org.apache.tuscany.spi.implementation.java.JavaMappedService;
-
+import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.builder.BuilderConfigException;
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.extension.ComponentBuilderExtension;
-import org.apache.tuscany.spi.model.ComponentDefinition;
-import org.apache.tuscany.spi.model.PropertyValue;
-import org.apache.tuscany.spi.model.Scope;
-
+import org.apache.tuscany.spi.host.ResourceHost;
 import org.apache.tuscany.spi.implementation.java.ConstructorDefinition;
 import org.apache.tuscany.spi.implementation.java.JavaMappedProperty;
 import org.apache.tuscany.spi.implementation.java.JavaMappedReference;
+import org.apache.tuscany.spi.implementation.java.JavaMappedService;
 import org.apache.tuscany.spi.implementation.java.PojoComponentType;
+import org.apache.tuscany.spi.implementation.java.Resource;
+import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.PropertyValue;
+import org.apache.tuscany.spi.model.Scope;
 
 import org.apache.tuscany.core.implementation.PojoConfiguration;
 import org.apache.tuscany.core.injection.MethodEventInvoker;
 import org.apache.tuscany.core.injection.PojoObjectFactory;
+import org.apache.tuscany.core.injection.ResourceObjectFactory;
 
 /**
  * Builds a Java-based atomic context from a component definition
@@ -50,10 +52,17 @@
  */
 public class JavaComponentBuilder extends ComponentBuilderExtension<JavaImplementation> {
 
+    private ResourceHost host;
+
+    @Autowire(required = false)
+    public void setHost(ResourceHost host) {
+        this.host = host;
+    }
+
     @SuppressWarnings("unchecked")
     public AtomicComponent build(CompositeComponent parent,
-                                    ComponentDefinition<JavaImplementation> definition,
-                                    DeploymentContext deployment)
+                                 ComponentDefinition<JavaImplementation> definition,
+                                 DeploymentContext deployment)
         throws BuilderConfigException {
         PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> componentType =
             definition.getImplementation().getComponentType();
@@ -97,6 +106,15 @@
                 configuration.addReferenceSite(reference.getName(), member);
             }
         }
+
+        for (Resource resource : componentType.getResources().values()) {
+            Member member = resource.getMember();
+            if (member != null) {
+                // could be null if the resource is mapped to a constructor
+                configuration.addResourceSite(resource.getName(), member);
+            }
+        }
+
         // setup constructor injection
         ConstructorDefinition<?> ctorDef = componentType.getConstructorDefinition();
         Constructor<?> constr = ctorDef.getConstructor();
@@ -104,7 +122,8 @@
         configuration.setInstanceFactory(instanceFactory);
         configuration.getConstructorParamNames().addAll(ctorDef.getInjectionNames());
         configuration.setMonitor(monitor);
-        JavaAtomicComponent component = new JavaAtomicComponent(definition.getName(), configuration);
+        configuration.setName(definition.getName());
+        JavaAtomicComponent component = new JavaAtomicComponent(configuration);
 
         // handle properties
         for (PropertyValue<?> property : definition.getPropertyValues().values()) {
@@ -112,6 +131,23 @@
             if (factory != null) {
                 component.addPropertyFactory(property.getName(), factory);
             }
+        }
+
+        // handle resources
+        for (Resource resource : componentType.getResources().values()) {
+            String name = resource.getName();
+            boolean optional = resource.isOptional();
+            Class<Object> type = (Class<Object>) resource.getType();
+            ResourceObjectFactory<Object> factory;
+            String mappedName = resource.getMappedName();
+            if (mappedName == null) {
+                // by type
+                factory = new ResourceObjectFactory<Object>(type, optional, parent, host);
+            } else {
+                factory = new ResourceObjectFactory<Object>(type, mappedName, optional, parent, host);
+            }
+            component.addResourceFactory(name, factory);
+
         }
 
         for (JavaMappedService service : componentType.getServices().values()) {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/builder/SystemComponentBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/builder/SystemComponentBuilder.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/builder/SystemComponentBuilder.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/builder/SystemComponentBuilder.java Fri Nov  3 20:06:48 2006
@@ -107,7 +107,8 @@
         PojoObjectFactory<?> instanceFactory = new PojoObjectFactory(constr);
         configuration.setInstanceFactory(instanceFactory);
         configuration.getConstructorParamNames().addAll(ctorDef.getInjectionNames());
-        SystemAtomicComponentImpl component = new SystemAtomicComponentImpl(definition.getName(), configuration);
+        configuration.setName(definition.getName());
+        SystemAtomicComponentImpl component = new SystemAtomicComponentImpl(configuration);
         // handle properties
         Map<String, PropertyValue<?>> propertyValues = definition.getPropertyValues();
         processProperties(propertyValues, componentType.getProperties().values(), component);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java Fri Nov  3 20:06:48 2006
@@ -38,8 +38,8 @@
  */
 public class SystemAtomicComponentImpl extends PojoAtomicComponent implements SystemAtomicComponent {
 
-    public SystemAtomicComponentImpl(String name, PojoConfiguration configuration) {
-        super(name, configuration);
+    public SystemAtomicComponentImpl(PojoConfiguration configuration) {
+        super(configuration);
         scope = Scope.MODULE;
     }
 

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceNotFoundException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceNotFoundException.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceNotFoundException.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceNotFoundException.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.core.injection;
+
+import org.apache.tuscany.spi.ObjectCreationException;
+
+/**
+ * Denotes an exception thrown when a runtime resource is not found
+ *
+ * @version $Rev$ $Date$
+ */
+public class ResourceNotFoundException extends ObjectCreationException {
+    public ResourceNotFoundException() {
+    }
+
+    public ResourceNotFoundException(String message) {
+        super(message);
+    }
+
+    public ResourceNotFoundException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public ResourceNotFoundException(Throwable cause) {
+        super(cause);
+    }
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceNotFoundException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceNotFoundException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceObjectFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceObjectFactory.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceObjectFactory.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceObjectFactory.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.core.injection;
+
+import org.apache.tuscany.spi.ObjectCreationException;
+import org.apache.tuscany.spi.ObjectFactory;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.SCAObject;
+import org.apache.tuscany.spi.host.ResourceHost;
+import org.apache.tuscany.spi.host.ResourceResolutionException;
+
+/**
+ * Resolves a runtime resource to be injected on a field or method of a Java component type marked with {@link
+ * org.osoa.sca.annotations.Resource}. If the mapped name of the resource is an absolute URI such as
+ * <code>sca://localhost</code> or <code>jndi://localhost</code> the host container namespace is searched; otherwise the
+ * URI is assumed to be relative and the parent composite is searched. If a mapped name is not provided, i.e. resolution
+ * is by type, the parent composite is first searched followed by the host namespace.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ResourceObjectFactory<T> implements ObjectFactory<T> {
+
+    private Class<T> type;
+    private String mappedName;
+    private CompositeComponent parent;
+    private ResourceHost host;
+    private boolean resolveFromHost;
+    private boolean optional;
+
+    /**
+     * Instantiates a factory that resolves resources by type
+     *
+     * @param type     the type of the resource to inject
+     * @param optional true if an error should be thrown if the resource is not found
+     * @param parent   the parent composite of the component to inject on
+     * @param host     the runtime resource provider
+     */
+    public ResourceObjectFactory(Class<T> type,
+                                 boolean optional,
+                                 CompositeComponent parent,
+                                 ResourceHost host) {
+        this.type = type;
+        this.parent = parent;
+        this.host = host;
+        this.optional = optional;
+    }
+
+    /**
+     * Instantiates a factory that resolves resources by mapped name
+     *
+     * @param type       the type of the resource to inject
+     * @param mappedName the resource name
+     * @param optional   true if an error should be thrown if the resource is not found
+     * @param parent     the parent composite of the component to inject on
+     * @param host       the runtime resource provider
+     */
+    public ResourceObjectFactory(Class<T> type,
+                                 String mappedName,
+                                 boolean optional,
+                                 CompositeComponent parent,
+                                 ResourceHost host) {
+        this.type = type;
+        this.parent = parent;
+        this.host = host;
+        if (mappedName.indexOf("://") >= 0) {
+            this.resolveFromHost = true;
+        }
+        this.mappedName = mappedName;
+        this.optional = optional;
+    }
+
+    public T getInstance() throws ObjectCreationException {
+        if (resolveFromHost) {
+            return resolveInstance();
+        } else {
+            T instance = null;
+            if (mappedName == null) {
+                instance = parent.resolveSystemInstance(type);
+                if (instance == null) {
+                    // if not found in parent scope, search the host namespace
+                    resolveFromHost = true;
+                    instance = resolveInstance();
+                }
+                if (instance == null && !optional) {
+                    ResourceNotFoundException e = new ResourceNotFoundException("No resource found matching type");
+                    e.setIdentifier(type.getName());
+                    throw e;
+                }
+                return instance;
+            } else {
+                SCAObject child = parent.getSystemChild(mappedName);
+                if (child != null) {
+                    instance = type.cast(child.getServiceInstance());
+                }
+                if (instance == null && !optional) {
+                    ResourceNotFoundException e = new ResourceNotFoundException("No resource found for URI");
+                    e.setIdentifier(mappedName);
+                    throw e;
+                }
+                return instance;
+            }
+        }
+    }
+
+    private T resolveInstance() {
+        try {
+            if (mappedName == null) {
+                return host.resolveResource(type);
+            } else {
+                return host.resolveResource(type, mappedName);
+            }
+        } catch (ResourceResolutionException e) {
+            throw new ObjectCreationException(e);
+        }
+
+    }
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceObjectFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/injection/ResourceObjectFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistry.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistry.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistry.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistry.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.core.services.host;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.osoa.sca.annotations.Service;
+
+import org.apache.tuscany.spi.annotation.Autowire;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.SCAObject;
+import org.apache.tuscany.spi.host.ResourceHost;
+import org.apache.tuscany.spi.host.ResourceHostRegistry;
+import org.apache.tuscany.spi.host.ResourceResolutionException;
+
+/**
+ * The default implementation of a <code>ResourceRegisty</code> that resolves resources in the <code>SCA://</code>
+ * namespace against its parent composite and delegates resolution to registered <code>ResourceHost</code>s for other
+ * namespaces. The search order for resources resolved by type starts with the SCA namespace and proceeds to hosts in
+ * the order they were registered.
+ *
+ * @version $Rev$ $Date$
+ */
+@Service(interfaces = {ResourceHost.class, ResourceHostRegistry.class})
+public class DelegatingResourceHostRegistry implements ResourceHost, ResourceHostRegistry {
+    private static final String SCA_PREFIX = "SCA://";
+    private static final String SCA_LOCALHOST_PREFIX = "SCA://localhost/";
+    private Map<String, ResourceHost> resourceHosts = new HashMap<String, ResourceHost>();
+    private CompositeComponent parent;
+
+    /**
+     * Creates a new delegating registry.
+     *
+     * @param parent the composite to resolve SCA resources against
+     */
+    public DelegatingResourceHostRegistry(@Autowire CompositeComponent parent) {
+        this.parent = parent;
+    }
+
+    public void register(String uri, ResourceHost host) {
+        resourceHosts.put(uri, host);
+    }
+
+    public void unregister(String uri) {
+        resourceHosts.remove(uri);
+    }
+
+    public <T> T resolveResource(Class<T> type) throws ResourceResolutionException {
+        T instance = parent.resolveSystemExternalInstance(type);
+        if (instance == null) {
+            for (ResourceHost host : resourceHosts.values()) {
+                instance = host.resolveResource(type);
+                if (instance != null) {
+                    return instance;
+                }
+            }
+        }
+        return instance;
+
+    }
+
+    public <T> T resolveResource(Class<T> type, String mappedName) throws ResourceResolutionException {
+        if (mappedName.startsWith(SCA_PREFIX)) {
+            String name;
+            if (mappedName.startsWith(SCA_LOCALHOST_PREFIX)) {
+                name = mappedName.substring(SCA_LOCALHOST_PREFIX.length());
+            } else {
+                name = mappedName.substring(SCA_PREFIX.length());
+            }
+            // resolve against the composite
+            SCAObject child = parent.getSystemChild(name);
+            // only expose services
+            if (child instanceof org.apache.tuscany.spi.component.Service) {
+                return type.cast(child.getServiceInstance());
+            }
+            return null;
+        } else {
+            int pos = mappedName.indexOf("://");
+            if (pos == -1) {
+                ResourceResolutionException e = new ResourceResolutionException("Invalid resource URI");
+                e.setIdentifier(mappedName);
+                throw e;
+            }
+            String uri = mappedName.substring(0, pos + 3);
+            ResourceHost host = resourceHosts.get(uri);
+            if (host == null) {
+                ResourceResolutionException e = new ResourceResolutionException("No resource host for URI");
+                e.setIdentifier(uri);
+                throw e;
+            }
+            return host.resolveResource(type, mappedName);
+        }
+    }
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistry.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicHttpSessionScopeTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicHttpSessionScopeTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicHttpSessionScopeTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicHttpSessionScopeTestCase.java Fri Nov  3 20:06:48 2006
@@ -109,7 +109,8 @@
         configuration.setInstanceFactory(factory);
         configuration.setInitInvoker(initInvoker);
         configuration.setDestroyInvoker(destroyInvoker);
-        SystemAtomicComponentImpl context = new SystemAtomicComponentImpl("foo", configuration);
+        configuration.setName("foo");
+        SystemAtomicComponentImpl context = new SystemAtomicComponentImpl(configuration);
         context.start();
         return context;
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicModuleScopeTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicModuleScopeTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicModuleScopeTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicModuleScopeTestCase.java Fri Nov  3 20:06:48 2006
@@ -100,7 +100,8 @@
         configuration.setInstanceFactory(factory);
         configuration.setInitInvoker(initInvoker);
         configuration.setDestroyInvoker(destroyInvoker);
-        SystemAtomicComponentImpl context = new SystemAtomicComponentImpl("foo", configuration);
+        configuration.setName("foo");
+        SystemAtomicComponentImpl context = new SystemAtomicComponentImpl(configuration);
         context.start();
         return context;
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicRequestScopeTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicRequestScopeTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicRequestScopeTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicRequestScopeTestCase.java Fri Nov  3 20:06:48 2006
@@ -97,7 +97,8 @@
         configuration.setInstanceFactory(factory);
         configuration.setInitInvoker(initInvoker);
         configuration.setDestroyInvoker(destroyInvoker);
-        SystemAtomicComponentImpl component = new SystemAtomicComponentImpl("foo", configuration);
+        configuration.setName("foo");
+        SystemAtomicComponentImpl component = new SystemAtomicComponentImpl(configuration);
         scopeContainer.register(component);
         return component;
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/HttpSessionScopeRestartTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/HttpSessionScopeRestartTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/HttpSessionScopeRestartTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/HttpSessionScopeRestartTestCase.java Fri Nov  3 20:06:48 2006
@@ -54,7 +54,8 @@
         configuration.setDestroyInvoker(destroyInvoker);
         Constructor<InitDestroyOnce> ctr = InitDestroyOnce.class.getConstructor((Class<?>[]) null);
         configuration.setInstanceFactory(new PojoObjectFactory<InitDestroyOnce>(ctr));
-        SystemAtomicComponent context = new SystemAtomicComponentImpl("InitDestroy", configuration);
+        configuration.setName("InitDestroy");
+        SystemAtomicComponent context = new SystemAtomicComponentImpl(configuration);
         context.start();
 
         Object session = new Object();

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ModuleScopeRestartTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ModuleScopeRestartTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ModuleScopeRestartTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ModuleScopeRestartTestCase.java Fri Nov  3 20:06:48 2006
@@ -54,7 +54,8 @@
         configuration.setDestroyInvoker(destroyInvoker);
         Constructor<InitDestroyOnce> ctr = InitDestroyOnce.class.getConstructor((Class<?>[]) null);
         configuration.setInstanceFactory(new PojoObjectFactory<InitDestroyOnce>(ctr));
-        SystemAtomicComponent context = new SystemAtomicComponentImpl("InitDestroy", configuration);
+        configuration.setName("InitDestroy");
+        SystemAtomicComponent context = new SystemAtomicComponentImpl(configuration);
         context.start();
 
         scope.onEvent(new CompositeStart(this, null));

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/RequestScopeRestartTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/RequestScopeRestartTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/RequestScopeRestartTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/RequestScopeRestartTestCase.java Fri Nov  3 20:06:48 2006
@@ -53,7 +53,8 @@
         configuration.setDestroyInvoker(destroyInvoker);
         Constructor<InitDestroyOnce> ctr = InitDestroyOnce.class.getConstructor((Class<?>[]) null);
         configuration.setInstanceFactory(new PojoObjectFactory<InitDestroyOnce>(ctr));
-        SystemAtomicComponent context = new SystemAtomicComponentImpl("InitDestroy", configuration);
+        configuration.setName("InitDestroy");        
+        SystemAtomicComponent context = new SystemAtomicComponentImpl(configuration);
         context.start();
 
         Object instance = context.getServiceInstance();

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/GetServiceByNameTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/GetServiceByNameTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/GetServiceByNameTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/GetServiceByNameTestCase.java Fri Nov  3 20:06:48 2006
@@ -54,7 +54,8 @@
         configuration.setInstanceFactory(new PojoObjectFactory<TargetImpl>(TargetImpl.class.getConstructor()));
         configuration.addServiceInterface(Target.class);
         configuration.setWireService(new JDKWireService());
-        final JavaAtomicComponent component = new JavaAtomicComponent("target", configuration);
+        configuration.setName("target");
+        final JavaAtomicComponent component = new JavaAtomicComponent(configuration);
 
         InboundWire wire = createMock(InboundWire.class);
 

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderResourceTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderResourceTestCase.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderResourceTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderResourceTestCase.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.core.implementation.java;
+
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.component.ScopeRegistry;
+import org.apache.tuscany.spi.implementation.java.ConstructorDefinition;
+import org.apache.tuscany.spi.implementation.java.PojoComponentType;
+import org.apache.tuscany.spi.implementation.java.Resource;
+import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.Scope;
+
+import junit.framework.TestCase;
+import org.easymock.EasyMock;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class JavaComponentBuilderResourceTestCase extends TestCase {
+
+    public void testResourceInjection() throws Exception {
+        ScopeContainer container = EasyMock.createNiceMock(ScopeContainer.class);
+        ScopeRegistry registry = EasyMock.createMock(ScopeRegistry.class);
+        EasyMock.expect(registry.getScopeContainer(Scope.STATELESS)).andReturn(container);
+        EasyMock.replay(registry);
+        JavaComponentBuilder builder = new JavaComponentBuilder();
+        builder.setScopeRegistry(registry);
+        ConstructorDefinition<Foo> ctorDef = new ConstructorDefinition<Foo>(Foo.class.getConstructor());
+        PojoComponentType type = new PojoComponentType();
+        Resource resource = new Resource();
+        resource.setType(String.class);
+        resource.setName("resource");
+        resource.setMember(Foo.class.getDeclaredField("resource"));
+        type.add(resource);
+        type.setImplementationScope(Scope.STATELESS);
+        type.setConstructorDefinition(ctorDef);
+        JavaImplementation impl = new JavaImplementation();
+        impl.setImplementationClass(Foo.class);
+        impl.setComponentType(type);
+        ComponentDefinition<JavaImplementation> definition = new ComponentDefinition<JavaImplementation>("foo", impl);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemInstance(String.class)).andReturn("result");
+        EasyMock.replay(parent);
+        JavaAtomicComponent component = (JavaAtomicComponent) builder.build(parent, definition, null);
+        Foo foo = (Foo) component.createInstance();
+        assertEquals("result", foo.resource);
+        EasyMock.verify(parent);
+    }
+
+    private static class Foo {
+
+        protected String resource;
+
+        public Foo() {
+        }
+
+    }
+}
+
+

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderResourceTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderResourceTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java Fri Nov  3 20:06:48 2006
@@ -73,7 +73,8 @@
         }).atLeastOnce();
         EasyMock.replay(service);
         configuration.setWireService(service);
-        JavaAtomicComponent sourceContext = new JavaAtomicComponent("source", configuration);
+        configuration.setName("source");
+        JavaAtomicComponent sourceContext = new JavaAtomicComponent(configuration);
         sourceContext.addOutboundWire(wire);
         sourceContext.start();
         Source source = (Source) sourceContext.getServiceInstance();

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/ResourceInjectionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/ResourceInjectionTestCase.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/ResourceInjectionTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/ResourceInjectionTestCase.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.core.implementation.java;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.ArrayList;
+
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.ScopeContainer;
+
+import junit.framework.TestCase;
+import org.apache.tuscany.core.implementation.PojoConfiguration;
+import org.apache.tuscany.core.injection.PojoObjectFactory;
+import org.apache.tuscany.core.injection.ResourceObjectFactory;
+import org.easymock.EasyMock;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ResourceInjectionTestCase extends TestCase {
+
+    public void testResourceMemberInjection() throws Exception {
+        ScopeContainer containter = EasyMock.createNiceMock(ScopeContainer.class);
+        Constructor<Foo> ctor = Foo.class.getConstructor();
+        Field field = Foo.class.getDeclaredField("resource");
+        PojoConfiguration configuration = new PojoConfiguration();
+        configuration.setName("component");
+        configuration.setScopeContainer(containter);
+        configuration.setInstanceFactory(new PojoObjectFactory<Foo>(ctor));
+        configuration.addResourceSite("bar", field);
+        JavaAtomicComponent component = new JavaAtomicComponent(configuration);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemInstance(EasyMock.eq(String.class))).andReturn("result");
+        EasyMock.replay(parent);
+        ResourceObjectFactory<String> factory = new ResourceObjectFactory<String>(String.class, false, parent, null);
+        component.addResourceFactory("bar", factory);
+
+        Foo foo = (Foo) component.createInstance();
+        assertEquals("result", foo.resource);
+        EasyMock.verify(parent);
+    }
+
+
+    public void testResourceConstructorInjection() throws Exception {
+        ScopeContainer containter = EasyMock.createNiceMock(ScopeContainer.class);
+        Constructor<FooConstructor> ctor = FooConstructor.class.getConstructor(String.class);
+        PojoConfiguration configuration = new PojoConfiguration();
+        configuration.setName("component");
+        configuration.setScopeContainer(containter);
+        configuration.setInstanceFactory(new PojoObjectFactory<FooConstructor>(ctor));
+        List<String> ctorNames = new ArrayList<String>();
+        ctorNames.add("bar");
+        configuration.setConstructorParamNames(ctorNames);
+        JavaAtomicComponent component = new JavaAtomicComponent(configuration);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemInstance(EasyMock.eq(String.class))).andReturn("result");
+        EasyMock.replay(parent);
+        ResourceObjectFactory<String> factory = new ResourceObjectFactory<String>(String.class, false, parent, null);
+        component.addResourceFactory("bar", factory);
+
+        FooConstructor foo = (FooConstructor) component.createInstance();
+        assertEquals("result", foo.resource);
+        EasyMock.verify(parent);
+    }
+
+    public static class Foo {
+        protected String resource;
+
+        public Foo() {
+        }
+
+    }
+
+    public static class FooConstructor {
+        protected String resource;
+
+        public FooConstructor(String resource) {
+            this.resource = resource;
+        }
+
+    }
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/ResourceInjectionTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/ResourceInjectionTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java Fri Nov  3 20:06:48 2006
@@ -185,12 +185,14 @@
         configuration.addServiceInterface(Target.class);
         configuration.setParent(parent);
         configuration.setWorkContext(workContext);
+        configuration.setName("source");
 
-        JavaAtomicComponent source = new JavaAtomicComponent("source", configuration);
+        JavaAtomicComponent source = new JavaAtomicComponent(configuration);
         OutboundWire outboundWire = createOutboundWire(new QualifiedName("target/Target"), Target.class);
         outboundWire.setContainer(source);
         source.addOutboundWire(outboundWire);
-        JavaAtomicComponent target = new JavaAtomicComponent("target", configuration);
+        configuration.setName("target");
+        JavaAtomicComponent target = new JavaAtomicComponent(configuration);
         InboundWire targetWire = MockFactory.createTargetWire("Target", Target.class);
         targetWire.setContainer(target);
         target.addInboundWire(targetWire);

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java Fri Nov  3 20:06:48 2006
@@ -91,7 +91,9 @@
         configuration.addServiceInterface(DummyImpl.class);
         configuration.setWireService(WIRE_SERVICE);
         configuration.setWorkContext(new WorkContextImpl());
-        return new JavaAtomicComponent(instance.getClass().getName(), configuration);
+        configuration.setName(instance.getClass().getName());
+
+        return new JavaAtomicComponent(configuration);
     }
 
     @SuppressWarnings("unchecked")
@@ -103,7 +105,8 @@
         configuration.addServiceInterface(clazz);
         configuration.setWireService(WIRE_SERVICE);
         configuration.setWorkContext(new WorkContextImpl());
-        return new JavaAtomicComponent(name, configuration);
+        configuration.setName(name);
+        return new JavaAtomicComponent(configuration);
 
     }
 
@@ -185,7 +188,8 @@
             configuration.addReferenceSite(entry.getKey(), entry.getValue());
         }
         configuration.setWorkContext(new WorkContextImpl());
-        JavaAtomicComponent sourceContext = new JavaAtomicComponent(sourceName, configuration);
+        configuration.setName(sourceName);
+        JavaAtomicComponent sourceContext = new JavaAtomicComponent(configuration);
         OutboundWire outboundWire = createReferenceWire(targetName, sourceReferenceClass, sourceHeadInterceptor);
         sourceContext.addOutboundWire(outboundWire);
         targetScope.register(targetContext);
@@ -236,7 +240,9 @@
             configuration.addReferenceSite(entry.getKey(), entry.getValue());
         }
         configuration.setWorkContext(new WorkContextImpl());
-        JavaAtomicComponent sourceContext = new JavaAtomicComponent(sourceName, configuration);
+        configuration.setName(sourceName);
+
+        JavaAtomicComponent sourceContext = new JavaAtomicComponent(configuration);
         OutboundWire outboundWire = createReferenceWire(targetName, sourceReferenceClass, null);
         List<OutboundWire> factories = new ArrayList<OutboundWire>();
         factories.add(outboundWire);

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java Fri Nov  3 20:06:48 2006
@@ -42,7 +42,8 @@
         configuration.addServiceInterface(Foo.class);
         configuration.setInstanceFactory(factory);
         configuration.setInitInvoker(initInvoker);
-        SystemAtomicComponentImpl component = new SystemAtomicComponentImpl("foo", configuration);
+        configuration.setName("foo");
+        SystemAtomicComponentImpl component = new SystemAtomicComponentImpl(configuration);
         Foo foo = (Foo) component.createInstance();
         component.init(foo);
         assertTrue(foo.initialized);
@@ -56,7 +57,8 @@
         configuration.setInitInvoker(initInvoker);
         configuration.addConstructorParamName("foo");
         configuration.addConstructorParamName("ref");
-        SystemAtomicComponentImpl component = new SystemAtomicComponentImpl("foo", configuration);
+        configuration.setName("foo");
+        SystemAtomicComponentImpl component = new SystemAtomicComponentImpl(configuration);
         component.addPropertyFactory("foo", new SingletonObjectFactory<String>("baz"));
         Foo target = new Foo();
         SystemOutboundWire wire = EasyMock.createMock(SystemOutboundWire.class);

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/wire/AtomicComponentWireInvocationTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/wire/AtomicComponentWireInvocationTestCase.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/wire/AtomicComponentWireInvocationTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/wire/AtomicComponentWireInvocationTestCase.java Fri Nov  3 20:06:48 2006
@@ -53,7 +53,8 @@
         configuration.addReferenceSite("setTarget", SourceImpl.class.getMethod("setTarget", Target.class));
         configuration.addServiceInterface(Source.class);
         configuration.setInstanceFactory(new PojoObjectFactory<SourceImpl>(SourceImpl.class.getConstructor()));
-        SystemAtomicComponent sourceContext = new SystemAtomicComponentImpl("source", configuration);
+        configuration.setName("source");
+        SystemAtomicComponent sourceContext = new SystemAtomicComponentImpl(configuration);
         QualifiedName qName = new QualifiedName("service");
         OutboundWire outboundWire = new SystemOutboundWireImpl("setTarget", qName, Target.class);
         outboundWire.setTargetWire(inboundWire);

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/ResourceObjectFactoryTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/ResourceObjectFactoryTestCase.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/ResourceObjectFactoryTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/ResourceObjectFactoryTestCase.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.core.injection;
+
+import org.apache.tuscany.spi.component.AtomicComponent;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.host.ResourceHost;
+
+import junit.framework.TestCase;
+import org.easymock.EasyMock;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ResourceObjectFactoryTestCase extends TestCase {
+
+    public void testResolveFromHostByType() throws Exception {
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.expect(host.resolveResource(EasyMock.eq(String.class))).andReturn("foo");
+        EasyMock.replay(host);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemInstance(EasyMock.eq(String.class))).andReturn(null);
+        EasyMock.replay(parent);
+        ResourceObjectFactory<String> factory = new ResourceObjectFactory<String>(String.class, false, parent, host);
+        assertEquals("foo", factory.getInstance());
+        EasyMock.verify(host);
+        EasyMock.verify(parent);
+    }
+
+    public void testResolveFromHostByName() throws Exception {
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.expect(host.resolveResource(EasyMock.eq(String.class),
+            EasyMock.eq("sca://localhost/bar"))).andReturn("foo");
+        EasyMock.replay(host);
+        ResourceObjectFactory<String> factory =
+            new ResourceObjectFactory<String>(String.class, "sca://localhost/bar", false, null, host);
+        assertEquals("foo", factory.getInstance());
+        EasyMock.verify(host);
+    }
+
+    public void testResolveFromParentByType() throws Exception {
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemInstance(EasyMock.eq(String.class))).andReturn("foo");
+        EasyMock.replay(parent);
+        ResourceObjectFactory<String> factory = new ResourceObjectFactory<String>(String.class, false, parent, null);
+        assertEquals("foo", factory.getInstance());
+        EasyMock.verify(parent);
+    }
+
+    public void testResolveFromParentByName() throws Exception {
+        AtomicComponent component = EasyMock.createMock(AtomicComponent.class);
+        EasyMock.expect(component.getServiceInstance()).andReturn("foo");
+        EasyMock.replay(component);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.getSystemChild(EasyMock.eq("bar"))).andReturn(component);
+        EasyMock.replay(parent);
+        ResourceObjectFactory<String> factory =
+            new ResourceObjectFactory<String>(String.class, "bar", false, parent, null);
+        assertEquals("foo", factory.getInstance());
+        EasyMock.verify(parent);
+        EasyMock.verify(component);
+    }
+
+    /**
+     * Verifies if a resource is not found as a child of the parent, the host namespace will be searched
+     */
+    public void testResolveFromParentThenResolveFromHost() throws Exception {
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.expect(host.resolveResource(EasyMock.eq(String.class))).andReturn("foo");
+        EasyMock.replay(host);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemInstance(EasyMock.eq(String.class))).andReturn(null);
+        EasyMock.replay(parent);
+        ResourceObjectFactory<String> factory = new ResourceObjectFactory<String>(String.class, false, parent, host);
+        assertEquals("foo", factory.getInstance());
+        EasyMock.verify(parent);
+        EasyMock.verify(host);
+    }
+
+    public void testResolveFromParentThenResolveFromHostNotFound() throws Exception {
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.expect(host.resolveResource(EasyMock.eq(String.class))).andReturn(null);
+        EasyMock.replay(host);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemInstance(EasyMock.eq(String.class))).andReturn(null);
+        EasyMock.replay(parent);
+        ResourceObjectFactory<String> factory = new ResourceObjectFactory<String>(String.class, true, parent, host);
+        assertNull(factory.getInstance());
+        EasyMock.verify(parent);
+        EasyMock.verify(host);
+    }
+
+    public void testResolveByTypeNotFound() throws Exception {
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.expect(host.resolveResource(EasyMock.eq(String.class))).andReturn(null);
+        EasyMock.replay(host);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemInstance(EasyMock.eq(String.class))).andReturn(null);
+        EasyMock.replay(parent);
+        ResourceObjectFactory<String> factory = new ResourceObjectFactory<String>(String.class, false, parent, host);
+        try {
+            factory.getInstance();
+            fail();
+        } catch (ResourceNotFoundException e) {
+            //expected
+        }
+        EasyMock.verify(parent);
+        EasyMock.verify(host);
+    }
+
+    public void testResolveByTypeNotFoundOptional() throws Exception {
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.expect(host.resolveResource(EasyMock.eq(String.class))).andReturn(null);
+        EasyMock.replay(host);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemInstance(EasyMock.eq(String.class))).andReturn(null);
+        EasyMock.replay(parent);
+        ResourceObjectFactory<String> factory = new ResourceObjectFactory<String>(String.class, true, parent, host);
+        assertNull(factory.getInstance());
+        EasyMock.verify(parent);
+        EasyMock.verify(host);
+    }
+
+
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/ResourceObjectFactoryTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/injection/ResourceObjectFactoryTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/mock/factories/MockFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/mock/factories/MockFactory.java?view=diff&rev=471111&r1=471110&r2=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/mock/factories/MockFactory.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/mock/factories/MockFactory.java Fri Nov  3 20:06:48 2006
@@ -123,7 +123,8 @@
         }
 
         sourceConfig.addReferenceSite(setter.getName(), setter);
-        SystemAtomicComponent sourceCtx = new SystemAtomicComponentImpl(source, sourceConfig);
+        sourceConfig.setName(source);
+        SystemAtomicComponent sourceCtx = new SystemAtomicComponentImpl(sourceConfig);
         QualifiedName targetName = new QualifiedName(target);
         SystemOutboundWire wire = new SystemOutboundWireImpl(setter.getName(), targetName, targetClass);
         InboundWire inboundWire = new SystemInboundWireImpl(targetName.getPortName(), targetClass, targetComponent);
@@ -153,7 +154,8 @@
                 configuration.setDestroyInvoker(new MethodEventInvoker<Object>(method));
             }
         }
-        return new SystemAtomicComponentImpl(name, configuration);
+        configuration.setName(name);
+        return new SystemAtomicComponentImpl(configuration);
     }
 
     public static <T> InboundWire createTargetWireFactory(String serviceName, Class<T> interfaze)

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistryTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistryTestCase.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistryTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistryTestCase.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.core.services.host;
+
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.SCAObject;
+import org.apache.tuscany.spi.component.Service;
+import org.apache.tuscany.spi.host.ResourceHost;
+import org.apache.tuscany.spi.host.ResourceResolutionException;
+
+import junit.framework.TestCase;
+import org.easymock.EasyMock;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class DelegatingResourceHostRegistryTestCase extends TestCase {
+
+    public void testResolveByUri() throws Exception {
+        CompositeComponent parent = EasyMock.createNiceMock(CompositeComponent.class);
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.expect(host.resolveResource(String.class, "Foo://foo")).andReturn("result");
+        EasyMock.replay(host);
+        DelegatingResourceHostRegistry registry = new DelegatingResourceHostRegistry(parent);
+        registry.register("Foo://", host);
+        assertEquals("result", registry.resolveResource(String.class, "Foo://foo"));
+        EasyMock.verify(host);
+    }
+
+    public void testResolveBySCAUri() throws Exception {
+        Service child = EasyMock.createMock(Service.class);
+        EasyMock.expect(child.getServiceInstance()).andReturn("result");
+        EasyMock.replay(child);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.getSystemChild("foo")).andReturn(child);
+        EasyMock.replay(parent);
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.replay(host);
+        DelegatingResourceHostRegistry registry = new DelegatingResourceHostRegistry(parent);
+        registry.register("Foo://", host);
+        assertEquals("result", registry.resolveResource(String.class, "SCA://foo"));
+        EasyMock.verify(host);
+    }
+
+
+    /**
+     * Tests system components not exposed as services are not visible
+     */
+    public void testResolveNonService() throws Exception {
+        SCAObject child = EasyMock.createMock(SCAObject.class);
+        EasyMock.expect(child.getServiceInstance()).andReturn("result");
+        EasyMock.replay(child);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.getSystemChild("foo")).andReturn(child);
+        EasyMock.replay(parent);
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.replay(host);
+        DelegatingResourceHostRegistry registry = new DelegatingResourceHostRegistry(parent);
+        registry.register("Foo://", host);
+        assertNull(registry.resolveResource(String.class, "SCA://foo"));
+        EasyMock.verify(host);
+    }
+
+    public void testResolveBySCALocalHostUri() throws Exception {
+        Service child = EasyMock.createMock(Service.class);
+        EasyMock.expect(child.getServiceInstance()).andReturn("result");
+        EasyMock.replay(child);
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.getSystemChild("foo")).andReturn(child);
+        EasyMock.replay(parent);
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.replay(host);
+        DelegatingResourceHostRegistry registry = new DelegatingResourceHostRegistry(parent);
+        registry.register("Foo://", host);
+        assertEquals("result", registry.resolveResource(String.class, "SCA://localhost/foo"));
+        EasyMock.verify(host);
+    }
+
+
+    public void testResolveByUriNotFound() throws Exception {
+        CompositeComponent parent = EasyMock.createNiceMock(CompositeComponent.class);
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.replay(host);
+        DelegatingResourceHostRegistry registry = new DelegatingResourceHostRegistry(parent);
+        registry.register("Foo://", host);
+        try {
+            assertEquals("result", registry.resolveResource(String.class, "Bar://bar"));
+            fail();
+        } catch (ResourceResolutionException e) {
+            //expected
+        }
+        EasyMock.verify(host);
+    }
+
+    public void testUnregister() throws Exception {
+        CompositeComponent parent = EasyMock.createNiceMock(CompositeComponent.class);
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.replay(host);
+        DelegatingResourceHostRegistry registry = new DelegatingResourceHostRegistry(parent);
+        registry.register("Foo://", host);
+        registry.unregister("Foo://");
+        try {
+            registry.resolveResource(String.class, "Foo://foo");
+            fail();
+        } catch (ResourceResolutionException e) {
+            //expected
+        }
+        EasyMock.verify(host);
+    }
+
+    public void testDelegatingResolveResource() throws Exception {
+        CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
+        EasyMock.expect(parent.resolveSystemExternalInstance(String.class)).andReturn(null);
+        EasyMock.replay(parent);
+        ResourceHost host = EasyMock.createMock(ResourceHost.class);
+        EasyMock.expect(host.resolveResource(String.class)).andReturn("result");
+        EasyMock.replay(host);
+        DelegatingResourceHostRegistry registry = new DelegatingResourceHostRegistry(parent);
+        registry.register("Foo://", host);
+        assertEquals("result", registry.resolveResource(String.class));
+        EasyMock.verify(host);
+    }
+
+
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistryTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/host/DelegatingResourceHostRegistryTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHost.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHost.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHost.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHost.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.spi.host;
+
+/**
+ * Interface implemented by host environments that allow for resolution of component implementation resources, e.g.
+ * items bound in a JNDI tree.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface ResourceHost {
+
+    /**
+     * Resolve a resource matching the given type
+     *
+     * @param type the type of the resources
+     * @throws ResourceResolutionException if an error is encountered during resolution
+     */
+    <T> T resolveResource(Class<T> type) throws ResourceResolutionException;
+
+    /**
+     * Resolve a resource matching the given type and name
+     *
+     * @param type       the type of the resources
+     * @param mappedName the mapped name of the resource
+     * @throws ResourceResolutionException if an error is encountered during resolution
+     */
+    <T> T resolveResource(Class<T> type, String mappedName) throws ResourceResolutionException;
+
+}

Propchange: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHost.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHost.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHostRegistry.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHostRegistry.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHostRegistry.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHostRegistry.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.spi.host;
+
+/**
+ * Implementations manage a registry of resource hosts in the runtime
+ *
+ * @version $Rev$ $Date$
+ */
+public interface ResourceHostRegistry {
+    /**
+     * Registers a resource host for the given uri prefix
+     *
+     * @param uri  the uri prefix the host resolves resources for
+     * @param host the resource host
+     */
+    void register(String uri, ResourceHost host);
+
+    /**
+     * Removes a host registered for the given uri prefix
+     */
+    void unregister(String uri);
+}

Propchange: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHostRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceHostRegistry.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceResolutionException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceResolutionException.java?view=auto&rev=471111
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceResolutionException.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceResolutionException.java Fri Nov  3 20:06:48 2006
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.spi.host;
+
+import org.apache.tuscany.api.TuscanyException;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ResourceResolutionException extends TuscanyException {
+    public ResourceResolutionException() {
+    }
+
+    public ResourceResolutionException(String message) {
+        super(message);
+    }
+
+    public ResourceResolutionException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public ResourceResolutionException(Throwable cause) {
+        super(cause);
+    }
+}

Propchange: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceResolutionException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/host/ResourceResolutionException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



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