package org.kevoree.library.ws; import org.kevoree.annotation.*; import org.kevoree.annotation.ChannelTypeFragment; import org.kevoree.framework.*; import org.kevoree.framework.message.Message; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.InetSocketAddress; import java.net.URI; import java.util.HashMap; import java.util.Map; /** * Created by IntelliJ IDEA. * User: duke * Date: 14/02/12 * Time: 22:27 */ @Library(name = "JavaSE") @ChannelTypeFragment @DictionaryType({ @DictionaryAttribute(name = "port", optional = false, fragmentDependant = true) } ) public class WsChannel extends AbstractChannelFragment { private WsServer wsServer = null; private Logger logger = LoggerFactory.getLogger(WsChannel.class); private Map<String, WsSocketClient> csClients = null; @Start public void startWsChannel() throws Exception { csClients = new HashMap<String, WsSocketClient>(); int port = parsePortNumber(getNodeName()); logger.debug("Start WS on port " + port); wsServer = new WsServer(new InetSocketAddress("0.0.0.0", port), this); wsServer.start(); } @Stop public void stopWsChannel() throws Exception { for (WsSocketClient client : csClients.values()) { client.close(); } wsServer.stop(); wsServer = null; } @Update public void updateWsChannel() throws Exception { stopWsChannel(); startWsChannel(); } @Override public Object dispatch(Message message) { for (org.kevoree.framework.KevoreePort p : getBindedPorts()) { forward(p, message); } for (KevoreeChannelFragment cf : getOtherFragments()) { if (!message.getPassedNodes().contains(cf.getNodeName())) { forward(cf, message); } } /* try { wsServer.sendToAll(message.getContent().toString()); } catch (Exception e){ e.printStackTrace(); }*/ return null; } @Override public ChannelFragmentSender createSender(final String remoteNodeName, final String remoteChannelName) { return new ChannelFragmentSender() { @Override public Object sendMessageToRemote(Message message) { try { WsSocketClient client = null; if(!csClients.containsKey(remoteNodeName)){ WsSocketClient newClient = new WsSocketClient(new URI("ws://"+getAddress(remoteNodeName)+":"+parsePortNumber(remoteNodeName))); csClients.put(remoteNodeName,newClient); newClient.connect(); client = newClient; } else { client = csClients.get(remoteNodeName); } client.sendMessage(message); } catch (Exception e) { logger.error("Error while sending message to " + remoteNodeName + "-" + remoteChannelName); } return null; } }; } public String getAddress(String remoteNodeName) { String ip = KevoreePlatformHelper.getProperty(this.getModelService().getLastModel(), remoteNodeName, org.kevoree.framework.Constants.KEVOREE_PLATFORM_REMOTE_NODE_IP()); if (ip == null || ip.equals("")) { ip = "127.0.0.1"; } return ip; } public int parsePortNumber(String nodeName) throws IOException { try { //logger.debug("look for port on " + nodeName); return KevoreeFragmentPropertyHelper .getIntPropertyFromFragmentChannel(this.getModelService().getLastModel(), this.getName(), "port", nodeName); } catch (NumberFormatException e) { throw new IOException(e.getMessage()); } } }