package org.jboss.seam.deployment;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.jboss.seam.annotations.Namespace;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
/**
* A deployment handler for namespaces
*
* @author Pete Muir
*
*/
public class NamespaceDeploymentHandler extends AbstractDeploymentHandler
{
private static DeploymentMetadata NAMESPACE_METADATA = new DeploymentMetadata()
{
public String getFileNameSuffix()
{
return "/package-info.class";
}
};
public static final String NAME = "org.jboss.seam.deployment.NamespaceDeploymentHandler";
private static final LogProvider log = Logging.getLogProvider(NamespaceDeploymentHandler.class);
private Set<Package> packages;
public NamespaceDeploymentHandler()
{
packages = new HashSet<Package>();
}
/**
* Returns packages with @Namespace declarations
*/
public Set<Package> getPackages()
{
return Collections.unmodifiableSet(packages);
}
@Override
public void postProcess(ClassLoader classLoader)
{
for (FileDescriptor fileDescriptor : getResources())
{
String packageName = filenameToPackageName(fileDescriptor.getName());
Package pkg = getPackage(packageName, classLoader);
if (pkg == null)
{
log.warn("Cannot load package info for " + packageName);
}
else
{
if (pkg.getAnnotation(Namespace.class) != null)
{
packages.add(pkg);
}
}
}
}
private static String filenameToPackageName(String filename)
{
return filename.substring(0, filename.lastIndexOf("/package-info.class"))
.replace('/', '.').replace('\\', '.');
}
private static Package getPackage(String name, ClassLoader classLoader)
{
try
{
Class c = classLoader.loadClass(name + ".package-info");
return c != null ? c.getPackage() : null;
}
catch (Exception e)
{
return null;
}
}
public String getName()
{
return NAME;
}
public DeploymentMetadata getMetadata()
{
return NAMESPACE_METADATA;
}
}