[jboss-cvs] JBossAS SVN: r108502 - in trunk/weld-int: assembly/src/main/assembly and 9 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Sun Oct 10 13:49:01 EDT 2010
Author: marius.bogoevici
Date: 2010-10-10 13:49:00 -0400 (Sun, 10 Oct 2010)
New Revision: 108502
Added:
trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/JBossProxyServices.java
trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/provider/
trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/provider/JBossSingletonProvider.java
Modified:
trunk/weld-int/assembly/pom.xml
trunk/weld-int/assembly/src/main/assembly/assembly.xml
trunk/weld-int/assembly/src/main/assembly/resources/META-INF/weld-deployers-jboss-beans.xml
trunk/weld-int/deployer/pom.xml
trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/cl/WeldCoreIntegrationDeployer.java
trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/WeldBootstrapDeployer.java
trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/bda/DUTopLevelClassLoaderGetter.java
trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/helpers/BootstrapBean.java
Log:
JBAS-8304 - Weld set up as a shared library
The build now splits weld-core into JSF and non-JSF dependent components: JSF dependent components will not be shared.
Added JBossSingletonProvider and JBossProxyServices.
Modified: trunk/weld-int/assembly/pom.xml
===================================================================
--- trunk/weld-int/assembly/pom.xml 2010-10-09 15:58:57 UTC (rev 108501)
+++ trunk/weld-int/assembly/pom.xml 2010-10-10 17:49:00 UTC (rev 108502)
@@ -14,6 +14,98 @@
<build>
<plugins>
+ <!--
+ Special treatment for JSF API dependent files
+ Because the API is not shared, we need to attach JSF extensions separately
+ Therefore, weld-core will be split in two: one jar is shared, one jar is
+ attached to the deployment's DU via
+ -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>core-no-jsf</id>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ <configuration>
+ <createSourcesJar>true</createSourcesJar>
+ <finalName>weld-core-no-jsf</finalName>
+ <shadedClassifierName>no-jsf</shadedClassifierName>
+ <artifactSet>
+ <includes>
+ <include>org.jboss.weld:weld-core</include>
+ </includes>
+ </artifactSet>
+ <filters>
+ <filter>
+ <artifact>org.jboss.weld:weld-core</artifact>
+ <includes>
+ <include>org/jboss/weld/**</include>
+ </includes>
+ <excludes>
+ <exclude>org/jboss/weld/jsf/ConversationAwareViewHandler*</exclude>
+ <exclude>org/jboss/weld/jsf/FacesUrlTransformer*</exclude>
+ <exclude>org/jboss/weld/jsf/JsfHelper*</exclude>
+ <exclude>org/jboss/weld/jsf/WeldPhaseListener*</exclude>
+ <exclude>org/jboss/weld/servlet/ConversationPropagationFilter*</exclude>
+ </excludes>
+ </filter>
+ </filters>
+ <transformers>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+ <manifestEntries>
+ <Specification-Title>Weld Implementation (JSF utilities excluded)</Specification-Title>
+ <Specification-Vendor>Seam Framework</Specification-Vendor>
+ <Specification-Version>${version.org.jboss.weld}</Specification-Version>
+ </manifestEntries>
+ </transformer>
+ </transformers>
+
+ </configuration>
+ </execution>
+ <execution>
+ <id>core-jsf-only</id>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ <configuration>
+ <createSourcesJar>true</createSourcesJar>
+ <finalName>weld-core-jsf-only</finalName>
+ <shadedClassifierName>jsf-only</shadedClassifierName>
+ <artifactSet>
+ <includes>
+ <include>org.jboss.weld:weld-core</include>
+ </includes>
+ </artifactSet>
+ <filters>
+ <filter>
+ <artifact>org.jboss.weld:weld-core</artifact>
+ <includes>
+ <include>org/jboss/weld/jsf/ConversationAwareViewHandler*</include>
+ <include>org/jboss/weld/jsf/FacesUrlTransformer*</include>
+ <include>org/jboss/weld/jsf/JsfHelper*</include>
+ <include>org/jboss/weld/jsf/WeldPhaseListener*</include>
+ <include>org/jboss/weld/servlet/ConversationPropagationFilter*</include>
+ </includes>
+ </filter>
+ </filters>
+ <transformers>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+ <manifestEntries>
+ <Specification-Title>Weld Implementation (JSF utilities only)</Specification-Title>
+ <Specification-Vendor>Seam Framework</Specification-Vendor>
+ <Specification-Version>${version.org.jboss.weld}</Specification-Version>
+ </manifestEntries>
+ </transformer>
+ </transformers>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
Modified: trunk/weld-int/assembly/src/main/assembly/assembly.xml
===================================================================
--- trunk/weld-int/assembly/src/main/assembly/assembly.xml 2010-10-09 15:58:57 UTC (rev 108501)
+++ trunk/weld-int/assembly/src/main/assembly/assembly.xml 2010-10-10 17:49:00 UTC (rev 108502)
@@ -16,9 +16,20 @@
<fileSet>
<directory>src/main/assembly/resources</directory>
<outputDirectory></outputDirectory>
- </fileSet>
+ </fileSet>
</fileSets>
-
+
+ <files>
+ <file>
+ <source>target/weld-core-jsf-only.jar</source>
+ <outputDirectory>lib-int</outputDirectory>
+ </file>
+ <file>
+ <source>target/weld-core-no-jsf.jar</source>
+ <outputDirectory></outputDirectory>
+ </file>
+ </files>
+
<dependencySets>
<dependencySet>
<outputFileNameMapping>${artifact.artifactId}.${artifact.extension}</outputFileNameMapping>
@@ -30,7 +41,6 @@
<include>org.jboss.jbossas:weld-int-ejb</include>
<include>org.jboss.jbossas:weld-int-deployer</include>
<include>org.jboss.jbossas:weld-int-deployer-mc-int</include>
-
<include>org.jboss.interceptor:jboss-interceptor</include>
</includes>
</dependencySet>
@@ -39,10 +49,8 @@
<outputFileNameMapping>${artifact.artifactId}.${artifact.extension}</outputFileNameMapping>
<outputDirectory>lib-int</outputDirectory>
<includes>
- <include>org.jboss.weld:weld-core</include>
<include>org.jboss.jbossas:weld-int-webtier</include>
<include>org.jboss.kernel:jboss-weld-int</include>
-
</includes>
</dependencySet>
</dependencySets>
Modified: trunk/weld-int/assembly/src/main/assembly/resources/META-INF/weld-deployers-jboss-beans.xml
===================================================================
--- trunk/weld-int/assembly/src/main/assembly/resources/META-INF/weld-deployers-jboss-beans.xml 2010-10-09 15:58:57 UTC (rev 108501)
+++ trunk/weld-int/assembly/src/main/assembly/resources/META-INF/weld-deployers-jboss-beans.xml 2010-10-10 17:49:00 UTC (rev 108502)
@@ -55,7 +55,11 @@
</bean>
<!-- Responsible for booting Weld -->
- <bean name="WeldBootstrapDeployer" class="org.jboss.weld.integration.deployer.env.WeldBootstrapDeployer"/>
+ <bean name="WeldBootstrapDeployer" class="org.jboss.weld.integration.deployer.env.WeldBootstrapDeployer">
+ <property name="singletonProvider"><inject bean="JBossSingletonProvider"/></property>
+ </bean>
+
+ <bean name="JBossSingletonProvider" class="org.jboss.weld.integration.provider.JBossSingletonProvider"/>
<!-- Responsible for pushing the JSF faces-config.xml onto the application classpath -->
<bean name="WeldFacesIntegrationDeployer" class="org.jboss.weld.integration.deployer.cl.WeldFacesIntegrationDeployer"/>
Modified: trunk/weld-int/deployer/pom.xml
===================================================================
--- trunk/weld-int/deployer/pom.xml 2010-10-09 15:58:57 UTC (rev 108501)
+++ trunk/weld-int/deployer/pom.xml 2010-10-10 17:49:00 UTC (rev 108502)
@@ -51,6 +51,12 @@
</dependency>
<dependency>
+ <groupId>org.jboss.weld</groupId>
+ <artifactId>weld-core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
<groupId>org.jboss.jbossas</groupId>
<artifactId>weld-int-ejb</artifactId>
</dependency>
Added: trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/JBossProxyServices.java
===================================================================
--- trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/JBossProxyServices.java (rev 0)
+++ trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/JBossProxyServices.java 2010-10-10 17:49:00 UTC (rev 108502)
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.weld.integration.deployer;
+
+import org.jboss.classloading.spi.RealClassLoader;
+import org.jboss.weld.bean.proxy.util.SimpleProxyServices;
+import org.jboss.weld.exceptions.WeldException;
+import org.jboss.weld.logging.messages.BeanMessage;
+import org.jboss.weld.serialization.spi.ProxyServices;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
+/**
+ * A {@link ProxyServices} implementation for JBoss AS. This needs to be used if Weld is shared.
+ *
+ * @author Marius Bogoevici
+ */
+public class JBossProxyServices extends SimpleProxyServices
+{
+
+ public ClassLoader getClassLoader(final Class<?> proxiedBeanType)
+ {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ {
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ {
+ public ClassLoader run()
+ {
+ return _getClassLoader(proxiedBeanType);
+ }
+ });
+ }
+ else
+ {
+ return _getClassLoader(proxiedBeanType);
+ }
+ }
+
+ /**
+ * Return the thread context classloader or its first {@link org.jboss.classloading.spi.RealClassLoader}
+ * parent (WARs WebCtxLoader$ENCLoader cannot be used for defining new proxy classes)
+ *
+ * If no {@link org.jboss.classloading.spi.RealClassLoader} is found, we return whatever we found.
+ *
+ * If there is no thread context classloader, then just fall back to the default Weld behaviour.
+ *
+ */
+ private ClassLoader _getClassLoader(Class<?> proxiedBeanType)
+ {
+ ClassLoader threadContextClassLoader = getThreadContextClassLoader();
+ ClassLoader actualClassLoader = threadContextClassLoader;
+ while (actualClassLoader != null && !(actualClassLoader instanceof RealClassLoader))
+ {
+ actualClassLoader = actualClassLoader.getParent();
+ }
+ if (actualClassLoader != null)
+ {
+ return actualClassLoader;
+ }
+ else if (threadContextClassLoader != null)
+ {
+ return threadContextClassLoader;
+ }
+ else
+ {
+ // fall back to the default Weld behaviour
+ return super.getClassLoader(proxiedBeanType);
+ }
+ }
+
+ private static ClassLoader getThreadContextClassLoader()
+ {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ {
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ {
+ public ClassLoader run()
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ }
+ else
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/cl/WeldCoreIntegrationDeployer.java
===================================================================
--- trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/cl/WeldCoreIntegrationDeployer.java 2010-10-09 15:58:57 UTC (rev 108501)
+++ trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/cl/WeldCoreIntegrationDeployer.java 2010-10-10 17:49:00 UTC (rev 108502)
@@ -29,6 +29,6 @@
@Override
protected String getShortLibName()
{
- return "weld-core.jar";
+ return "weld-core-jsf-only.jar";
}
}
\ No newline at end of file
Modified: trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/WeldBootstrapDeployer.java
===================================================================
--- trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/WeldBootstrapDeployer.java 2010-10-09 15:58:57 UTC (rev 108501)
+++ trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/WeldBootstrapDeployer.java 2010-10-10 17:49:00 UTC (rev 108502)
@@ -21,6 +21,8 @@
*/
package org.jboss.weld.integration.deployer.env;
+import org.jboss.beans.metadata.api.annotations.Start;
+import org.jboss.beans.metadata.api.annotations.Stop;
import org.jboss.beans.metadata.spi.BeanMetaData;
import org.jboss.beans.metadata.spi.ValueMetaData;
import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
@@ -29,13 +31,17 @@
import org.jboss.deployers.spi.DeploymentException;
import org.jboss.deployers.structure.spi.DeploymentUnit;
import org.jboss.weld.bootstrap.api.Bootstrap;
+import org.jboss.weld.bootstrap.api.SingletonProvider;
import org.jboss.weld.context.api.BeanStore;
import org.jboss.weld.context.api.helpers.ConcurrentHashMapBeanStore;
import org.jboss.weld.integration.deployer.DeployersUtils;
+import org.jboss.weld.integration.deployer.JBossProxyServices;
+import org.jboss.weld.integration.deployer.env.bda.DUTopLevelClassLoaderGetter;
import org.jboss.weld.integration.deployer.env.bda.DeploymentImpl;
-import org.jboss.weld.integration.deployer.env.helpers.BootstrapBean;
-import org.jboss.weld.integration.injection.WeldInjector;
+import org.jboss.weld.integration.provider.JBossSingletonProvider;
+
+
/**
* Deploy Weld boostrap service.
*
@@ -43,6 +49,8 @@
*/
public class WeldBootstrapDeployer extends AbstractBootstrapInfoDeployer
{
+ private SingletonProvider singletonProvider;
+
public WeldBootstrapDeployer()
{
super(false);
@@ -51,21 +59,70 @@
addInput(DeployersUtils.JAVAX_VALIDATION_VALIDATOR_FACTORY);
}
+ /**
+ * Setter for allowing the injection of a different type of SingletonProvider
+ *
+ * @param singletonProvider
+ */
+ public void setSingletonProvider(SingletonProvider singletonProvider)
+ {
+ if (singletonProvider == null)
+ {
+ throw new IllegalArgumentException("Cannot set a null SingletonProvider");
+ }
+ this.singletonProvider = singletonProvider;
+ }
+
+ /**
+ * Configures the SingletonProvider to be used by the application server
+ */
+ @Start
+ public void install()
+ {
+ if (singletonProvider != null)
+ {
+ SingletonProvider.initialize(singletonProvider);
+ }
+ else
+ {
+ // set up the default Singleton provider, which in this case is JBossSingletonProvider
+ JBossSingletonProvider provider = new JBossSingletonProvider();
+ provider.setTopLevelClassLoaderGetter(DUTopLevelClassLoaderGetter.INSTANCE);
+ SingletonProvider.initialize(provider);
+ }
+ }
+
+ /**
+ * Removes the SingletonProvider - we assume that no application is running anymore
+ * in this application server when the deployer is uninstalled (shutdown)
+ */
+ @Stop
+ public void uninstall()
+ {
+ SingletonProvider.reset();
+ }
+
@Override
protected void deployInternal(DeploymentUnit unit, BootstrapInfo info) throws DeploymentException
{
-
+
ValueMetaData ejbServicesValue = info.getEjbServices();
if (ejbServicesValue == null)
+ {
throw new DeploymentException("Missing ejb services: " + unit);
+ }
ValueMetaData ejbInjectionServicesValue = info.getEjbInjectionServices();
if (ejbInjectionServicesValue == null)
+ {
throw new DeploymentException("Missing ejb injection services: " + unit);
+ }
ValueMetaData deploymentValue = info.getDeployment();
if (deploymentValue == null)
+ {
throw new DeploymentException("Missing deployment: " + unit);
+ }
String bootstrapName = DeployersUtils.getBootstrapBeanName(unit);
BeanMetaDataBuilder bootstrap = BeanMetaDataBuilder.createBuilder(bootstrapName, "org.jboss.weld.integration.deployer.env.helpers.BootstrapBean");
@@ -80,6 +137,7 @@
bootstrap.addPropertyMetaData("applicationContext", createBeanStore());
bootstrap.addPropertyMetaData("securityServices", bootstrap.createInject("JBossSecurityServices"));
bootstrap.addPropertyMetaData("validationServices", createValidationServices(unit));
+ bootstrap.addPropertyMetaData("proxyServices", createProxyServices());
bootstrap.setCreate("initialize");
bootstrap.setStart("boot");
bootstrap.setDestroy("shutdown");
@@ -87,8 +145,8 @@
//Make the bootstrap depend on this deployment unit so that we know all sub deployments have been processed
bootstrap.addDependency(unit.getName());
-
-
+
+
// call dynamic dependency creator for EJBs
ParameterMetaDataBuilder install = bootstrap.addInstallWithParameters("createDepenencies", "DynamicDependencyCreator", null, ControllerState.CONFIGURED);
install.addParameterMetaData(Object.class.getName(), bootstrapName);
@@ -100,6 +158,16 @@
}
/**
+ * Create proxy services
+ *
+ * @return the {@link org.jboss.weld.serialization.spi.ProxyServices} instance
+ */
+ protected JBossProxyServices createProxyServices()
+ {
+ return new JBossProxyServices();
+ }
+
+ /**
* Create new bean store.
*
* @return the bean store instance
@@ -129,7 +197,7 @@
if (validatorFactory == null && isValidationFactoryRequired(unit))
{
- throw new DeploymentException("Missing ValidatorFactory attachment in deployment: " + unit);
+ throw new DeploymentException("Missing ValidatorFactory attachment in deployment: " + unit);
}
String beanName = unit.getName() + "_JBossValidationServices";
BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(beanName, "org.jboss.weld.integration.validation.JBossValidationServices");
@@ -143,4 +211,4 @@
//TODO: define more strict criteria for determining whether the presence of a validation factory is required (e.g. JSF, JPA deployments)
return false;
}
-}
\ No newline at end of file
+}
Modified: trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/bda/DUTopLevelClassLoaderGetter.java
===================================================================
--- trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/bda/DUTopLevelClassLoaderGetter.java 2010-10-09 15:58:57 UTC (rev 108501)
+++ trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/bda/DUTopLevelClassLoaderGetter.java 2010-10-10 17:49:00 UTC (rev 108502)
@@ -22,6 +22,8 @@
package org.jboss.weld.integration.deployer.env.bda;
+import org.jboss.classloader.spi.base.BaseClassLoader;
+import org.jboss.classloading.spi.RealClassLoader;
import org.jboss.classloading.spi.dependency.Module;
import org.jboss.deployers.plugins.classloading.AbstractDeploymentClassLoaderPolicyModule;
import org.jboss.deployers.structure.spi.DeploymentUnit;
@@ -51,9 +53,24 @@
if (cl == null)
throw new IllegalArgumentException("Null classloader");
- Module module = SecurityActions.getModuleForClassLoader(cl);
+ // start at the first BaseClassLoader parent,
+ ClassLoader firstBaseClassLoader = cl;
+ while (firstBaseClassLoader != null && !(firstBaseClassLoader instanceof RealClassLoader))
+ {
+ firstBaseClassLoader = firstBaseClassLoader.getParent();
+ }
+
+ if (firstBaseClassLoader == null)
+ {
+ // no BaseClassLoader found, perhaps this is top-level
+ return cl;
+ }
+
+ Module module = SecurityActions.getModuleForClassLoader(firstBaseClassLoader);
if (module == null || (module instanceof AbstractDeploymentClassLoaderPolicyModule == false))
+ {
return cl;
+ }
AbstractDeploymentClassLoaderPolicyModule abclm = (AbstractDeploymentClassLoaderPolicyModule) module;
DeploymentUnit du = abclm.getDeploymentUnit();
Modified: trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/helpers/BootstrapBean.java
===================================================================
--- trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/helpers/BootstrapBean.java 2010-10-09 15:58:57 UTC (rev 108501)
+++ trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/deployer/env/helpers/BootstrapBean.java 2010-10-10 17:49:00 UTC (rev 108502)
@@ -14,6 +14,7 @@
import org.jboss.weld.injection.spi.ResourceInjectionServices;
import org.jboss.weld.integration.deployer.env.bda.DeploymentImpl;
import org.jboss.weld.security.spi.SecurityServices;
+import org.jboss.weld.serialization.spi.ProxyServices;
import org.jboss.weld.servlet.api.ServletServices;
import org.jboss.weld.transaction.spi.TransactionServices;
import org.jboss.weld.validation.spi.ValidationServices;
@@ -103,6 +104,11 @@
addDeploymentService(SecurityServices.class, securityServices);
}
+ public void setProxyServices(ProxyServices proxyServices)
+ {
+ addDeploymentService(ProxyServices.class, proxyServices);
+ }
+
private <S extends Service> void addDeploymentService(Class<S> type, S service)
{
getDeployment().getServices().add(type, service);
Added: trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/provider/JBossSingletonProvider.java
===================================================================
--- trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/provider/JBossSingletonProvider.java (rev 0)
+++ trunk/weld-int/deployer/src/main/java/org/jboss/weld/integration/provider/JBossSingletonProvider.java 2010-10-10 17:49:00 UTC (rev 108502)
@@ -0,0 +1,104 @@
+package org.jboss.weld.integration.provider;
+
+import org.jboss.beans.metadata.api.annotations.Start;
+import org.jboss.classloader.spi.base.BaseClassLoader;
+import org.jboss.weld.bootstrap.api.Singleton;
+import org.jboss.weld.bootstrap.api.SingletonProvider;
+import org.jboss.weld.integration.deployer.env.bda.DUTopLevelClassLoaderGetter;
+import org.jboss.weld.integration.deployer.env.bda.TopLevelClassLoaderGetter;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * @author Marius Bogoevici
+ */
+public class JBossSingletonProvider extends SingletonProvider
+{
+
+ private TopLevelClassLoaderGetter topLevelClassLoaderGetter;
+
+ public JBossSingletonProvider()
+ {
+
+ }
+
+ public void setTopLevelClassLoaderGetter(TopLevelClassLoaderGetter topLevelClassLoaderGetter)
+ {
+ this.topLevelClassLoaderGetter = topLevelClassLoaderGetter;
+ }
+
+ @Start
+ public void install()
+ {
+ if (topLevelClassLoaderGetter == null)
+ {
+ topLevelClassLoaderGetter = DUTopLevelClassLoaderGetter.getInstance();
+ }
+ }
+
+ @Override
+ public <T> Singleton<T> create(Class<? extends T> expectedType)
+ {
+ return new EarSingleton<T>();
+ }
+
+ public class EarSingleton<T> implements Singleton<T>
+ {
+ private final ConcurrentMap<ClassLoader, T> store = new ConcurrentHashMap<ClassLoader, T>();
+
+
+ public T get()
+ {
+ ClassLoader currentClassLoader = getTopLevelClassLoader();
+ T value = store.get(currentClassLoader);
+ if (value == null)
+ {
+ throw new IllegalStateException("Singleton not set for " + currentClassLoader);
+ }
+ return value;
+ }
+
+ public boolean isSet()
+ {
+ return store.containsKey(getTopLevelClassLoader());
+ }
+
+ public void set(T object)
+ {
+ store.put(getTopLevelClassLoader(), object);
+ }
+
+ public void clear()
+ {
+ store.remove(getTopLevelClassLoader());
+ }
+
+ private ClassLoader getTopLevelClassLoader()
+ {
+ return topLevelClassLoaderGetter.getTopLevelClassLoader(getThreadContextClassLoader());
+ }
+ }
+
+ private static ClassLoader getThreadContextClassLoader()
+ {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ {
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ {
+ public ClassLoader run()
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ }
+ else
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ }
+
+}
More information about the jboss-cvs-commits
mailing list