package org.jboss.seam.security.external.virtualapplications; import java.util.HashSet; import java.util.Set; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Observes; import javax.enterprise.inject.Instance; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Inject; import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import org.jboss.seam.security.external.virtualapplications.api.AfterVirtualApplicationCreation; import org.jboss.solder.servlet.event.Destroyed; import org.jboss.solder.servlet.event.Initialized; /** * @author Marcel Kolsteren */ @ApplicationScoped public class VirtualApplicationManager { @Inject private VirtualApplicationContextExtension virtualApplicationContextExtension; @Inject private Instance<VirtualApplicationBean> virtualApplication; @Inject private BeanManager beanManager; private Set<String> hostNames = new HashSet<String>(); protected void servletInitialized(@Observes @Initialized final ServletContext context) { getVirtualApplicationContext().initialize(context); AfterVirtualApplicationManagerCreationEvent afterVirtualApplicationManagerCreation = new AfterVirtualApplicationManagerCreationEvent(); beanManager.fireEvent(afterVirtualApplicationManagerCreation); for (String hostName : afterVirtualApplicationManagerCreation.getHostNames()) { hostNames.add(hostName); getVirtualApplicationContext().create(hostName); virtualApplication.get().setHostName(hostName); beanManager.fireEvent(new AfterVirtualApplicationCreation()); getVirtualApplicationContext().detach(); } } protected void servletDestroyed(@Observes @Destroyed final ServletContext context) { for (String hostName : hostNames) { if (getVirtualApplicationContext().isExistingVirtualApplication(hostName)) { attach(hostName); getVirtualApplicationContext().destroy(); } } } protected void requestInitialized(@Observes @Initialized final ServletRequest request) { String hostName = request.getServerName(); if (getVirtualApplicationContext().isExistingVirtualApplication(hostName)) { attach(hostName); } } protected void requestDestroyed(@Observes @Destroyed final ServletRequest request) { if (getVirtualApplicationContext().isActive()) { detach(); } } public void attach(String hostName) { getVirtualApplicationContext().attach(hostName); virtualApplication.get().setHostName(hostName); } public void detach() { getVirtualApplicationContext().detach(); } public Set<String> getHostNames() { return hostNames; } private VirtualApplicationContext getVirtualApplicationContext() { return virtualApplicationContextExtension.getVirtualApplicationContext(); } }