/* * Copyright (C) 2009 eXo Platform SAS. * * 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.exoplatform.container; import java.lang.ref.WeakReference; import java.util.Set; /** * This class defined the {@link ClassLoader} of a portal container * * Created by The eXo Platform SAS * Author : Nicolas Filotto * nicolas.filotto@exoplatform.com * 15 sept. 2009 */ class PortalContainerClassLoader extends UnifiedClassLoader { /** * The weak reference to the related portal container */ private volatile WeakReference<PortalContainer> containerRef; /** * The name of the related portal container used in case of developing mode */ private final String portalContainerName; PortalContainerClassLoader(PortalContainer container) { super(getClassLoaders(container)); // In case of developing mode we want to avoid to use hard reference in case // we would like to reload the container this.containerRef = new WeakReference<PortalContainer>(container); this.portalContainerName = container.getName(); } /** * Retrieves the list of all the {@link ClassLoader} that are associated to the given * portal container */ private static ClassLoader[] getClassLoaders(PortalContainer container) { final Set<WebAppInitContext> contexts = container.getWebAppInitContexts(); final ClassLoader[] cls = new ClassLoader[contexts.size()]; int i = 0; for (WebAppInitContext ctx : contexts) { cls[i++] = ctx.getWebappClassLoader(); } return cls; } /** * {@inheritDoc} */ protected ClassLoader[] getClassLoaders() { return getClassLoaders(getPortalContainer()); } private PortalContainer getPortalContainer() { PortalContainer container = containerRef.get(); if (container != null) { return container; } container = RootContainer.getInstance().getPortalContainer(portalContainerName); containerRef = new WeakReference<PortalContainer>(container); return container; } }