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 services = new HashMap(); private Map bindings = new HashMap(); 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(); } } } }