/******************************************************************************* * Copyright (c) 2014 EURA NOVA. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Aldemar Reynaga - initial API and implementation * Salim Jouili - initial API and implementation ******************************************************************************/ package com.steffi.traversal; import java.io.IOException; import java.util.Date; import org.zeromq.ZMQ; import org.zeromq.ZMQ.Context; import org.zeromq.ZMQ.Socket; import com.steffi.common.CommonTools; import com.steffi.model.SteffiGraph; import com.steffi.model.SteffiVertex; import com.steffi.networking.messages.Message; import com.steffi.networking.messages.TraversalRepMsg; import com.steffi.networking.messages.TraversalReqMsg; /** * @author Aldemar Reynaga * The point of access to the traversal engine */ public class DistributedTraversal extends SimpleTraversal { private MatchEvaluatorConf matchEvaluatorConf; private Context context; private Socket requester; private int managerIndex; public DistributedTraversal() { SteffiGraph graph = SteffiGraph.getInstance(); context = graph.getZMQContext(); // Socket to talk to server requester = context.socket(ZMQ.REQ); managerIndex = graph.getNextTraversalManagerIndex(); requester.connect("tcp://" + graph.getTraversalManagerIps()[managerIndex]); } public void close() { requester.close(); } public void setMatchEvaluatorConf(MatchEvaluatorConf matchEvaluatorConf) { this.matchEvaluatorConf = matchEvaluatorConf; } private TraversalReqMsg prepareRequestMsg(SteffiVertex vertex) throws IOException { TraversalReqMsg traversalReqMsg = new TraversalReqMsg(); traversalReqMsg.setMaxHops(hops); traversalReqMsg.setTraversalConfs(edgeTraversalConfs); traversalReqMsg.setVertexId(vertex.getId()); traversalReqMsg.setMatchConf(matchEvaluatorConf); traversalReqMsg.setNodeIp(CommonTools.getLocalIP()); traversalReqMsg.setManagerIndex(managerIndex); return traversalReqMsg; } private TraversalRepMsg readTraversalRepMsg(byte [] msg) throws IOException, ClassNotFoundException { return (TraversalRepMsg) Message.readFromBytes(msg); } @Override public void addEvaluators(Evaluator... evaluators) { throw new UnsupportedOperationException("In distributed traversals the evaluators are " + "set by the match evaluator configuration"); } @Override public TraversalResults traverse(SteffiVertex startVertex) { TraversalResults results = null; Date startDate, endDate; // Socket to talk to server try { startDate = new Date(); Message message = prepareRequestMsg(startVertex); requester.send(Message.convertMessageToBytes(message), 0); byte[] reply = requester.recv(0); TraversalRepMsg traversalRepMsg = (TraversalRepMsg) Message.readFromBytes(reply); if (traversalRepMsg.isCompletedSuccesfully()) { results = readTraversalRepMsg(reply).getTraversalResults(); endDate = new Date(); results.setTime(endDate.getTime() - startDate.getTime()); } } catch (Exception x) { x.printStackTrace(); } return results; } }