package org.jboss.seam.init; import java.util.Comparator; import org.jboss.seam.ScopeType; import org.jboss.seam.Seam; import org.jboss.seam.annotations.AutoCreate; import org.jboss.seam.annotations.Install; import org.jboss.seam.annotations.Startup; import org.jboss.seam.core.Init; import org.jboss.seam.security.permission.PermissionResolver; import org.jboss.seam.web.AbstractResource; /** * Meta-data about a Seam component. * * @author Norman Richards * */ public class ComponentDescriptor implements Comparable<ComponentDescriptor> { protected String name; protected Class<?> componentClass; protected ScopeType scope; protected String jndiName; protected Boolean installed; protected Boolean autoCreate; protected Boolean startup; protected String[] startupDepends; protected Integer precedence; /** * For components.xml */ public ComponentDescriptor(String name, Class<?> componentClass, ScopeType scope, Boolean autoCreate, Boolean startup, String[] startupDepends, String jndiName, Boolean installed, Integer precedence) { this.name = name; this.componentClass = componentClass; this.scope = scope; this.jndiName = jndiName; this.installed = installed; this.autoCreate = autoCreate; this.precedence = precedence; this.startup = startup; this.startupDepends = startupDepends; } /** * For a scanned role */ public ComponentDescriptor(String name, Class<?> componentClass, ScopeType scope) { this.name = name; this.componentClass = componentClass; this.scope = scope; } /** * For a scanned default role */ public ComponentDescriptor(Class componentClass) { this.componentClass = componentClass; } /** * For built-ins with special rules */ public ComponentDescriptor(Class componentClass, Boolean installed) { this.componentClass = componentClass; this.installed = installed; } public String getName() { return name == null ? Seam.getComponentName(componentClass) : name; } public ScopeType getScope() { return scope == null ? Seam.getComponentScope(componentClass) : scope; } public Class getComponentClass() { return componentClass; } public String getJndiName() { return jndiName; } public boolean isStartup() { return startup!=null ? startup : componentClass.isAnnotationPresent(Startup.class); } public boolean isAutoCreate() { return autoCreate!=null ? autoCreate : isAutoCreateAnnotationPresent(); } private boolean isAutoCreateAnnotationPresent() { if (componentClass.isAnnotationPresent(AutoCreate.class)) { return true; } Package pkg = componentClass.getPackage(); return pkg!=null && pkg.isAnnotationPresent(AutoCreate.class); } public String[] getStartupDependencies() { if (startupDepends != null && startupDepends.length > 0) { return startupDepends; } Startup startup = componentClass.getAnnotation(Startup.class); if (startup != null) { return startup.depends(); } return new String[0]; } public String[] getDependencies() { Install install = componentClass.getAnnotation(Install.class); if (install == null) { return null; } return install.dependencies(); } public Class[] getGenericDependencies() { Install install = componentClass.getAnnotation(Install.class); if (install == null) { return null; } return install.genericDependencies(); } public String[] getClassDependencies() { Install install = componentClass.getAnnotation(Install.class); if (install == null) { return null; } return install.classDependencies(); } public boolean isInstalled() { if (installed != null) { return installed; } Install install = componentClass.getAnnotation(Install.class); if (install == null) { return true; } return install.debug() ? Init.instance().isDebug() : install.value(); } public int getPrecedence() { if (precedence != null) { return precedence; } Install install = componentClass.getAnnotation(Install.class); if (install == null) { return Install.APPLICATION; } return install.precedence(); } public int compareTo(ComponentDescriptor other) { return other.getPrecedence() - getPrecedence(); } public boolean isFilter() { if (javax.servlet.Filter.class.isAssignableFrom(componentClass)) { for (Class clazz = componentClass; !Object.class.equals(clazz); clazz = clazz.getSuperclass()) { if (clazz.isAnnotationPresent(org.jboss.seam.annotations.web.Filter.class)) { return true; } } } return false; } public boolean isResourceProvider() { return AbstractResource.class.isAssignableFrom(componentClass); } public boolean isPermissionResolver() { return PermissionResolver.class.isAssignableFrom(componentClass); } @Override public String toString() { return "ComponentDescriptor(" + getName() + ":" + getComponentClass() + ')'; } public static class PrecedenceComparator implements Comparator<ComponentDescriptor> { public int compare(ComponentDescriptor obj1, ComponentDescriptor obj2) { return obj2.getPrecedence() - obj1.getPrecedence(); } } }