[infinispan-commits] Infinispan SVN: r1084 - in trunk/core/src: test/java/org/infinispan/remoting and 1 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Fri Oct 30 11:20:36 EDT 2009


Author: manik.surtani at jboss.com
Date: 2009-10-30 11:20:35 -0400 (Fri, 30 Oct 2009)
New Revision: 1084

Added:
   trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java
   trunk/core/src/test/java/org/infinispan/remoting/jgroups/
   trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java
Modified:
   trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsTransport.java
Log:
[ISPN-185] Need to provide a mechanism in which a JGroups channel can be passed in

Added: trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java	                        (rev 0)
+++ trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java	2009-10-30 15:20:35 UTC (rev 1084)
@@ -0,0 +1,18 @@
+package org.infinispan.remoting.transport.jgroups;
+
+import org.jgroups.Channel;
+
+/**
+ * A hook to pass in a JGroups channel.  Implementations need to provide a public no-arg constructor as instances are
+ * created via reflection.
+ *
+ * @author Manik Surtani
+ * @since 4.0
+ */
+public interface JGroupsChannelLookup {
+   Channel getJGroupsChannel();
+
+   boolean shouldStartAndConnect();
+
+   boolean shouldStopAndDisconnect();
+}


Property changes on: trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsTransport.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsTransport.java	2009-10-30 14:49:30 UTC (rev 1083)
+++ trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsTransport.java	2009-10-30 15:20:35 UTC (rev 1084)
@@ -71,8 +71,17 @@
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
 /**
- * An encapsulation of a JGroups transport
- *
+ * An encapsulation of a JGroups transport.  JGroups transports can be configured using a variety of methods, usually
+ * by passing in one of the following properties:
+ * <ul>
+ * <li><tt>configurationString</tt> - a JGroups configuration String</li>
+ * <li><tt>configurationXml</tt> - JGroups configuration XML as a String</li>
+ * <li><tt>configurationFile</tt> - String pointing to a JGroups XML configuration file</li>
+ * <li><tt>channelLookup</tt> - Fully qualified class name of a {@link org.infinispan.remoting.transport.jgroups.JGroupsChannelLookup} instance</li>
+ * </ul>
+ * These are normally passed in as Properties in {@link org.infinispan.config.GlobalConfiguration#setTransportProperties(java.util.Properties)}
+ * or in the Infinispan XML configuration file.
+ * 
  * @author Manik Surtani
  * @author Galder Zamarreño
  * @since 4.0
@@ -81,7 +90,9 @@
    public static final String CONFIGURATION_STRING = "configurationString";
    public static final String CONFIGURATION_XML = "configurationXml";
    public static final String CONFIGURATION_FILE = "configurationFile";
+   public static final String CHANNEL_LOOKUP = "channelLookup";
    private static final String DEFAULT_JGROUPS_CONFIGURATION_FILE = "config-samples/jgroups-udp.xml";
+   private boolean startChannel = true, stopChannel = true;
 
    Channel channel;
    boolean createdChannel = false;
@@ -137,11 +148,12 @@
 
       initChannelAndRPCDispatcher();
 
-      //otherwise just connect
-      try {
-         channel.connect(c.getClusterName());
-      } catch (ChannelException e) {
-         throw new CacheException("Unable to start JGroups Channel", e);
+      if (startChannel) {
+         try {
+            channel.connect(c.getClusterName());
+         } catch (ChannelException e) {
+            throw new CacheException("Unable to start JGroups Channel", e);
+         }
       }
       log.info("Cache local address is {0}", getAddress());
 
@@ -158,7 +170,7 @@
 
    public void stop() {
       try {
-         if (channel != null && channel.isOpen()) {
+         if (stopChannel && channel != null && channel.isOpen()) {
             log.info("Disconnecting and closing JGroups Channel");
             channel.disconnect();
             channel.close();
@@ -208,7 +220,22 @@
       // finally the legacy JGroups String properties.
       String cfg;
       if (props != null) {
-         if (props.containsKey(CONFIGURATION_FILE)) {
+         if (props.containsKey(CHANNEL_LOOKUP)) {
+            String channelLookupClassName = props.getProperty(CHANNEL_LOOKUP);
+
+            try {
+               JGroupsChannelLookup lookup = (JGroupsChannelLookup) Util.getInstance(channelLookupClassName);
+               channel = lookup.getJGroupsChannel();
+               startChannel = lookup.shouldStartAndConnect();
+               stopChannel = lookup.shouldStopAndDisconnect();
+            } catch (ClassCastException e) {
+               log.error("Class [" + channelLookupClassName + "] cannot be cast to JGroupsChannelLookup!  Not using a channel lookup.");
+            } catch (Exception e) {
+               log.error("Errors instantiating [" + channelLookupClassName + "]!  Not using a channel lookup.");
+            }
+         }
+
+         if (channel == null && props.containsKey(CONFIGURATION_FILE)) {
             cfg = props.getProperty(CONFIGURATION_FILE);
             try {
                channel = new JChannel(new FileLookup().lookupFileLocation(cfg));
@@ -218,7 +245,7 @@
             }
          }
 
-         if (props.containsKey(CONFIGURATION_XML)) {
+         if (channel == null && props.containsKey(CONFIGURATION_XML)) {
             cfg = props.getProperty(CONFIGURATION_XML);
             try {
                channel = new JChannel(XmlConfigHelper.stringToElement(cfg));
@@ -228,7 +255,7 @@
             }
          }
 
-         if (props.containsKey(CONFIGURATION_STRING)) {
+         if (channel == null && props.containsKey(CONFIGURATION_STRING)) {
             cfg = props.getProperty(CONFIGURATION_STRING);
             try {
                channel = new JChannel(cfg);
@@ -395,7 +422,7 @@
                } else if (value instanceof Throwable) {
                   Throwable t = (Throwable) value;
                   if (trace) log.trace("Unexpected throwable from " + rsp.getSender(), t);
-                  throw new CacheException("Remote (" + rsp.getSender() +") failed unexpectedly", t);
+                  throw new CacheException("Remote (" + rsp.getSender() + ") failed unexpectedly", t);
                }
             }
          }
@@ -577,4 +604,7 @@
       return dispatcher;
    }
 
+   public Channel getChannel() {
+      return channel;
+   }
 }

Added: trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java	                        (rev 0)
+++ trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java	2009-10-30 15:20:35 UTC (rev 1084)
@@ -0,0 +1,59 @@
+package org.infinispan.remoting.jgroups;
+
+import org.easymock.classextension.EasyMock;
+import org.infinispan.config.GlobalConfiguration;
+import org.infinispan.factories.GlobalComponentRegistry;
+import org.infinispan.manager.CacheManager;
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.remoting.transport.Transport;
+import org.infinispan.remoting.transport.jgroups.JGroupsChannelLookup;
+import org.infinispan.remoting.transport.jgroups.JGroupsTransport;
+import org.infinispan.test.AbstractInfinispanTest;
+import org.infinispan.test.TestingUtil;
+import org.jgroups.Address;
+import org.jgroups.Channel;
+import org.jgroups.JChannel;
+import org.testng.annotations.Test;
+
+import java.util.Properties;
+
+ at Test(testName = "remoting.jgroups.ChannelLookupTest", groups = "functional")
+public class ChannelLookupTest extends AbstractInfinispanTest {
+   public void channelLookupTest() {
+      GlobalConfiguration gc = GlobalConfiguration.getClusteredDefault();
+      Properties p = new Properties();
+      p.setProperty("channelLookup", DummyLookup.class.getName());
+      gc.setTransportProperties(p);
+      CacheManager cm = new DefaultCacheManager(gc);
+      cm.start();
+      cm.getCache();
+      GlobalComponentRegistry gcr = TestingUtil.extractGlobalComponentRegistry(cm);
+      Transport t = gcr.getComponent(Transport.class);
+      assert t != null;
+      assert t instanceof JGroupsTransport;
+      assert !(((JGroupsTransport) t).getChannel() instanceof JChannel);
+   }
+
+   public static class DummyLookup implements JGroupsChannelLookup {
+      Channel mockChannel;
+      Address a = EasyMock.createNiceMock(Address.class);
+
+      public DummyLookup() {
+         mockChannel = EasyMock.createNiceMock(Channel.class);
+         EasyMock.expect(mockChannel.getAddress()).andReturn(a);
+         EasyMock.replay(mockChannel, a);
+      }
+
+      public Channel getJGroupsChannel() {
+         return mockChannel;
+      }
+
+      public boolean shouldStartAndConnect() {
+         return false;
+      }
+
+      public boolean shouldStopAndDisconnect() {
+         return false;
+      }
+   }
+}


Property changes on: trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF



More information about the infinispan-commits mailing list