package org.jboss.seam.init; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.DocumentException; import org.dom4j.Element; import org.jboss.seam.ComponentType; import org.jboss.seam.log.LogProvider; import org.jboss.seam.log.Logging; import org.jboss.seam.util.XML; /** * Parser for ejb-jar.xml and orm.xml deployment descriptors * * @author Norman Richards * */ public class DeploymentDescriptor { private static final LogProvider log = Logging.getLogProvider(DeploymentDescriptor.class); private Map<Class, EjbDescriptor> ejbDescriptors = new HashMap<Class, EjbDescriptor>(); private Class componentClass; public DeploymentDescriptor(Class clazz) { componentClass = clazz; if (clazz.getClassLoader() == null) { return; } try { InputStream ejbJarXml = clazz.getClassLoader().getResourceAsStream("META-INF/ejb-jar.xml"); if (ejbJarXml!=null) { parseEjbJarXml( XML.getRootElementSafely(ejbJarXml) ); } } catch (DocumentException e) { log.warn("Couldn't parse META-INF/ejb-jar.xml for component types " + e.getMessage()); } try { InputStream ormXml = clazz.getClassLoader().getResourceAsStream("META-INF/orm.xml"); if (ormXml!=null) { parseOrmXml( XML.getRootElementSafely(ormXml) ); } } catch (DocumentException e) { log.warn("Couldn't parse META-INF/orm.xml for component types " + e.getMessage()); } } public Map<Class, EjbDescriptor> getEjbDescriptors() { return ejbDescriptors; } @SuppressWarnings("unchecked") private void parseEjbJarXml(Element root) { Element beans = root.element("enterprise-beans"); if (beans != null) { for (Element bean: (List<Element>) beans.elements("session")) { EjbDescriptor info = new EjbDescriptor(); info.setEjbName(bean.element("ejb-name").getTextTrim()); Element ejbClass = bean.element("ejb-class"); if (ejbClass != null) { info.setEjbClassName(ejbClass.getTextTrim()); Element sessionType = bean.element("session-type"); if (sessionType != null && sessionType.getTextTrim().equalsIgnoreCase("Stateful")) { info.setBeanType(ComponentType.STATEFUL_SESSION_BEAN); } else { info.setBeanType(ComponentType.STATELESS_SESSION_BEAN); } add(info); } } for (Element bean: (List<Element>) beans.elements("message-driven")) { EjbDescriptor info = new EjbDescriptor(); info.setEjbName(bean.element("ejb-name").getTextTrim()); info.setEjbClassName(bean.element("ejb-class").getTextTrim()); info.setBeanType(ComponentType.MESSAGE_DRIVEN_BEAN); add(info); } } } @SuppressWarnings("unchecked") private void parseOrmXml(Element root) { String packagePrefix = ""; Element pkg = root.element("package"); if (pkg!=null) { packagePrefix = pkg.getTextTrim() + "."; } for (Element entity: (List<Element>) root.elements("entity")) { String className = packagePrefix + entity.attribute("class").getText(); EjbDescriptor info = new EjbDescriptor(); info.setBeanType(ComponentType.ENTITY_BEAN); info.setEjbClassName(className); add(info); } } protected void add(EjbDescriptor descriptor) { try { Class ejbClass = componentClass.getClassLoader().loadClass( descriptor.getEjbClassName() ); ejbDescriptors.put(ejbClass, descriptor); } catch (ClassNotFoundException cnfe) { log.warn("Could not load EJB class: " + descriptor.getEjbClassName()); } } }