diff options
author | wjaniszewski <wjaniszewski@13f79535-47bb-0310-9956-ffa450edef68> | 2009-03-06 21:57:58 +0000 |
---|---|---|
committer | wjaniszewski <wjaniszewski@13f79535-47bb-0310-9956-ffa450edef68> | 2009-03-06 21:57:58 +0000 |
commit | 9320e6220c2a7135e7a2ec16e0b90bb00d65cdc5 (patch) | |
tree | 46625ffb6b7a18e691b0a4833cd8a5250856ee67 /sandbox/wjaniszewski | |
parent | e526f246a6d2ff674975bbdd2a6a36d4cba71d57 (diff) |
Service RPC updated by allowing to have more than one SCA-Erlang module on single SCA-Erlang node
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@751092 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sandbox/wjaniszewski')
12 files changed, 359 insertions, 118 deletions
diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangBindingProviderFactory.java b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangBindingProviderFactory.java index 8953112aaa..f823be2d8f 100644 --- a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangBindingProviderFactory.java +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangBindingProviderFactory.java @@ -19,6 +19,9 @@ package org.apache.tuscany.sca.binding.erlang.impl;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.tuscany.sca.binding.erlang.ErlangBinding;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.provider.BindingProviderFactory;
@@ -31,34 +34,61 @@ import org.apache.tuscany.sca.runtime.RuntimeComponentService; /**
* @version $Rev: $ $Date: $
*/
-public class ErlangBindingProviderFactory implements BindingProviderFactory<ErlangBinding> {
-
- public ErlangBindingProviderFactory(ExtensionPointRegistry registry) {
-
- }
- /**
- * @see org.apache.tuscany.sca.provider.BindingProviderFactory#createReferenceBindingProvider(org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentReference, org.apache.tuscany.sca.assembly.Binding)
- */
- public ReferenceBindingProvider createReferenceBindingProvider(RuntimeComponent component,
- RuntimeComponentReference reference,
- ErlangBinding binding) {
- return new ErlangReferenceBindingProvider(binding, reference);
- }
+public class ErlangBindingProviderFactory implements
+ BindingProviderFactory<ErlangBinding> {
+
+ private Map<String, ErlangNode> nodes = new HashMap<String, ErlangNode>();
+
+ public ErlangBindingProviderFactory(ExtensionPointRegistry registry) {
+
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.provider.BindingProviderFactory#createReferenceBindingProvider(org.apache.tuscany.sca.runtime.RuntimeComponent,
+ * org.apache.tuscany.sca.runtime.RuntimeComponentReference,
+ * org.apache.tuscany.sca.assembly.Binding)
+ */
+ public ReferenceBindingProvider createReferenceBindingProvider(
+ RuntimeComponent component, RuntimeComponentReference reference,
+ ErlangBinding binding) {
+ return new ErlangReferenceBindingProvider(binding, reference);
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.provider.BindingProviderFactory#createServiceBindingProvider(org.apache.tuscany.sca.runtime.RuntimeComponent,
+ * org.apache.tuscany.sca.runtime.RuntimeComponentService,
+ * org.apache.tuscany.sca.assembly.Binding)
+ */
+ public ServiceBindingProvider createServiceBindingProvider(
+ RuntimeComponent component, RuntimeComponentService service,
+ ErlangBinding binding) {
+ ServiceBindingProvider provider = null;
+ try {
+ provider = new ErlangServiceBindingProvider(getErlangNode(binding
+ .getNode()), binding, service);
+ } catch (Exception e) {
+ // TODO: log, throw, do something with this error
+ e.printStackTrace();
+ }
+ return provider;
+ }
- /**
- * @see org.apache.tuscany.sca.provider.BindingProviderFactory#createServiceBindingProvider(org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentService, org.apache.tuscany.sca.assembly.Binding)
- */
- public ServiceBindingProvider createServiceBindingProvider(RuntimeComponent component,
- RuntimeComponentService service,
- ErlangBinding binding) {
- return new ErlangServiceBindingProvider(binding, service);
- }
+ /**
+ * @see org.apache.tuscany.sca.provider.ProviderFactory#getModelType()
+ */
+ public Class<ErlangBinding> getModelType() {
+ return ErlangBinding.class;
+ }
- /**
- * @see org.apache.tuscany.sca.provider.ProviderFactory#getModelType()
- */
- public Class<ErlangBinding> getModelType() {
- return ErlangBinding.class;
- }
+ private ErlangNode getErlangNode(String name) throws Exception {
+ ErlangNode result = null;
+ if (nodes.containsKey(name)) {
+ result = nodes.get(name);
+ } else {
+ result = new ErlangNode(name);
+ nodes.put(name, result);
+ }
+ return result;
+ }
}
diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangNode.java b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangNode.java new file mode 100644 index 0000000000..a5cfbe6d90 --- /dev/null +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangNode.java @@ -0,0 +1,83 @@ +package org.apache.tuscany.sca.binding.erlang.impl; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.apache.tuscany.sca.binding.erlang.ErlangBinding; +import org.apache.tuscany.sca.binding.erlang.impl.exceptions.ErlangException; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; + +import com.ericsson.otp.erlang.OtpConnection; +import com.ericsson.otp.erlang.OtpSelf; + +public class ErlangNode implements Runnable { + + private Map<String, RuntimeComponentService> services = new HashMap<String, RuntimeComponentService>(); + private Map<String, ErlangBinding> bindings = new HashMap<String, ErlangBinding>(); + private String name; + private OtpSelf self; + private ExecutorService executors; + private boolean stopRequested; + + public ErlangNode(String name) throws Exception { + this.name = name; + self = new OtpSelf(name); + boolean registered = self.publishPort(); + if (!registered) { + // TODO: externalize messages? + throw new ErlangException( + "Problem with publishing service under epmd server."); + } + } + + private void stop() { + stopRequested = true; + executors.shutdownNow(); + } + + public void run() { + executors = Executors.newFixedThreadPool(10); + while (!stopRequested) { + try { + OtpConnection connection = self.accept(); + executors.execute(new RpcExecutor(services, bindings, + connection)); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + } + } + } + + public void registerModule(ErlangBinding binding, + RuntimeComponentService service) throws ErlangException { + if (services.containsKey(binding.getModule())) { + // TODO: externalize message + // TODO: really want to throw exception? Log only? + throw new ErlangException("Module " + binding.getModule() + + " already defined under " + name + + " node. Duplicate module won't be started"); + } else { + if (services.size() == 0) { + // TODO: should ErlangNode manage its thread? + Thread selfThread = new Thread(this); + selfThread.start(); + } + services.put(binding.getModule(), service); + bindings.put(binding.getModule(), binding); + } + } + + public void unregisterModule(ErlangBinding binding) throws ErlangException { + if (services.containsKey(binding.getModule())) { + services.remove(binding.getModule()); + bindings.remove(binding.getModule()); + if (services.size() == 0) { + stop(); + } + } + } + +} diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangServiceBindingProvider.java b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangServiceBindingProvider.java index df82c5813c..651067f4e7 100644 --- a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangServiceBindingProvider.java +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangServiceBindingProvider.java @@ -31,12 +31,13 @@ import org.osoa.sca.ServiceRuntimeException; public class ErlangServiceBindingProvider implements ServiceBindingProvider {
private RuntimeComponentService service;
+ private ErlangNode node;
private ErlangBinding binding;
- private RpcServer rpcServer;
- public ErlangServiceBindingProvider(ErlangBinding binding, RuntimeComponentService service) {
+ public ErlangServiceBindingProvider(ErlangNode node, ErlangBinding binding, RuntimeComponentService service) {
this.service = service;
this.binding = binding;
+ this.node = node;
}
/**
@@ -51,9 +52,7 @@ public class ErlangServiceBindingProvider implements ServiceBindingProvider { */
public void start() {
try {
- rpcServer = new RpcServer(service, binding);
- Thread thread = new Thread(rpcServer);
- thread.start();
+ node.registerModule(binding, service);
} catch (Exception e) {
throw new ServiceRuntimeException(e);
}
@@ -65,7 +64,7 @@ public class ErlangServiceBindingProvider implements ServiceBindingProvider { */
public void stop() {
try {
- rpcServer.stop();
+ node.unregisterModule(binding);
} catch (Exception e) {
throw new ServiceRuntimeException(e);
}
diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/RpcExecutor.java b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/RpcExecutor.java index 6707496194..03e83cec61 100644 --- a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/RpcExecutor.java +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/RpcExecutor.java @@ -22,6 +22,7 @@ package org.apache.tuscany.sca.binding.erlang.impl; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.List; +import java.util.Map; import org.apache.tuscany.sca.binding.erlang.ErlangBinding; import org.apache.tuscany.sca.binding.erlang.impl.types.TypeHelpersProxy; @@ -40,18 +41,18 @@ import com.ericsson.otp.erlang.OtpErlangTuple; public class RpcExecutor implements Runnable { - private RuntimeComponentService service; - private ErlangBinding binding; + private Map<String, RuntimeComponentService> services; + private Map<String, ErlangBinding> bindings; private OtpConnection connection; private static final OtpErlangAtom OK = new OtpErlangAtom("ok"); private static final OtpErlangAtom ERROR = new OtpErlangAtom("error"); private static final OtpErlangAtom BADRPC = new OtpErlangAtom("badrpc"); - public RpcExecutor(RuntimeComponentService service, ErlangBinding binding, + public RpcExecutor(Map<String, RuntimeComponentService> services, Map<String, ErlangBinding> bindings, OtpConnection connection) { - this.service = service; - this.binding = binding; + this.bindings = bindings; + this.services = services; this.connection = connection; } @@ -85,13 +86,15 @@ public class RpcExecutor implements Runnable { } else { argsList = new OtpErlangList(args); } - if (!binding.getModule().equals(module)) { + if (!services.containsKey(module)) { // TODO: externalize message? OtpErlangObject errorMsg = MessageHelper.functionUndefMessage( module, function, argsList, "Module not found in SCA component."); sendMessage(connection, senderPid, senderRef, BADRPC, errorMsg); } else { + RuntimeComponentService service = services.get(module); + ErlangBinding binding = bindings.get(module); List<Operation> operations = service.getInterfaceContract() .getInterface().getOperations(); Operation operation = null; diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/RpcServer.java b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/RpcServer.java deleted file mode 100644 index ab10865c83..0000000000 --- a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/RpcServer.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.binding.erlang.impl; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import org.apache.tuscany.sca.binding.erlang.ErlangBinding; -import org.apache.tuscany.sca.binding.erlang.impl.exceptions.ErlangException; -import org.apache.tuscany.sca.runtime.RuntimeComponentService; - -import com.ericsson.otp.erlang.OtpConnection; -import com.ericsson.otp.erlang.OtpSelf; - -public class RpcServer implements Runnable { - - private RuntimeComponentService service; - private ErlangBinding binding; - private OtpSelf self; - ExecutorService executors; - private boolean stopRequested; - - public RpcServer(RuntimeComponentService service, ErlangBinding binding) throws Exception { - this.service = service; - this.binding = binding; - self = new OtpSelf(binding.getNode()); - boolean registered = self.publishPort(); - if (!registered) { - //TODO: externalize messages? - throw new ErlangException("Problem with publishing service under epmd server."); - } - executors = Executors.newFixedThreadPool(10); - } - - public void stop() { - stopRequested = true; - executors.shutdownNow(); - } - - public void run() { - while (!stopRequested) { - try { - OtpConnection connection = self.accept(); - executors.execute(new RpcExecutor(service, binding, connection)); - } catch (Exception e) { - // TODO: handle exception - e.printStackTrace(); - } - } - } - -} diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/exceptions/ErlangException.java b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/exceptions/ErlangException.java index 6ae919b969..cf573def95 100644 --- a/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/exceptions/ErlangException.java +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/exceptions/ErlangException.java @@ -2,8 +2,14 @@ package org.apache.tuscany.sca.binding.erlang.impl.exceptions; public class ErlangException extends Exception { + private static final long serialVersionUID = 1L; + public ErlangException(String message) { super(message); } + public ErlangException(String message, Throwable cause) { + super(message, cause); + } + } diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ReferenceServiceTestCase.java b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ReferenceServiceTestCase.java index 04adb60adb..34efb04812 100644 --- a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ReferenceServiceTestCase.java +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ReferenceServiceTestCase.java @@ -33,6 +33,7 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; +import org.osoa.sca.ServiceRuntimeException; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangDouble; @@ -43,6 +44,7 @@ import com.ericsson.otp.erlang.OtpErlangTuple; import com.ericsson.otp.erlang.OtpMbox; import com.ericsson.otp.erlang.OtpNode; +//this test runner will ignore tests if epmd is not available @RunWith(IgnorableRunner.class) public class ReferenceServiceTestCase { @@ -50,6 +52,7 @@ public class ReferenceServiceTestCase { private static MboxInterface mboxReference; private static ServiceInterface moduleReference; + private static ServiceInterface clonedModuleReference; private static OtpNode node; private static OtpMbox mbox; private static Process epmdProcess; @@ -65,6 +68,7 @@ public class ReferenceServiceTestCase { ReferenceTestComponentImpl.class, "ReferenceTest"); mboxReference = component.getMboxReference(); moduleReference = component.getModuleReference(); + clonedModuleReference = component.getClonedModuleReference(); node = new OtpNode("MboxServer"); mbox = node.createMbox("sendArgs"); } catch (IOException e) { @@ -87,6 +91,11 @@ public class ReferenceServiceTestCase { } } + /** + * Tests passing strings + * + * @throws Exception + */ @Test(timeout = 1000) public void testStrings() throws Exception { String strArg = "Test message"; @@ -100,6 +109,11 @@ public class ReferenceServiceTestCase { assertEquals(strResult, testResult); } + /** + * Tests passing booleans + * + * @throws Exception + */ @Test(timeout = 1000) public void testBooleans() throws Exception { boolean booleanArg = true; @@ -113,6 +127,11 @@ public class ReferenceServiceTestCase { assertEquals(booleanResult, testResult); } + /** + * Tests passing floats + * + * @throws Exception + */ @Test(timeout = 1000) public void testFloats() throws Exception { float floatArg = 1.0f; @@ -126,6 +145,11 @@ public class ReferenceServiceTestCase { assertEquals(floatResult, testResult, 0); } + /** + * Tests passing doubles + * + * @throws Exception + */ @Test(timeout = 1000) public void testDoubles() throws Exception { double doubleArg = 1.0f; @@ -139,6 +163,11 @@ public class ReferenceServiceTestCase { assertEquals(doubleResult, testResult, 0); } + /** + * Tests passing long values + * + * @throws Exception + */ @Test(timeout = 1000) public void testLongs() throws Exception { long longArg = 1; @@ -152,6 +181,11 @@ public class ReferenceServiceTestCase { assertEquals(longResult, testResult, 0); } + /** + * Tests passing integers + * + * @throws Exception + */ @Test(timeout = 1000) public void testInts() throws Exception { int intArg = 1; @@ -165,6 +199,11 @@ public class ReferenceServiceTestCase { assertEquals(intResult, testResult, 0); } + /** + * Tests passing chars + * + * @throws Exception + */ @Test(timeout = 1000) public void testChars() throws Exception { char charArg = 1; @@ -178,6 +217,11 @@ public class ReferenceServiceTestCase { assertEquals(charResult, testResult, 0); } + /** + * Tests passing shorts + * + * @throws Exception + */ @Test(timeout = 1000) public void testShorts() throws Exception { short shortArg = 1; @@ -191,6 +235,11 @@ public class ReferenceServiceTestCase { assertEquals(shortResult, testResult, 0); } + /** + * Tests passing bytes + * + * @throws Exception + */ @Test(timeout = 1000) public void testBytes() throws Exception { byte byteArg = 1; @@ -204,6 +253,11 @@ public class ReferenceServiceTestCase { assertEquals(byteResult, testResult, 0); } + /** + * Tests passing multiple arguments + * + * @throws Exception + */ @Test(timeout = 1000) public void testMultipleArguments() throws Exception { MboxListener mboxListener = new MboxListener(mbox, true); @@ -219,6 +273,11 @@ public class ReferenceServiceTestCase { .getMsg()).elementAt(1)).stringValue()); } + /** + * Tests passing tuples + * + * @throws Exception + */ @Test(timeout = 1000) public void testTuples() throws Exception { StructuredTuple tupleResult = new StructuredTuple(); @@ -250,6 +309,11 @@ public class ReferenceServiceTestCase { .booleanValue()); } + /** + * Tests passing lists + * + * @throws Exception + */ @Test(timeout = 1000) public void testLists() throws Exception { String[] testArg = new String[] { "One", "Two", "Three" }; @@ -269,6 +333,11 @@ public class ReferenceServiceTestCase { } } + /** + * Tests passing multidimensional lists + * + * @throws Exception + */ @Test(timeout = 1000) public void testMultiDimLists() throws Exception { String[][] testArg = new String[][] { { "One", "Two" }, @@ -294,6 +363,11 @@ public class ReferenceServiceTestCase { } } + /** + * Tests mismatched interface + * + * @throws Exception + */ @Test(timeout = 1000) public void typeMismatch() throws Exception { try { @@ -418,6 +492,11 @@ public class ReferenceServiceTestCase { } } + /** + * Basic RPC test, without arguments + * + * @throws Exception + */ @Test(timeout = 1000) public void testRPC() throws Exception { String[] result = moduleReference.sayHellos(); @@ -426,6 +505,11 @@ public class ReferenceServiceTestCase { assertEquals("2", result[1]); } + /** + * Tests RPC with arguments + * + * @throws Exception + */ @Test(timeout = 1000) public void testRPCWithArgs() throws Exception { String arg1 = "One"; @@ -434,6 +518,11 @@ public class ReferenceServiceTestCase { assertEquals("Hello " + arg1 + " " + arg2, testResult); } + /** + * Tests RPC with structured arguments + * + * @throws Exception + */ @Test(timeout = 1000) public void testRPCWithComplexArgs() throws Exception { StructuredTuple arg = new StructuredTuple(); @@ -443,34 +532,39 @@ public class ReferenceServiceTestCase { new String[] { "some", "array" }); assertEquals(arg, testResult); } - + + /** + * Tests handling requests pointing to unknown functions + * + * @throws Exception + */ @Test(timeout = 1000) public void testUnknownFunction() throws Exception { - - //following functions differs by parameters - + + // following functions differs by parameters + try { moduleReference.sayHello(); } catch (Exception e) { assertEquals(ErlangException.class, e.getClass()); } - + try { moduleReference.sayHello("1"); } catch (Exception e) { assertEquals(ErlangException.class, e.getClass()); } - + try { moduleReference.sayHello(1, 2); } catch (Exception e) { assertEquals(ErlangException.class, e.getClass()); } - - //for following ones name not exists - + + // for following ones name not exists + moduleReference.notExist(); - + try { moduleReference.notExistWithException(); } catch (Exception e) { @@ -478,4 +572,35 @@ public class ReferenceServiceTestCase { } } + /** + * Tests using multiple Erlang modules on one SCA Erlang node + * + * @throws Exception + */ + @Test(timeout = 1000) + public void testMultipleModulesOnNode() throws Exception { + String[] mr = moduleReference.sayHellos(); + String[] cmr = clonedModuleReference.sayHellos(); + assertEquals("1", mr[0]); + assertEquals("2", mr[1]); + + assertEquals("-1", cmr[0]); + assertEquals("-2", cmr[1]); + } + + /** + * Tests nodes with duplcated components (the same node and module + * parameters) + * + * @throws Exception + */ + @Test(timeout = 1000) + public void testModuleDuplicatedOnNode() throws Exception { + try { + SCADomain.newInstance("ErlangServiceModuleDuplicate.composite"); + } catch (ServiceRuntimeException e) { + assertEquals(ErlangException.class, e.getCause().getClass()); + } + } + } diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ReferenceTestComponentImpl.java b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ReferenceTestComponentImpl.java index f9f9a99054..919ca64568 100644 --- a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ReferenceTestComponentImpl.java +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ReferenceTestComponentImpl.java @@ -6,6 +6,7 @@ public class ReferenceTestComponentImpl implements ReferenceTestComponent { private MboxInterface mboxReference; private ServiceInterface moduleReference; + private ServiceInterface clonedModuleReference; @Reference public void setMboxReference(MboxInterface mboxReference) { @@ -16,6 +17,11 @@ public class ReferenceTestComponentImpl implements ReferenceTestComponent { public void setModuleReference(ServiceInterface moduleReference) { this.moduleReference = moduleReference; } + + @Reference + public void setClonedModuleReference(ServiceInterface clonedModuleReference) { + this.clonedModuleReference = clonedModuleReference; + } public MboxInterface getMboxReference() { return mboxReference; @@ -24,5 +30,9 @@ public class ReferenceTestComponentImpl implements ReferenceTestComponent { public ServiceInterface getModuleReference() { return moduleReference; } + + public ServiceInterface getClonedModuleReference() { + return clonedModuleReference; + } } diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ServiceTestComponentImplClone.java b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ServiceTestComponentImplClone.java new file mode 100644 index 0000000000..98921bd24d --- /dev/null +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/java/org/apache/tuscany/sca/binding/erlang/testing/ServiceTestComponentImplClone.java @@ -0,0 +1,19 @@ +package org.apache.tuscany.sca.binding.erlang.testing; + + +public class ServiceTestComponentImplClone implements ServiceTestComponent { + + public String sayHello(String arg1, String arg2) { + return "Bye " + arg1 + " " + arg2; + } + + public String[] sayHellos() { + String[] result = new String[] {"-1", "-2"}; + return result; + } + + public StructuredTuple passComplexArgs(StructuredTuple arg1, String[] arg2) { + return arg1; + } + +} diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangReference.composite b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangReference.composite index 7b283a1047..a27fd224c2 100644 --- a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangReference.composite +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangReference.composite @@ -13,6 +13,10 @@ <reference name="moduleReference"> <tuscany:binding.erlang node="RPCServer" module="hello"/> </reference> + + <reference name="clonedModuleReference"> + <tuscany:binding.erlang node="RPCServer" module="hello_clone"/> + </reference> </component> </composite>
\ No newline at end of file diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangService.composite b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangService.composite index 516a971ac4..441819b95d 100644 --- a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangService.composite +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangService.composite @@ -11,5 +11,13 @@ <interface.java interface="org.apache.tuscany.sca.binding.erlang.testing.ServiceTestComponent" /> <tuscany:binding.erlang node="RPCServer" module="hello"/> </service> + + <component name="ServiceTestClone"> + <implementation.java class="org.apache.tuscany.sca.binding.erlang.testing.ServiceTestComponentImplClone" /> + </component> + <service name="ServiceTestClone" promote="ServiceTestClone"> + <interface.java interface="org.apache.tuscany.sca.binding.erlang.testing.ServiceTestComponent" /> + <tuscany:binding.erlang node="RPCServer" module="hello_clone"/> + </service> </composite>
\ No newline at end of file diff --git a/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangServiceModuleDuplicate.composite b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangServiceModuleDuplicate.composite new file mode 100644 index 0000000000..008b186955 --- /dev/null +++ b/sandbox/wjaniszewski/binding-erlang-runtime/src/test/resources/ErlangServiceModuleDuplicate.composite @@ -0,0 +1,23 @@ +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" + targetNamespace="http://sample" + xmlns:sample="http://sample" + name="ErlangServiceBinding"> + + <component name="ServiceTest"> + <implementation.java class="org.apache.tuscany.sca.binding.erlang.testing.ServiceTestComponentImpl" /> + </component> + <service name="ServiceTest" promote="ServiceTest"> + <interface.java interface="org.apache.tuscany.sca.binding.erlang.testing.ServiceTestComponent" /> + <tuscany:binding.erlang node="DuplicateTest" module="hello"/> + </service> + + <component name="ServiceTestClone"> + <implementation.java class="org.apache.tuscany.sca.binding.erlang.testing.ServiceTestComponentImplClone" /> + </component> + <service name="ServiceTestClone" promote="ServiceTestClone"> + <interface.java interface="org.apache.tuscany.sca.binding.erlang.testing.ServiceTestComponent" /> + <tuscany:binding.erlang node="DuplicateTest" module="hello"/> + </service> + +</composite>
\ No newline at end of file |