/*
* Copyright 2012 Thomas Bocek
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package net.tomp2p.rpc;
import net.tomp2p.connection2.ChannelCreator;
import net.tomp2p.connection2.ConnectionBean;
import net.tomp2p.connection2.ConnectionConfiguration;
import net.tomp2p.connection2.PeerBean;
import net.tomp2p.connection2.RequestHandler;
import net.tomp2p.futures.FutureResponse;
import net.tomp2p.message.DataMap;
import net.tomp2p.message.Message2;
import net.tomp2p.message.Message2.Type;
import net.tomp2p.p2p.BroadcastHandler;
import net.tomp2p.p2p.builder.BroadcastBuilder;
import net.tomp2p.peers.PeerAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BroadcastRPC extends DispatchHandler {
private static final Logger LOG = LoggerFactory.getLogger(BroadcastRPC.class);
public static final byte BROADCAST_COMMAND = 12;
private final BroadcastHandler broadcastHandler;
public BroadcastRPC(PeerBean peerBean, ConnectionBean connectionBean, BroadcastHandler broadcastHandler) {
super(peerBean, connectionBean, BROADCAST_COMMAND);
this.broadcastHandler = broadcastHandler;
}
public FutureResponse send(final PeerAddress remotePeer, final BroadcastBuilder broadcastBuilder,
final ChannelCreator channelCreator, final ConnectionConfiguration configuration) {
final Message2 message = createMessage(remotePeer, BROADCAST_COMMAND, Type.REQUEST_FF_1);
message.setInteger(broadcastBuilder.hopCounter());
message.setKey(broadcastBuilder.messageKey());
if (broadcastBuilder.dataMap() != null) {
message.setDataMap(new DataMap(broadcastBuilder.dataMap()));
}
final FutureResponse futureResponse = new FutureResponse(message);
final RequestHandler<FutureResponse> requestHandler = new RequestHandler<FutureResponse>(
futureResponse, peerBean(), connectionBean(), configuration);
if (!broadcastBuilder.isUDP()) {
return requestHandler.fireAndForgetTCP(channelCreator);
} else {
return requestHandler.fireAndForgetUDP(channelCreator);
}
}
@Override
public Message2 handleResponse(final Message2 message, final boolean sign) throws Exception {
if (!(message.getType() == Type.REQUEST_FF_1 && message.getCommand() == BROADCAST_COMMAND)) {
throw new IllegalArgumentException("Message content is wrong");
}
LOG.debug("received BRODACAST message: {}", message);
broadcastHandler.receive(message);
return message;
}
/**
* @return The broadcast handler that is currently used
*/
public BroadcastHandler broadcastHandler() {
return broadcastHandler;
}
}