Add method to get DOMInvoker for a service and testcase for that

git-svn-id: https://svn.apache.org/repos/asf/tuscany/sca-java-2.x/trunk@1373552 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/modules/domain-node/src/main/java/org/apache/tuscany/sca/Node.java b/modules/domain-node/src/main/java/org/apache/tuscany/sca/Node.java
index b316ae7..a71611e 100644
--- a/modules/domain-node/src/main/java/org/apache/tuscany/sca/Node.java
+++ b/modules/domain-node/src/main/java/org/apache/tuscany/sca/Node.java
@@ -32,6 +32,7 @@
 import org.apache.tuscany.sca.monitor.ValidationException;
 import org.apache.tuscany.sca.runtime.ActivationException;
 import org.apache.tuscany.sca.runtime.ContributionDescription;
+import org.apache.tuscany.sca.runtime.DOMInvoker;
 import org.oasisopen.sca.NoSuchServiceException;
 
 /**
@@ -215,6 +216,8 @@
      * Would also be convenient to get service proxys as from SCAClientFactory
      */
     <T> T getService(Class<T> interfaze, String serviceURI) throws NoSuchServiceException;    
+    
+    DOMInvoker getDOMInvoker(String serviceURI) throws NoSuchServiceException;
 
     /**
      * Get the URIs of any composites that have been started in the domain
diff --git a/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl.java b/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl.java
index 52a6c7e..c5ae827 100644
--- a/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl.java
+++ b/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl.java
@@ -61,6 +61,7 @@
 import org.apache.tuscany.sca.runtime.CompositeActivator;
 import org.apache.tuscany.sca.runtime.ContributionDescription;
 import org.apache.tuscany.sca.runtime.ContributionListener;
+import org.apache.tuscany.sca.runtime.DOMInvoker;
 import org.apache.tuscany.sca.runtime.DomainRegistry;
 import org.apache.tuscany.sca.runtime.RuntimeProperties;
 import org.oasisopen.sca.NoSuchServiceException;
@@ -653,4 +654,9 @@
         endpointsIncludeDomainName = b;
     }
 
+    @Override
+    public DOMInvoker getDOMInvoker(String serviceURI) throws NoSuchServiceException {
+        return ServiceHelper.getDOMInvoker(serviceURI, domainRegistry, extensionPointRegistry, deployer);
+    }
+
 }
diff --git a/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/ServiceHelper.java b/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/ServiceHelper.java
index 3ada1bb..274b15d 100644
--- a/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/ServiceHelper.java
+++ b/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/ServiceHelper.java
@@ -45,10 +45,12 @@
 import org.apache.tuscany.sca.interfacedef.java.JavaInterface;

 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;

 import org.apache.tuscany.sca.runtime.ContributionDescription;

+import org.apache.tuscany.sca.runtime.DOMInvoker;

 import org.apache.tuscany.sca.runtime.DomainRegistry;

 import org.apache.tuscany.sca.runtime.RuntimeComponent;

 import org.apache.tuscany.sca.runtime.RuntimeComponentReference;

 import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;

+import org.apache.tuscany.sca.runtime.TuscanyServiceReference;

 import org.oasisopen.sca.NoSuchServiceException;

 import org.oasisopen.sca.ServiceRuntimeException;

 import org.oasisopen.sca.annotation.Remotable;

@@ -85,6 +87,30 @@
         }

     }

 

+    public static DOMInvoker getDOMInvoker(String serviceURI, DomainRegistry domainRegistry, ExtensionPointRegistry extensionPointRegistry, Deployer deployer) throws NoSuchServiceException {

+

+        List<Endpoint> endpoints = domainRegistry.findEndpoint(serviceURI);

+        if (endpoints.size() < 1) {

+            throw new NoSuchServiceException(serviceURI);

+        }

+

+        String serviceName = null;

+        if (serviceURI.contains("/")) {

+            int i = serviceURI.indexOf("/");

+            if (i < serviceURI.length() - 1) {

+                serviceName = serviceURI.substring(i + 1);

+            }

+        }

+

+        Endpoint ep = endpoints.get(0);

+        if (((RuntimeComponent)ep.getComponent()).getComponentContext() != null) {

+            return ((TuscanyServiceReference<?>)((RuntimeComponent)ep.getComponent()).getServiceReference(null, serviceName)).getDOMInvoker();

+        } else {

+            throw new NoSuchServiceException(serviceURI);

+//            return getRemoteProxy(interfaze, ep, domainRegistry, extensionPointRegistry, deployer);

+        }

+    }

+

     private static <T> T getRemoteProxy(Class<T> serviceInterface, Endpoint endpoint, DomainRegistry domainRegistry, ExtensionPointRegistry extensionPointRegistry, Deployer deployer) throws NoSuchServiceException {

         FactoryExtensionPoint factories = extensionPointRegistry.getExtensionPoint(FactoryExtensionPoint.class);

         AssemblyFactory assemblyFactory = factories.getFactory(AssemblyFactory.class);

diff --git a/modules/domain-node/src/test/java/org/apache/tuscany/sca/runtime/DOMInvokerTestCase.java b/modules/domain-node/src/test/java/org/apache/tuscany/sca/runtime/DOMInvokerTestCase.java
new file mode 100644
index 0000000..83688b6
--- /dev/null
+++ b/modules/domain-node/src/test/java/org/apache/tuscany/sca/runtime/DOMInvokerTestCase.java
@@ -0,0 +1,72 @@
+/*

+ * 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.sca.runtime;

+

+import java.io.IOException;

+

+import junit.framework.Assert;

+

+import org.apache.tuscany.sca.Node;

+import org.apache.tuscany.sca.TuscanyRuntime;

+import org.apache.tuscany.sca.common.xml.dom.DOMHelper;

+import org.apache.tuscany.sca.core.ExtensionPointRegistry;

+import org.apache.tuscany.sca.impl.NodeImpl;

+import org.junit.Test;

+import org.xml.sax.SAXException;

+

+public class DOMInvokerTestCase {

+

+    private DOMHelper domHelper;

+

+    @Test

+    public void testInstallDeployable() throws Throwable {

+        Node node = TuscanyRuntime.newInstance().createNode("default");

+        node.installContribution("helloworld", "src/test/resources/sample-helloworld.jar", null, null);

+        node.startComposite("helloworld", "helloworld.composite");

+

+        ExtensionPointRegistry registry = ((NodeImpl)node).getExtensionPointRegistry();

+        this.domHelper = DOMHelper.getInstance(registry);

+

+        DOMInvoker domInvoker = node.getDOMInvoker("HelloworldComponent");

+        org.w3c.dom.Node arg = getRequestDOM("petra");

+        org.w3c.dom.Node response = domInvoker.invoke("sayHello", arg);

+        Assert.assertEquals("Hello petra", getResponseString(response));

+    }

+

+    private String getResponseString(org.w3c.dom.Node responseDOM) {

+        String xml = domHelper.saveAsString(responseDOM); 

+        int x = xml.indexOf("<return>") + "<return>".length();

+        int y = xml.indexOf("</return>");

+        return xml.substring(x, y);

+    }

+

+    private org.w3c.dom.Node getRequestDOM(String name) {

+        try {

+

+            String xml = "<ns2:sayHello xmlns:ns2=\"http://sample/\"><arg0>"+ name + "</arg0></ns2:sayHello>";

+            return domHelper.load(xml);

+

+        } catch (IOException e) {

+            throw new RuntimeException(e);

+        } catch (SAXException e) {

+            throw new RuntimeException(e);

+        }

+    }

+

+}

diff --git a/modules/domain-node/src/test/java/org/apache/tuscany/sca/runtime/DynamicTestCase.java b/modules/domain-node/src/test/java/org/apache/tuscany/sca/runtime/DynamicTestCase.java
index f05771e..f1c4545 100644
--- a/modules/domain-node/src/test/java/org/apache/tuscany/sca/runtime/DynamicTestCase.java
+++ b/modules/domain-node/src/test/java/org/apache/tuscany/sca/runtime/DynamicTestCase.java
@@ -42,6 +42,7 @@
 import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;

 import org.apache.tuscany.sca.core.ExtensionPointRegistry;

 import org.apache.tuscany.sca.core.FactoryExtensionPoint;

+import org.apache.tuscany.sca.core.UtilityExtensionPoint;

 import org.apache.tuscany.sca.implementation.java.IntrospectionException;

 import org.apache.tuscany.sca.implementation.java.JavaImplementation;

 import org.apache.tuscany.sca.implementation.java.JavaImplementationFactory;

@@ -64,6 +65,9 @@
         ExtensionPointRegistry extensionPoints = tuscanyRuntime.getExtensionPointRegistry();

         FactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);

 

+        UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);

+        utilities.getUtility(RuntimeProperties.class).getProperties().setProperty(RuntimeProperties.QUIET_LOGGING, "true");

+        

         // Create a contribution

         ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class);

         Contribution contribution = contributionFactory.createContribution();

@@ -96,10 +100,16 @@
         // Now run the composite with a Tuscany Node

         Node node = tuscanyRuntime.createNode();

         node.installContribution(contribution, null);

-        node.startComposite(contribution.getURI(), composite.getURI());

+        

+        for (int i=0; i<2000; i++) {

+            node.startComposite(contribution.getURI(), composite.getURI());

 

-        // test that the service has started and can be invoked

-        testService(node, contribution.getClassLoader());

+            // test that the service has started and can be invoked

+            testService(node, contribution.getClassLoader());

+            

+            node.stopComposite(contribution.getURI(), composite.getURI());

+        }

+        

 

         node.stop();

         tuscanyRuntime.stop();

@@ -107,7 +117,8 @@
 

     private void testService(Node node, ClassLoader classLoader) throws ClassNotFoundException, NoSuchServiceException, NoSuchDomainException, IllegalArgumentException, InvocationTargetException, IllegalAccessException {

         Class<?> interfaze = classLoader.loadClass("sample.Helloworld");

-        Object clientProxy = node.getService(interfaze, "testComponent/Helloworld");

+        Object clientProxy = node.getService(null, "testComponent/Helloworld");

+//        Object clientProxy = SCAClientFactory.newInstance(null).getService(interfaze, "testComponent/Helloworld");

         Method m = interfaze.getMethods()[0]; // the helloworld interface just has a single method "sayHello"

         Object response = m.invoke(clientProxy, new Object[] {"Ariana"});

         Assert.assertEquals("Hello Ariana", response);