diff options
Diffstat (limited to 'sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangNode.java')
-rw-r--r-- | sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangNode.java | 83 |
1 files changed, 83 insertions, 0 deletions
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(); + } + } + } + +} |