/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, 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.deployment;
// $Id: J2eeModuleMetaData.java 81030 2008-11-14 12:59:42Z dimitris@jboss.org $
import org.jboss.metadata.MetaData;
import org.w3c.dom.Element;
/**
* The metadata for an application/module element
*
* @author <a href="mailto:daniel.schulze@telkel.com">Daniel Schulze</a>
* @author Thomas.Diesler@jboss.org
* @version $Revision: 81030 $
*/
public class J2eeModuleMetaData
extends MetaData
{
// Constants -----------------------------------------------------
public static final int EJB = 0;
public static final int WEB = 1;
public static final int CLIENT = 2;
public static final int CONNECTOR = 3;
public static final int SERVICE = 4;
public static final int HAR = 5;
private static final String[] tags = {"ejb", "web", "java", "connector", "service", "har"};
// Attributes ----------------------------------------------------
int type;
String fileName;
String alternativeDD;
String webContext;
// Static --------------------------------------------------------
// Public --------------------------------------------------------
/**
* Default ctor used when populating the metadata via xml descriptors
*/
public J2eeModuleMetaData()
{
}
/**
* Ctor used when populating the metadata without a descriptor
* @param type - one of EJB, WEB, CLIENT, CONNECTOR, SERVICE, HAR
* @param fileName - the module name
*/
public J2eeModuleMetaData(int type, String fileName)
{
this.type = type;
this.fileName = fileName;
if( type == WEB )
{
int dot = fileName.lastIndexOf('.');
if( dot >= 0 )
webContext = fileName.substring(0, dot);
}
}
public int getType()
{
return type;
}
public void setType(int type)
{
this.type = type;
}
public boolean isEjb()
{
return (type == EJB);
}
public boolean isWeb()
{
return (type == WEB);
}
public boolean isJava()
{
return (type == CLIENT);
}
public boolean isConnector()
{
return (type == CONNECTOR);
}
public String getFileName()
{
return fileName;
}
public void setFileName(String name)
{
this.fileName = name;
if( type == WEB )
{
int dot = fileName.lastIndexOf('.');
if( dot >= 0 )
webContext = fileName.substring(0, dot);
}
}
public String getAlternativeDD()
{
return alternativeDD;
}
public void setAlternativeDD(String dd)
{
this.alternativeDD = dd;
}
public String getWebContext()
{
if (type == WEB)
{
return webContext;
}
else
{
return null;
}
}
public void setWebContext(String context)
{
this.webContext = context;
}
public void importXml(Element rootElement) throws DeploymentException
{
String rootTag = rootElement.getOwnerDocument().getDocumentElement().getTagName();
if (rootTag.equals("application"))
importXml(rootElement, false);
else if (rootTag.equals("jboss-app"))
importXml(rootElement, true);
else
throw new DeploymentException("Unrecognized root tag: " + rootTag);
}
protected void importXml(Element element, boolean jbossSpecific) throws DeploymentException
{
String name = element.getTagName();
if (name.equals("module"))
{
boolean done = false; // only one of the tags can hit!
for (int i = 0; done == false && i < tags.length; ++i)
{
Element child = getOptionalChild(element, tags[i]);
if (child == null)
{
continue;
}
type = i;
switch (type)
{
case SERVICE:
if (jbossSpecific == false)
{
throw new DeploymentException("Service archives must be in jboss-app.xml");
} // end of if ()
//fall through.
case HAR:
if (jbossSpecific == false)
{
throw new DeploymentException("Hibernate archives must be in jboss-app.xml");
}
case EJB:
case CLIENT:
case CONNECTOR:
fileName = getElementContent(child);
alternativeDD = getElementContent(getOptionalChild(element, "alt-dd"));
break;
case WEB:
fileName = getElementContent(getUniqueChild(child, "web-uri"));
webContext = getElementContent(getOptionalChild(child, "context-root"));
alternativeDD = getElementContent(getOptionalChild(element, "alt-dd"));
break;
}
done = true;
}
// If the module content is not recognized throw an exception
if (done == false)
{
StringBuffer msg = new StringBuffer("Invalid module content, must be one of: ");
for (int i = 0; i < tags.length; i ++)
{
msg.append(tags[i]);
msg.append(", ");
}
throw new DeploymentException(msg.toString());
}
}
else
{
throw new DeploymentException("non-module tag in application dd: " + name);
}
}
public String toString()
{
StringBuilder buffer = new StringBuilder();
buffer.append(getClass().getSimpleName());
buffer.append('@');
buffer.append(System.identityHashCode(this));
buffer.append("{fileName=").append(fileName).append(",type=").append(type).append('}');
return buffer.toString();
}
}