package com.intrbiz.bergamot.command;
import java.util.List;
import java.util.LinkedList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.log4j.Logger;
import com.intrbiz.bergamot.command.handler.BergamotCommandHandler;
import com.intrbiz.bergamot.model.message.command.CommandRequest;
import com.intrbiz.bergamot.model.message.command.CommandResponse;
import com.intrbiz.bergamot.queue.BergamotCommandQueue;
import com.intrbiz.queue.RPCServer;
public abstract class AbstractCommandProcessor implements CommandProcessor
{
private Logger logger = Logger.getLogger(AbstractCommandProcessor.class);
private int threads = Runtime.getRuntime().availableProcessors();
private BergamotCommandQueue commandQueue;
private List<RPCServer<CommandRequest, CommandResponse>> commandServers = new LinkedList<RPCServer<CommandRequest, CommandResponse>>();
private ConcurrentMap<Class<? extends CommandRequest>, BergamotCommandHandler<?>> handlers = new ConcurrentHashMap<Class<? extends CommandRequest>, BergamotCommandHandler<?>>();
public AbstractCommandProcessor()
{
super();
}
@Override
public int getThreads()
{
return this.threads;
}
@Override
public void setThreads(int threads)
{
this.threads = threads;
}
public void registerHandler(BergamotCommandHandler<?> handler)
{
for (Class<? extends CommandRequest> handles : handler.handles())
{
this.handlers.put(handles, handler);
handler.init(this);
}
}
public BergamotCommandHandler<?> getHandler(Class<? extends CommandRequest> forRequestType)
{
return this.handlers.get(forRequestType);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void start()
{
// open the command queue
this.commandQueue = BergamotCommandQueue.open();
// setup the servers
for (int i = 0; i < this.threads; i++)
{
this.commandServers.add(
this.commandQueue.createBergamotCommandRPCServer((request) -> {
// lookup the command handler and process the request
if (request != null)
{
BergamotCommandHandler handler = this.getHandler(request.getClass());
if (handler != null)
{
return handler.process(request);
}
else
{
logger.warn("Failed to find command handler for request: " + request.getClass());
}
}
return null;
})
);
}
}
}