From fce6ad4c30b15b4284a94e7a00e084bf18748cf2 Mon Sep 17 00:00:00 2001 From: wjaniszewski Date: Fri, 20 Mar 2009 14:23:51 +0000 Subject: Added configurable timeout and cookies for service bindings. Consequence is that one SCA-Erlang node is created excusively for one service binding, so service bindings cannot share the same value in 'node' attribute like it was before. Made some other fixes. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@756480 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/binding/erlang/impl/ErlangNode.java | 87 +++++++--------------- 1 file changed, 26 insertions(+), 61 deletions(-) (limited to 'sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangNode.java') 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 index beeec9fffb..94bac31809 100644 --- 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 @@ -46,16 +46,15 @@ public class ErlangNode implements Runnable { private static final Logger logger = Logger.getLogger(ErlangNode.class .getName()); - private Map erlangModules = new HashMap(); - private ErlangNodeElement erlangMbox; - private boolean mboxNode; + private ErlangNodeElement nodeElement; private String name; private OtpSelf self; private ExecutorService executors; private boolean stopRequested; private Map> groupedOperations; - public ErlangNode(String name) throws Exception { + public ErlangNode(String name, ErlangBinding binding, + RuntimeComponentService service) throws Exception { this.name = name; self = new OtpSelf(name); boolean registered = self.publishPort(); @@ -64,9 +63,13 @@ public class ErlangNode implements Runnable { throw new ErlangException( "Problem with publishing service under epmd server."); } + if (binding.hasCookie()) { + self.setCookie(binding.getCookie()); + } + registerBinding(binding, service); } - private void stop() { + public void stop() { stopRequested = true; executors.shutdownNow(); } @@ -78,76 +81,38 @@ public class ErlangNode implements Runnable { try { OtpConnection connection = self.accept(); executors.execute(new ServiceExecutor(connection, - groupedOperations, erlangModules, erlangMbox, name)); + groupedOperations, nodeElement, name)); } catch (IOException e) { // TODO: externalzie message? logger.log(Level.WARNING, "Error occured while accepting connection on '" + name - + "' node"); + + "' node", e); } catch (OtpAuthException e) { - // TODO: log bad authentication attempt + // TODO: externalize message? + logger.log(Level.WARNING, "Error while authenticating client", e); } } } - public void registerBinding(ErlangBinding binding, + private void registerBinding(ErlangBinding binding, RuntimeComponentService service) throws ErlangException { if (binding.isMbox()) { - if (mboxNode) { - // TODO: externalize message? - // NOTE: if mbox registered more than once for node then - // exception will be thrown - throw new ErlangException("Node " + binding.getNode() - + " already defined as mbox node"); - } else { - List operations = service.getInterfaceContract() - .getInterface().getOperations(); - groupedOperations = new HashMap>(); - for (Operation operation : operations) { - List operationsGroup = groupedOperations - .get(operation.getName()); - if (operationsGroup == null) { - operationsGroup = new ArrayList(); - groupedOperations.put(operation.getName(), - operationsGroup); - } - operationsGroup.add(operation); - } - mboxNode = true; - erlangMbox = new ErlangNodeElement(); - erlangMbox.setService(service); - erlangMbox.setBinding(binding); - } - } else { - if (erlangModules.containsKey(binding.getModule())) { - // TODO: externalize message? - // NOTE: if the same module was registered more than once than - // exception will be thrown - throw new ErlangException("Module " + binding.getModule() - + " already defined under " + name - + " node. Duplicate module won't be started"); - } else { - if (erlangModules.size() == 0) { - // NOTE: Erlang node is managing it's thread by itself. Just noticing. - Thread selfThread = new Thread(this); - selfThread.start(); + List operations = service.getInterfaceContract() + .getInterface().getOperations(); + groupedOperations = new HashMap>(); + for (Operation operation : operations) { + List operationsGroup = groupedOperations + .get(operation.getName()); + if (operationsGroup == null) { + operationsGroup = new ArrayList(); + groupedOperations.put(operation.getName(), operationsGroup); } - ErlangNodeElement module = new ErlangNodeElement(); - module.setService(service); - module.setBinding(binding); - erlangModules.put(binding.getModule(), module); - } - } - } - - public void unregisterBinding(ErlangBinding binding) throws ErlangException { - if (erlangModules.containsKey(binding.getModule())) { - erlangModules.remove(binding.getModule()); - erlangModules.remove(binding.getModule()); - if (erlangModules.size() == 0) { - stop(); + operationsGroup.add(operation); } } + nodeElement = new ErlangNodeElement(); + nodeElement.setService(service); + nodeElement.setBinding(binding); } } -- cgit v1.2.3