package org.kevoree.library.voldemortChannels; import org.kevoree.ContainerNode; import org.kevoree.ContainerRoot; import org.kevoree.Group; import org.kevoree.annotation.*; import org.kevoree.framework.AbstractComponentType; import org.kevoree.framework.KevoreeFragmentPropertyHelper; import org.kevoree.framework.KevoreePlatformHelper; import org.kevoree.framework.message.Message; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import voldemort.client.StoreClient; import voldemort.cluster.Node; import voldemort.versioning.Versioned; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; /** * Created by jed * User: jedartois@gmail.com * Date: 19/04/12 * Time: 17:33 */ @Library(name="JavaSE") @Provides({ @ProvidedPort(name = "msg", type = PortType.MESSAGE) }) @ComponentType public class GatewayVoldemortArduino extends AbstractComponentType implements Runnable { private Logger logger = LoggerFactory.getLogger(GatewayVoldemortArduino.class); private List<Node> nodes = new ArrayList<Node>(); private Thread thread; private Node currentNode=null; @Start public void start() { thread = new Thread(this); thread.start(); } @Stop public void stop() { //NOP } @Update public void update() { nodes.clear(); thread.start(); } @Port(name = "msg") public void appendIncoming(Object msg) { if(msg instanceof Message) { Message currentmsg = (Message) msg; String remoteNodeName = currentmsg.getDestNodeName(); KClient t = new KClient(currentNode,nodes); StoreClient store = t.getStore("kevoree"); Versioned data = store.get(remoteNodeName); Versioned<Message> version=null; if(data !=null) { // get the value version = store.get(remoteNodeName); // modify the value version.setObject(currentmsg); // update the value store.put(remoteNodeName,version); }else { store.put(remoteNodeName,msg); } } } public String getAddressModel(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 List<String> getAllNodes () { ContainerRoot model = this.getModelService().getLastModel(); for (Object o : model.getGroupsForJ()) { Group g = (Group) o; List<String> peers = new ArrayList<String>(g.getSubNodes().size()); for (ContainerNode node : g.getSubNodesForJ()) { peers.add(node.getName()); } return peers; } return new ArrayList<String>(); } public int getport(String nodeName,String port) throws IOException { try { //logger.debug("look for port on " + nodeName); return KevoreeFragmentPropertyHelper.getIntPropertyFromFragmentChannel(getModelService().getLastModel(), getName(), port, nodeName); } catch (NumberFormatException e) { throw new IOException(e.getMessage()); } } @Override public void run() { try { List<String> listNodes = getAllNodes(); logger.error("Number of node "+listNodes.size()); for(String _node : listNodes) { String hostname = getAddressModel(_node); int id =getport(_node, "id"); int httpPort = getport(_node, "httpPort"); int socketPort = getport(_node, "socketPort"); int adminPort = getport(_node, "adminPort"); String partition = KevoreeFragmentPropertyHelper.getPropertyFromFragmentChannel(getModelService().getLastModel(), getName(), "partitions", _node); List<Integer> partitions = new ArrayList<Integer>(); StringTokenizer st = new StringTokenizer(partition, ";"); while (st.hasMoreTokens()) { partitions.add(Integer.parseInt(st.nextToken())); } logger.error("Node "+id+" httpPort="+httpPort+" "+" socketPort="+socketPort+" adminPort="+adminPort+" partitions="+partitions); Node node = new Node(id,hostname,httpPort,socketPort,adminPort,partitions); nodes.add(node); if(_node.equals(getNodeName())) { currentNode = node; } } } catch (IOException e) { logger.error("The cluster can't be configure "+e); } } }