001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.util;
016    
017    /**
018     * @author Raymond Aug??
019     * @author Shuyang Zhou
020     */
021    public class ClassLoaderUtil {
022    
023            public static ClassLoader getAggregatePluginsClassLoader(
024                    String[] servletContextNames, boolean addContextClassLoader) {
025    
026                    return _pacl.getAggregatePluginsClassLoader(
027                            servletContextNames, addContextClassLoader);
028            }
029    
030            public static ClassLoader getClassLoader(Class<?> clazz) {
031                    return _pacl.getClassLoader(clazz);
032            }
033    
034            public static ClassLoader getContextClassLoader() {
035                    return _pacl.getContextClassLoader();
036            }
037    
038            public static ClassLoader getPluginClassLoader(String servletContextName) {
039                    return _pacl.getPluginClassLoader(servletContextName);
040            }
041    
042            public static ClassLoader getPortalClassLoader() {
043                    return _pacl.getPortalClassLoader();
044            }
045    
046            public static void setContextClassLoader(ClassLoader classLoader) {
047                    _pacl.setContextClassLoader(classLoader);
048            }
049    
050            public static class NoPACL implements PACL {
051    
052                    @Override
053                    public ClassLoader getAggregatePluginsClassLoader(
054                            String[] servletContextNames, boolean addContextClassLoader) {
055    
056                            ClassLoader[] classLoaders = null;
057    
058                            int offset = 0;
059    
060                            if (addContextClassLoader) {
061                                    classLoaders = new ClassLoader[servletContextNames.length + 1];
062    
063                                    Thread currentThread = Thread.currentThread();
064    
065                                    classLoaders[0] = currentThread.getContextClassLoader();
066    
067                                    offset = 1;
068                            }
069                            else {
070                                    classLoaders = new ClassLoader[servletContextNames.length];
071                            }
072    
073                            for (int i = 0; i < servletContextNames.length; i++) {
074                                    classLoaders[offset + i] = ClassLoaderPool.getClassLoader(
075                                            servletContextNames[i]);
076                            }
077    
078                            return AggregateClassLoader.getAggregateClassLoader(classLoaders);
079                    }
080    
081                    @Override
082                    public ClassLoader getClassLoader(Class<?> clazz) {
083                            return clazz.getClassLoader();
084                    }
085    
086                    @Override
087                    public ClassLoader getContextClassLoader() {
088                            Thread currentThread = Thread.currentThread();
089    
090                            return currentThread.getContextClassLoader();
091                    }
092    
093                    @Override
094                    public ClassLoader getPluginClassLoader(String servletContextName) {
095                            return ClassLoaderPool.getClassLoader(servletContextName);
096                    }
097    
098                    @Override
099                    public ClassLoader getPortalClassLoader() {
100                            return PortalClassLoaderUtil.getClassLoader();
101                    }
102    
103                    @Override
104                    public void setContextClassLoader(ClassLoader classLoader) {
105                            Thread thread = Thread.currentThread();
106    
107                            thread.setContextClassLoader(classLoader);
108                    }
109    
110            }
111    
112            public interface PACL {
113    
114                    public ClassLoader getAggregatePluginsClassLoader(
115                            String[] servletContextNames, boolean addContextClassLoader);
116    
117                    public ClassLoader getClassLoader(Class<?> clazz);
118    
119                    public ClassLoader getContextClassLoader();
120    
121                    public ClassLoader getPluginClassLoader(String servletContextName);
122    
123                    public ClassLoader getPortalClassLoader();
124    
125                    public void setContextClassLoader(ClassLoader classLoader);
126    
127            }
128    
129            private static final PACL _pacl = new NoPACL();
130    
131    }