package org.drools.grid.distributed;
import org.drools.SystemEventListener;
import org.drools.command.impl.ContextImpl;
import org.drools.command.impl.GenericCommand;
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.NodeData;
import org.drools.runtime.impl.ExecutionResultImpl;
public class GenericMessageGridHandlerImpl
implements
GenericMessageHandler {
private SystemEventListener systemEventListener;
private NodeData data;
private DirectoryNodeService directory;
public GenericMessageGridHandlerImpl(NodeData data,
SystemEventListener systemEventListener) {
this.systemEventListener = systemEventListener;
this.data = data;
// Class[] classes = new Class[]{org.drools.grid.DirectoryNodeService.class};
// ServiceTemplate tmpl = new ServiceTemplate(null, classes,null);
//
// LookupDiscoveryManager lookupDiscovery = null;
// try {
// lookupDiscovery = new LookupDiscoveryManager(LookupDiscoveryManager.ALL_GROUPS, null, null);
// } catch (IOException ex) {
// Logger.getLogger(GenericMessageGridHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
// }
//
// System.out.println("Discovering Manager service ...");
//
// ServiceDiscoveryManager serviceDiscovery = null;
// try {
// serviceDiscovery = new ServiceDiscoveryManager(lookupDiscovery, new LeaseRenewalManager());
// } catch (IOException ex) {
// Logger.getLogger(GenericMessageGridHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
// }
//
// /* Wait no more then 10 seconds to discover the service */
// ServiceItem item = null;
// try {
// try {
// item = serviceDiscovery.lookup(tmpl, null, 1000);
// } catch (RemoteException ex) {
// Logger.getLogger(GenericMessageGridHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
// }
// } catch (InterruptedException ex) {
// Logger.getLogger(GenericMessageGridHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
// }
// serviceDiscovery.terminate();
//
// if(item != null) {
// System.out.println("Discovered Registry service");
// if(item.service instanceof DirectoryNodeService){
// registry = (DirectoryNodeService)item.service;
//
// }
//
//
// } else {
// System.out.println("Registry service not discovered, make sure the"+
// "service is deployed");
// }
}
/* (non-Javadoc)
* @see org.drools.vsm.GenericMessageHandler#messageReceived(org.drools.vsm.GenericIoWriter, org.drools.vsm.Message)
*/
public void messageReceived(GenericIoWriter session,
Message msg) throws Exception {
this.systemEventListener.debug( "Message receieved : " + msg );
// we always need to process a List, for genericity, but don't force a List on the payload
// List<GenericCommand> commands;
// if ( msg.getPayload() instanceof List ) {
// commands = (List<GenericCommand>) msg.getPayload();
// } else {
// commands = new ArrayList<GenericCommand>();
// commands.add( (GenericCommand) msg.getPayload() );
// }
GenericCommand command = (GenericCommand) msg.getPayload();
// Setup the evaluation context
ContextImpl localSessionContext = new ContextImpl( "session_" + msg.getSessionId(),
this.data.getContextManager(),
this.data.getTemp() );
ExecutionResultImpl localKresults = new ExecutionResultImpl();
localSessionContext.set( "kresults_" + msg.getSessionId(),
localKresults );
//@TODO: replace with Environment ?? this needs to change..
localSessionContext.set( "registry",
this.directory );
// for ( GenericCommand cmd : commands ) {
// // evaluate the commands
// cmd.execute( localSessionContext );
// }
Object result = command.execute( localSessionContext );
if ( localSessionContext.get( "kbase" ) != null ) {
session.write( new Message( msg.getSessionId(),
msg.getResponseId(),
msg.isAsync(),
localSessionContext.get( "kbase" ) ),
null );
return;
}
session.write( new Message( msg.getSessionId(),
msg.getResponseId(),
msg.isAsync(),
result ),
null );
// else if ( !msg.isAsync() && localKresults.getIdentifiers().isEmpty() ) {
// // if it's not an async invocation and their are no results, just send a simple notification message
// session.write( new Message( msg.getSessionId(),
// msg.getResponseId(),
// msg.isAsync(),
// new FinishedCommand() ), null );
//
//
// } else{
// // return the payload
// session.write( new Message( msg.getSessionId(),
// msg.getResponseId(),
// msg.isAsync(),
// localKresults ), null );
// }
}
}