/*
* Blitz Trading
*/
package executionserver.controller;
import BE.BEConnectRequest;
import BE.BEOrderRequest;
import executionserver.domain.ExecutionOrder;
import executionserver.domain.Market;
import executionserver.domain.ProcessingStatus;
import java.util.Calendar;
import java.util.UUID;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.transport.socket.nio.SocketSessionConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Sylvio Azevedo <sylvio.azevedo@blitz-trading.com>
*/
public class ProtobufHandler extends IoHandlerAdapter{
private final Logger logger = LoggerFactory.getLogger(getClass());
private String clientName = null;
public ProtobufHandler() {
}
@Override
public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
{
logger.error(cause.getMessage());
}
@Override
public void messageReceived( IoSession session, Object message ) throws Exception
{
if(message instanceof BEConnectRequest.ConnectRequest)
{
BEConnectRequest.ConnectRequest request = (BEConnectRequest.ConnectRequest) message;
clientName = request.getClient();
logger.info("Adding a session for client:" + clientName);
ExecutionController execCtr = new ExecutionController(clientName, session);
session.setAttribute("ExecutionController", execCtr);
session.setAttribute("Protocol", "Protobuff");
ExecutionServerController.clients.put(clientName, session);
logger.info("[ConnectRequest] received, preparing response.");
execCtr.sendAvailableConns();
execCtr.sendOrderList();
execCtr.startQueueWatcher();
}
else
if(message instanceof BEOrderRequest.OrderRequest) {
if(clientName == null) {
// Not connected with a valid client.
return;
}
BEOrderRequest.OrderRequest request = (BEOrderRequest.OrderRequest) message;
logger.info("Order [" + request.getOrderId() + "] received.");
ExecutionOrder order = new ExecutionOrder();
order.setId(request.getOrderId());
order.setAccount(request.getAccountId());
order.setClientId(request.getOrderId());
order.setBroker(request.getBroker());
order.setExchange(request.getExchange());
order.setMinQty(request.getMinqty());
order.setOpenQty(request.getOpenqty());
order.setPrice(request.getPrice());
order.setQty(request.getQuantity());
order.setSide(request.getSide());
order.setStopPrice(request.getStoppx());
order.setSecurity(request.getSymbol());
order.setOrderType(request.getType());
order.setValidity(request.getValidity());
order.setOwner(request.getClientId());
order.setReqType(request.getReqType());
order.setStatus(ProcessingStatus.NEW);
order.setDateCreated(Calendar.getInstance().getTime());
if(request.hasSecurityId()) {
order.setSecurityId(request.getSecurityId());
}
if(request.hasSecurityIdSource()) {
order.setSecurityIdSource(request.getSecurityIdSource());
}
if(request.hasSecurityExchange()){
order.setSecurityExchange(request.getSecurityExchange());
}
if(request.hasLastPrice()) {
order.setLastPrice(request.getLastPrice());
}
if(request.hasPortfolio()) {
order.setPortfolio(request.getPortfolio());
}
if(request.getRoute().isEmpty()) {
/**
* Check the market settings and try to select the default
* route.
*/
for(Market market : ExecutionServerController.settings.markets)
{
if(market.name.trim().equals(order.getExchange().trim())) {
order.setRoute(market.conn);
}
}
}
else {
order.setRoute(request.getRoute());
}
ExecutionController controller = (ExecutionController) session.getAttribute("ExecutionController");
controller.addOrder(order);
}
}
@Override
public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
{
System.out.println( "IDLE " + session.getIdleCount( status ));
}
@Override
public void sessionOpened(IoSession session) throws Exception {
logger.info("Session open. Sending server information.");
String sessionId = UUID.randomUUID().toString();
session.setAttribute("id", sessionId);
session.write("Execution Server - Version (" + ExecutionServerController.SERVER_VERSION + ") Id: " + sessionId);
}
@Override
public void sessionCreated(IoSession session) throws Exception {
logger.info("Session created, setting buffer size.");
((SocketSessionConfig) session.getConfig()).setReceiveBufferSize(1024);
session.setIdleTime( IdleStatus.BOTH_IDLE, 60 );
}
}