[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