/* * Itaú Asset Management - Quantitative Research Team * * @project * @date */ package executionserver.mina; import executionserver.bson.command.BsonCommand; import executionserver.controller.ExecutionServerController; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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.bson.BasicBSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author Sylvio Azevedo */ public class BsonHandler extends IoHandlerAdapter { // constants public static final String BSON_CMD_PACKAGE = "executionserver.bson.command."; private final Logger logger = LoggerFactory.getLogger(getClass()); public String clientName = null; @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 BasicBSONObject)) { List args = new ArrayList(); args.add("-100"); args.add("Command is not valid bson object."); BasicBSONObject bson = new BasicBSONObject(); bson.put("Handler", "Message"); bson.put("Args", args); return; } // retrieve bson object. BasicBSONObject bsonObj = (BasicBSONObject) message; // retrieve bson command name String cmdName = bsonObj.getString("Handler"); // retrieve command arguments Map<String, Object> args = (Map<String, Object>) bsonObj.get("Args"); logger.info("Command received [" + cmdName + "]. Processing..."); // instance and execute bson command by reflection. BsonCommand cmd = (BsonCommand) Class.forName(BSON_CMD_PACKAGE + cmdName).newInstance(); cmd.setHandler(this); cmd.execute(args, session); } @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(); Map<String, Object> args = new HashMap<String, Object>(); args.put("ServerInfo", "Execution Server - Version (" + ExecutionServerController.SERVER_VERSION + ") Id: " + sessionId) ; BasicBSONObject response = new BasicBSONObject(); response.put("Handler", "SessionOpen"); response.put("Args", args); session.setAttribute("id", sessionId); session.write(response); } @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 ); } }