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;
public class EntityMetaData
extends BeanMetaData
{
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-rmi-invoker";
public static final String DEFAULT_CLUSTERED_ENTITY_INVOKER_PROXY_BINDING =
"clustered-entity-rmi-invoker";
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;
private static Logger log = Logger.getLogger( EntityMetaData.class );
public EntityMetaData( ApplicationMetaData app )
{
super(app, BeanMetaData.ENTITY_TYPE);
}
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;
}
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);
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'!" );
}
primaryKeyClass = getElementContent(getUniqueChild(element,
"prim-key-class"));
reentrant = Boolean.valueOf(getElementContent(getUniqueChild(element,
"reentrant"))).booleanValue();
if( isCMP() )
{
if( getApplicationMetaData().isEJB2x() )
{
String cmpVersionString = getElementContent(
getOptionalChild(element, "cmp-version"));
if( cmpVersionString == null )
{
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
{
cmpVersion = CMP_VERSION_1;
}
abstractSchemaName = getOptionalChildContent(element,
"abstract-schema-name");
if( cmpVersion == 2 )
{
String ejbName = getEjbName();
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" );
}
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 + "'" );
}
}
Iterator iterator = getChildrenByTagName( element, "cmp-field" );
while( iterator.hasNext() )
{
Element field = (Element)iterator.next();
cmpFields.add(getElementContent(getUniqueChild(field,
"field-name")));
}
primKeyField = getElementContent(getOptionalChild(element,
"primkey-field"));
if( primKeyField != null && !cmpFields.contains(primKeyField) )
{
throw new DeploymentException( "primkey-field " + primKeyField +
" is not a cmp-field");
}
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);
String readOnlyString = getElementContent(getOptionalChild(
element, "read-only"));
if( readOnlyString != null )
{
readOnly = Boolean.valueOf(readOnlyString).booleanValue();
}
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);
}
}
}