[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