summaryrefslogtreecommitdiffstats
path: root/sandbox/wjaniszewski/binding-erlang-runtime/src/main/java/org/apache/tuscany/sca/binding/erlang/impl/ErlangNode.java
diff options
context:
space:
mode:
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.java83
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();
+ }
+ }
+ }
+
+}