package org.exolab.castor.jdo.engine.nature;
import org.castor.core.nature.BaseNature;
import org.castor.core.nature.PropertyHolder;
import org.exolab.castor.mapping.TypeConvertor;
/**
* JDO-specific nature for {@link FieldDescriptor}.<br/><br/>
*
* Augments {@link FieldDescriptor} to include persistence-specific data such as
* e.g. the column names, types and other SQL-related information.<br/><br/>
*
* To access persistence-specific data of a {@link FieldDescriptor}, use the
* following code fragment to ...
*
* <ol>
* <li>check for this nature</li>
* <li>apply this nature to the {@link FieldDescriptor} in question.</li>
* <li>access e.g. the column name.</li>
* </ol>
*
* <i>Sample - Looking up column name</i>
*
* <pre>
* FieldDescriptor fieldDescriptor = ...;
* ...
* if (fieldDescriptor.hasNature(FieldDescriptorJDONature.class.getName()) { 1)
* FieldDescriptorJDONature nature = new FieldDescriptorJDONature(fieldDescriptor); 2)
* ...
* String columnName = nature.getColumnName; 3)
* }
* </pre>
*
* @author <a href="mailto:wguttmn AT codehaus DOT org">Werner Guttmann</a>
* @since 1.2.1
*/
public class FieldDescriptorJDONature extends BaseNature {
/**
* Nature property name for sql name.
*/
private static final String SQL_NAME = "sqlName";
/**
* Nature property name for sql many key.
*/
private static final String MANY_KEY = "manyKey";
/**
* Nature property name for sql many table.
*/
private static final String MANY_TABLE = "manyTable";
/**
* Nature property name for sql read only.
*/
private static final String READ_ONLY = "readOnly";
/**
* Nature property name for sql dirty check.
*/
private static final String DIRTY_CHECK = "dirtyCheck";
/**
* Nature property name for sql type convertor.
*/
private static final String TYPE_CONVERTOR = "typeConvertor";
/**
* Nature property name for sql types.
*/
private static final String SQL_TYPE = "sqlType";
/**
* Nature property name for transient attribute.
*/
private static final String SQL_TRANSIENT = "sqlTransient";
/**
* Nature property name for sql cascade property.
*/
private static final String CASCADING = "sqlCascading";
/**
* Creates an instance of {@link FieldDescriptorJDONature}.
* @param holder The {@link PropertyHolder} to 'view upon'.
*/
public FieldDescriptorJDONature(final PropertyHolder holder) {
super(holder);
}
/**
* {@inheritDoc}
* @see org.castor.core.nature.Nature#getId()
*/
public String getId() {
return getClass().getName();
}
/**
* Returns the SQL (column) name of the field.
* @return The SQL (column) name.
*/
public String[] getSQLName() {
return (String[]) getProperty(SQL_NAME);
}
/**
* Sets the SQL (column) name of the field.
* @param sqlName The SQL (column) name.
*/
public void setSQLName(final String[] sqlName) {
setProperty(SQL_NAME, sqlName);
}
/**
* Returns the SQL many key of the field.
*
* @return The SQL many key.
*/
public String[] getManyKey() {
return (String[]) getProperty(MANY_KEY);
}
/**
* Sets the SQL many key of the field.
*
* @param manyKey The SQL (many key.
*/
public void setManyKey(final String[] manyKey) {
setProperty(MANY_KEY, manyKey);
}
/**
* Returns the SQL many table of the field.
*
* @return The SQL many table.
*/
public String getManyTable() {
return (String) getProperty(MANY_TABLE);
}
/**
* Sets the SQL many table of the field.
*
* @param manyTable The SQL many table.
*/
public void setManyTable(final String manyTable) {
setProperty(MANY_TABLE, manyTable);
}
/**
* Returns true if field access is read only.
*
* @return True if field access is read-only.
*/
public boolean isReadonly() {
return getBooleanPropertyDefaultFalse(READ_ONLY);
}
/**
* Sets whether field access if read-only.
* @param readOnly True if field access is read-only.
*/
public void setReadOnly(final boolean readOnly) {
setProperty(READ_ONLY, new Boolean(readOnly));
}
/**
* Returns true if dirty checking is required for this field.
* @return True if dirty checking required
*/
public boolean isDirtyCheck() {
return getBooleanPropertyDefaultFalse(DIRTY_CHECK);
}
/**
* Sets whether dirty checking is required for this field.
* @param dirtyCheck True if dirty checking is required for this field.
*/
public void setDirtyCheck(final boolean dirtyCheck) {
setProperty(DIRTY_CHECK, new Boolean(dirtyCheck));
}
/**
* Returns the convertor from the field type to an external type.
* @return Convertor from field type
*/
public TypeConvertor getConvertor() {
return (TypeConvertor) getProperty(TYPE_CONVERTOR);
}
/**
* Sets the {@link TypeConvertor} used for converting from field types to
* external types.
* @param typeConvertor {@link TypeConvertor} to be used.
*/
public void setTypeConvertor(final TypeConvertor typeConvertor) {
setProperty(TYPE_CONVERTOR, typeConvertor);
}
/**
* Returns the SQL type of this field.
* @return The SQL type of this field
*/
public int[] getSQLType() {
return (int[]) getProperty(SQL_TYPE);
}
/**
* Sets the SQL type of this field.
* @param sqlType The SQL type of this field.
*/
public void setSQLType(final int[] sqlType) {
setProperty(SQL_TYPE, sqlType);
}
/**
* Returns true if transient is set for this field.
* @return True if this field should be transient.
*/
public boolean isTransient() {
return getBooleanPropertyDefaultFalse(SQL_TRANSIENT);
}
/**
* Sets whether this field should be transient.
* @param lazy True if this field should be transient.
*/
public void setTransient(final boolean isTransient) {
setProperty(SQL_TRANSIENT, new Boolean(isTransient));
}
/**
* Returns the cascading types for the given field.
* @return The cascading values.
*/
public String getCascading() {
return (String) getProperty(CASCADING);
}
/**
* Sets the cascading values for the given field.
* @param cascading The cascading values to be set.
*/
public void setCascading(final String cascading) {
setProperty(CASCADING, cascading);
}
}