/*
* 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;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.drools.SystemEventListener;
import org.drools.SystemEventListenerFactory;
/**
*
* @author salaboy
*/
public class GenericConnectorFactory {
private static final String SEPARATOR = ":";
private static final String LOCAL_NODE_CONNECTOR_CLASS = "org.drools.grid.local.LocalNodeConnector";
private static final String LOCAL_DIRECTORY_CONNECTOR_CLASS = "org.drools.grid.local.LocalDirectoryConnector";
private static final String REMOTE_MINA_NODE_CONNECTOR_CLASS = "org.drools.grid.remote.mina.RemoteMinaNodeConnector";
private static final String REMOTE_MINA_DIRECTORY_CONNECTOR_CLASS = "org.drools.grid.remote.directory.RemoteMinaDirectoryConnector";
private static final String REMOTE_MINA_TASK_CONNECTOR_CLASS = "org.drools.grid.task.RemoteMinaHumanTaskConnector";
private static final String REMOTE_HORNETQ_NODE_CONNECTOR_CLASS = "";
private static final String REMOTE_HORNETQ_DIRECTORY_CONNECTOR_CLASS = "";
private static final String REMOTE_HORNETQ_TASK_CONNECTOR_CLASS = "";
private static final String DISTRIBUTED_RIO_NODE_CONNECTOR_CLASS = "org.drools.grid.distributed.connectors.DistributedRioNodeConnector";
private static final String DISTRIBUTED_RIO_DIRECTORY_CONNECTOR_CLASS = "org.drools.grid.distributed.connectors.DistributedRioDirectoryConnector";
private static final String DISTRIBUTED_RIO_TASK_CONNECTOR_CLASS = "";
/* connectorString format:
* [0] -> Environment Type: Local, Remote, Distributed
* [1] -> Implementation: Local, Mina, HornetQ, Rio
* [2] -> Connector Type: Node, Directory, Task
* [3] -> Connector Id: <ID of the Execution, Directory or Task node>,
* The connector ID let us create the connector to a specific,
* usually remote/distributed node,directory or taskserver.
*
* examples:
* Local Directory Connector String: Local:Local:Directory
* Remote Mina Node Connector String: Remote:Mina:Node:127.0.0.1:9123
* Distributed Rio Directory Connector String: Distributed:Rio:Directory:<ID>
*/
public static GenericNodeConnector newConnector(String connectorString) {
GenericNodeConnector connector = null;
String[] connectorDetails = getConnectorDetails( connectorString );
String environmentType = connectorDetails[0];
if ( environmentType.equals( "Local" ) ) {
connector = newLocalConnector( connectorString );
}
if ( environmentType.equals( "Remote" ) ) {
connector = newRemoteConnector( connectorString );
}
if ( environmentType.equals( "Distributed" ) ) {
connector = newDistributedConnector( connectorString );
}
return connector;
}
private static GenericNodeConnector newLocalConnector(String connectorString) {
GenericNodeConnector connector = null;
String[] connectorDetails = getConnectorDetails( connectorString );
if ( connectorDetails[1].equals( "Local" ) && connectorDetails[2].equals( "Node" ) ) {
//TODO: add ID to the local connector (connectorString)
connector = newLocalNodeConnector();
}
if ( connectorDetails[1].equals( "Local" ) && connectorDetails[2].equals( "Directory" ) ) {
connector = newLocalDirectoryConnector();
}
if ( connectorDetails[1].equals( "Local" ) && connectorDetails[2].equals( "Task" ) ) {
throw new UnsupportedOperationException( "We don't have a Local Task implementation! Sorry!" );
}
return connector;
}
private static GenericNodeConnector newLocalNodeConnector() {
GenericNodeConnector connector = null;
try {
Class clazz = Class.forName( LOCAL_NODE_CONNECTOR_CLASS );
connector = (GenericNodeConnector) clazz.newInstance();
} catch ( InstantiationException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalAccessException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( ClassNotFoundException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
}
return connector;
}
private static GenericNodeConnector newLocalDirectoryConnector() {
GenericNodeConnector connector = null;
try {
Class clazz = Class.forName( LOCAL_DIRECTORY_CONNECTOR_CLASS );
connector = (GenericNodeConnector) clazz.newInstance();
} catch ( InstantiationException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalAccessException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( ClassNotFoundException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
}
return connector;
}
private static GenericNodeConnector newRemoteConnector(String connectorString) {
GenericNodeConnector connector = null;
String[] connectorDetails = getConnectorDetails( connectorString );
if ( connectorDetails[1].equals( "Mina" ) && connectorDetails[2].equals( "Node" ) ) {
connector = newRemoteMinaNodeConnector( connectorString );
}
if ( connectorDetails[1].equals( "Mina" ) && connectorDetails[2].equals( "Directory" ) ) {
connector = newRemoteMinaDirectoryConnector( connectorString );
}
if ( connectorDetails[1].equals( "Mina" ) && connectorDetails[2].equals( "Task" ) ) {
connector = newRemoteMinaTaskConnector( connectorString );
}
if ( connectorDetails[1].equals( "HornetQ" ) && connectorDetails[2].equals( "Node" ) ) {
connector = newRemoteHornetQNodeConnector( connectorString );
}
if ( connectorDetails[1].equals( "HornetQ" ) && connectorDetails[2].equals( "Directory" ) ) {
connector = newRemoteHornetQDirectoryConnector( connectorString );
}
if ( connectorDetails[1].equals( "HornetQ" ) && connectorDetails[2].equals( "Task" ) ) {
connector = newRemoteHornetQTaskConnector( connectorString );
}
return connector;
}
private static GenericNodeConnector newDistributedConnector(String connectorString) {
GenericNodeConnector connector = null;
String[] connectorDetails = getConnectorDetails( connectorString );
if ( connectorDetails[1].equals( "Rio" ) && connectorDetails[2].equals( "Node" ) ) {
connector = newDistributedRioNodeConnector( connectorString );
}
if ( connectorDetails[1].equals( "Rio" ) && connectorDetails[2].equals( "Directory" ) ) {
connector = newDistributedRioDirectoryConnector( connectorString );
}
if ( connectorDetails[1].equals( "Rio" ) && connectorDetails[2].equals( "Task" ) ) {
throw new UnsupportedOperationException( "Not Implemented yet, we are working on it!" );
}
return connector;
}
private static GenericNodeConnector newRemoteMinaNodeConnector(String connectorString) {
GenericNodeConnector connector = null;
try {
String[] connectorDetails = getConnectorDetails( connectorString );
Class clazz = Class.forName( REMOTE_MINA_NODE_CONNECTOR_CLASS );
Constructor constructor = clazz.getConstructor( String.class,
String.class,
Integer.class,
SystemEventListener.class );
connector = (GenericNodeConnector) constructor.newInstance( connectorString,
connectorDetails[3],
Integer.valueOf( connectorDetails[4] ),
SystemEventListenerFactory.getSystemEventListener() );
} catch ( InstantiationException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalAccessException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalArgumentException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( InvocationTargetException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( NoSuchMethodException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( SecurityException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( ClassNotFoundException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
}
return connector;
}
private static GenericNodeConnector newRemoteMinaDirectoryConnector(String connectorString) {
GenericNodeConnector connector = null;
try {
String[] connectorDetails = getConnectorDetails( connectorString );
Class clazz = Class.forName( REMOTE_MINA_DIRECTORY_CONNECTOR_CLASS );
Constructor constructor = clazz.getConstructor( String.class,
String.class,
Integer.class,
SystemEventListener.class );
connector = (GenericNodeConnector) constructor.newInstance( connectorString,
connectorDetails[3],
Integer.valueOf( connectorDetails[4] ),
SystemEventListenerFactory.getSystemEventListener() );
} catch ( InstantiationException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalAccessException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalArgumentException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( InvocationTargetException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( NoSuchMethodException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( SecurityException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( ClassNotFoundException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
}
return connector;
}
private static GenericNodeConnector newRemoteMinaTaskConnector(String connectorString) {
GenericNodeConnector connector = null;
try {
String[] connectorDetails = getConnectorDetails( connectorString );
Class clazz = Class.forName( REMOTE_MINA_TASK_CONNECTOR_CLASS );
Constructor constructor = clazz.getConstructor( String.class,
String.class,
Integer.class,
SystemEventListener.class );
connector = (GenericNodeConnector) constructor.newInstance( connectorString,
connectorDetails[3],
Integer.valueOf( connectorDetails[4] ),
SystemEventListenerFactory.getSystemEventListener() );
} catch ( InstantiationException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalAccessException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalArgumentException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( InvocationTargetException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( NoSuchMethodException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( SecurityException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( ClassNotFoundException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
}
return connector;
}
private static String[] getConnectorDetails(String connectorString) {
return connectorString.split( SEPARATOR );
}
private static GenericNodeConnector newRemoteHornetQNodeConnector(String connectorString) {
throw new UnsupportedOperationException( "Not yet implemented" );
}
private static GenericNodeConnector newRemoteHornetQDirectoryConnector(String connectorString) {
throw new UnsupportedOperationException( "Not yet implemented" );
}
private static GenericNodeConnector newRemoteHornetQTaskConnector(String connectorString) {
throw new UnsupportedOperationException( "Not yet implemented" );
}
private static GenericNodeConnector newDistributedRioNodeConnector(String connectorString) {
GenericNodeConnector connector = null;
try {
String[] connectorDetails = getConnectorDetails( connectorString );
Class clazz = Class.forName( DISTRIBUTED_RIO_NODE_CONNECTOR_CLASS );
if ( connectorDetails.length < 4 || !"".equals( connectorDetails[3] ) ) {
Constructor constructor = clazz.getConstructor( String.class,
SystemEventListener.class,
String.class );
connector = (GenericNodeConnector) constructor.newInstance( connectorString,
SystemEventListenerFactory.getSystemEventListener(),
connectorString );
} else {
Constructor constructor = clazz.getConstructor( String.class,
SystemEventListener.class );
connector = (GenericNodeConnector) constructor.newInstance( connectorString,
SystemEventListenerFactory.getSystemEventListener() );
}
} catch ( InstantiationException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalAccessException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalArgumentException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( InvocationTargetException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( NoSuchMethodException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( SecurityException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( ClassNotFoundException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
}
return connector;
}
private static GenericNodeConnector newDistributedRioDirectoryConnector(String connectorString) {
GenericNodeConnector connector = null;
try {
String[] connectorDetails = getConnectorDetails( connectorString );
Class clazz = Class.forName( DISTRIBUTED_RIO_DIRECTORY_CONNECTOR_CLASS );
if ( connectorDetails.length > 3 && !"".equals( connectorDetails[3] ) ) {
Constructor constructor = clazz.getConstructor( String.class,
SystemEventListener.class,
String.class );
connector = (GenericNodeConnector) constructor.newInstance( connectorString,
SystemEventListenerFactory.getSystemEventListener(),
connectorString );
} else {
Constructor constructor = clazz.getConstructor( String.class,
SystemEventListener.class );
connector = (GenericNodeConnector) constructor.newInstance( connectorString,
SystemEventListenerFactory.getSystemEventListener() );
}
} catch ( InstantiationException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalAccessException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( IllegalArgumentException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( InvocationTargetException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( NoSuchMethodException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( SecurityException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
} catch ( ClassNotFoundException ex ) {
Logger.getLogger( GenericConnectorFactory.class.getName() ).log( Level.SEVERE,
null,
ex );
}
return connector;
}
}