/* * 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 org.exoplatform.container.security.ContainerPermissions; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.HashSet; import java.util.Set; /** * The ExoContainerContext helper to invoke a service of a container from any location. * * @author Tuan Nguyen (tuan08@users.sourceforge.net) * @since Jan 11, 2005 * @version $Id: ExoContainerContext.java 6677 2006-07-03 10:49:59Z geaz $ * @LevelAPI Platform */ @SuppressWarnings("serial") public final class ExoContainerContext implements java.io.Serializable { private static ThreadLocal<WeakReference<ExoContainer>> currentContainer = new ThreadLocal<WeakReference<ExoContainer>>(); private static volatile ExoContainer topContainer; private HashMap<String, Object> attributes = new HashMap<String, Object>(); private final ExoContainer container; private String name; private static final Log LOG = ExoLogger.getLogger("exo.kernel.container.ExoContainerContext"); public ExoContainerContext(ExoContainer container) { this.container = container; } public ExoContainerContext(ExoContainer container, String name) { this.container = container; this.name = name; } public ExoContainer getContainer() { return container; } /** * @return if the embedded container is a {@link PortalContainer}, it will return the name the * portal container otherwise it will return <code>null</code> */ public String getPortalContainerName() { if (container instanceof PortalContainer) { return ((PortalContainer)container).getName(); } return null; } /** * @return if the embedded container is a {@link PortalContainer}, it will return the name * of the rest context related to the portal container otherwise it will return the default name */ public String getRestContextName() { if (container instanceof PortalContainer) { return ((PortalContainer)container).getRestContextName(); } return PortalContainer.DEFAULT_REST_CONTEXT_NAME; } /** * @return if the embedded container is a {@link PortalContainer}, it will return the name * of the realm related to the portal container otherwise it will return the default name */ public String getRealmName() { if (container instanceof PortalContainer) { return ((PortalContainer)container).getRealmName(); } return PortalContainer.DEFAULT_REALM_NAME; } /** * @return if the embedded container is a {@link PortalContainer}, it will return the value * of the setting related to the portal container otherwise it will return <code>null</code> */ public Object getSetting(String settingName) { if (container instanceof PortalContainer) { return ((PortalContainer)container).getSetting(settingName); } return null; } /** * @return returns the container name */ public String getName() { return name; } /** * sets the name of the container name * @param name the container name */ public void setName(String name) { SecurityManager security = System.getSecurityManager(); if (security != null) security.checkPermission(ContainerPermissions.MANAGE_CONTAINER_PERMISSION); this.name = name; } /** * @return returns the top container that will be the root container * in portal mode and the standalone container in standalone mode */ public static ExoContainer getTopContainer() { if (topContainer == null) topContainer = RootContainer.getInstance(); return topContainer; } /** * Sets the top container * @param cont the top container */ static void setTopContainer(ExoContainer cont) { SecurityManager security = System.getSecurityManager(); if (security != null) security.checkPermission(ContainerPermissions.MANAGE_CONTAINER_PERMISSION); if (topContainer != null && cont != null && cont != topContainer) //NOSONAR { throw new IllegalStateException("Two top level containers created, but must be only one."); } else if (cont == topContainer) //NOSONAR { return; } LOG.info("Set the top container in its context"); topContainer = cont; } /** * @return returns the current container */ public static ExoContainer getCurrentContainer() { WeakReference<ExoContainer> ref = currentContainer.get(); ExoContainer container = ref == null ? null : ref.get(); if (container == null) container = getTopContainer(); return container; } /** * @return returns the current container if present, otherwise it returns the top container */ public static ExoContainer getCurrentContainerIfPresent() { WeakReference<ExoContainer> ref = currentContainer.get(); ExoContainer container = ref == null ? null : ref.get(); if (container == null) return topContainer; return container; } /** * Sets the current container * @param instance the current container */ public static void setCurrentContainer(ExoContainer instance) { SecurityManager security = System.getSecurityManager(); if (security != null) security.checkPermission(ContainerPermissions.MANAGE_CONTAINER_PERMISSION); currentContainer.set(instance == null ? null : new WeakReference<ExoContainer>(instance)); } /** * @param name the container name * @return the ExoContainer instance */ public static ExoContainer getContainerByName(String name) { ExoContainerContext containerContext = topContainer.getContext(); String name1 = containerContext.getName(); if (name1.equals(name)) return topContainer; return (ExoContainer)topContainer.getComponentInstance(name); } /** * @return returns the list of the name of all the attributes available in the context */ public Set<String> getAttributeNames() { // Gives a safe copy return new HashSet<String>(attributes.keySet()); } /** * @return returns the value of the attribute */ public Object getAttribute(String name) { return attributes.get(name); } /** * @param name the name of the attribute to set * @param value the value of the attribute to set */ public void setAttribute(String name, Object value) { SecurityManager security = System.getSecurityManager(); if (security != null) security.checkPermission(ContainerPermissions.MANAGE_CONTAINER_PERMISSION); attributes.put(name, value); } }