Package org.jboss.seam.security.external.virtualapplications

Source Code of org.jboss.seam.security.external.virtualapplications.VirtualApplicationContext

package org.jboss.seam.security.external.virtualapplications;

import java.lang.annotation.Annotation;

import javax.enterprise.context.ContextNotActiveException;
import javax.enterprise.context.spi.Context;
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
import javax.servlet.ServletContext;

import org.jboss.seam.security.external.contexts.ContextualInstance;
import org.jboss.seam.security.external.contexts.HashMapBeanStore;
import org.jboss.seam.security.external.virtualapplications.api.VirtualApplicationScoped;

/**
* @author Marcel Kolsteren
*
*/
public class VirtualApplicationContext implements Context
{
   private static final String BEAN_STORE_ATTRIBUTE_NAME_PREFIX = "virtualApplicationContextBeanStore";

   private ServletContext servletContext;

   private final ThreadLocal<String> hostNameThreadLocal;

   public VirtualApplicationContext()
   {
      hostNameThreadLocal = new ThreadLocal<String>();
   }

   protected HashMapBeanStore getBeanStore()
   {
      return getBeanStore(hostNameThreadLocal.get());
   }

   private HashMapBeanStore getBeanStore(String hostName)
   {
      HashMapBeanStore beanStore = (HashMapBeanStore) servletContext.getAttribute(getAttributeName(hostName));
      return beanStore;
   }

   private void createBeanStore(String hostName)
   {
      HashMapBeanStore beanStore = new HashMapBeanStore();
      servletContext.setAttribute(getAttributeName(hostName), beanStore);
   }

   private void removeBeanStore(String hostName)
   {
      servletContext.removeAttribute(getAttributeName(hostName));
   }

   private String getAttributeName(String hostName)
   {
      return BEAN_STORE_ATTRIBUTE_NAME_PREFIX + "_" + hostName;
   }

   public void initialize(ServletContext servletContext)
   {
      this.servletContext = servletContext;
   }

   public void destroy()
   {
      this.servletContext = null;
   }

   public void create(String hostName)
   {
      createBeanStore(hostName);
      attach(hostName);
   }

   public void remove()
   {
      getBeanStore().clear();
      removeBeanStore(this.hostNameThreadLocal.get());
      detach();
   }

   public boolean isExistingVirtualApplication(String hostName)
   {
      return servletContext != null && getBeanStore(hostName) != null;
   }

   public void attach(String hostName)
   {
      this.hostNameThreadLocal.set(hostName);
   }

   public void detach()
   {
      this.hostNameThreadLocal.set(null);
   }

   public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext)
   {
      if (!isActive())
      {
         throw new ContextNotActiveException();
      }
      ContextualInstance<T> beanInstance = getBeanStore().get(contextual);
      if (beanInstance != null)
      {
         return beanInstance.getInstance();
      }
      else if (creationalContext != null)
      {
         T instance = contextual.create(creationalContext);
         if (instance != null)
         {
            beanInstance = new ContextualInstance<T>(contextual, creationalContext, instance);
            getBeanStore().put(contextual, beanInstance);
         }
         return instance;
      }
      else
      {
         return null;
      }
   }

   public <T> T get(Contextual<T> contextual)
   {
      return get(contextual, null);
   }

   public Class<? extends Annotation> getScope()
   {
      return VirtualApplicationScoped.class;
   }

   public boolean isActive()
   {
      return hostNameThreadLocal.get() != null;
   }
}
TOP

Related Classes of org.jboss.seam.security.external.virtualapplications.VirtualApplicationContext

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.