/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.metadata;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.jboss.deployment.DeploymentException;
import org.jboss.mx.util.MBeanServerLocator;
import org.jboss.security.SecurityRoleMetaData;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
/**
* The top level meta data from the jboss.xml and ejb-jar.xml descriptor.
*
* @author Sebastien Alborini
* @author Peter Antman
* @author Scott Stark
* @author Christian Riege
* @author Christoph G. Jung.
* @author Thomas Diesler.
*
* @version $Revision: 57209 $
*/
public class ApplicationMetaData
extends MetaData
{
public static final int EJB_1x = 1;
public static final int EJB_2x = 2;
/** The ejb jar URL */
private URL url;
/** version of the dtd used to create ejb-jar.xml */
protected int ejbVersion;
protected int ejbMinorVersion;
/** ArrayList for the ejbs */
private ArrayList beans = new ArrayList();
/** A HashMap for webservice description publish locations */
private HashMap wsdlPublishLocationMap = new HashMap();
/** True if this is a web service deployment */
private boolean webServiceDeployment;
/** The optional JBossWS config-name */
private String configName;
/** The optional JBossWS config-file */
private String configFile;
/** List of relations in this application. */
private ArrayList relationships = new ArrayList();
/** The assembly-descriptor */
private AssemblyDescriptorMetaData assemblyDescriptor = new AssemblyDescriptorMetaData();
/** A HashMap for container configs */
private HashMap configurations = new HashMap();
/** A HashMap for invoker bindings */
private HashMap invokerBindings = new HashMap();
/** A HashMap of res-name to JNDI name/URL */
private HashMap resources = new HashMap();
private HashMap plugins = new HashMap();
/** The user defined JMX name for the EJBModule */
private String jmxName;
/** The security-domain value assigned to the application */
private String securityDomain;
/** The unauthenticated-principal value assigned to the application */
private String unauthenticatedPrincipal;
/** The web context root to use for web services */
private String webServiceContextRoot;
/** An unused flag if the spec security restrictions should be enforced */
private boolean enforceEjbRestrictions;
/** The missing-method-permissions-excluded-mode value */
private boolean excludeMissingMethods = true;
/** Whether to throw an exception on a rollback if there is no exception */
private boolean exceptionRollback = false;
/** The ClassLoader to load additional resources */
private URLClassLoader resourceCl;
public ApplicationMetaData()
{
}
/** Get the ClassLoader to load additional resources */
public URLClassLoader getResourceCl()
{
return resourceCl;
}
/** Set the ClassLoader to load additional resources */
public void setResourceClassLoader(URLClassLoader resourceCl)
{
this.resourceCl = resourceCl;
}
public URL getUrl()
{
return url;
}
public void setUrl(URL u)
{
url = u;
}
public boolean isEJB1x()
{
return ejbVersion == 1;
}
public boolean isEJB2x()
{
return ejbVersion == 2;
}
public boolean isEJB21()
{
return ejbVersion == 2 && ejbMinorVersion == 1;
}
public Iterator getEnterpriseBeans()
{
return beans.iterator();
}
/**
* Get an EJB by its declared <ejb-name> tag
*
* @param ejbName EJB to return
*
* @return BeanMetaData pertaining to the given ejb-name,
* null
if none found
*/
public BeanMetaData getBeanByEjbName(String ejbName)
{
Iterator iterator = getEnterpriseBeans();
while (iterator.hasNext())
{
BeanMetaData current = (BeanMetaData)iterator.next();
if (current.getEjbName().equals(ejbName))
{
return current;
}
}
// not found
return null;
}
public String getConfigFile()
{
return configFile;
}
public void setConfigFile(String configFile)
{
this.configFile = configFile;
}
public String getConfigName()
{
return configName;
}
public void setConfigName(String configName)
{
this.configName = configName;
}
public String getWsdlPublishLocationByName(String name)
{
// if not found, the we will use default
return (String)wsdlPublishLocationMap.get(name);
}
public String getWebServiceContextRoot()
{
return webServiceContextRoot;
}
public void setWebServiceContextRoot(String webServiceContextRoot)
{
this.webServiceContextRoot = webServiceContextRoot;
}
public boolean isWebServiceDeployment()
{
return webServiceDeployment;
}
public void setWebServiceDeployment(boolean webServiceDeployment)
{
this.webServiceDeployment = webServiceDeployment;
}
/**
* Get the container managed relations in this application.
* Items are instance of RelationMetaData.
*/
public Iterator getRelationships()
{
return relationships.iterator();
}
public AssemblyDescriptorMetaData getAssemblyDescriptor()
{
return assemblyDescriptor;
}
public Iterator getConfigurations()
{
return configurations.values().iterator();
}
public ConfigurationMetaData getConfigurationMetaDataByName(String name)
{
return (ConfigurationMetaData)configurations.get(name);
}
public Iterator getInvokerProxyBindings()
{
return invokerBindings.values().iterator();
}
public InvokerProxyBindingMetaData getInvokerProxyBindingMetaDataByName(String name)
{
return (InvokerProxyBindingMetaData)invokerBindings.get(name);
}
public String getResourceByName(String name)
{
// if not found, the container will use default
return (String)resources.get(name);
}
public void addPluginData(String pluginName, Object pluginData)
{
plugins.put(pluginName, pluginData);
}
public Object getPluginData(String pluginName)
{
return plugins.get(pluginName);
}
public String getJmxName()
{
return jmxName;
}
public String getSecurityDomain()
{
return securityDomain;
}
/**
* Set the security domain for this web application
*/
public void setSecurityDomain(String securityDomain)
{
this.securityDomain = securityDomain;
}
public String getUnauthenticatedPrincipal()
{
return unauthenticatedPrincipal;
}
public void setUnauthenticatedPrincipal(String unauthenticatedPrincipal)
{
this.unauthenticatedPrincipal = unauthenticatedPrincipal;
}
public boolean getEnforceEjbRestrictions()
{
return enforceEjbRestrictions;
}
public boolean isExcludeMissingMethods()
{
return excludeMissingMethods;
}
public MessageDestinationMetaData getMessageDestination(String name)
{
return assemblyDescriptor.getMessageDestinationMetaData(name);
}
public boolean getExceptionRollback()
{
return exceptionRollback;
}
/**
* Import data provided by ejb-jar.xml
*
* @throws DeploymentException When there was an error encountered
* while parsing ejb-jar.xml
*/
public void importEjbJarXml(Element element)
throws DeploymentException
{
// EJB version is determined by the doc type that was used to
// verify the ejb-jar.xml.
DocumentType docType = element.getOwnerDocument().getDoctype();
if (docType == null)
{
// test if this is a 2.1 schema-based descriptor
if ("http://java.sun.com/xml/ns/j2ee".equals(element.getNamespaceURI()))
{
ejbVersion = 2;
ejbMinorVersion = 1;
}
else
{
// No good, EJB 1.1/2.1 requires a DOCTYPE declaration
throw new DeploymentException("ejb-jar.xml must either obey " +
"the right xml schema or define a valid DOCTYPE!");
}
}
else
{
String publicId = docType.getPublicId();
if (publicId == null)
{
// We need a public Id
throw new DeploymentException("The DOCTYPE declaration in " +
"ejb-jar.xml must define a PUBLIC id");
}
// Check for a known public Id
if (publicId.startsWith("-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0"))
{
ejbVersion = 2;
}
else if (publicId.startsWith("-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1"))
{
ejbVersion = 1;
}
else
{
// Unknown
throw new DeploymentException("Unknown PUBLIC id in " +
"ejb-jar.xml: " + publicId);
}
}
// find the beans
Element enterpriseBeans = getUniqueChild(element, "enterprise-beans");
// Entity Beans
HashMap schemaNameMap = new HashMap();
Iterator iterator = getChildrenByTagName(enterpriseBeans, "entity");
while (iterator.hasNext())
{
Element currentEntity = (Element)iterator.next();
EntityMetaData entityMetaData = new EntityMetaData(this);
try
{
entityMetaData.importEjbJarXml(currentEntity);
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in ejb-jar.xml " +
"for Entity Bean " + entityMetaData.getEjbName() + ": " +
e.getMessage());
}
// Ensure unique-ness of
String abstractSchemaName = entityMetaData.getAbstractSchemaName();
if (abstractSchemaName != null)
{
if (schemaNameMap.containsKey(abstractSchemaName))
{
//
throw new DeploymentException(entityMetaData.getEjbName() +
": Duplicate abstract-schema name '" + abstractSchemaName +
"'. Already defined for Entity '" +
((EntityMetaData)schemaNameMap.get(abstractSchemaName)).getEjbName() + "'.");
}
schemaNameMap.put(abstractSchemaName, entityMetaData);
}
beans.add(entityMetaData);
}
// Session Beans
iterator = getChildrenByTagName(enterpriseBeans, "session");
while (iterator.hasNext())
{
Element currentSession = (Element)iterator.next();
SessionMetaData sessionMetaData = new SessionMetaData(this);
try
{
sessionMetaData.importEjbJarXml(currentSession);
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in ejb-jar.xml for " +
"Session Bean " + sessionMetaData.getEjbName() + ": " +
e.getMessage());
}
beans.add(sessionMetaData);
}
// Message Driven Beans
iterator = getChildrenByTagName(enterpriseBeans, "message-driven");
while (iterator.hasNext())
{
Element currentMessageDriven = (Element)iterator.next();
MessageDrivenMetaData messageDrivenMetaData =
new MessageDrivenMetaData(this);
try
{
messageDrivenMetaData.importEjbJarXml(currentMessageDriven);
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in ejb-jar.xml for " +
"Message Driven Bean " +
messageDrivenMetaData.getEjbName() + ": " + e.getMessage());
}
beans.add(messageDrivenMetaData);
}
// Enforce unique-ness of declared ejb-name Elements
Set ejbNames = new HashSet();
Iterator beanIt = beans.iterator();
while (beanIt.hasNext())
{
BeanMetaData bmd = (BeanMetaData)beanIt.next();
String beanName = bmd.getEjbName();
if (ejbNames.contains(beanName))
{
throw new DeploymentException("Duplicate definition of an " +
"EJB with name '" + beanName + "'.");
}
ejbNames.add(beanName);
}
// Relationships
Element relationshipsElement = getOptionalChild(element,
"relationships");
if (relationshipsElement != null)
{
// used to assure that a relationship name is not reused
Set relationNames = new HashSet();
iterator = getChildrenByTagName(relationshipsElement,
"ejb-relation");
while (iterator.hasNext())
{
Element relationElement = (Element)iterator.next();
RelationMetaData relationMetaData = new RelationMetaData();
try
{
relationMetaData.importEjbJarXml(relationElement);
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in ejb-jar.xml " +
"for relation " + relationMetaData.getRelationName() +
": " + e.getMessage());
}
// if the relationship has a name, assure that it has not
// already been used
String relationName = relationMetaData.getRelationName();
if (relationName != null)
{
if (relationNames.contains(relationName))
{
throw new DeploymentException("ejb-relation-name must " +
"be unique in ejb-jar.xml file: ejb-relation-name is " +
relationName);
}
relationNames.add(relationName);
}
relationships.add(relationMetaData);
}
}
// read the assembly descriptor (optional)
Element descrElement = getOptionalChild(element, "assembly-descriptor");
if (descrElement != null)
{
// set the security roles (optional)
iterator = getChildrenByTagName(descrElement, "security-role");
while (iterator.hasNext())
{
Element securityRole = (Element)iterator.next();
try
{
String roleName = getElementContent(getUniqueChild(securityRole, "role-name"));
SecurityRoleMetaData srMetaData = new SecurityRoleMetaData(roleName);
assemblyDescriptor.addSecurityRoleMetaData(srMetaData);
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in ejb-jar.xml " +
"for security-role: " + e.getMessage());
}
}
// set the method permissions (optional)
iterator = getChildrenByTagName(descrElement,
"method-permission");
try
{
while (iterator.hasNext())
{
Element methodPermission = (Element)iterator.next();
// Look for the unchecked element
Element unchecked = getOptionalChild(methodPermission,
"unchecked");
boolean isUnchecked = false;
Set roles = null;
if (unchecked != null)
{
isUnchecked = true;
}
else
{
// Get the role-name elements
roles = new HashSet();
Iterator rolesIterator = getChildrenByTagName(methodPermission, "role-name");
while (rolesIterator.hasNext())
{
roles.add(getElementContent((Element)rolesIterator.next()));
}
if (roles.size() == 0)
throw new DeploymentException("An unchecked " +
"element or one or more role-name elements " +
"must be specified in method-permission");
}
// find the methods
Iterator methods = getChildrenByTagName(methodPermission,
"method");
while (methods.hasNext())
{
// load the method
MethodMetaData method = new MethodMetaData();
method.importEjbJarXml((Element)methods.next());
if (isUnchecked)
{
method.setUnchecked();
}
else
{
method.setRoles(roles);
}
// give the method to the right bean
BeanMetaData bean = getBeanByEjbName(method.getEjbName());
if (bean == null)
{
throw new DeploymentException(method.getEjbName() +
" doesn't exist");
}
bean.addPermissionMethod(method);
}
}
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in ejb-jar.xml, " +
"in method-permission: " + e.getMessage());
}
// set the container transactions (optional)
iterator = getChildrenByTagName(descrElement,
"container-transaction");
try
{
while (iterator.hasNext())
{
Element containerTransaction = (Element)iterator.next();
// find the type of the transaction
byte transactionType;
String type = getElementContent(getUniqueChild(containerTransaction, "trans-attribute"));
if (type.equalsIgnoreCase("NotSupported") ||
type.equalsIgnoreCase("Not_Supported"))
{
transactionType = TX_NOT_SUPPORTED;
}
else if (type.equalsIgnoreCase("Supports"))
{
transactionType = TX_SUPPORTS;
}
else if (type.equalsIgnoreCase("Required"))
{
transactionType = TX_REQUIRED;
}
else if (type.equalsIgnoreCase("RequiresNew") ||
type.equalsIgnoreCase("Requires_New"))
{
transactionType = TX_REQUIRES_NEW;
}
else if (type.equalsIgnoreCase("Mandatory"))
{
transactionType = TX_MANDATORY;
}
else if (type.equalsIgnoreCase("Never"))
{
transactionType = TX_NEVER;
}
else
{
throw new DeploymentException("invalid " +
" : " + type);
}
// find the methods
Iterator methods = getChildrenByTagName(containerTransaction, "method");
while (methods.hasNext())
{
// load the method
MethodMetaData method = new MethodMetaData();
method.importEjbJarXml((Element)methods.next());
method.setTransactionType(transactionType);
// give the method to the right bean
BeanMetaData bean = getBeanByEjbName(method.getEjbName());
if (bean == null)
{
throw new DeploymentException("bean " +
method.getEjbName() + " doesn't exist");
}
bean.addTransactionMethod(method);
}
}
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in ejb-jar.xml, " +
"in : " + e.getMessage());
}
// Get the exclude-list methods
Element excludeList = getOptionalChild(descrElement,
"exclude-list");
if (excludeList != null)
{
iterator = getChildrenByTagName(excludeList, "method");
while (iterator.hasNext())
{
Element methodInf = (Element)iterator.next();
// load the method
MethodMetaData method = new MethodMetaData();
method.importEjbJarXml(methodInf);
method.setExcluded();
// give the method to the right bean
BeanMetaData bean = getBeanByEjbName(method.getEjbName());
if (bean == null)
{
throw new DeploymentException("bean " +
method.getEjbName() + " doesn't exist");
}
bean.addExcludedMethod(method);
}
}
// set the message destinations (optional)
iterator = getChildrenByTagName(descrElement, "message-destination");
while (iterator.hasNext())
{
Element messageDestination = (Element)iterator.next();
try
{
MessageDestinationMetaData messageDestinationMetaData = new MessageDestinationMetaData();
messageDestinationMetaData.importEjbJarXml(messageDestination);
assemblyDescriptor.addMessageDestinationMetaData(messageDestinationMetaData);
}
catch (Throwable t)
{
throw new DeploymentException("Error in ejb-jar.xml " +
"for message destination: " + t.getMessage());
}
}
}
}
public void importJbossXml(Element element)
throws DeploymentException
{
Iterator iterator;
// all the tags are optional
// Get the enforce-ejb-restrictions
Element enforce = getOptionalChild(element, "enforce-ejb-restrictions");
if (enforce != null)
{
String tmp = getElementContent(enforce);
enforceEjbRestrictions = Boolean.valueOf(tmp).booleanValue();
}
// Get any user defined JMX name
Element jmxNameElement = getOptionalChild(element,
"jmx-name");
if (jmxNameElement != null)
{
jmxName = getElementContent(jmxNameElement);
}
// Throw an exception when marked rollback with no exception thrown
exceptionRollback = MetaData.getOptionalChildBooleanContent(element, "exception-on-rollback", false);
// Get the security domain name
Element securityDomainElement = getOptionalChild(element,
"security-domain");
if (securityDomainElement != null)
{
securityDomain = getElementContent(securityDomainElement);
}
// Get the missing-method-permissions-excluded-mode flag
excludeMissingMethods = MetaData.getOptionalChildBooleanContent(element,
"missing-method-permissions-excluded-mode", true);
// Get the unauthenticated-principal name
Element unauth = getOptionalChild(element,
"unauthenticated-principal");
if (unauth != null)
{
unauthenticatedPrincipal = getElementContent(unauth);
}
else
{
try
{
MBeanServer server = MBeanServerLocator.locateJBoss();
ObjectName oname = new ObjectName("jboss.security:service=JaasSecurityManager");
unauthenticatedPrincipal = (String)server.getAttribute(oname, "DefaultUnauthenticatedPrincipal");
}
catch (Exception e)
{
log.error("Cannot obtain unauthenticated principal");
}
}
// find the invoker configurations
Element invokerConfs = getOptionalChild(element,
"invoker-proxy-bindings");
if (invokerConfs != null)
{
iterator = getChildrenByTagName(invokerConfs,
"invoker-proxy-binding");
while (iterator.hasNext())
{
Element invoker = (Element)iterator.next();
String invokerName = getElementContent(getUniqueChild(invoker, "name"));
// find the configuration if it has already been defined
// (allow jboss.xml to modify a standard conf)
InvokerProxyBindingMetaData invokerMetaData =
getInvokerProxyBindingMetaDataByName(invokerName);
// create it if necessary
if (invokerMetaData == null)
{
invokerMetaData = new InvokerProxyBindingMetaData(invokerName);
invokerBindings.put(invokerName, invokerMetaData);
}
try
{
invokerMetaData.importJbossXml(invoker);
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in jboss.xml " +
"for invoker-proxy-binding " + invokerMetaData.getName() +
": " + e.getMessage());
}
}
}
// find the container configurations (we need them first to use
// them in the beans)
Element confs = getOptionalChild(element, "container-configurations");
if (confs != null)
{
iterator = getChildrenByTagName(confs, "container-configuration");
while (iterator.hasNext())
{
Element conf = (Element)iterator.next();
String confName = getElementContent(getUniqueChild(conf,
"container-name"));
String parentConfName = conf.getAttribute("extends");
if (parentConfName != null && parentConfName.trim().length() == 0)
{
parentConfName = null;
}
// Allow the configuration to inherit from a standard
// configuration. This is determined by looking for a
// configuration matching the name given by the extends
// attribute, or if extends was not specified, an
// existing configuration with the same.
ConfigurationMetaData configurationMetaData = null;
if (parentConfName != null)
{
configurationMetaData = getConfigurationMetaDataByName(parentConfName);
if (configurationMetaData == null)
{
throw new DeploymentException("Failed to find " +
"parent config=" + parentConfName);
}
// Make a copy of the existing configuration
configurationMetaData =
(ConfigurationMetaData)configurationMetaData.clone();
configurations.put(confName, configurationMetaData);
}
if (configurationMetaData == null)
{
configurationMetaData =
getConfigurationMetaDataByName(confName);
}
// Create a new configuration if none was found
if (configurationMetaData == null)
{
configurationMetaData = new ConfigurationMetaData(confName);
configurations.put(confName, configurationMetaData);
}
try
{
configurationMetaData.importJbossXml(conf);
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in jboss.xml " +
"for container-configuration " +
configurationMetaData.getName() + ": " + e.getMessage());
}
}
}
// webservice meta data that are common to all EJB endpoints
Element webservices = getOptionalChild(element, "webservices");
if (webservices != null)
{
//
Element contextRoot = getOptionalChild(webservices, "context-root");
if (contextRoot != null)
{
webServiceContextRoot = getElementContent(contextRoot);
if (webServiceContextRoot.charAt(0) != '/')
webServiceContextRoot = "/" + webServiceContextRoot;
}
//
iterator = getChildrenByTagName(webservices, "webservice-description");
while (iterator.hasNext())
{
Element wsd = (Element)iterator.next();
String wsdName = getElementContent(getUniqueChild(wsd, "webservice-description-name"));
configName = MetaData.getOptionalChildContent(wsd, "config-name");
configFile = MetaData.getOptionalChildContent(wsd, "config-file");
String wsdlPublishLocation = getOptionalChildContent(wsd, "wsdl-publish-location");
wsdlPublishLocationMap.put(wsdName, wsdlPublishLocation);
}
}
// update the enterprise beans
Element entBeans = getOptionalChild(element, "enterprise-beans");
if (entBeans != null)
{
String ejbName = null;
try
{
// Entity Beans
iterator = getChildrenByTagName(entBeans, "entity");
while (iterator.hasNext())
{
Element bean = (Element)iterator.next();
ejbName = getElementContent(getUniqueChild(bean, "ejb-name"));
BeanMetaData beanMetaData = getBeanByEjbName(ejbName);
if (beanMetaData == null)
{
throw new DeploymentException("found in jboss.xml " +
"but not in ejb-jar.xml");
}
beanMetaData.importJbossXml(bean);
}
// Session Beans
iterator = getChildrenByTagName(entBeans, "session");
while (iterator.hasNext())
{
Element bean = (Element)iterator.next();
ejbName = getElementContent(getUniqueChild(bean, "ejb-name"));
BeanMetaData beanMetaData = getBeanByEjbName(ejbName);
if (beanMetaData == null)
{
throw new DeploymentException("found in jboss.xml " +
"but not in ejb-jar.xml");
}
beanMetaData.importJbossXml(bean);
}
// Message Driven Beans
iterator = getChildrenByTagName(entBeans, "message-driven");
while (iterator.hasNext())
{
Element bean = (Element)iterator.next();
ejbName = getElementContent(getUniqueChild(bean, "ejb-name"));
BeanMetaData beanMetaData = getBeanByEjbName(ejbName);
if (beanMetaData == null)
{
throw new DeploymentException("found in jboss.xml " +
"but not in ejb-jar.xml");
}
beanMetaData.importJbossXml(bean);
}
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in jboss.xml for " +
"Bean " + ejbName + ": " + e.getMessage());
}
}
// read the assembly descriptor (optional)
Element descrElement = getOptionalChild(element, "assembly-descriptor");
if (descrElement != null)
{
// set the security roles (optional)
iterator = getChildrenByTagName(descrElement, "security-role");
while (iterator.hasNext())
{
Element securityRole = (Element)iterator.next();
String roleName = getElementContent(getUniqueChild(securityRole, "role-name"));
SecurityRoleMetaData securityRoleMetaData = assemblyDescriptor.getSecurityRoleByName(roleName);
if (securityRoleMetaData == null)
{
// Create a new SecurityRoleMetaData
securityRoleMetaData = new SecurityRoleMetaData(roleName);
assemblyDescriptor.addSecurityRoleMetaData(securityRoleMetaData);
}
Iterator itPrincipalNames = getChildrenByTagName(securityRole, "principal-name");
while (itPrincipalNames.hasNext())
{
String principalName = getElementContent((Element)itPrincipalNames.next());
securityRoleMetaData.addPrincipalName(principalName);
}
}
// set the message destinations (optional)
iterator = getChildrenByTagName(descrElement, "message-destination");
while (iterator.hasNext())
{
Element messageDestination = (Element)iterator.next();
try
{
String messageDestinationName = getUniqueChildContent(messageDestination, "message-destination-name");
MessageDestinationMetaData messageDestinationMetaData = getMessageDestination(messageDestinationName);
if (messageDestinationMetaData == null)
throw new DeploymentException("message-destination " + messageDestinationName + " found in jboss.xml but not in ejb-jar.xml");
messageDestinationMetaData.importJbossXml(messageDestination);
}
catch (Throwable t)
{
throw new DeploymentException("Error in ejb-jar.xml " +
"for message destination: " + t.getMessage());
}
}
}
// set the resource managers
Element resmans = getOptionalChild(element, "resource-managers");
if (resmans != null)
{
iterator = getChildrenByTagName(resmans, "resource-manager");
try
{
while (iterator.hasNext())
{
Element resourceManager = (Element)iterator.next();
String resName = getElementContent(getUniqueChild(resourceManager, "res-name"));
String jndi = getElementContent(getOptionalChild(resourceManager, "res-jndi-name"));
String url = getElementContent(getOptionalChild(resourceManager, "res-url"));
if (jndi != null && url == null)
{
resources.put(resName, jndi);
}
else if (jndi == null && url != null)
{
resources.put(resName, url);
}
else
{
throw new DeploymentException(resName +
" : expected res-url or res-jndi-name tag");
}
}
}
catch (DeploymentException e)
{
throw new DeploymentException("Error in jboss.xml, in " +
"resource-manager: " + e.getMessage());
}
}
}
}
/*
vim:ts=3:sw=3:et
*/