Skip to content

Commit

Permalink
created non-static version of bean container
Browse files Browse the repository at this point in the history
  • Loading branch information
cdiadvocate committed Apr 27, 2011
1 parent 7aeeb6f commit 79f9766
Show file tree
Hide file tree
Showing 8 changed files with 143 additions and 30 deletions.
Expand Up @@ -2,11 +2,16 @@


import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.ServiceLoader; import java.util.ServiceLoader;
import java.util.WeakHashMap;


import org.cdisource.logging.Logger; import org.cdisource.logging.Logger;



import static org.cdisource.logging.LogFactoryManager.logger; import static org.cdisource.logging.LogFactoryManager.logger;




Expand Down Expand Up @@ -54,10 +59,15 @@ public class BeanContainerManager {
/** Property name that we use to look up the bean container override. */ /** Property name that we use to look up the bean container override. */
public static String PROP_NAME = "org.cdisource.beancontainer.BeanContainer"; public static String PROP_NAME = "org.cdisource.beancontainer.BeanContainer";


/** private static Map<ClassLoader, WeakReference<BeanContainer>> map = Collections
* Holds a singleton instance of a {@link BeanContainer} .synchronizedMap(new WeakHashMap<ClassLoader, WeakReference<BeanContainer>>());
*/
private static BeanContainer instance; private static boolean useStatic = false;
private static BeanContainer beanContainer;

public static void testEnv() {
useStatic=true;
}


/** /**
* Thread safe method to create and initialize the {@link BeanContainer} * Thread safe method to create and initialize the {@link BeanContainer}
Expand All @@ -78,10 +88,6 @@ public static void initialize() {
*/ */
public synchronized static void initialize(Properties properties) { public synchronized static void initialize(Properties properties) {
log.trace("initialize(properties)"); log.trace("initialize(properties)");

if (instance != null) {
return;
}
startUpInstance(properties); startUpInstance(properties);


} }
Expand All @@ -101,15 +107,33 @@ public synchronized static void initialize(Properties properties) {
* @see {@link BeanContainerManager#initialize()} * @see {@link BeanContainerManager#initialize()}
* */ * */
public static BeanContainer getInstance() { public static BeanContainer getInstance() {

if (useStatic && beanContainer!=null) {
return beanContainer;
}
log.trace("getInstance() called"); log.trace("getInstance() called");
if (instance == null) { synchronized (map) {
log.debug("getInstance():: instance was null"); WeakReference<BeanContainer> weakReference = map.get(Thread.currentThread().getContextClassLoader());
initialize(); if (weakReference==null || weakReference.get()==null) {
log.debug("getInstance():: instance was null");
initialize();
}
return beanContainer();
}
}

private static BeanContainer beanContainer() {
if (useStatic && beanContainer!=null) {
return beanContainer;
}
WeakReference<BeanContainer> weakReference = map.get(Thread.currentThread().getContextClassLoader());
if (weakReference== null || weakReference.get() == null) {
throw new IllegalStateException("WeakReference<BeanContainer> is not set");
} }
log.debug("getInstance():: instance is null? %s", instance == null ? "yes" : "no"); return weakReference.get();
return instance;
} }



/** /**
* Create the bean container instance using system properties. If this method * Create the bean container instance using system properties. If this method
* is called before one of the initialize methods is called, then the * is called before one of the initialize methods is called, then the
Expand Down Expand Up @@ -140,15 +164,16 @@ public static BeanContainer createInstance() {
*/ */
private synchronized static void startUpInstance(Properties properties) { private synchronized static void startUpInstance(Properties properties) {
log.trace("startUpInstance(properties)"); log.trace("startUpInstance(properties)");
// double check that the instance is null, someone might have created BeanContainer instance = generateInstance(properties);
// it while we were entering this method.
if (instance != null) {
return;
}
instance = generateInstance(properties);
if (instance != null) { if (instance != null) {
instance.start(); instance.start();
} }

if (useStatic) {
beanContainer= instance;
} else {
map.put(Thread.currentThread().getContextClassLoader(), new WeakReference<BeanContainer>(instance));
}
} }


/** /**
Expand Down Expand Up @@ -213,9 +238,9 @@ private static BeanContainer generateInstance(Properties properties) {
* a new instance. * a new instance.
*/ */
public static synchronized void shutdown() { public static synchronized void shutdown() {
if (instance != null) { BeanContainer beanContainer = beanContainer();
instance.stop(); if (beanContainer!=null) {
instance = null; beanContainer.stop();
} }
} }
} }
Expand Up @@ -23,7 +23,7 @@
*/ */
public class AbstractBeanContainerTest { public class AbstractBeanContainerTest {


private BeanContainer beanContainer; private static BeanContainer beanContainer;


public BeanContainer getBeanContainer() { public BeanContainer getBeanContainer() {
return beanContainer; return beanContainer;
Expand Down
17 changes: 13 additions & 4 deletions spring/pom.xml
Expand Up @@ -83,12 +83,25 @@
<artifactId>spring-aspects</artifactId> <artifactId>spring-aspects</artifactId>
<version>${spring.version}</version> <version>${spring.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId> <artifactId>spring-tx</artifactId>
<version>${spring.version}</version> <version>${spring.version}</version>
</dependency> </dependency>


<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>

<dependency> <dependency>
<groupId>org.cdisource.beancontainer</groupId> <groupId>org.cdisource.beancontainer</groupId>
<artifactId>beancontainer-api</artifactId> <artifactId>beancontainer-api</artifactId>
Expand Down Expand Up @@ -228,10 +241,6 @@
<configuration> <configuration>
<useSystemClassLoader>true</useSystemClassLoader> <useSystemClassLoader>true</useSystemClassLoader>
<useManifestOnlyJar>false</useManifestOnlyJar> <useManifestOnlyJar>false</useManifestOnlyJar>
<excludes>
<exclude>**/*SpringIntegrationExtentionTest*</exclude>
<exclude>**/*CdiBeanThatHasSpringInjection*</exclude>
</excludes>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
Expand Down
@@ -0,0 +1,30 @@
package org.cdisource.springintegration.servletsupport;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.cdisource.springintegration.springsupport.ApplicationContextLocator;
import org.cdisource.springintegration.springsupport.ApplicationContextLocatorImpl;
import org.cdisource.springintegration.springsupport.ApplicationContextLocatorManager;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

@WebListener
public class ApplicationContextFinderServletContextListener implements ServletContextListener {


@Override
public void contextInitialized(ServletContextEvent sce) {
WebApplicationContext requiredWebApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(sce.getServletContext());
ApplicationContextLocatorImpl.putContext(requiredWebApplicationContext);
ApplicationContextLocator applicationContextLocator = ApplicationContextLocatorManager.getInstance();
sce.getServletContext().setAttribute(ApplicationContextLocator.class.getName(), applicationContextLocator);
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
sce.getServletContext().setAttribute(ApplicationContextLocator.class.getName(), null);
}

}
17 changes: 17 additions & 0 deletions spring/src/main/resources/META-INF/web-fragment.xml
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>

<web-fragment version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd">

<name>Spring CDI Bridge</name>

<ordering><after><others/></after></ordering>

<listener>
<display-name></display-name>

<listener-class>org.cdisource.springintegration.servletsupport.ApplicationContextFinderServletContextListener</listener-class>

</listener>


</web-fragment>
Expand Up @@ -4,6 +4,7 @@
import javax.inject.Inject; import javax.inject.Inject;


import org.cdisource.beancontainer.BeanContainer; import org.cdisource.beancontainer.BeanContainer;
import org.cdisource.beancontainer.BeanContainerImpl;
import org.cdisource.beancontainer.BeanContainerManager; import org.cdisource.beancontainer.BeanContainerManager;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runner.notification.RunNotifier; import org.junit.runner.notification.RunNotifier;
Expand Down Expand Up @@ -48,25 +49,26 @@ public CdiTestRunner(Class<?> klass) throws InitializationError {


private static BeanContainer beanContainer; private static BeanContainer beanContainer;


private RunConfig runConfig;


/** /**
* Lazy initializes a bean container that exists on the classpath. * Lazy initializes a bean container that exists on the classpath.
* @param annotation * @param annotation
* *
* @return instance of the CDI Bean container * @return instance of the CDI Bean container
*/ */
public static BeanContainer getBeanContainer() { public static BeanContainer getBeanContainer() {
BeanContainerManager.testEnv();
if (beanContainer == null) { if (beanContainer == null) {
beanContainer = BeanContainerManager.getInstance(); beanContainer = BeanContainerManager.getInstance();
} }

return beanContainer; return beanContainer;
} }


@Override @Override
protected Object createTest() throws Exception { protected Object createTest() throws Exception {
Class<?> clazz = getTestClass().getJavaClass(); Class<?> clazz = getTestClass().getJavaClass();
this.runConfig = clazz.getAnnotation(RunConfig.class); //this.runConfig = clazz.getAnnotation(RunConfig.class);


Object result = getBeanContainer().getBeanByType(clazz); Object result = getBeanContainer().getBeanByType(clazz);
if (result == null) { if (result == null) {
Expand Down
7 changes: 7 additions & 0 deletions web/pom.xml
Expand Up @@ -58,6 +58,13 @@
<scope>test</scope> <scope>test</scope>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>

<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>


<build> <build>
Expand Down
23 changes: 23 additions & 0 deletions web/src/main/java/org/cdisource/web/CDIServletContextListener.java
@@ -0,0 +1,23 @@
package org.cdisource.web;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.cdisource.beancontainer.BeanContainer;
import org.cdisource.beancontainer.BeanContainerManager;

@WebListener
public class CDIServletContextListener implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext().setAttribute(BeanContainer.class.getName(), BeanContainerManager.getInstance());
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
sce.getServletContext().setAttribute(BeanContainer.class.getName(), null);
}

}

0 comments on commit 79f9766

Please sign in to comment.