package org.drools.grid.remote.directory; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.drools.SystemEventListener; import org.drools.grid.DirectoryNodeLocalImpl; import org.drools.grid.DirectoryNodeService; import org.drools.grid.internal.GenericIoWriter; import org.drools.grid.internal.GenericMessageHandler; import org.drools.grid.internal.Message; import org.drools.grid.internal.commands.SimpleCommand; import org.drools.grid.internal.commands.SimpleCommandName; public class DirectoryServerMessageHandlerImpl implements GenericMessageHandler { private final Map<String, GenericIoWriter> clients; //We can create a persistent directory service and provide access to that service private DirectoryNodeService directory = new DirectoryNodeLocalImpl(); private final SystemEventListener systemEventListener; public DirectoryServerMessageHandlerImpl(SystemEventListener systemEventListener) { this.clients = new HashMap<String, GenericIoWriter>(); this.systemEventListener = systemEventListener; } public void exceptionCaught(IoSession session, Throwable cause) throws Exception { this.systemEventListener.exception( "Uncaught exception on Server", cause ); } public void messageReceived(GenericIoWriter session, Message msg) throws Exception { SimpleCommand cmd = (SimpleCommand) (msg).getPayload(); try { this.systemEventListener.debug( "Message received on server : " + cmd.getName() ); // systemEventListener.debug("Arguments : " + Arrays.toString(cmd.getArguments().toArray())); switch ( cmd.getName() ) { case RegisterExecutor : { this.systemEventListener.debug( "Command receieved on server was operation of type: RegisterExecutor" ); String executorId = (String) cmd.getArguments().get( 0 ); String resourceId = (String) cmd.getArguments().get( 1 ); this.directory.register( executorId, resourceId ); SimpleCommand resultsCmnd = new SimpleCommand( cmd.getId(), SimpleCommandName.OperationResponse, null ); // session.write(new Message( msg.getSessionId(), // msg.getResponseId(), // msg.isAsync(), // resultsCmnd ), null); break; } case UnRegisterExecutor : { this.systemEventListener.debug( "Command receieved on server was operation of type: UnRegisterExecutor" ); String executorId = (String) cmd.getArguments().get( 0 ); this.directory.unregister( executorId ); // SimpleCommand resultsCmnd = new SimpleCommand(cmd.getId(), SimpleCommandName.OperationResponse, null); // session.write(new Message( msg.getSessionId(), // msg.getResponseId(), // msg.isAsync(), // resultsCmnd ), null); break; } case RegisterKBase : { this.systemEventListener.debug( "Command receieved on server was operation of type: RegisterKbase" ); String kbaseId = (String) cmd.getArguments().get( 0 ); String resourceId = (String) cmd.getArguments().get( 1 ); this.directory.registerKBase( kbaseId, resourceId ); SimpleCommand resultsCmnd = new SimpleCommand( cmd.getId(), SimpleCommandName.OperationResponse, null ); session.write( new Message( msg.getSessionId(), msg.getResponseId(), msg.isAsync(), resultsCmnd ), null ); break; } case RequestExecutorsMap : { Map<String, String> directoryMap = this.directory.getExecutorsMap(); List<Object> results = new ArrayList<Object>( 1 ); results.add( directoryMap ); SimpleCommand resultsCmnd = new SimpleCommand( cmd.getId(), SimpleCommandName.OperationResponse, results ); session.write( new Message( msg.getSessionId(), msg.getResponseId(), msg.isAsync(), resultsCmnd ), null ); break; } case RequestKBasesMap : { Map<String, String> kbasesMap = this.directory.getKBasesMap(); List<Object> results = new ArrayList<Object>( 1 ); results.add( kbasesMap ); SimpleCommand resultsCmnd = new SimpleCommand( cmd.getId(), SimpleCommandName.OperationResponse, results ); session.write( new Message( msg.getSessionId(), msg.getResponseId(), msg.isAsync(), resultsCmnd ), null ); break; } case RequestKBaseId : { String kbaseId = (String) cmd.getArguments().get( 0 ); String kbaseConnectorId = this.directory.getKBasesMap().get( kbaseId ); List<Object> results = new ArrayList<Object>( 1 ); results.add( kbaseConnectorId ); SimpleCommand resultsCmnd = new SimpleCommand( cmd.getId(), SimpleCommandName.OperationResponse, results ); session.write( new Message( msg.getSessionId(), msg.getResponseId(), msg.isAsync(), resultsCmnd ), null ); break; } case RequestLookupSessionId : { String executorId = (String) cmd.getArguments().get( 0 ); String resourceId = this.directory.getExecutorsMap().get( executorId ); List<Object> results = new ArrayList<Object>( 1 ); results.add( resourceId ); SimpleCommand resultsCmnd = new SimpleCommand( cmd.getId(), SimpleCommandName.OperationResponse, results ); session.write( new Message( msg.getSessionId(), msg.getResponseId(), msg.isAsync(), resultsCmnd ), null ); break; } default : { this.systemEventListener.debug( "Unknown command recieved on server" ); } } } catch ( RuntimeException e ) { this.systemEventListener.exception( e.getMessage(), e ); e.printStackTrace( System.err ); } } public void sessionIdle(IoSession session, IdleStatus status) throws Exception { this.systemEventListener.debug( "Server IDLE " + session.getIdleCount( status ) ); } }