/*
* 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.ejb.plugins.cmp.jdbc.metadata;
import org.jboss.deployment.DeploymentException;
import org.jboss.metadata.MetaData;
import org.jboss.logging.Logger;
import org.w3c.dom.Element;
/**
* Audit field meta data
*
* @author <a href="mailto:Adrian.Brock@HappeningTimes.com">Adrian Brock</a>
* @version $Revision: 81030 $
*/
public final class JDBCAuditMetaData
{
// Constants ---------------------------------------
// Attributes --------------------------------------
/** The created by principal field */
final private JDBCCMPFieldMetaData createdPrincipalField;
/** The created by time field */
final private JDBCCMPFieldMetaData createdTimeField;
/** The last update by principal field */
final private JDBCCMPFieldMetaData updatedPrincipalField;
/** The last update time time field */
final private JDBCCMPFieldMetaData updatedTimeField;
/** logger */
final private Logger log;
// Constructors ------------------------------------
/**
* Constructs audit metadata reading
* audit XML element
*/
public JDBCAuditMetaData(JDBCEntityMetaData entityMetaData, Element element)
throws DeploymentException
{
log = Logger.getLogger(entityMetaData.getName());
Element workElement;
if ((workElement = MetaData.getOptionalChild(element, "created-by")) != null)
{
createdPrincipalField = constructAuditField(entityMetaData, workElement, "audit_created_by");
log.debug("created-by: " + createdPrincipalField);
}
else
createdPrincipalField = null;
if ((workElement = MetaData.getOptionalChild(element, "created-time")) != null)
{
createdTimeField = constructAuditField(entityMetaData, workElement, "audit_created_time");
log.debug("created-time: " + createdTimeField);
}
else
createdTimeField = null;
if ((workElement = MetaData.getOptionalChild(element, "updated-by")) != null)
{
updatedPrincipalField = constructAuditField(entityMetaData, workElement, "audit_updated_by");
log.debug("updated-by: " + updatedPrincipalField);
}
else
updatedPrincipalField = null;
if ((workElement = MetaData.getOptionalChild(element, "updated-time")) != null)
{
updatedTimeField = constructAuditField(entityMetaData, workElement, "audit_updated_time");
log.debug("updated-time: " + updatedTimeField);
}
else
updatedTimeField = null;
}
// Public ------------------------------------------
public JDBCCMPFieldMetaData getCreatedPrincipalField()
{
return createdPrincipalField;
}
public JDBCCMPFieldMetaData getCreatedTimeField()
{
return createdTimeField;
}
public JDBCCMPFieldMetaData getUpdatedPrincipalField()
{
return updatedPrincipalField;
}
public JDBCCMPFieldMetaData getUpdatedTimeField()
{
return updatedTimeField;
}
// Private -----------------------------------------
/**
* Constructs an audit locking field metadata from
* XML element
*/
private static JDBCCMPFieldMetaData constructAuditField(
JDBCEntityMetaData entity,
Element element,
String defaultName)
throws DeploymentException
{
// field name
String fieldName = MetaData.getOptionalChildContent(element, "field-name");
if (fieldName == null || fieldName.trim().length() < 1)
fieldName = defaultName;
// column name
String columnName = MetaData.getOptionalChildContent(element, "column-name");
if (columnName == null || columnName.trim().length() < 1)
columnName = defaultName;
// field type
Class fieldType;
String fieldTypeStr = MetaData.getOptionalChildContent(element, "field-type");
if (fieldTypeStr != null)
{
try
{
fieldType = GetTCLAction.getContextClassLoader().loadClass(fieldTypeStr);
}
catch(ClassNotFoundException e)
{
throw new DeploymentException(
"Could not load field type for audit field "
+ fieldName + ": " + fieldTypeStr);
}
}
else
{
if (defaultName.endsWith("by"))
fieldType = String.class;
else
fieldType = java.util.Date.class;
}
// JDBC/SQL Type
int jdbcType;
String sqlType;
String jdbcTypeName = MetaData.getOptionalChildContent(element, "jdbc-type");
if (jdbcTypeName != null)
{
jdbcType = JDBCMappingMetaData.getJdbcTypeFromName(jdbcTypeName);
sqlType = MetaData.getUniqueChildContent(element, "sql-type");
}
else
{
jdbcType = Integer.MIN_VALUE;
sqlType = null;
}
// Is the field exposed?
JDBCCMPFieldMetaData result = entity.getCMPFieldByName(fieldName);
if (result == null)
result = new JDBCCMPFieldMetaData(entity, fieldName, fieldType, columnName, jdbcType, sqlType);
return result;
}
}