/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.transport;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.util.ArgumentChecker;
/**
* Directly invokes {@link ByteArrayMessageReceiver} instances whenever a message is transmitted.
* This is ideally useful in integration tests where all operations should be in
* a single virtual memory instance.
* Because this happens in the caller's thread context, it's not particularly scalable.
*/
public class DirectInvocationByteArrayMessageSender implements ByteArrayMessageSender {
/** Logger. */
private static final Logger s_logger = LoggerFactory.getLogger(DirectInvocationByteArrayMessageSender.class);
/**
* The list of receivers. Not synchronized!
*/
private final List<ByteArrayMessageReceiver> _receivers = new ArrayList<ByteArrayMessageReceiver>();
/**
* Creates a message sender.
*/
public DirectInvocationByteArrayMessageSender() {
}
/**
* Creates a message sender with one receiver.
* @param receiver the receiver to use, not null
*/
public DirectInvocationByteArrayMessageSender(ByteArrayMessageReceiver receiver) {
addReceiver(receiver);
}
/**
* Creates a message sender adding receivers.
* @param receivers the receivers to use, not null, no nulls
*/
public DirectInvocationByteArrayMessageSender(ByteArrayMessageReceiver... receivers) {
ArgumentChecker.notNull(receivers, "receivers");
for (ByteArrayMessageReceiver receiver : receivers) {
addReceiver(receiver);
}
}
//-------------------------------------------------------------------------
/**
* Adds a receiver to the list to call.
* @param receiver the receiver to add, not null
*/
public synchronized void addReceiver(ByteArrayMessageReceiver receiver) {
ArgumentChecker.notNull(receiver, "receiver");
_receivers.add(receiver);
}
//-------------------------------------------------------------------------
/**
* Sends a message to each of the registered receivers.
* @param message the message to send, not null
*/
@Override
public synchronized void send(byte[] message) {
for (ByteArrayMessageReceiver receiver : _receivers) {
try {
receiver.messageReceived(message);
} catch (Exception e) {
s_logger.warn("Unable to dispatch message to receiver " + receiver, e);
}
}
}
}