package com.netifera.platform.internal.dispatcher.channels;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import com.netifera.platform.api.channels.IChannelMessageSerializer;
import com.netifera.platform.api.dispatcher.IClientDispatcher;
import com.netifera.platform.api.dispatcher.IMessenger;
import com.netifera.platform.api.dispatcher.IProbeMessage;
import com.netifera.platform.api.log.ILogger;
import com.netifera.platform.internal.dispatcher.Messenger;
import com.netifera.platform.internal.dispatcher.ServerDispatcher;
public class LocalChannel {
private final static boolean DEBUG = false;
private static final int MESSAGE_QUEUE_SIZE = 16;
private final BlockingQueue<IProbeMessage> q1 = new ArrayBlockingQueue<IProbeMessage>(MESSAGE_QUEUE_SIZE);
private final BlockingQueue<IProbeMessage> q2 = new ArrayBlockingQueue<IProbeMessage>(MESSAGE_QUEUE_SIZE);
private final IChannelMessageSerializer serverSerializer;
private final IChannelMessageSerializer clientSerializer;
private Messenger clientMessenger;
public static LocalChannel create(IClientDispatcher clientDispatcher, ServerDispatcher serverDispatcher, ILogger logger) {
logger.debug("Activating Local Channel");
final LocalChannel localChannel = new LocalChannel(logger);
serverDispatcher.registerLocalConnection(localChannel.serverSerializer);
localChannel.clientMessenger = new Messenger(localChannel.clientSerializer, clientDispatcher, logger);
localChannel.clientMessenger.start();
return localChannel;
}
private LocalChannel(ILogger logger) {
final ILogger serverLogger = logger.getManager().getLogger("Local Channel [server]");
final ILogger clientLogger = logger.getManager().getLogger("Local Channel [client]");
if(DEBUG) {
serverLogger.enableDebug();
clientLogger.enableDebug();
}
serverSerializer = new LocalChannelSerializer(q1, q2, serverLogger);
clientSerializer = new LocalChannelSerializer(q2, q1, clientLogger);
}
public IMessenger getClientMessenger() {
return clientMessenger;
}
}