You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2006/09/11 14:34:16 UTC

svn commit: r442196 - in /incubator/tuscany/sandbox/ant/container.easy: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/tuscany/ src/main/java/org/apache/tuscany/container/ src/main/java/org/apache...

Author: antelder
Date: Mon Sep 11 05:34:15 2006
New Revision: 442196

URL: http://svn.apache.org/viewvc?view=rev&rev=442196
Log:
Initial stab at a simple container extension

Added:
    incubator/tuscany/sandbox/ant/container.easy/
    incubator/tuscany/sandbox/ant/container.easy/NOTICE.txt   (with props)
    incubator/tuscany/sandbox/ant/container.easy/pom.xml   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/
    incubator/tuscany/sandbox/ant/container.easy/src/main/
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentBuilder.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentType.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentTypeLoader.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementation.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementationLoader.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstance.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstanceFactory.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/main/resources/
    incubator/tuscany/sandbox/ant/container.easy/src/test/
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentBuilderTestCase.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeLoaderTestCase.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeTestCase.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationLoaderTestCase.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationTestCase.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInvokerTestCase.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/MockInstanceFactory.java   (with props)
    incubator/tuscany/sandbox/ant/container.easy/src/test/resources/
    incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/
    incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/
    incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/
    incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/
    incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/
    incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.componentType
    incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.mock

Added: incubator/tuscany/sandbox/ant/container.easy/NOTICE.txt
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/NOTICE.txt?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/NOTICE.txt (added)
+++ incubator/tuscany/sandbox/ant/container.easy/NOTICE.txt Mon Sep 11 05:34:15 2006
@@ -0,0 +1,14 @@
+${pom.name}
+Copyright (c) 2005 - 2006 The Apache Software Foundation
+
+Apache Tuscany is an effort undergoing incubation at The Apache Software
+Foundation (ASF), sponsored by the Apache Web Services PMC. Incubation is
+required of all newly accepted projects until a further review indicates that
+the infrastructure, communications, and decision making process have stabilized
+in a manner consistent with other successful ASF projects. While incubation
+status is not necessarily a reflection of the completeness or stability of the
+code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+

Propchange: incubator/tuscany/sandbox/ant/container.easy/NOTICE.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/tuscany/sandbox/ant/container.easy/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/pom.xml?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/pom.xml (added)
+++ incubator/tuscany/sandbox/ant/container.easy/pom.xml Mon Sep 11 05:34:15 2006
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+
+    <parent>
+        <groupId>org.apache.tuscany.containers</groupId>
+        <artifactId>containers</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>easy-container</artifactId>
+    <name>Apache Tuscany Easy Container</name>
+    <description>Apache Tuscany Easy Container</description>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.tuscany</groupId>
+            <artifactId>core</artifactId>
+            <version>${sca.version}</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tuscany</groupId>
+            <artifactId>test</artifactId>
+            <version>${sca.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymockclassextension</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

Propchange: incubator/tuscany/sandbox/ant/container.easy/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,112 @@
+/*
+ * 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.container.easy;
+
+import static org.apache.tuscany.spi.idl.java.JavaIDLUtils.findMethod;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.spi.ObjectCreationException;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.extension.AtomicComponentExtension;
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
+import org.apache.tuscany.spi.wire.WireService;
+
+/**
+ * A component implementation for script languages.
+ */
+public class EasyComponent extends AtomicComponentExtension {
+
+    private final List<Class<?>> services;
+
+    private final Map<String, Object> properties;
+
+    protected EasyInstanceFactory instanceFactory;
+
+    public EasyComponent(String name, EasyInstanceFactory instanceFactory, List<Class<?>> services, CompositeComponent parent, ScopeContainer scopeContainer,
+            WireService wireService, WorkContext workContext) {
+
+        super(name, parent, scopeContainer, wireService, workContext, null, 0);
+
+        this.instanceFactory = instanceFactory;
+        this.services = services;
+        this.scope = scopeContainer.getScope();
+        this.properties = new HashMap<String, Object>();
+    }
+
+    @SuppressWarnings("unchecked")
+    public Object createInstance() throws ObjectCreationException {
+
+        Map<String, Object> context = new HashMap<String, Object>(getProperties());
+
+        for (List<OutboundWire> referenceWires : getOutboundWires().values()) {
+            for (OutboundWire wire : referenceWires) {
+                Object wireProxy = wireService.createProxy(wire);
+                context.put(wire.getReferenceName(), wireProxy);
+            }
+        }
+
+        return instanceFactory.createInstance(context);
+    }
+
+    public TargetInvoker createTargetInvoker(String targetName, Operation operation) {
+        Method[] methods = operation.getServiceContract().getInterfaceClass().getMethods();
+        Method method = findMethod(operation, methods);
+        return new EasyInvoker(method.getName(), this);
+    }
+
+    // TODO: move all the following up to AtomicComponentExtension?
+
+    public List<Class<?>> getServiceInterfaces() {
+        return services;
+    }
+
+    public Map<String, Object> getProperties() {
+        return properties;
+    }
+
+    public Object getTargetInstance() throws TargetException {
+        return scopeContainer.getInstance(this);
+    }
+
+    public Object getServiceInstance() throws TargetException {
+        return getServiceInstance(null);
+    }
+
+    @SuppressWarnings("unchecked")
+    public Object getServiceInstance(String service) throws TargetException {
+        InboundWire wire = getInboundWire(service);
+        if (wire == null) {
+            TargetException e = new TargetException("ServiceDefinition not found"); // TODO better error message
+            e.setIdentifier(service);
+            throw e;
+        }
+        return wireService.createProxy(wire);
+    }
+
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentBuilder.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentBuilder.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentBuilder.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,74 @@
+/*
+ * 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.container.easy;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.tuscany.spi.builder.BuilderConfigException;
+import org.apache.tuscany.spi.component.Component;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.ScopeContainer;
+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.Scope;
+import org.apache.tuscany.spi.model.ServiceDefinition;
+
+/**
+ * Extension point for creating {@link ScriptComponent}s from an assembly configuration
+ */
+public class EasyComponentBuilder extends ComponentBuilderExtension<EasyImplementation> {
+
+    public EasyComponentBuilder() {
+    }
+
+    protected Class<EasyImplementation> getImplementationType() {
+        return EasyImplementation.class;
+    }
+
+    @SuppressWarnings("unchecked")
+    public Component build(CompositeComponent parent, ComponentDefinition<EasyImplementation> componentDefinition,
+            DeploymentContext deploymentContext) throws BuilderConfigException {
+
+        String name = componentDefinition.getName();
+        EasyImplementation implementation = componentDefinition.getImplementation();
+        EasyComponentType componentType = implementation.getComponentType();
+
+        // get list of services provided by this component
+        Collection<ServiceDefinition> collection = componentType.getServices().values();
+        List<Class<?>> services = new ArrayList<Class<?>>(collection.size());
+        for (ServiceDefinition serviceDefinition : collection) {
+            services.add(serviceDefinition.getServiceContract().getInterfaceClass());
+        }
+
+        // TODO: have ComponentBuilderExtension pass ScopeContainer in on build method?
+        ScopeContainer scopeContainer;
+        Scope scope = componentType.getLifecycleScope();
+        if (Scope.MODULE == scope) {
+            scopeContainer = deploymentContext.getModuleScope();
+        } else {
+            scopeContainer = scopeRegistry.getScopeContainer(scope);
+        }
+
+        return new EasyComponent(name, implementation.getScriptInstanceFactory(), services, parent, scopeContainer, wireService, workContext);
+    }
+
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentType.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentType.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentType.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentType.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,62 @@
+/*
+ * 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.container.easy;
+
+import org.apache.tuscany.spi.model.ComponentType;
+import org.apache.tuscany.spi.model.Property;
+import org.apache.tuscany.spi.model.ReferenceDefinition;
+import org.apache.tuscany.spi.model.Scope;
+import org.apache.tuscany.spi.model.ServiceDefinition;
+
+/**
+ * A componentType for script components
+ * TODO: need lifecycle methods init/destroy 
+ * TODO: really need a generic componentType that supports scope and lifecycle 
+ */
+public class EasyComponentType extends ComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> {
+
+    private Scope lifecycleScope = Scope.MODULE;
+
+    public EasyComponentType() {
+    }
+
+    @SuppressWarnings("unchecked")
+    public EasyComponentType(ComponentType ct) {
+        // TODO: A bit hacky but this is so the generic .componentType XML side file can be used for now
+        setInitLevel(ct.getInitLevel());
+        for (Object property : ct.getProperties().values()) {
+            add((Property) property);
+        }
+        for (Object reference : ct.getReferences().values()) {
+            add((ReferenceDefinition) reference);
+        }
+        for (Object service : ct.getServices().values()) {
+            add((ServiceDefinition) service);
+        }
+    }
+
+    public Scope getLifecycleScope() {
+        return lifecycleScope;
+    }
+
+    public void setLifecycleScope(Scope lifecycleScope) {
+        this.lifecycleScope = lifecycleScope;
+    }
+
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentType.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentTypeLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentTypeLoader.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentTypeLoader.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentTypeLoader.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,76 @@
+/*
+ * 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.container.easy;
+
+import java.net.URL;
+
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.extension.ComponentTypeLoaderExtension;
+import org.apache.tuscany.spi.loader.LoaderException;
+import org.apache.tuscany.spi.model.ComponentType;
+
+/**
+ * ComponentType loader for script components
+ */
+public class EasyComponentTypeLoader extends ComponentTypeLoaderExtension<EasyImplementation> {
+
+    public EasyComponentTypeLoader() {
+    }
+
+    @Override
+    protected Class<EasyImplementation> getImplementationClass() {
+        return EasyImplementation.class;
+    }
+
+    protected String getResourceName(EasyImplementation implementation) {
+        return implementation.getScriptInstanceFactory().getScriptName();
+    }
+
+    // TODO: must be possible to move all the following up in to ComponentTypeLoaderExtension
+
+    public void load(CompositeComponent parent, EasyImplementation implementation, DeploymentContext deploymentContext) throws LoaderException {
+        String sideFile = getSideFileName(implementation);
+        URL resource = implementation.getScriptInstanceFactory().getClassLoader().getResource(sideFile);
+        EasyComponentType componentType;
+        if (resource == null) {
+            throw new IllegalArgumentException("missing .componentType side file: " + sideFile);
+            // TODO: or else implement introspection
+        } else {
+            componentType = loadFromSidefile(resource, deploymentContext);
+        }
+        implementation.setComponentType(componentType);
+    }
+
+    protected EasyComponentType loadFromSidefile(URL url, DeploymentContext deploymentContext) throws LoaderException {
+        ComponentType ct = loaderRegistry.load(null, url, ComponentType.class, deploymentContext);
+        EasyComponentType scriptComponentType = new EasyComponentType(ct);
+        return scriptComponentType;
+    }
+
+    protected String getSideFileName(EasyImplementation implementation) {
+        String baseName = getResourceName(implementation);
+        int lastDot = baseName.lastIndexOf('.');
+        if (lastDot != -1) {
+            baseName = baseName.substring(0, lastDot);
+        }
+        return baseName + ".componentType";
+    }
+
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentTypeLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponentTypeLoader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementation.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementation.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementation.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementation.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,37 @@
+/*
+ * 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.container.easy;
+
+import org.apache.tuscany.spi.model.AtomicImplementation;
+
+/**
+ * Model object for a script implementation.
+ */
+public class EasyImplementation extends AtomicImplementation<EasyComponentType> {
+
+    private EasyInstanceFactory scriptInstanceFactory;
+
+    public EasyInstanceFactory getScriptInstanceFactory() {
+        return scriptInstanceFactory;
+    }
+
+    public void setScriptInstanceFactory(EasyInstanceFactory scriptInstanceFactory) {
+        this.scriptInstanceFactory = scriptInstanceFactory;
+    }
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementation.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementation.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementationLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementationLoader.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementationLoader.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementationLoader.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,92 @@
+/*
+ * 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.container.easy;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.tuscany.spi.annotation.Autowire;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.extension.LoaderExtension;
+import org.apache.tuscany.spi.loader.LoaderException;
+import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.loader.MissingResourceException;
+import org.osoa.sca.annotations.Constructor;
+
+/**
+ * Loader for handling implementation.script elements.
+ * 
+ * <implementation.script script="path/foo.py" class="myclass">
+ * 
+ */
+public abstract class EasyImplementationLoader extends LoaderExtension<EasyImplementation> {
+
+    @Constructor( { "registry" })
+    public EasyImplementationLoader(@Autowire
+    LoaderRegistry registry) {
+        super(registry);
+    }
+
+    public abstract QName getXMLType();
+
+    abstract public EasyImplementation load(CompositeComponent parent, XMLStreamReader reader, DeploymentContext deploymentContext) throws MissingResourceException, XMLStreamException, LoaderException;
+
+    protected String loadSource(ClassLoader cl, String resource) throws LoaderException {
+        URL url = cl.getResource(resource);
+        if (url == null) {
+            throw new MissingResourceException(resource);
+        }
+        InputStream is;
+        try {
+            is = url.openStream();
+        } catch (IOException e) {
+            MissingResourceException mre = new MissingResourceException(resource, e);
+            mre.setIdentifier(resource);
+            throw mre;
+        }
+        try {
+            Reader reader = new InputStreamReader(is, "UTF-8");
+            char[] buffer = new char[1024];
+            StringBuilder source = new StringBuilder();
+            int count;
+            while ((count = reader.read(buffer)) > 0) {
+                source.append(buffer, 0, count);
+            }
+            return source.toString();
+        } catch (IOException e) {
+            LoaderException le = new LoaderException(e);
+            le.setIdentifier(resource);
+            throw le;
+        } finally {
+            try {
+                is.close();
+            } catch (IOException e) {
+                // ignore
+            }
+        }
+    }
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementationLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyImplementationLoader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstance.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstance.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstance.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstance.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,31 @@
+/*
+ * 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.container.easy;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * An invokable instance of a script
+ * 
+ * Basically just a wrapper around a BSF engine with an optional script class object.
+ */
+public interface EasyInstance {
+
+    public Object invokeTarget(String operationName, Object[] args) throws InvocationTargetException;
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstance.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstance.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstanceFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstanceFactory.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstanceFactory.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstanceFactory.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,68 @@
+/*
+ * 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.container.easy;
+
+import java.util.Map;
+
+/**
+ * ScriptInstanceFactory creates ScriptInstances for a script
+ */
+public abstract class EasyInstanceFactory<T extends EasyInstance> {
+
+    protected String scriptName;
+
+    protected String scriptSource;
+
+    protected String className;
+
+    protected ClassLoader classLoader;
+
+    public EasyInstanceFactory(String scriptName, String className, String scriptSource, ClassLoader classLoader) {
+        this.scriptName = scriptName;
+        this.className = className;
+        this.scriptSource = scriptSource;
+        this.classLoader = classLoader;
+    }
+
+    /**
+     * Create a new invokeable instance of the script
+     * 
+     * @param context
+     *            objects to add to scope of the script instance
+     * @return a RhinoScriptInstance
+     */
+    public abstract T createInstance(Map<String, Object> context);
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public String getScriptSource() {
+        return scriptSource;
+    }
+
+    public ClassLoader getClassLoader() {
+        return classLoader;
+    }
+
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstanceFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInstanceFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,53 @@
+/*
+ * 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.container.easy;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.tuscany.spi.extension.TargetInvokerExtension;
+
+/**
+ * TargetInvoker that calls a function on a ScriptInstance
+ */
+public class EasyInvoker extends TargetInvokerExtension {
+
+    private EasyComponent context;
+
+    private String functionName;
+
+    public EasyInvoker(String functionName, EasyComponent context) {
+        this.functionName = functionName;
+        this.context = context;
+    }
+
+    /**
+     * Invoke the function
+     */
+    public Object invokeTarget(final Object payload) throws InvocationTargetException {
+        EasyInstance target = (EasyInstance) context.getTargetInstance();
+        try {
+
+            return target.invokeTarget(functionName, (Object[]) payload);
+
+        } catch (Exception e) {
+            throw new InvocationTargetException(e);
+        }
+    }
+
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentBuilderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentBuilderTestCase.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentBuilderTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentBuilderTestCase.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,90 @@
+package org.apache.tuscany.container.easy;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import junit.framework.TestCase;
+
+import org.apache.tuscany.core.component.scope.ModuleScopeObjectFactory;
+import org.apache.tuscany.core.component.scope.ScopeRegistryImpl;
+import org.apache.tuscany.spi.component.Component;
+import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.component.ScopeRegistry;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.idl.java.JavaServiceContract;
+import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.Scope;
+import org.apache.tuscany.spi.model.ServiceContract;
+import org.apache.tuscany.spi.model.ServiceDefinition;
+import org.easymock.IAnswer;
+
+public class EasyComponentBuilderTestCase extends TestCase {
+
+    public void testGetImplementationType() {
+        EasyComponentBuilder builder = new EasyComponentBuilder();
+        assertEquals(EasyImplementation.class, builder.getImplementationType());
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testBuild() {
+        EasyComponentBuilder builder = new EasyComponentBuilder();
+        ScopeRegistry scopeRegistry = new ScopeRegistryImpl();
+        scopeRegistry.registerFactory(Scope.COMPOSITE, new ModuleScopeObjectFactory(scopeRegistry));
+        builder.setScopeRegistry(scopeRegistry);
+        DeploymentContext deploymentContext = createMock(DeploymentContext.class);
+        final ScopeContainer scopeContainer = createMock(ScopeContainer.class);
+        expect(scopeContainer.getScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return Scope.COMPOSITE;
+            }
+        });
+        expect(deploymentContext.getModuleScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return scopeContainer;
+            }
+        });
+        replay(deploymentContext);
+        ComponentDefinition<EasyImplementation> impl = new ComponentDefinition<EasyImplementation>(new EasyImplementation());
+        EasyComponentType componentType = new EasyComponentType();
+        componentType.setLifecycleScope(Scope.COMPOSITE);
+        ServiceDefinition service = new ServiceDefinition();
+        ServiceContract serviceContract = new JavaServiceContract();
+        service.setServiceContract(serviceContract);
+        componentType.add(service);
+        impl.getImplementation().setComponentType(componentType);
+        Component component = builder.build(null, impl, deploymentContext);
+        assertNotNull(component);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testBuildModuleScope() {
+        EasyComponentBuilder builder = new EasyComponentBuilder();
+        DeploymentContext deploymentContext = createMock(DeploymentContext.class);
+        final ScopeContainer scopeContainer = createMock(ScopeContainer.class);
+        expect(scopeContainer.getScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return Scope.MODULE;
+            }
+        });
+        expect(deploymentContext.getModuleScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return scopeContainer;
+            }
+        });
+        replay(deploymentContext);
+        ComponentDefinition<EasyImplementation> impl = new ComponentDefinition<EasyImplementation>(new EasyImplementation());
+        EasyComponentType componentType = new EasyComponentType();
+        ServiceDefinition service = new ServiceDefinition();
+        ServiceContract serviceContract = new JavaServiceContract();
+        service.setServiceContract(serviceContract);
+        componentType.add(service);
+        impl.getImplementation().setComponentType(componentType);
+        Component component = builder.build(null, impl, deploymentContext);
+        assertNotNull(component);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentBuilderTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentBuilderTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,137 @@
+package org.apache.tuscany.container.easy;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.container.easy.mock.MockInstanceFactory;
+import org.apache.tuscany.core.wire.InboundWireImpl;
+import org.apache.tuscany.core.wire.OutboundWireImpl;
+import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.model.Scope;
+import org.apache.tuscany.spi.model.ServiceContract;
+import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.RuntimeWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
+import org.apache.tuscany.spi.wire.WireService;
+import org.easymock.IAnswer;
+
+public class EasyComponentTestCase extends TestCase {
+    
+    private ScopeContainer scopeContainer;
+
+    @SuppressWarnings("unchecked")
+    public void testCreateTargetInvoker() {
+        EasyComponent component = new EasyComponent(null,null,null, null, scopeContainer, null, null);
+        
+        Operation operation = new Operation("hashCode", null,null,null,false,null);
+        ServiceContract contract = new ServiceContract(List.class){};
+        operation.setServiceContract(contract);
+        TargetInvoker invoker = component.createTargetInvoker("hashCode", operation);
+        
+        assertNotNull(invoker);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testCreateInstance() throws IOException {
+        EasyComponent pc = new EasyComponent(null,createBSFEasy(),null, null, scopeContainer, null, null);
+        Object o = pc.createInstance();
+        assertNotNull(o);
+        assertTrue(o instanceof EasyInstance);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testCreateInstanceWithRef() throws IOException {
+        WireService wireService = createMock(WireService.class);
+        expect(wireService.createProxy(isA(RuntimeWire.class))).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return Scope.MODULE;
+            }
+        });
+       
+        EasyComponent pc = new EasyComponent(null,createBSFEasy(),null, null, scopeContainer, wireService, null);
+        OutboundWire wire = new OutboundWireImpl();
+        wire.setReferenceName("foo");
+        pc.addOutboundWire(wire);
+        Object o = pc.createInstance();
+        assertNotNull(o);
+        assertTrue(o instanceof EasyInstance);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testGetServiceInstance() {
+        WireService wireService = createMock(WireService.class);
+        expect(wireService.createProxy(isA(RuntimeWire.class))).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return "foo";
+            }
+        });
+        replay(wireService);
+        EasyComponent pc = new EasyComponent(null,null,null, null, scopeContainer, wireService, null);
+        InboundWire wire = new InboundWireImpl();
+        pc.addInboundWire(wire);
+        assertEquals("foo", pc.getServiceInstance());
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testGetServiceInstanceFail() {
+        EasyComponent pc = new EasyComponent(null,null,null, null, scopeContainer, null, null);
+        try {
+            pc.getServiceInstance();
+            fail();
+        } catch (TargetException e) {
+            // expected
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testGetproperties() {
+        EasyComponent pc = new EasyComponent(null,null,null, null, scopeContainer, null, null);
+        assertNotNull(pc.getProperties());
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testGetServiceInterfaces() {
+        List services = new ArrayList();
+        EasyComponent pc = new EasyComponent(null,null,services, null, scopeContainer, null,null);
+        assertEquals(services, pc.getServiceInterfaces());
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    protected void setUp() throws Exception {
+        super.setUp();
+        this.scopeContainer = createMock(ScopeContainer.class);
+        expect(scopeContainer.getScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return Scope.MODULE;
+            }
+        });
+    }
+
+    public EasyInstanceFactory createBSFEasy() throws IOException {
+        URL scriptURL = getClass().getResource("foo.mock");
+        InputStream is = scriptURL.openStream();
+        StringBuilder sb = new StringBuilder();
+        int i = 0;
+        while ((i = is.read()) != -1) {
+            sb.append((char) i);
+        }
+        is.close();
+        String script = sb.toString();
+        MockInstanceFactory bsfEasy = new MockInstanceFactory("foo.mock", "hello", script, null);
+        return bsfEasy;
+    }
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeLoaderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeLoaderTestCase.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeLoaderTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeLoaderTestCase.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,169 @@
+/*
+ * 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.container.easy;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.xml.stream.XMLStreamException;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.container.easy.mock.MockInstanceFactory;
+import org.apache.tuscany.core.loader.LoaderRegistryImpl;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.loader.LoaderException;
+import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.model.ComponentType;
+import org.apache.tuscany.spi.model.ModelObject;
+import org.apache.tuscany.spi.model.Scope;
+import org.easymock.IAnswer;
+
+/**
+ * 
+ */
+public class EasyComponentTypeLoaderTestCase extends TestCase {
+
+    private String script;
+
+    public void testGetSideFileName() {
+        EasyInstanceFactory bsfEasy = new MockInstanceFactory("BSFEasyTestCase.mock", "hello", script, null);
+        EasyComponentTypeLoader loader = new EasyComponentTypeLoader();
+        EasyImplementation implementation = new EasyImplementation();
+        implementation.setScriptInstanceFactory(bsfEasy);
+        assertEquals("BSFEasyTestCase.componentType", loader.getSideFileName(implementation));
+
+        bsfEasy = new MockInstanceFactory("BSFEasyTestCase", "hello", script, null);
+        implementation.setScriptInstanceFactory(bsfEasy);
+        assertEquals("BSFEasyTestCase.componentType", loader.getSideFileName(implementation));
+
+    }
+
+    public void testGetSideFileNameNoDot() {
+        EasyInstanceFactory bsfEasy = new MockInstanceFactory("BSFEasyTestCase", "hello", script, null);
+        EasyComponentTypeLoader loader = new EasyComponentTypeLoader();
+        EasyImplementation implementation = new EasyImplementation();
+        implementation.setScriptInstanceFactory(bsfEasy);
+        assertEquals("BSFEasyTestCase.componentType", loader.getSideFileName(implementation));
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testLoadFromSideFile() throws MalformedURLException, LoaderException, XMLStreamException {
+        EasyComponentTypeLoader loader = new EasyComponentTypeLoader();
+        LoaderRegistry loaderRegistry = new LoaderRegistryImpl() {
+            public <MO extends ModelObject> MO load(CompositeComponent parent, URL url, Class<MO> type, DeploymentContext ctx) throws LoaderException {
+                return (MO) new ComponentType();
+            }
+        };
+        loader.setLoaderRegistry(loaderRegistry);
+        loader.loadFromSidefile(null, null);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testLoad() throws LoaderException {
+        EasyInstanceFactory bsfEasy = new MockInstanceFactory("org/apache/tuscany/container/easy/foo.mock", "hello", script, getClass().getClassLoader());
+        EasyComponentTypeLoader loader = new EasyComponentTypeLoader();
+        LoaderRegistry loaderRegistry = new LoaderRegistryImpl() {
+            public <MO extends ModelObject> MO load(CompositeComponent parent,
+                    URL url,
+                    Class<MO> type,
+                    DeploymentContext ctx) throws LoaderException {
+                return (MO) new ComponentType();
+            }
+        };
+        loader.setLoaderRegistry(loaderRegistry);
+        EasyImplementation implementation = new EasyImplementation();
+        implementation.setScriptInstanceFactory(bsfEasy);
+        DeploymentContext deploymentContext = createMock(DeploymentContext.class);
+        final ScopeContainer scopeContainer = createMock(ScopeContainer.class);
+        expect(scopeContainer.getScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return Scope.MODULE;
+            }
+        });
+        expect(deploymentContext.getModuleScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return scopeContainer;
+            }
+        });
+        replay(deploymentContext);
+        loader.load(null, implementation, deploymentContext);
+        assertNotNull(implementation.getComponentType());
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testLoadMissingSideFile() throws LoaderException {
+        EasyInstanceFactory bsfEasy = new MockInstanceFactory("org/apche/tuscany/container/easy/foo.mock", "hello", script, getClass().getClassLoader());
+        EasyComponentTypeLoader loader = new EasyComponentTypeLoader();
+        EasyImplementation implementation = new EasyImplementation();
+        implementation.setScriptInstanceFactory(bsfEasy);
+        DeploymentContext deploymentContext = createMock(DeploymentContext.class);
+        final ScopeContainer scopeContainer = createMock(ScopeContainer.class);
+        expect(scopeContainer.getScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return Scope.MODULE;
+            }
+        });
+        expect(deploymentContext.getModuleScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return scopeContainer;
+            }
+        });
+        replay(deploymentContext);
+        try {
+            loader.load(null, implementation, deploymentContext);
+            fail();
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    public void testGetImplementationClass() {
+        EasyComponentTypeLoader loader = new EasyComponentTypeLoader();
+        assertEquals(EasyImplementation.class, loader.getImplementationClass());
+    }
+
+    public void testGetResourceName() {
+        EasyComponentTypeLoader loader = new EasyComponentTypeLoader();
+        EasyImplementation implementation = new EasyImplementation();
+        EasyInstanceFactory bsfEasy = new MockInstanceFactory("PythonEasyTestCase.py", "hello", script, null);
+        implementation.setScriptInstanceFactory(bsfEasy);
+        assertEquals("PythonEasyTestCase.py", loader.getResourceName(implementation));
+    }
+
+    @Override
+    public void setUp() throws IOException {
+        URL scriptURL = getClass().getResource("foo.mock");
+        InputStream is = scriptURL.openStream();
+        StringBuilder sb = new StringBuilder();
+        int i = 0;
+        while ((i = is.read()) != -1) {
+            sb.append((char) i);
+        }
+        is.close();
+        script = sb.toString();
+    }
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeLoaderTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeLoaderTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeTestCase.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeTestCase.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,37 @@
+package org.apache.tuscany.container.easy;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.container.easy.EasyComponentType;
+import org.apache.tuscany.spi.model.ComponentType;
+import org.apache.tuscany.spi.model.Property;
+import org.apache.tuscany.spi.model.ReferenceDefinition;
+import org.apache.tuscany.spi.model.Scope;
+import org.apache.tuscany.spi.model.ServiceDefinition;
+
+public class EasyComponentTypeTestCase extends TestCase {
+    
+    public void testLifecycleScope() {
+        EasyComponentType ct = new EasyComponentType();
+        assertEquals(Scope.MODULE, ct.getLifecycleScope());
+        ct.setLifecycleScope(Scope.COMPOSITE);
+        assertEquals(Scope.COMPOSITE, ct.getLifecycleScope());
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testComponentTypeConstructor() {
+        ComponentType ct = new ComponentType();
+        Property property = new Property();
+        ct.add(property);
+        ReferenceDefinition reference = new ReferenceDefinition();
+        ct.add(reference);
+        ServiceDefinition service = new ServiceDefinition();
+        ct.add(service);
+
+        EasyComponentType pct = new EasyComponentType(ct);
+        
+        assertEquals(property, pct.getProperties().values().iterator().next());
+        assertEquals(reference, pct.getReferences().values().iterator().next());
+        assertEquals(service, pct.getServices().values().iterator().next());
+    }
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTypeTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationLoaderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationLoaderTestCase.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationLoaderTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationLoaderTestCase.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,135 @@
+/*
+ * 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.container.easy;
+
+import static org.easymock.classextension.EasyMock.createMock;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.loader.LoaderException;
+import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.loader.MissingResourceException;
+
+/**
+ * 
+ */
+public class EasyImplementationLoaderTestCase extends TestCase {
+    private CompositeComponent parent;
+
+    private XMLStreamReader reader;
+
+    private DeploymentContext deploymentContext;
+
+    private ClassLoader classLoader;
+
+    private LoaderRegistry registry;
+
+    private EasyImplementationLoader loader;
+
+//    public void testLoadNoEasyAttribute() throws LoaderException, XMLStreamException {
+//        expect(reader.getAttributeValue(null, "script")).andReturn(null);
+//        replay(reader);
+//        replay(deploymentContext);
+//
+//        try {
+//            loader.load(parent, reader, deploymentContext);
+//            fail();
+//        } catch (MissingResourceException e) {
+//            // ok
+//        }
+//        verify(reader);
+//        verify(deploymentContext);
+//    }
+
+//    public void testLoadNoEasyPresent() throws LoaderException, XMLStreamException {
+//        expect(reader.getAttributeValue(null, "script")).andReturn("foo.py");
+//        expect(reader.getAttributeValue(null, "class")).andReturn(null);
+//        expect(reader.next()).andReturn(XMLStreamConstants.END_ELEMENT);
+//        expect(deploymentContext.getClassLoader()).andReturn(classLoader);
+//
+//        replay(reader);
+//        replay(deploymentContext);
+//
+//        EasyImplementationLoader mockLoader = new EasyImplementationLoader(registry) {
+//            protected String loadSource(ClassLoader cl, String resource) throws LoaderException {
+//                assertSame(classLoader, cl);
+//                assertEquals("foo.py", resource);
+//                throw new MissingResourceException(resource);
+//            }
+//            public QName getXMLType() {
+//                return null;
+//            }
+//
+//            @Override
+//            public EasyImplementation load(CompositeComponent parent, XMLStreamReader reader, DeploymentContext deploymentContext) throws MissingResourceException, XMLStreamException, LoaderException {
+//                return null;
+//            }
+//        };
+//        try {
+//            mockLoader.load(parent, reader, deploymentContext);
+//            fail();
+//        } catch (MissingResourceException e) {
+//            assertEquals("foo.py", e.getMessage());
+//        }
+//        verify(reader);
+//        verify(deploymentContext);
+//    }
+
+    public void testLoadSource() throws LoaderException {
+        String script = loader.loadSource(getClass().getClassLoader(), "org/apache/tuscany/container/easy/foo.mock");
+        assertTrue(script.startsWith("hello"));
+    }
+
+    public void testLoadSourceMissingResource() throws LoaderException {
+        try {
+            loader.loadSource(getClass().getClassLoader(), "doesnt.exist");
+            fail();
+        } catch (MissingResourceException e) {
+            // expected
+        }
+    }
+
+    public void testGetXMLType() throws LoaderException {
+        assertEquals("http://foo", loader.getXMLType().getNamespaceURI());
+        assertEquals("bar", loader.getXMLType().getLocalPart());
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        registry = createMock(LoaderRegistry.class);
+        loader = new EasyImplementationLoader(registry){
+            public QName getXMLType() {
+                return new QName("http://foo", "bar");
+            }
+            public EasyImplementation load(CompositeComponent parent, XMLStreamReader reader, DeploymentContext deploymentContext) throws MissingResourceException, XMLStreamException, LoaderException {
+                return null;
+            }};
+
+        parent = createMock(CompositeComponent.class);
+        reader = createMock(XMLStreamReader.class);
+        deploymentContext = createMock(DeploymentContext.class);
+        classLoader = createMock(ClassLoader.class);
+    }
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationLoaderTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationLoaderTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationTestCase.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationTestCase.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,35 @@
+package org.apache.tuscany.container.easy;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.container.easy.mock.MockInstanceFactory;
+
+public class EasyImplementationTestCase extends TestCase {
+
+    private EasyInstanceFactory bsfEasy;
+
+    public void testGetBSFEasy() {
+        EasyImplementation impl = new EasyImplementation();
+        impl.setScriptInstanceFactory(bsfEasy);
+        assertEquals(bsfEasy, impl.getScriptInstanceFactory());
+    }
+
+    public void setUp() throws IOException {
+        URL easyURL = getClass().getResource("foo.mock");
+        assert easyURL != null;
+        InputStream is = easyURL.openStream();
+        StringBuilder sb = new StringBuilder();
+        int i = 0;
+        while ((i = is.read()) != -1) {
+            sb.append((char) i);
+        }
+        is.close();
+        String easy = sb.toString();
+        bsfEasy = new MockInstanceFactory("BSFEasyTestCase", "hello", easy, null);
+    }
+
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyImplementationTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,48 @@
+package org.apache.tuscany.container.easy;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.container.easy.mock.MockInstanceFactory;
+
+public class EasyInstanceFactoryTestCase extends TestCase {
+
+    public void testCreateInstance() throws InvocationTargetException {
+        MockInstanceFactory factory = new MockInstanceFactory("foo.mock", "bar", "baz", getClass().getClassLoader());
+        Map<String, Object> context = new HashMap<String, Object>();
+        context.put("foo", "bar");
+        EasyInstance instance = factory.createInstance(context);
+        assertNotNull(instance);
+    }
+
+    public void testCreateInstanceNoClass() throws InvocationTargetException {
+        MockInstanceFactory factory = new MockInstanceFactory("foo.mock", null, "baz", getClass().getClassLoader());
+        Map<String, Object> context = new HashMap<String, Object>();
+        context.put("foo", "bar");
+        EasyInstance instance = factory.createInstance(context);
+        assertNotNull(instance);
+    }
+
+    public void testCreateInstanceRuby() throws InvocationTargetException {
+        MockInstanceFactory factory = new MockInstanceFactory("foo.mock", "bar", "baz", getClass().getClassLoader());
+        Map<String, Object> context = new HashMap<String, Object>();
+        context.put("foo", "bar");
+        EasyInstance instance = factory.createInstance(context);
+        assertNotNull(instance);
+    }
+
+    public void testGetters() throws InvocationTargetException {
+        MockInstanceFactory factory = new MockInstanceFactory("foo", "bar", "baz", getClass().getClassLoader());
+        assertEquals("foo", factory.getScriptName());
+        assertEquals("bar", factory.getClassName());
+        assertEquals("baz", factory.getScriptSource());
+        assertEquals(getClass().getClassLoader(), factory.getClassLoader());
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInvokerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInvokerTestCase.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInvokerTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInvokerTestCase.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,61 @@
+package org.apache.tuscany.container.easy;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+
+import java.lang.reflect.InvocationTargetException;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.spi.component.AtomicComponent;
+import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.model.Scope;
+import org.easymock.IAnswer;
+
+public class EasyInvokerTestCase extends TestCase {
+
+    private EasyComponent component;
+
+    public void testInvokeTarget() throws InvocationTargetException {
+        EasyInvoker invoker = new EasyInvoker("hello", component);
+        assertEquals("hello petra", invoker.invokeTarget(null));
+    }
+
+    public void testInvokeTargetException() throws InvocationTargetException, SecurityException, NoSuchMethodException {
+         EasyInvoker badInvoker = new EasyInvoker("bang", component);
+         try {
+             badInvoker.invokeTarget(null);
+             fail();
+         } catch (InvocationTargetException e) {
+            // expected
+         }
+    }
+
+    @SuppressWarnings("unchecked")
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        ScopeContainer scopeContainer = createMock(ScopeContainer.class);
+        expect(scopeContainer.getScope()).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return Scope.MODULE;
+            }
+        });
+        expect(scopeContainer.getInstance(isA(AtomicComponent.class))).andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return new EasyInstance(){
+                    public Object invokeTarget(String operationName, Object[] args) throws InvocationTargetException {
+                        if ("bang".equals(operationName)) {
+                            throw new RuntimeException("bang");
+                        }
+                        return "hello petra";
+                    }};
+            }
+        });
+        replay(scopeContainer);
+
+        this.component = new EasyComponent(null, null, null, null, scopeContainer, null, null);
+    }
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInvokerTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInvokerTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/MockInstanceFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/MockInstanceFactory.java?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/MockInstanceFactory.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/MockInstanceFactory.java Mon Sep 11 05:34:15 2006
@@ -0,0 +1,30 @@
+package org.apache.tuscany.container.easy.mock;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+
+import org.apache.tuscany.container.easy.EasyInstance;
+import org.apache.tuscany.container.easy.EasyInstanceFactory;
+
+public class MockInstanceFactory extends EasyInstanceFactory<MockInstance> {
+
+    public MockInstanceFactory(String scriptName, String className, String scriptSource, ClassLoader classLoader) {
+        super(scriptName, className, scriptSource, classLoader);
+    }
+
+    @Override
+    public MockInstance createInstance(Map<String, Object> context) {
+        // TODO Auto-generated method stub
+        return new MockInstance();
+    }
+
+}
+
+class MockInstance implements EasyInstance {
+
+    public Object invokeTarget(String operationName, Object[] args) throws InvocationTargetException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/MockInstanceFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/MockInstanceFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.componentType
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.componentType?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.componentType (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.componentType Mon Sep 11 05:34:15 2006
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ASCII"?>
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+    <service name="HelloWorldService">
+        <interface.java interface="not.used"/>
+    </service>
+
+</componentType>

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.mock
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.mock?view=auto&rev=442196
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.mock (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/resources/org/apache/tuscany/container/easy/foo.mock Mon Sep 11 05:34:15 2006
@@ -0,0 +1 @@
+hello
\ No newline at end of file



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