package com.robonobo.mina.message.handlers;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.robonobo.common.util.TimeUtil;
import com.robonobo.core.api.proto.CoreApi.Node;
import com.robonobo.mina.message.MessageHolder;
import com.robonobo.mina.message.proto.MinaProtocol.AdvSource;
import com.robonobo.mina.message.proto.MinaProtocol.GotSource;
import com.robonobo.mina.network.ControlConnection;
public class AdvSourceHandler extends AbstractMessageHandler {
@Override
public void handleMessage(MessageHolder mh) {
AdvSource as = (AdvSource) mh.getMessage();
ControlConnection cc = mh.getFromCC();
if (cc.isLocal()) {
List<Node> sources = new ArrayList<Node>();
sources.add(cc.getNode());
for (String streamId : as.getStreamIdList()) {
GotSource gs = GotSource.newBuilder().setStreamId(streamId).addAllNode(sources).build();
MessageHolder gsMh = new MessageHolder("GotSource", gs, cc, TimeUtil.now());
mina.getMessageMgr().getHandler("GotSource").handleMessage(gsMh);
}
}
if (mina.getConfig().isSupernode()) {
// Don't pass on the local attr to searchers
Node sourceNode = Node.newBuilder(cc.getNode()).setLocal(false).build();
Map<String, List<Node>> searcherMap = mina.getSupernodeMgr().notifyAdvSource(mh);
for (String streamId : as.getStreamIdList()) {
List<Node> searchers = searcherMap.get(streamId);
if (searchers.size() > 0) {
GotSource gs = GotSource.newBuilder().setStreamId(streamId).addNode(sourceNode).build();
for (Node node : searchers) {
// Don't send advert back to sender
if (!node.getId().equals(cc.getNodeId())) {
ControlConnection sendCC = mina.getCCM().getCCWithId(node.getId());
if (sendCC != null)
sendCC.sendMessage("GotSource", gs);
}
}
}
}
}
}
@Override
public AdvSource parse(String cmdName, InputStream is) throws IOException {
return AdvSource.newBuilder().mergeFrom(is).build();
}
}