/**
*
*/
package org.drools.grid.remote.mina;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.drools.SystemEventListener;
import org.drools.grid.internal.ClientGenericMessageReceiver;
import org.drools.grid.internal.GenericIoWriter;
import org.drools.grid.internal.GenericMessageHandler;
import org.drools.grid.internal.Message;
import org.drools.grid.internal.MessageResponseHandler;
import org.drools.grid.internal.commands.SimpleCommand;
public class ClientGenericMessageReceiverImpl
implements
ClientGenericMessageReceiver {
protected Map<Integer, MessageResponseHandler> responseHandlers;
private GenericMessageHandler handler;
private final SystemEventListener systemEventListener;
public ClientGenericMessageReceiverImpl(GenericMessageHandler handler,
SystemEventListener systemEventListener) {
this.handler = handler;
this.responseHandlers = new ConcurrentHashMap<Integer, MessageResponseHandler>();;
this.systemEventListener = systemEventListener;
}
/* (non-Javadoc)
* @see org.drools.vsm.mina.ClientGenericMessageReceiver#addResponseHandler(int, org.drools.vsm.MessageResponseHandler)
*/
public void addResponseHandler(int id,
MessageResponseHandler responseHandler) {
this.responseHandlers.put( id,
responseHandler );
}
/* (non-Javadoc)
* @see org.drools.vsm.mina.ClientGenericMessageReceiver#messageReceived(org.drools.vsm.mina.MinaIoWriter, org.drools.vsm.Message)
*/
public void messageReceived(GenericIoWriter writer,
Message msg) throws Exception {
this.systemEventListener.debug( "Message receieved : " + msg );
MessageResponseHandler responseHandler = this.responseHandlers.remove( msg.getResponseId() );
if ( responseHandler != null ) {
Object payload = msg.getPayload();
if ( payload instanceof SimpleCommand && ((SimpleCommand) msg.getPayload()).getArguments().size() > 0 &&
((SimpleCommand) msg.getPayload()).getArguments().get( 0 ) instanceof RuntimeException ) {
payload = ((SimpleCommand) msg.getPayload()).getArguments().get( 0 );
}
if ( (payload != null && payload instanceof RuntimeException) ) {
responseHandler.setError( (RuntimeException) payload );
} else {
responseHandler.receive( msg );
}
} else if ( this.handler != null ) {
this.handler.messageReceived( writer,
msg );
} else {
throw new RuntimeException( "Unable to process Message" );
}
}
}