[jboss-svn-commits] JBL Code SVN: r33581 - in labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid: drools-grid-remote-dir-mina and 9 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Jun 21 20:15:20 EDT 2010
Author: salaboy21
Date: 2010-06-21 20:15:20 -0400 (Mon, 21 Jun 2010)
New Revision: 33581
Added:
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/pom.xml
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/DirectoryNodeRemoteClient.java
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/DirectoryServerMessageHandlerImpl.java
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/MinaRemoteDirectoryConnector.java
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/commands/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/resources/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/test/
labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/test/java/
Log:
drools-grid Directory Mina Implementation
Added: labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/pom.xml
===================================================================
--- labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/pom.xml (rev 0)
+++ labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/pom.xml 2010-06-22 00:15:20 UTC (rev 33581)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>drools-grid</artifactId>
+ <groupId>org.drools</groupId>
+ <version>5.1.0.SNAPSHOT</version>
+ </parent>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-grid-remote-dir-mina</artifactId>
+
+ <name>Drools :: Grid :: Remote Directory :: Mina</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-grid-api</artifactId>
+ <version>5.1.0.SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-grid-remote-api</artifactId>
+ <version>5.1.0.SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-grid-local</artifactId>
+ <version>5.1.0.SNAPSHOT</version>
+ <type>jar</type>
+ </dependency>
+ <!-- Apache Mina for default Service Remote Implementation -->
+ <dependency>
+ <groupId>org.apache.mina</groupId>
+ <artifactId>mina-core</artifactId>
+ <version>2.0.0-M6</version>
+ </dependency>
+
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-grid-remote-mina</artifactId>
+ <version>5.1.0.SNAPSHOT</version>
+ <type>jar</type>
+ </dependency>
+ </dependencies>
+</project>
Added: labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/DirectoryNodeRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/DirectoryNodeRemoteClient.java (rev 0)
+++ labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/DirectoryNodeRemoteClient.java 2010-06-22 00:15:20 UTC (rev 33581)
@@ -0,0 +1,137 @@
+/*
+ * 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.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.GenericNodeConnector;
+import org.drools.grid.internal.Message;
+import org.drools.grid.internal.MessageResponseHandler;
+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.mina.MinaIoHandler;
+
+/**
+ *
+ * @author salaboy
+ */
+public class DirectoryNodeRemoteClient implements DirectoryNodeService {
+ private MinaRemoteDirectoryConnector connector;
+
+ DirectoryNodeRemoteClient(MinaRemoteDirectoryConnector connector) {
+ this.connector = connector;
+ }
+
+ public void register(String executorId, String resourceId) throws ConnectorException {
+ List<Object> args = new ArrayList<Object>(2);
+ args.add(executorId);
+ args.add(resourceId);
+ SimpleCommand cmd = new SimpleCommand(connector.counter.getAndIncrement(), SimpleCommandName.RegisterExecutor, args);
+ Message msg = new Message(connector.getSessionId(), connector.counter.incrementAndGet(), false, cmd);
+ BlockingMessageResponseHandler handler = new BlockingMessageResponseHandler();
+ write(msg, handler);
+
+ }
+
+ public void register(String executorId, GenericNodeConnector resourceConnector) throws ConnectorException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public GenericNodeConnector lookup(String resourceId) throws ConnectorException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void registerKBase(String kbaseId, String resourceId) throws ConnectorException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public KnowledgeBase lookupKBase(String kbaseId) throws ConnectorException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void addService(GenericNodeConnector service) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public Map<String, String> getDirectoryMap() throws ConnectorException {
+
+ SimpleCommand cmd = new SimpleCommand(connector.counter.getAndIncrement(), SimpleCommandName.RequestDirectoryMap, null);
+ Message msg = new Message(connector.getSessionId(), connector.counter.incrementAndGet(), false, cmd);
+ BlockingMessageDirectoryMapRequestResponseHandler handler = new BlockingMessageDirectoryMapRequestResponseHandler();
+ write(msg, handler);
+ SimpleCommand resultcmd = (SimpleCommand)handler.getMessage().getPayload();
+ return (Map<String,String>)resultcmd.getArguments().get(0);
+ }
+
+
+
+
+ public void dispose() throws ConnectorException {
+ this.connector.disconnect();
+ }
+
+ public String lookupId(String resourceId) throws ConnectorException {
+ List<Object> args = new ArrayList<Object>(1);
+ args.add(resourceId);
+ SimpleCommand cmd = new SimpleCommand(connector.counter.getAndIncrement(), SimpleCommandName.RequestLookupSessionId, args);
+ Message msg = new Message(connector.getSessionId(), connector.counter.incrementAndGet(), false, cmd);
+ BlockingMessageDirectoryMapRequestResponseHandler handler = new BlockingMessageDirectoryMapRequestResponseHandler();
+ write(msg, handler);
+ SimpleCommand resultcmd = (SimpleCommand)handler.getMessage().getPayload();
+ return (String)resultcmd.getArguments().get(0);
+ }
+
+ private Message write(Message msg) throws ConnectorException{
+ BlockingMessageResponseHandler responseHandler = new BlockingMessageResponseHandler();
+
+ if (responseHandler != null) {
+ addResponseHandler(msg.getResponseId(),
+ responseHandler);
+ }
+ 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);
+ }
+ this.connector.getSession().write(msg);
+ }
+
+ private void addResponseHandler(int id,
+ MessageResponseHandler responseHandler) {
+ ((MinaIoHandler) this.connector.getSession().getHandler()).addResponseHandler(id,
+ responseHandler);
+
+ }
+
+}
Added: labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/DirectoryServerMessageHandlerImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/DirectoryServerMessageHandlerImpl.java (rev 0)
+++ labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/DirectoryServerMessageHandlerImpl.java 2010-06-22 00:15:20 UTC (rev 33581)
@@ -0,0 +1,97 @@
+package org.drools.grid.remote.directory;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+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.DirectoryNodeService;
+
+import org.drools.grid.local.DirectoryNodeLocalImpl;
+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 {
+ systemEventListener.exception("Uncaught exception on Server", cause);
+ }
+
+ public void messageReceived(GenericIoWriter session, Message msg) throws Exception {
+ SimpleCommand cmd = (SimpleCommand) ((Message) msg).getPayload();
+ try {
+ systemEventListener.debug("Message received on server : " + cmd.getName());
+ // systemEventListener.debug("Arguments : " + Arrays.toString(cmd.getArguments().toArray()));
+ switch (cmd.getName()) {
+ case RegisterExecutor: {
+ 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);
+ directory.register(executorId, resourceId);
+ System.out.println("Registered in Remote Directory => ExecutorId "+executorId+" - resourceId = "+resourceId);
+
+ SimpleCommand resultsCmnd = new SimpleCommand(cmd.getId(), SimpleCommandName.OperationResponse, null);
+ session.write(new Message( msg.getSessionId(),
+ msg.getResponseId(),
+ msg.isAsync(),
+ resultsCmnd ), null);
+
+ break;
+ }
+ case RequestDirectoryMap: {
+
+ Map<String, String> directoryMap = directory.getDirectoryMap();
+ 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 RequestLookupSessionId: {
+
+ String executorId = (String) cmd.getArguments().get(0);
+ String resourceId = directory.getDirectoryMap().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: {
+ systemEventListener.debug("Unknown command recieved on server");
+ }
+ }
+ } catch (RuntimeException e) {
+ systemEventListener.exception(e.getMessage(), e);
+ e.printStackTrace(System.err);
+ }
+ }
+
+ public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
+ systemEventListener.debug("Server IDLE " + session.getIdleCount(status));
+ }
+}
Added: labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/MinaRemoteDirectoryConnector.java
===================================================================
--- labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/MinaRemoteDirectoryConnector.java (rev 0)
+++ labs/jbossrules/branches/salaboy_drools_grid_api_separation/drools-grid/drools-grid-remote-dir-mina/src/main/java/org/drools/grid/remote/directory/MinaRemoteDirectoryConnector.java 2010-06-22 00:15:20 UTC (rev 33581)
@@ -0,0 +1,127 @@
+/*
+ * 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.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.apache.mina.core.future.ConnectFuture;
+import org.apache.mina.core.session.IoSession;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
+import org.apache.mina.transport.socket.SocketConnector;
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.SystemEventListener;
+import org.drools.SystemEventListenerFactory;
+import org.drools.grid.ConnectorException;
+import org.drools.grid.DirectoryNodeService;
+import org.drools.grid.GenericConnection;
+import org.drools.grid.GenericDirectoryConnector;
+import org.drools.grid.internal.Message;
+import org.drools.grid.internal.MessageResponseHandler;
+import org.drools.grid.internal.responsehandlers.BlockingMessageResponseHandler;
+import org.drools.grid.remote.RemoteConnection;
+import org.drools.grid.remote.mina.MinaIoHandler;
+
+/**
+ *
+ * @author salaboy
+ */
+public class MinaRemoteDirectoryConnector implements GenericDirectoryConnector{
+ private RemoteConnection connection;
+ private String providerName;
+ private SystemEventListener eventListener;
+ protected IoSession session;
+ protected AtomicInteger counter;
+ protected SocketConnector connector;
+ protected SocketAddress address;
+
+
+
+ public MinaRemoteDirectoryConnector(String providerName, String providerAddress,
+ Integer providerPort, SystemEventListener systemEventListener) {
+ SocketConnector minaconnector = new NioSocketConnector();
+ minaconnector.setHandler(new MinaIoHandler(SystemEventListenerFactory.getSystemEventListener()));
+ if (providerName == null) {
+ throw new IllegalArgumentException("Name can not be null");
+ }
+ this.counter = new AtomicInteger();
+ this.providerName = providerName;
+ this.eventListener = systemEventListener;
+ this.address = new InetSocketAddress(providerAddress, providerPort);
+ this.connector = minaconnector;
+ this.connection = new RemoteConnection();
+
+ }
+
+ public DirectoryNodeService getDirectoryNodeService() {
+ return new DirectoryNodeRemoteClient(this);
+ }
+
+ public void connect() throws ConnectorException {
+ if (session != null && session.isConnected()) {
+ throw new IllegalStateException("Already connected. Disconnect first.");
+ }
+
+ try {
+ this.connector.getFilterChain().addLast("codec"+UUID.randomUUID().toString(),
+ new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
+ System.out.println("Connecting to Server "+this.address);
+ ConnectFuture future1 = this.connector.connect(this.address);
+ future1.await(2000);
+ if (!future1.isConnected()) {
+ eventListener.info("unable to connect : " + address + " : " + future1.getException());
+ Logger.getLogger(MinaRemoteDirectoryConnector.class.getName()).log(Level.SEVERE, null, "The Directory Connection Failed!");
+ throw new ConnectorException("unable to connect : " + address + " : " + future1.getException());
+ }
+ eventListener.info("connected : " + address);
+ this.session = future1.getSession();
+
+ } catch (Exception e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ public void disconnect() throws ConnectorException {
+ connection.dispose();
+ System.out.println("DisConnected to Directory Server "+this.address);
+ if (session != null && session.isConnected()) {
+ session.close();
+ session.getCloseFuture().join();
+ }
+ }
+
+ public String getId() {
+ String hostName = ((InetSocketAddress)this.address).getHostName();
+ int hostPort = ((InetSocketAddress)this.address).getPort();
+ return "Mina:"+this.providerName+":"+hostName+":"+hostPort;
+ }
+
+ public int getSessionId() {
+ return (int) session.getId();
+ }
+ public IoSession getSession(){
+ return session;
+ }
+
+}
+
+
More information about the jboss-svn-commits
mailing list