[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