package com.robonobo.mina.message.handlers; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; import com.robonobo.core.api.proto.CoreApi.Node; import com.robonobo.mina.instance.StreamMgr; import com.robonobo.mina.message.MessageHolder; import com.robonobo.mina.message.proto.MinaProtocol.GotSource; import com.robonobo.mina.message.proto.MinaProtocol.WantSource; import com.robonobo.mina.network.ControlConnection; public class WantSourceHandler extends AbstractMessageHandler { @Override public void handleMessage(MessageHolder mh) { WantSource ws = (WantSource) mh.getMessage(); ControlConnection cc = mh.getFromCC(); if (cc.isLocal()) { for (String sid : ws.getStreamIdList()) { if (mina.getStreamMgr().isBroadcasting(sid) || mina.getStreamMgr().isRebroadcasting(sid)) { GotSource.Builder gsb = GotSource.newBuilder().addNode( mina.getNetMgr().getDescriptorForTalkingTo(cc.getNode(), true)); cc.sendMessage("GotSource", gsb.setStreamId(sid).build()); } } } if (mina.getConfig().isSupernode()) { Map<String, List<Node>> sourceMap = mina.getSupernodeMgr().notifyWantSource(mh); for (String sid : ws.getStreamIdList()) { List<Node> sources = sourceMap.get(sid); GotSource.Builder gsb = GotSource.newBuilder().setStreamId(sid).addAllNode(sources); if (mina.getStreamMgr().isBroadcasting(sid) || mina.getStreamMgr().isRebroadcasting(sid)) gsb.addNode(mina.getNetMgr().getDescriptorForTalkingTo(mh.getFromCC().getNode(), mh.getFromCC().isLocal())); if (gsb.getNodeCount() > 0) cc.sendMessage("GotSource", gsb.build()); } } } @Override public WantSource parse(String cmdName, InputStream is) throws IOException { return WantSource.newBuilder().mergeFrom(is).build(); } }