package org.jboss.seam.deployment;
import java.io.File;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletContext;
import org.jboss.seam.contexts.Contexts;
/**
* The standard deployment strategy used with Seam, deploys non-hot-deployable
* Seam components and namespaces
*
* @author Pete Muir
*
*/
public class StandardDeploymentStrategy extends DeploymentStrategy
{
private ClassLoader classLoader;
private ServletContext servletContext;
/**
* The files used to identify a Seam archive
*/
public static final String[] RESOURCE_NAMES = {"seam.properties", "META-INF/seam.properties", "META-INF/components.xml"};
/**
* The contextual variable name this deployment strategy is made available at
* during Seam startup.
*/
public static final String NAME = "deploymentStrategy";
/**
* The key under which to list extra deployment handlers.
*
* This can be specified as a System property or in
* /META-INF/seam-deployment.properties
*/
public static final String HANDLERS_KEY = "org.jboss.seam.deployment.deploymentHandlers";
private ComponentDeploymentHandler componentDeploymentHandler;
private ComponentsXmlDeploymentHandler componentsXmlDeploymentHandler;
private NamespaceDeploymentHandler namespaceDeploymentHandler;
private AnnotationDeploymentHandler annotationDeploymentHandler;
private DotComponentDotXmlDeploymentHandler dotComponentDotXmlDeploymentHandler;
/**
* @param classLoader The classloader used to load and handle resources
*/
public StandardDeploymentStrategy(ClassLoader classLoader,ServletContext servletContext)
{
this.classLoader = Thread.currentThread().getContextClassLoader();
this.servletContext=servletContext;
componentDeploymentHandler = new ComponentDeploymentHandler();
getDeploymentHandlers().put(ComponentDeploymentHandler.NAME, componentDeploymentHandler);
componentsXmlDeploymentHandler = new ComponentsXmlDeploymentHandler();
getDeploymentHandlers().put(ComponentsXmlDeploymentHandler.NAME, componentsXmlDeploymentHandler);
dotComponentDotXmlDeploymentHandler = new DotComponentDotXmlDeploymentHandler();
getDeploymentHandlers().put(DotComponentDotXmlDeploymentHandler.NAME, dotComponentDotXmlDeploymentHandler);
namespaceDeploymentHandler = new NamespaceDeploymentHandler();
getDeploymentHandlers().put(NamespaceDeploymentHandler.NAME, namespaceDeploymentHandler);
annotationDeploymentHandler = new AnnotationDeploymentHandler(new SeamDeploymentProperties(classLoader).getPropertyValues(AnnotationDeploymentHandler.ANNOTATIONS_KEY), classLoader);
getDeploymentHandlers().put(AnnotationDeploymentHandler.NAME, annotationDeploymentHandler);
}
@Override
public ClassLoader getClassLoader()
{
return classLoader;
}
@Override
protected String getDeploymentHandlersKey()
{
return HANDLERS_KEY;
}
/**
* Get all annotated components known to this strategy
*/
public Set<ClassDescriptor> getAnnotatedComponents()
{
return Collections.unmodifiableSet(componentDeploymentHandler.getClasses());
}
/**
* Get all XML defined (throught components.xml and component.xml) components
*/
public Set<FileDescriptor> getXmlComponents()
{
Set<FileDescriptor> fileDescriptors = new HashSet<FileDescriptor>();
fileDescriptors.addAll(componentsXmlDeploymentHandler.getResources());
fileDescriptors.addAll(dotComponentDotXmlDeploymentHandler.getResources());
return Collections.unmodifiableSet(fileDescriptors);
}
/**
* Get all scanned and handled Seam namespaces
*/
public Set<Package> getScannedNamespaces()
{
return Collections.unmodifiableSet(namespaceDeploymentHandler.getPackages());
}
public Map<String, Set<Class<?>>> getAnnotatedClasses()
{
return Collections.unmodifiableMap(annotationDeploymentHandler.getClassMap());
}
@Override
public void scan()
{
getScanner().scanResources(RESOURCE_NAMES);
getScanner().scanDirectories(getFiles().toArray(new File[0]));
postScan();
}
public static StandardDeploymentStrategy instance()
{
if (Contexts.getEventContext().isSet(NAME))
{
return (StandardDeploymentStrategy) Contexts.getEventContext().get(NAME);
}
return null;
}
@Override
public ServletContext getServletContext()
{
return servletContext;
}
}