/*
* Copyright 2010 salaboy.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* under the License.
*/
package org.drools.grid.remote.directory;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.drools.KnowledgeBase;
import org.drools.grid.ConnectorException;
import org.drools.grid.DirectoryNodeService;
import org.drools.grid.GenericConnectorFactory;
import org.drools.grid.GenericNodeConnector;
import org.drools.grid.NodeConnectionType;
import org.drools.grid.internal.Message;
import org.drools.grid.internal.MessageResponseHandler;
import org.drools.grid.internal.MessageSession;
import org.drools.grid.internal.commands.SimpleCommand;
import org.drools.grid.internal.commands.SimpleCommandName;
import org.drools.grid.internal.responsehandlers.BlockingMessageDirectoryMapRequestResponseHandler;
import org.drools.grid.internal.responsehandlers.BlockingMessageResponseHandler;
import org.drools.grid.remote.KnowledgeBaseRemoteClient;
import org.drools.grid.remote.mina.MinaIoHandler;
/**
*
* @author salaboy
*/
public class DirectoryNodeRemoteClient
implements
DirectoryNodeService {
private GenericNodeConnector connector;
DirectoryNodeRemoteClient(GenericNodeConnector connector) {
this.connector = connector;
}
public void register(String executorId,
String resourceId) throws ConnectorException,
RemoteException {
this.connector.connect();
List<Object> args = new ArrayList<Object>( 2 );
args.add( executorId );
args.add( resourceId );
SimpleCommand cmd = new SimpleCommand( this.connector.getCounter().getAndIncrement(),
SimpleCommandName.RegisterExecutor,
args );
Message msg = new Message( this.connector.getSessionId(),
this.connector.getCounter().incrementAndGet(),
false,
cmd );
write( msg,
null );
this.connector.disconnect();
}
public void register(String executorId,
GenericNodeConnector resourceConnector) throws ConnectorException {
throw new UnsupportedOperationException( "Not supported yet." );
}
public GenericNodeConnector lookup(String resourceId) throws ConnectorException,
RemoteException {
this.connector.connect();
List<Object> args = new ArrayList<Object>( 1 );
args.add( resourceId );
SimpleCommand cmd = new SimpleCommand( this.connector.getCounter().getAndIncrement(),
SimpleCommandName.RequestLookupSessionId,
args );
Message msg = new Message( this.connector.getSessionId(),
this.connector.getCounter().incrementAndGet(),
false,
cmd );
BlockingMessageDirectoryMapRequestResponseHandler handler = new BlockingMessageDirectoryMapRequestResponseHandler();
write( msg,
handler );
SimpleCommand resultcmd = (SimpleCommand) handler.getMessage().getPayload();
this.connector.disconnect();
return GenericConnectorFactory.newConnector( (String) resultcmd.getArguments().get( 0 ) );
}
public void registerKBase(String kbaseId,
String resourceId) throws ConnectorException,
RemoteException {
this.connector.connect();
List<Object> args = new ArrayList<Object>( 2 );
args.add( kbaseId );
args.add( resourceId );
SimpleCommand cmd = new SimpleCommand( this.connector.getCounter().getAndIncrement(),
SimpleCommandName.RegisterKBase,
args );
Message msg = new Message( this.connector.getSessionId(),
this.connector.getCounter().incrementAndGet(),
false,
cmd );
write( msg,
null );
this.connector.disconnect();
}
public KnowledgeBase lookupKBase(String kbaseId) throws ConnectorException,
RemoteException {
this.connector.connect();
List<Object> args = new ArrayList<Object>( 1 );
args.add( kbaseId );
SimpleCommand cmd = new SimpleCommand( this.connector.getCounter().getAndIncrement(),
SimpleCommandName.RequestKBaseId,
args );
Message msg = new Message( this.connector.getSessionId(),
this.connector.getCounter().incrementAndGet(),
false,
cmd );
BlockingMessageDirectoryMapRequestResponseHandler handler = new BlockingMessageDirectoryMapRequestResponseHandler();
write( msg,
handler );
SimpleCommand resultcmd = (SimpleCommand) handler.getMessage().getPayload();
String connectorString = (String) resultcmd.getArguments().get( 0 );
GenericNodeConnector currentConnector = GenericConnectorFactory.newConnector( connectorString );
this.connector.disconnect();
return new KnowledgeBaseRemoteClient( kbaseId,
currentConnector,
new MessageSession() );
}
public Map<String, String> getExecutorsMap() throws ConnectorException,
RemoteException {
this.connector.connect();
SimpleCommand cmd = new SimpleCommand( this.connector.getCounter().getAndIncrement(),
SimpleCommandName.RequestExecutorsMap,
null );
Message msg = new Message( this.connector.getSessionId(),
this.connector.getCounter().incrementAndGet(),
false,
cmd );
BlockingMessageDirectoryMapRequestResponseHandler handler = new BlockingMessageDirectoryMapRequestResponseHandler();
write( msg,
handler );
SimpleCommand resultcmd = (SimpleCommand) handler.getMessage().getPayload();
this.connector.disconnect();
return (Map<String, String>) resultcmd.getArguments().get( 0 );
}
public void dispose() throws ConnectorException,
RemoteException {
this.connector.disconnect();
}
public String lookupId(String resourceId) throws ConnectorException,
RemoteException {
this.connector.connect();
List<Object> args = new ArrayList<Object>( 1 );
args.add( resourceId );
SimpleCommand cmd = new SimpleCommand( this.connector.getCounter().getAndIncrement(),
SimpleCommandName.RequestLookupSessionId,
args );
Message msg = new Message( this.connector.getSessionId(),
this.connector.getCounter().incrementAndGet(),
false,
cmd );
BlockingMessageDirectoryMapRequestResponseHandler handler = new BlockingMessageDirectoryMapRequestResponseHandler();
write( msg,
handler );
SimpleCommand resultcmd = (SimpleCommand) handler.getMessage().getPayload();
this.connector.disconnect();
return (String) resultcmd.getArguments().get( 0 );
}
private Message write(Message msg) throws ConnectorException,
RemoteException {
BlockingMessageResponseHandler responseHandler = new BlockingMessageResponseHandler();
if ( responseHandler != null ) {
addResponseHandler( msg.getResponseId(),
responseHandler );
}
((RemoteMinaDirectoryConnector) this.connector).getSession().write( msg );
Message returnMessage = responseHandler.getMessage();
if ( responseHandler.getError() != null ) {
throw responseHandler.getError();
}
return returnMessage;
}
private void write(Message msg,
MessageResponseHandler responseHandler) {
if ( responseHandler != null ) {
addResponseHandler( msg.getResponseId(),
responseHandler );
}
((RemoteMinaDirectoryConnector) this.connector).getSession().write( msg );
}
private void addResponseHandler(int id,
MessageResponseHandler responseHandler) {
((MinaIoHandler) ((RemoteMinaDirectoryConnector) this.connector).getSession().getHandler()).addResponseHandler( id,
responseHandler );
}
public String getId() throws ConnectorException {
return "Remote:Directory";
}
public void unregister(String executorId) throws ConnectorException,
RemoteException {
this.connector.connect();
List<Object> args = new ArrayList<Object>( 2 );
args.add( executorId );
SimpleCommand cmd = new SimpleCommand( this.connector.getCounter().getAndIncrement(),
SimpleCommandName.UnRegisterExecutor,
args );
Message msg = new Message( this.connector.getSessionId(),
this.connector.getCounter().incrementAndGet(),
false,
cmd );
write( msg,
null );
this.connector.disconnect();
}
public Map<String, String> getKBasesMap() throws ConnectorException,
RemoteException {
this.connector.connect();
SimpleCommand cmd = new SimpleCommand( this.connector.getCounter().getAndIncrement(),
SimpleCommandName.RequestKBasesMap,
null );
Message msg = new Message( this.connector.getSessionId(),
this.connector.getCounter().incrementAndGet(),
false,
cmd );
BlockingMessageDirectoryMapRequestResponseHandler handler = new BlockingMessageDirectoryMapRequestResponseHandler();
write( msg,
handler );
SimpleCommand resultcmd = (SimpleCommand) handler.getMessage().getPayload();
this.connector.disconnect();
return (Map<String, String>) resultcmd.getArguments().get( 0 );
}
public void registerKBase(String kbaseId,
KnowledgeBase kbase) throws ConnectorException,
RemoteException {
throw new UnsupportedOperationException( "Not supported yet." );
}
public void unregisterKBase(String kbaseId) throws ConnectorException,
RemoteException {
throw new UnsupportedOperationException( "Not supported yet." );
}
public NodeConnectionType getNodeConnectionType() throws ConnectorException,
RemoteException {
throw new UnsupportedOperationException( "Not supported yet." );
}
public ServiceType getServiceType() throws ConnectorException,
RemoteException {
return ServiceType.REMOTE;
}
public String lookupKBaseLocationId(String kbaseId) throws ConnectorException, RemoteException {
this.connector.connect();
List<Object> args = new ArrayList<Object>( 1 );
args.add( kbaseId );
SimpleCommand cmd = new SimpleCommand( this.connector.getCounter().getAndIncrement(),
SimpleCommandName.RequestKBaseId,
args );
Message msg = new Message( this.connector.getSessionId(),
this.connector.getCounter().incrementAndGet(),
false,
cmd );
BlockingMessageDirectoryMapRequestResponseHandler handler = new BlockingMessageDirectoryMapRequestResponseHandler();
write( msg,
handler );
SimpleCommand resultcmd = (SimpleCommand) handler.getMessage().getPayload();
String connectorString = (String) resultcmd.getArguments().get( 0 );
return connectorString;
}
}