Author: jmarino
Date: Fri Sep  8 00:20:10 2006
New Revision: 441406

URL: http://svn.apache.org/viewvc?view=rev&rev=441406
Log:
add a remote test binding; get Spring composite to expose beans through remote 
services

Added:
    
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInterceptor.java
   (with props)
    
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponentTestCase.java
   (with props)
    
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingRuntimeException.java
   (with props)
    
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBinding.java
   (with props)
    
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingBuilder.java
   (with props)
    
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingLoader.java
   (with props)
    
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingReference.java
   (with props)
    
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingService.java
   (with props)
    
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketInvoker.java
   (with props)
    incubator/tuscany/java/sca/test/src/test/java/org/
    incubator/tuscany/java/sca/test/src/test/java/org/apache/
    incubator/tuscany/java/sca/test/src/test/java/org/apache/tuscany/
    incubator/tuscany/java/sca/test/src/test/java/org/apache/tuscany/test/
    
incubator/tuscany/java/sca/test/src/test/java/org/apache/tuscany/test/binding/
Modified:
    incubator/tuscany/java/sca/containers/container.spring/pom.xml
    
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java
    
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponent.java
    
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInvoker.java
    
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/mock/TestBeanImpl.java
    incubator/tuscany/java/sca/test/pom.xml
    
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingService.java
    
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestInvoker.java
    
incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/test.binding.system.scdl

Modified: incubator/tuscany/java/sca/containers/container.spring/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/pom.xml?view=diff&rev=441406&r1=441405&r2=441406
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/pom.xml (original)
+++ incubator/tuscany/java/sca/containers/container.spring/pom.xml Fri Sep  8 
00:20:10 2006
@@ -60,7 +60,9 @@
         </dependency>
         <dependency>
             <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
+            <artifactId>easymockclassextension</artifactId>
+            <version>2.2</version>
+            <scope>test</scope>
         </dependency>
 
     </dependencies>

Modified: 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java?view=diff&rev=441406&r1=441405&r2=441406
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java
 Fri Sep  8 00:20:10 2006
@@ -67,6 +67,8 @@
             InboundWire<?> wire = service.getInboundWire();
             QualifiedName targetName = new 
QualifiedName(serviceDefinition.getTarget().getPath());
             for (InboundInvocationChain chain : 
wire.getInvocationChains().values()) {
+                // FIXME this should go to the connector and get policy and be 
invoked from SpringComposite.prepare()
+                chain.addInterceptor(new SpringInterceptor());
                 
chain.setTargetInvoker(component.createTargetInvoker(targetName.getPartName(), 
chain.getOperation()));
             }
             component.register(service);

Modified: 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponent.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponent.java?view=diff&rev=441406&r1=441405&r2=441406
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponent.java
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponent.java
 Fri Sep  8 00:20:10 2006
@@ -104,6 +104,9 @@
 
     public void start() {
         super.start();
+        for (SCAObject child : children.values()) {
+            child.start();
+        }
         springContext.start();
     }
 

Added: 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInterceptor.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInterceptor.java?view=auto&rev=441406
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInterceptor.java
 (added)
+++ 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInterceptor.java
 Fri Sep  8 00:20:10 2006
@@ -0,0 +1,35 @@
+package org.apache.tuscany.container.spring.impl;
+
+import org.apache.tuscany.spi.wire.Interceptor;
+import org.apache.tuscany.spi.wire.InvocationRuntimeException;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.TargetInvoker;
+
+/**
+ * A temporary interceptor until the connector is updated
+ *
+ * @version $Rev$ $Date$
+ */
+public class SpringInterceptor implements Interceptor {
+
+    public Message invoke(Message msg) throws InvocationRuntimeException {
+        TargetInvoker invoker = msg.getTargetInvoker();
+        if (invoker == null) {
+            throw new InvocationRuntimeException("No target invoker specified 
on message");
+        }
+        return invoker.invoke(msg);
+    }
+
+    public void setNext(Interceptor next) {
+        throw new IllegalStateException("This interceptor must be the last one 
in an target interceptor chain");
+    }
+
+    public Interceptor getNext() {
+        return null;
+    }
+
+    public boolean isOptimizable() {
+        return true;
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInvoker.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInvoker.java?view=diff&rev=441406&r1=441405&r2=441406
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInvoker.java
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringInvoker.java
 Fri Sep  8 00:20:10 2006
@@ -59,7 +59,11 @@
             }
         }
         try {
-            return method.invoke(bean, (Object[]) object);
+            if (object != null && !object.getClass().isArray()) {
+                return method.invoke(bean, object);
+            } else {
+                return method.invoke(bean, (Object[]) object);
+            }
         } catch (IllegalAccessException e) {
             throw new InvocationTargetException(e);
         }

Added: 
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponentTestCase.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponentTestCase.java?view=auto&rev=441406
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponentTestCase.java
 (added)
+++ 
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponentTestCase.java
 Fri Sep  8 00:20:10 2006
@@ -0,0 +1,42 @@
+package org.apache.tuscany.container.spring.impl;
+
+import org.apache.tuscany.spi.component.Service;
+
+import junit.framework.TestCase;
+import static org.easymock.classextension.EasyMock.replay;
+import static org.easymock.classextension.EasyMock.verify;
+import org.easymock.classextension.EasyMock;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class SpringCompositeComponentTestCase extends TestCase {
+
+    public void testAppContextStart() {
+        AbstractApplicationContext appContext = 
EasyMock.createMock(AbstractApplicationContext.class);
+        appContext.refresh();
+        appContext.setParent(EasyMock.isA(ApplicationContext.class));
+        appContext.start();
+        replay(appContext);
+        SpringCompositeComponent<?> component = new 
SpringCompositeComponent("spring", appContext, null, null, null);
+        component.start();
+        verify(appContext);
+    }
+
+    public void testChildStart() {
+        AbstractApplicationContext appContext = 
EasyMock.createNiceMock(AbstractApplicationContext.class);
+        replay(appContext);
+        Service service = EasyMock.createMock(Service.class);
+        EasyMock.expect(service.getName()).andReturn("foo").anyTimes();
+        service.start();
+        replay(service);
+        SpringCompositeComponent<?> component = new 
SpringCompositeComponent("spring", appContext, null, null, null);
+        component.register(service);
+        component.start();
+        verify(service);
+    }
+
+
+}

Propchange: 
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponentTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/impl/SpringCompositeComponentTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/mock/TestBeanImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/mock/TestBeanImpl.java?view=diff&rev=441406&r1=441405&r2=441406
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/mock/TestBeanImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/mock/TestBeanImpl.java
 Fri Sep  8 00:20:10 2006
@@ -26,7 +26,6 @@
     private TestBean bean;
 
     public TestBeanImpl() {
-        System.out.println("");
     }
 
     public String echo(String msg) {

Modified: incubator/tuscany/java/sca/test/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/pom.xml?view=diff&rev=441406&r1=441405&r2=441406
==============================================================================
--- incubator/tuscany/java/sca/test/pom.xml (original)
+++ incubator/tuscany/java/sca/test/pom.xml Fri Sep  8 00:20:10 2006
@@ -41,11 +41,11 @@
             <version>3.8.1</version>
             <scope>compile</scope>
         </dependency>
-        <dependency>
-            <groupId>jmock</groupId>
-            <artifactId>jmock</artifactId>
-            <version>1.0.1</version>
-            <scope>compile</scope>
-        </dependency>
+           <dependency>
+                <groupId>org.easymock</groupId>
+                <artifactId>easymock</artifactId>
+                <version>2.2</version>
+                <scope>test</scope>
+            </dependency>
     </dependencies>
 </project>

Added: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingRuntimeException.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingRuntimeException.java?view=auto&rev=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingRuntimeException.java
 (added)
+++ 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingRuntimeException.java
 Fri Sep  8 00:20:10 2006
@@ -0,0 +1,24 @@
+package org.apache.tuscany.test.binding;
+
+import org.apache.tuscany.api.TuscanyRuntimeException;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TestBindingRuntimeException extends TuscanyRuntimeException {
+
+    public TestBindingRuntimeException() {
+    }
+
+    public TestBindingRuntimeException(String message) {
+        super(message);
+    }
+
+    public TestBindingRuntimeException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public TestBindingRuntimeException(Throwable cause) {
+        super(cause);
+    }
+}

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingRuntimeException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingRuntimeException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingService.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingService.java?view=diff&rev=441406&r1=441405&r2=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingService.java
 (original)
+++ 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestBindingService.java
 Fri Sep  8 00:20:10 2006
@@ -24,6 +24,7 @@
 import org.apache.tuscany.spi.wire.WireService;
 
 /**
+ * 
  * @version $Rev$ $Date$
  */
 public class TestBindingService<T> extends ServiceExtension<T> {

Modified: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestInvoker.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestInvoker.java?view=diff&rev=441406&r1=441405&r2=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestInvoker.java
 (original)
+++ 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestInvoker.java
 Fri Sep  8 00:20:10 2006
@@ -2,9 +2,9 @@
 
 import java.lang.reflect.InvocationTargetException;
 
-import org.apache.tuscany.spi.wire.TargetInvoker;
-import org.apache.tuscany.spi.wire.Message;
 import org.apache.tuscany.spi.wire.InvocationRuntimeException;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.TargetInvoker;
 
 /**
  * @version $Rev$ $Date$
@@ -27,7 +27,7 @@
 
     public Object invokeTarget(final Object payload) throws 
InvocationTargetException {
         // echo back the result, a real binding would invoke some API for 
flowing the request
-        return ((Object[])payload)[0];
+        return ((Object[]) payload)[0];
     }
 
     public Message invoke(Message msg) throws InvocationRuntimeException {
@@ -45,4 +45,5 @@
     public Object clone() throws CloneNotSupportedException {
         return super.clone();
     }
+
 }

Added: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBinding.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBinding.java?view=auto&rev=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBinding.java
 (added)
+++ 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBinding.java
 Fri Sep  8 00:20:10 2006
@@ -0,0 +1,27 @@
+package org.apache.tuscany.test.binding;
+
+import org.apache.tuscany.spi.model.Binding;
+
+/**
+ * A simple socket-based binding. Service operations may onyl take one 
parameter that is <code>Serializable</code>
+ *
+ * @version $$Rev$$ $$Date$$
+ */
+public class TestSocketBinding extends Binding {
+    private String host;
+    private int port;
+
+    public TestSocketBinding(String host, int port) {
+        this.host = host;
+        this.port = port;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBinding.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBinding.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingBuilder.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingBuilder.java?view=auto&rev=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingBuilder.java
 (added)
+++ 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingBuilder.java
 Fri Sep  8 00:20:10 2006
@@ -0,0 +1,39 @@
+package org.apache.tuscany.test.binding;
+
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.Reference;
+import org.apache.tuscany.spi.component.Service;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.extension.BindingBuilderExtension;
+import org.apache.tuscany.spi.model.BoundReferenceDefinition;
+import org.apache.tuscany.spi.model.BoundServiceDefinition;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TestSocketBindingBuilder extends 
BindingBuilderExtension<TestSocketBinding> {
+
+    @SuppressWarnings("unchecked")
+    public Service<?> build(CompositeComponent parent,
+                            BoundServiceDefinition<TestSocketBinding> 
definition,
+                            DeploymentContext context) {
+        Class<?> interfaze = 
definition.getServiceContract().getInterfaceClass();
+        int port = definition.getBinding().getPort();
+        return new TestSocketBindingService(definition.getName(), port, 
interfaze, parent, wireService);
+    }
+
+    @SuppressWarnings("unchecked")
+    public Reference<?> build(CompositeComponent parent,
+                              BoundReferenceDefinition<TestSocketBinding> 
definition,
+                              DeploymentContext context) {
+        Class<?> interfaze = 
definition.getServiceContract().getInterfaceClass();
+        String name = definition.getName();
+        int port = definition.getBinding().getPort();
+        String host = definition.getBinding().getHost();
+        return new TestSocketBindingReference(name, host, port, interfaze, 
parent, wireService);
+    }
+
+    protected Class<TestSocketBinding> getBindingType() {
+        return TestSocketBinding.class;
+    }
+}

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingLoader.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingLoader.java?view=auto&rev=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingLoader.java
 (added)
+++ 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingLoader.java
 Fri Sep  8 00:20:10 2006
@@ -0,0 +1,45 @@
+package org.apache.tuscany.test.binding;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.osoa.sca.Version;
+import org.osoa.sca.annotations.Constructor;
+
+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;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TestSocketBindingLoader extends 
LoaderExtension<TestSocketBinding> {
+
+    public static final QName BINDING_TEST = new 
QName(Version.XML_NAMESPACE_1_0, "binding.socket");
+
+    @Constructor
+    public TestSocketBindingLoader(@Autowire LoaderRegistry registry) {
+        super(registry);
+    }
+
+    public QName getXMLType() {
+        return TestSocketBindingLoader.BINDING_TEST;
+    }
+
+    public TestSocketBinding load(CompositeComponent parent,
+                                  XMLStreamReader reader,
+                                  DeploymentContext context) throws 
XMLStreamException, LoaderException {
+        String host = reader.getAttributeValue(null, "host");
+        int port;
+        try {
+            port = Integer.parseInt(reader.getAttributeValue(null, "port"));
+        } catch (NumberFormatException e) {
+            throw new LoaderException("Invalid port specified", e);
+        }
+        return new TestSocketBinding(host, port);
+    }
+}

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingLoader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingReference.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingReference.java?view=auto&rev=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingReference.java
 (added)
+++ 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingReference.java
 Fri Sep  8 00:20:10 2006
@@ -0,0 +1,32 @@
+package org.apache.tuscany.test.binding;
+
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.extension.ReferenceExtension;
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.model.ServiceContract;
+import org.apache.tuscany.spi.wire.TargetInvoker;
+import org.apache.tuscany.spi.wire.WireService;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TestSocketBindingReference<T> extends ReferenceExtension<T> {
+
+    private String host;
+    private int port;
+
+    public TestSocketBindingReference(String name,
+                                      String host,
+                                      int port,
+                                      Class<T> interfaze,
+                                      CompositeComponent parent,
+                                      WireService wireService) {
+        super(name, interfaze, parent, wireService);
+        this.port = port;
+        this.host = host;
+    }
+
+    public TargetInvoker createTargetInvoker(ServiceContract contract, 
Operation operation) {
+        return new TestSocketInvoker(host, port, operation.getName());
+    }
+}

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingReference.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingReference.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingService.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingService.java?view=auto&rev=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingService.java
 (added)
+++ 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingService.java
 Fri Sep  8 00:20:10 2006
@@ -0,0 +1,122 @@
+package org.apache.tuscany.test.binding;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.apache.tuscany.spi.CoreRuntimeException;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.extension.ServiceExtension;
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.wire.InboundInvocationChain;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.MessageImpl;
+import org.apache.tuscany.spi.wire.WireService;
+
+/**
+ * Implements a very simple remote, socket-based binding for test purposes. 
This binding exposes services using a socket
+ * on a given port. Service operations must take only one paramter that is 
<code>Serializable</code>.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TestSocketBindingService<T> extends ServiceExtension<T> {
+    private int port;
+    private ServerSocket socket;
+    private ExecutorService executor;
+    private TestSocketBindingService<T>.ServerRunnable runnable;
+
+    public TestSocketBindingService(String name,
+                                    int port,
+                                    Class<T> interfaze,
+                                    CompositeComponent parent,
+                                    WireService wireService) throws 
CoreRuntimeException {
+        super(name, interfaze, parent, wireService);
+        this.port = port;
+    }
+
+    public void start() {
+        executor = Executors.newSingleThreadExecutor();
+        // create a listener, note that a work scheduler should normally be 
used to spawn work in different threads
+        runnable = new ServerRunnable();
+        executor.execute(runnable);
+    }
+
+    public void stop() {
+        try {
+            runnable.setEnd(true);
+            socket.close();
+            executor.shutdownNow();
+        } catch (IOException e) {
+            throw new TestBindingRuntimeException(e);
+        }
+    }
+
+    /**
+     * Creates a socket listener in another thread which handles one client at 
a time. For a real binding, a work
+     * scheduler should be used
+     */
+    private class ServerRunnable implements Runnable {
+
+        private boolean end;
+
+        public void setEnd(boolean end) {
+            this.end = end;
+        }
+
+        public void run() {
+            Socket clientSocket;
+            ObjectInputStream is = null;
+            ObjectOutputStream os = null;
+            try {
+                socket = new ServerSocket(port);
+            } catch (IOException e) {
+                throw new TestBindingRuntimeException(e);
+            }
+            while (!end) {
+                try {
+                    // only handle one client at a time
+                    clientSocket = socket.accept();
+                    is = new ObjectInputStream(clientSocket.getInputStream());
+                    String operation = is.readUTF();
+                    Object o = is.readObject();
+                    Map<Operation<?>, InboundInvocationChain> chains = 
getInboundWire().getInvocationChains();
+                    for (InboundInvocationChain chain : chains.values()) {
+                        if (chain.getOperation().getName().equals(operation)) {
+                            Message message = new MessageImpl();
+                            message.setTargetInvoker(chain.getTargetInvoker());
+                            message.setBody(new Object[]{o});
+                            message = 
chain.getHeadInterceptor().invoke(message);
+                            os = new 
ObjectOutputStream(clientSocket.getOutputStream());
+                            os.writeObject(message.getBody());
+                            os.flush();
+                        }
+                    }
+                } catch (IOException e) {
+                    throw new TestBindingRuntimeException(e);
+                } catch (ClassNotFoundException e) {
+                    throw new TestBindingRuntimeException(e);
+                } finally {
+                    if (os != null) {
+                        try {
+                            os.close();
+                        } catch (IOException e) {
+                            // ingore
+                        }
+                    }
+                    if (is != null) {
+                        try {
+                            is.close();
+                        } catch (IOException e) {
+                            // ignore
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketBindingService.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketInvoker.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketInvoker.java?view=auto&rev=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketInvoker.java
 (added)
+++ 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketInvoker.java
 Fri Sep  8 00:20:10 2006
@@ -0,0 +1,113 @@
+package org.apache.tuscany.test.binding;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.net.Socket;
+import java.net.UnknownHostException;
+
+import org.apache.tuscany.spi.wire.InvocationRuntimeException;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.TargetInvoker;
+
+/**
+ * Responsible for serializing an operation parameter flowing the invocation 
through the socket
+ *
+ * @version $Rev$ $Date$
+ */
+public class TestSocketInvoker implements TargetInvoker {
+    private String host;
+    private int port;
+    private String operation;
+
+    private boolean cacheable;
+
+    public TestSocketInvoker(String host, int port, String operation) {
+        this.host = host;
+        this.port = port;
+        this.operation = operation;
+    }
+
+    public boolean isCacheable() {
+        return cacheable;
+    }
+
+    public void setCacheable(boolean cacheable) {
+        this.cacheable = cacheable;
+    }
+
+    public boolean isOptimizable() {
+        return isCacheable();
+    }
+
+    public Message invoke(Message msg) throws InvocationRuntimeException {
+        try {
+            Object resp = invokeTarget(msg.getBody());
+            msg.setBody(resp);
+        } catch (InvocationTargetException e) {
+            msg.setBody(e.getCause());
+        } catch (Throwable e) {
+            msg.setBody(e);
+        }
+        return msg;
+    }
+
+    /**
+     * Sends the payload over a socket
+     */
+    public Object invokeTarget(final Object object) throws 
InvocationTargetException {
+        Object payload;
+        if (object != null && !object.getClass().isArray()) {
+            payload = object;
+        } else {
+            payload = ((Object[]) object)[0];
+        }
+
+        Socket socket = null;
+        ObjectOutputStream os = null;
+        ObjectInputStream is = null;
+        try {
+            socket = new Socket(host, port);
+            os = new ObjectOutputStream(socket.getOutputStream());
+            os.writeUTF(operation);
+            os.writeObject(payload);
+            os.flush();
+            is = new ObjectInputStream(socket.getInputStream());
+            return is.readObject();
+        } catch (ClassNotFoundException e) {
+            throw new InvocationTargetException(e);
+        } catch (UnknownHostException e) {
+            throw new InvocationTargetException(e);
+        } catch (IOException e) {
+            throw new InvocationTargetException(e);
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (socket != null) {
+                try {
+                    socket.close();
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+        }
+    }
+
+    public Object clone() throws CloneNotSupportedException {
+        return super.clone();
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketInvoker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/binding/TestSocketInvoker.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/test.binding.system.scdl
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/test.binding.system.scdl?view=diff&rev=441406&r1=441405&r2=441406
==============================================================================
--- 
incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/test.binding.system.scdl
 (original)
+++ 
incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/test.binding.system.scdl
 Fri Sep  8 00:20:10 2006
@@ -33,4 +33,12 @@
         <system:implementation.system 
class="org.apache.tuscany.test.binding.TestBindingBuilder"/>
     </component>
 
+    <component name="SocketBindingLoader">
+        <system:implementation.system 
class="org.apache.tuscany.test.binding.TestSocketBindingLoader"/>
+    </component>
+
+    <component name="SocketBindingBuilder">
+        <system:implementation.system 
class="org.apache.tuscany.test.binding.TestSocketBindingBuilder"/>
+    </component>
+
 </composite>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to