[infinispan-commits] Infinispan SVN: r2667 - in trunk/server/rest: src/main/scala/org/infinispan/rest and 1 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Thu Nov 4 07:00:08 EDT 2010


Author: galder.zamarreno at jboss.com
Date: 2010-11-04 07:00:07 -0400 (Thu, 04 Nov 2010)
New Revision: 2667

Modified:
   trunk/server/rest/pom.xml
   trunk/server/rest/src/main/scala/org/infinispan/rest/StartupListener.scala
   trunk/server/rest/src/main/webapp/WEB-INF/web.xml
Log:
ISPN-742 - Allow REST module to have CacheManager injected via JBoss MC - Use reflection to check whether CacheManager was injected and allow the bean name to be configured via an init property. (Merged from 4.2.x rev 2627)

Modified: trunk/server/rest/pom.xml
===================================================================
--- trunk/server/rest/pom.xml	2010-11-04 10:50:16 UTC (rev 2666)
+++ trunk/server/rest/pom.xml	2010-11-04 11:00:07 UTC (rev 2667)
@@ -84,6 +84,12 @@
          <scope>provided</scope>
       </dependency>
 
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>infinispan-server-core</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+
       <!-- and now for unit and integration tests -->
       <dependency>
          <groupId>org.mortbay.jetty</groupId>

Modified: trunk/server/rest/src/main/scala/org/infinispan/rest/StartupListener.scala
===================================================================
--- trunk/server/rest/src/main/scala/org/infinispan/rest/StartupListener.scala	2010-11-04 10:50:16 UTC (rev 2666)
+++ trunk/server/rest/src/main/scala/org/infinispan/rest/StartupListener.scala	2010-11-04 11:00:07 UTC (rev 2667)
@@ -1,9 +1,10 @@
 package org.infinispan.rest
 
-import org.infinispan.manager.DefaultCacheManager
 import scala.collection.JavaConversions._
-import javax.servlet.{ServletConfig, ServletContextListener, ServletContextEvent}
 import javax.servlet.http.HttpServlet
+import org.infinispan.manager.{EmbeddedCacheManager, DefaultCacheManager}
+import org.infinispan.server.core.Logging
+import javax.servlet.{ServletContext, ServletConfig}
 
 /**
  * To init the cache manager. Nice to do this on startup as any config problems will be picked up before any
@@ -13,20 +14,65 @@
  * @author Galder Zamarreño
  * @since 4.0
  */
-class StartupListener extends HttpServlet {
+class StartupListener extends HttpServlet with Logging {
    override def init(cfg: ServletConfig) {
       super.init(cfg)
-      val cfgFile = cfg getInitParameter "infinispan.config"
-      if (cfgFile == null)
-         ManagerInstance.instance = new DefaultCacheManager
-      else {
-         ManagerInstance.instance = new DefaultCacheManager(cfgFile)
+
+      // Check whether the listener is running within an MC environment. A couple of reasons to do this here:
+      // 1. REST module is a war file, so a module can't depend on it and compile against it
+      //    and any module that would want to provide a different listener would need to end up
+      //    setting ManagerInstance.instance
+      // 2. Doing it here makes it a lot easier rather than needing to have a separate module
+      //    within app server build system
+      ManagerInstance.instance = getMcInjectedCacheManager(cfg)
+
+      // If cache manager is still null, create one for REST server's own usage
+      if (ManagerInstance.instance == null) {
+         val cfgFile = cfg getInitParameter "infinispan.config"
+         if (cfgFile == null)
+            ManagerInstance.instance = new DefaultCacheManager
+         else
+            ManagerInstance.instance = new DefaultCacheManager(cfgFile)
       }
 
-     // Start defined caches to avoid issues with lazily started caches
-     for (cacheName <- asIterator(ManagerInstance.instance.getCacheNames.iterator))
-        ManagerInstance.instance.getCache(cacheName)
-     // Finally, start default cache as well
-     ManagerInstance.instance.getCache[String, Any]
-  }
+      // Start defined caches to avoid issues with lazily started caches
+      for (cacheName <- asIterator(ManagerInstance.instance.getCacheNames.iterator))
+         ManagerInstance.instance.getCache(cacheName)
+      // Finally, start default cache as well
+      ManagerInstance.instance.getCache[String, Any]
+   }
+
+   /**
+    * To avoid any hard dependencies, checking whether the cache manager is injected
+    * via the JBoss MicroContainer is done using reflection.
+    */
+   private def getMcInjectedCacheManager(cfg: ServletConfig): EmbeddedCacheManager = {
+      val isDebug = isDebugEnabled
+      val kernel = cfg.getServletContext.getAttribute("jboss.kernel:service=Kernel")
+      if (kernel != null) {
+         val kernelCl = loadClass("org.jboss.kernel.Kernel")
+         val kernelReg = kernelCl.getMethod("getRegistry").invoke(kernel)
+         val kernelRegCl = loadClass("org.jboss.kernel.spi.registry.KernelRegistry")
+         var beanName = cfg.getInitParameter("infinispan.cachemanager.bean")
+         if (beanName == null)
+            beanName = "DefaultCacheManager"
+         
+         val kernelRegEntry = kernelRegCl.getMethod("getEntry", classOf[Object]).invoke(kernelReg, beanName)
+         if (kernelRegEntry != null) {
+            val kernelRegEntryCl = loadClass("org.jboss.kernel.spi.registry.KernelRegistryEntry")
+            if (isDebug) debug("Retrieving cache manager from JBoss Microcontainer")
+            return kernelRegEntryCl.getMethod("getTarget").invoke(kernelRegEntry).asInstanceOf[EmbeddedCacheManager]
+         } else {
+            if (isDebug) debug("Running within JBoss Microcontainer but cache manager bean not present")
+            null
+         }
+      }
+      null
+   }
+
+   private def loadClass(name: String): Class[_] = {
+      val clazz = Thread.currentThread.getContextClassLoader loadClass name
+      clazz.asInstanceOf[Class[_]]
+   }
+
 }
\ No newline at end of file

Modified: trunk/server/rest/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/server/rest/src/main/webapp/WEB-INF/web.xml	2010-11-04 10:50:16 UTC (rev 2666)
+++ trunk/server/rest/src/main/webapp/WEB-INF/web.xml	2010-11-04 11:00:07 UTC (rev 2667)
@@ -19,12 +19,18 @@
       <servlet-name>InitServlet</servlet-name>
       <servlet-class>org.infinispan.rest.StartupListener</servlet-class>
 
-      <!-- specify your cache configuration file -->
+      <!-- Specify your cache configuration file -->
       <init-param>
          <param-name>infinispan.config</param-name>
          <param-value>infinispan.xml</param-value>
       </init-param>
 
+      <!-- Managed bean name to look up when the REST server is running an app server -->
+      <init-param>
+         <param-name>infinispan.cachemanager.bean</param-name>
+         <param-value>DefaultCacheManager</param-value>
+      </init-param>
+
       <load-on-startup>1</load-on-startup>
    </servlet>
 



More information about the infinispan-commits mailing list