/*
* 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.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import org.w3c.dom.Element;
import org.jboss.deployment.DeploymentException;
import org.jboss.logging.Logger;
import org.jboss.util.Strings;
/**
* The meta data information specific to entity beans.
*
* @author Sebastien Alborini
* @author Scott Stark
* @author Dain Sundstrom
* @author Bill Burke
* @author Christian Riege
*
* @version $Revision: 59641 $
*
*
Revisions:
*
2001/10/16: billb
*
* - Added clustering tags
*
*/
public class EntityMetaData
extends BeanMetaData
{
// Constants -----------------------------------------------------
public final static int CMP_VERSION_1 = 1;
public final static int CMP_VERSION_2 = 2;
public static final String DEFAULT_ENTITY_INVOKER_PROXY_BINDING =
"entity-unified-invoker";
public static final String DEFAULT_CLUSTERED_ENTITY_INVOKER_PROXY_BINDING =
"clustered-entity-unified-invoker";
// Attributes ----------------------------------------------------
private boolean cmp;
private String primaryKeyClass;
private boolean reentrant;
private int cmpVersion;
private String abstractSchemaName;
private ArrayList cmpFields = new ArrayList();
private String primKeyField;
private ArrayList queries = new ArrayList();
private boolean readOnly = false;
private boolean doDistCachInvalidations = false;
private CacheInvalidationConfigMetaData cacheInvalidConfig = null;
// Static --------------------------------------------------------
private static Logger log = Logger.getLogger( EntityMetaData.class );
// Constructors --------------------------------------------------
public EntityMetaData( ApplicationMetaData app )
{
super(app, BeanMetaData.ENTITY_TYPE);
}
// Public --------------------------------------------------------
public boolean isCMP()
{
return cmp;
}
public boolean isCMP1x()
{
return cmp && (cmpVersion==1);
}
public boolean isCMP2x()
{
return cmp && (cmpVersion==2);
}
public boolean isBMP()
{
return !cmp;
}
public String getPrimaryKeyClass()
{
return primaryKeyClass;
}
public boolean isReentrant()
{
return reentrant;
}
public String getAbstractSchemaName()
{
return abstractSchemaName;
}
public boolean isReadOnly()
{
return readOnly;
}
/**
* Gets the container managed fields.
* @returns iterator over Strings containing names of the fields
*/
public Iterator getCMPFields()
{
return cmpFields.iterator();
}
public String getPrimKeyField()
{
return primKeyField;
}
public Iterator getQueries()
{
return queries.iterator();
}
public String getDefaultConfigurationName()
{
if (isCMP())
{
if(getApplicationMetaData().isEJB2x())
{
if (isClustered())
{
return ConfigurationMetaData.CLUSTERED_CMP_2x_13;
}
else
{
return ConfigurationMetaData.CMP_2x_13;
}
}
else
{
if (isClustered())
{
return ConfigurationMetaData.CLUSTERED_CMP_1x_13;
}
else
{
return ConfigurationMetaData.CMP_1x_13;
}
}
}
else
{
if (isClustered())
{
return ConfigurationMetaData.CLUSTERED_BMP_13;
}
else
{
return ConfigurationMetaData.BMP_13;
}
}
}
public boolean doDistributedCacheInvalidations ()
{
return this.doDistCachInvalidations ;
}
public CacheInvalidationConfigMetaData getDistributedCacheInvalidationConfig ()
{
return this.cacheInvalidConfig ;
}
public void importEjbJarXml( Element element )
throws DeploymentException
{
super.importEjbJarXml(element);
// set persistence type
String persistenceType = getElementContent(getUniqueChild(element,
"persistence-type"));
if( persistenceType.equals("Bean") )
{
cmp = false;
}
else if( persistenceType.equals("Container") )
{
cmp = true;
}
else
{
throw new DeploymentException( getEjbName() + ": " +
"persistence-type must be 'Bean' or 'Container'!" );
}
// set primary key class
primaryKeyClass = getElementContent(getUniqueChild(element,
"prim-key-class"));
// set reentrant
reentrant = Boolean.valueOf(getElementContent(getUniqueChild(element,
"reentrant"))).booleanValue();
if( isCMP() )
{
// cmp-version
if( getApplicationMetaData().isEJB2x() )
{
String cmpVersionString = getElementContent(
getOptionalChild(element, "cmp-version"));
if( cmpVersionString == null )
{
// default for ejb 2.0 apps is cmp 2.x
cmpVersion = CMP_VERSION_2;
}
else
{
if( "1.x".equals(cmpVersionString) )
{
cmpVersion = 1;
}
else if( "2.x".equals(cmpVersionString) )
{
cmpVersion = 2;
}
else
{
throw new DeploymentException( getEjbName() + ": " +
"cmp-version must be '1.x' or '2.x', if specified" );
}
}
}
else
{
// default for 1.0 DTDs is version 2
cmpVersion = CMP_VERSION_1;
}
// abstract-schema-name
abstractSchemaName = getOptionalChildContent(element,
"abstract-schema-name");
if( cmpVersion == 2 )
{
// Enforce several restrictions on abstract-schema-name and
// ejb-name Elements, see bug #613360
String ejbName = getEjbName();
// ejb-name tests
if( !Strings.isValidJavaIdentifier(ejbName) )
{
throw new DeploymentException( "The ejb-name for a CMP" +
"2.x Entity must be a valid Java Identifier" );
}
if( Strings.isEjbQlIdentifier(ejbName) )
{
log.warn( ejbName + ": The ejb-name for a CMP 2.x Entity " +
"should not be a reserved EJB-QL keyword" );
}
// Test various things for abstract-schema-name
if( abstractSchemaName == null )
{
throw new DeploymentException( "The abstract-schema-name " +
"must be specified for CMP 2.x Beans" );
}
if( !Strings.isValidJavaIdentifier(abstractSchemaName) )
{
throw new DeploymentException( "The abstract-schema-name " +
"must be a valid Java Identifier '" + abstractSchemaName +
"'");
}
if( Strings.isEjbQlIdentifier(abstractSchemaName) )
{
log.warn( ejbName + ": The abstract-schema-name should " +
"not be a reserved EJB-QL Identifier '" +
abstractSchemaName + "'" );
}
}
// cmp-fields
Iterator iterator = getChildrenByTagName( element, "cmp-field" );
while( iterator.hasNext() )
{
Element field = (Element)iterator.next();
cmpFields.add(getElementContent(getUniqueChild(field,
"field-name")));
}
// set the primary key field
primKeyField = getElementContent(getOptionalChild(element,
"primkey-field"));
if( primKeyField != null && !cmpFields.contains(primKeyField) )
{
// FIXME: include ejb-name
throw new DeploymentException( "primkey-field " + primKeyField +
" is not a cmp-field");
}
// queries
iterator = getChildrenByTagName(element, "query");
while( iterator.hasNext() )
{
Element queryElement = (Element) iterator.next();
QueryMetaData queryMetaData = new QueryMetaData();
queryMetaData.importEjbJarXml(queryElement);
queries.add(queryMetaData);
}
}
}
protected void defaultInvokerBindings()
{
this.invokerBindings = new HashMap();
if( isClustered() )
{
this.invokerBindings.put(
DEFAULT_CLUSTERED_ENTITY_INVOKER_PROXY_BINDING, getJndiName());
}
else
{
this.invokerBindings.put(
DEFAULT_ENTITY_INVOKER_PROXY_BINDING, getJndiName());
}
}
public void importJbossXml( Element element )
throws DeploymentException
{
super.importJbossXml(element);
// set readonly
String readOnlyString = getElementContent(getOptionalChild(
element, "read-only"));
if( readOnlyString != null )
{
readOnly = Boolean.valueOf(readOnlyString).booleanValue();
}
// Manage distributed cache-invalidation settings
//
String distCacheInvalidations = getElementContent(getOptionalChild( element,
"cache-invalidation"), (this.doDistCachInvalidations ? "True" : "False") );
this.doDistCachInvalidations = distCacheInvalidations.equalsIgnoreCase ("True");
Element cacheInvalidConfigElement = getOptionalChild(element,
"cache-invalidation-config");
this.cacheInvalidConfig = new CacheInvalidationConfigMetaData();
this.cacheInvalidConfig.init(this);
if (cacheInvalidConfigElement != null)
{
this.cacheInvalidConfig.importJbossXml(cacheInvalidConfigElement);
}
}
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}
/*
vim:ts=3:sw=3:et
*/