Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source
   * Copyright 2010, Red Hat Inc., and individual contributors as indicated
   * by the @authors tag. See the copyright.txt 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.as.weld.services;
 
 import java.util.Map;
 import java.util.Set;
 
Singleton Provider that uses the TCCL to figure out the current application.

Author(s):
Stuart Douglas
 
 public class ModuleGroupSingletonProvider extends SingletonProvider {

    
Map of the top level class loader to all class loaders in a deployment
 
     public static Map<ClassLoaderSet<ClassLoader>> deploymentClassLoaders = new ConcurrentHashMap<ClassLoaderSet<ClassLoader>>();

    
Maps a top level class loader to all CL's in the deployment
 
     public static void addClassLoaders(ClassLoader topLevelSet<ClassLoaderallClassLoaders) {
         .put(topLevelallClassLoaders);
     }

    
Removes the class loader mapping
 
     public static void removeClassLoader(ClassLoader topLevel) {
         .remove(topLevel);
     }
 
     @Override
     public <T> Singleton<T> create(Class<? extends T> type) {
         return new TCCLSingleton<T>();
     }
 
     private static class TCCLSingleton<T> implements Singleton<T> {
 
         private volatile Map<ClassLoader, T> store = Collections.emptyMap();
 
         public T get() {
             T instance = .get(findParentModuleCl(getClassLoader()));
             if (instance == null) {
                 throw ..singletonNotSet(getClassLoader());
             }
             return instance;
         }
 
         public synchronized void set(T object) {
             final Map<ClassLoader, T> store = new IdentityHashMap<ClassLoader, T>(this.);
             ClassLoader classLoader = getClassLoader();
             store.put(classLoaderobject);
             if (.containsKey(classLoader)) {
                 for (ClassLoader cl : .get(classLoader)) {
                     store.put(clobject);
                 }
             }
             this. = store;
         }
 
         public synchronized void clear() {
             ClassLoader classLoader = getClassLoader();
             final Map<ClassLoader, T> store = new IdentityHashMap<ClassLoader, T>(this.);
             store.remove(classLoader);
             if (.containsKey(classLoader)) {
                 for (ClassLoader cl : .get(classLoader)) {
                     store.remove(cl);
                 }
            }
            this. = store;
        }
        public boolean isSet() {
            return .containsKey(findParentModuleCl(getClassLoader()));
        }

        
If a custom CL is in use we want to get the module CL it delegates to

Parameters:
classLoader The current CL
ReturnThe:
corresponding module CL
        private ClassLoader findParentModuleCl(ClassLoader classLoader) {
            ClassLoader c = classLoader;
            while (c != null && !(c instanceof ModuleClassLoader)) {
                c = c.getParent();
            }
            return c;
        }
        private ClassLoader getClassLoader() {
            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();
            }
        }
        /*
         * Default implementation of the Weld 1.2 API
         *
         * This provides forward binary compatibility with Weld 1.2 (OSGi integration).
         * It is OK to ignore the id parameter as TCCL is still used to identify the singleton in Java EE.
         */
        public T get(String id) {
            return get();
        }
        public boolean isSet(String id) {
            return isSet();
        }
        public void set(String id, T object) {
            set(object);
        }
        public void clear(String id) {
            clear();
        }
    }
New to GrepCode? Check out our FAQ X