/*
* Copyright 2008 Werner Guttmann
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.exolab.castor.jdo.engine.nature;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.castor.core.nature.BaseNature;
import org.castor.core.nature.PropertyHolder;
import org.exolab.castor.jdo.engine.KeyGeneratorDescriptor;
import org.exolab.castor.mapping.AccessMode;
import org.exolab.castor.mapping.ClassDescriptor;
import org.exolab.castor.mapping.FieldDescriptor;
import org.exolab.castor.mapping.loader.ClassDescriptorImpl;
import org.exolab.castor.mapping.xml.NamedNativeQuery;
/**
* JDO-specific nature for {@link ClassDescriptor}.<br/><br/>
*
* Augments {@link ClassDescriptor} to include persistence-specific data such as
* e.g. the table name, cache parameter, key generators, access mode and other
* SQL-related information.<br/><br/>
*
* To access persistence-specific data of a {@link ClassDescriptor}, use the
* following code fragment to ...
*
* <ol>
* <li>check for this nature</li>
* <li>apply this nature to the {@link ClassDescriptor} in question.</li>
* <li>access e.g. the table name.</li>
* </ol>
*
* <i>Sample - Looking up table name</i>
*
* <pre>
* ClassDescriptor classDescriptor = ...;
* ...
* if (classDescriptor.hasNature(ClassDescriptorJDONature.class.getName()) { 1)
* ClassDescriptorJDONature nature = new ClassDescriptorJDONature(classDescriptor); 2)
* ...
* String tableName = nature.getTableName(); 3)
* }
* </pre>
*
* @author <a href="mailto:wguttmn AT codehaus DOT org">Werner Guttmann</a>
* @since 1.2.1
*/
public class ClassDescriptorJDONature extends BaseNature {
/**
* Nature property name for table name.
*/
private static final String TABLE_NAME = "tableName";
/**
* Nature property name for table name.
*/
private static final String ACCESS_MODE = "accessMode";
/**
* Nature property name for key generator descriptor.
*/
private static final String KEY_GENERATOR_DESCRIPTOR = "keyGeneratorDescriptor";
/**
* Nature property name for cache parameters.
*/
private static final String CACHE_PARAMETERS = "cacheParameters";
/**
* Nature property name for abstract.
*/
private static final String MAPPED_SUPERCLASS = "mappedSuperclass";
/**
* Nature property name for named queries.
*/
private static final String NAMED_QUERIES = "namedQueries";
/**
* Nature property name for named native queries.
*/
private static final String NAMED_NATIVE_QUERIES = "namedNativeQueries";
/**
* Nature property name for {@link ClassDescriptor}s that extend this {@link ClassDescriptor}.
*/
private static final String EXTENDED = "extended";
/**
* Nature property name for the version field for object modification checks.
*/
private static final String VERSION = "version";
/**
* Creates an instance of {@link ClassDescriptorJDONature}.
* @param holder The {@link PropertyHolder} to 'view upon'.
*/
public ClassDescriptorJDONature(final PropertyHolder holder) {
super(holder);
}
/**
* {@inheritDoc}
*
* @see org.castor.core.nature.Nature#getId()
*/
public String getId() {
return getClass().getName();
}
/**
* Set class to abstract
*
* @param abstract Boolean
*/
public void setAbstract(final Boolean hasMappedSuperclass) {
setProperty(MAPPED_SUPERCLASS, hasMappedSuperclass);
}
/**
* Returns if class has mapped super class.
*
* @return true if class hs mapped super class
*/
public boolean hasMappedSuperclass() {
return getBooleanPropertyDefaultFalse(MAPPED_SUPERCLASS);
}
/**
* Sets the table name to which this object maps.
*
* @param tableName Table name
*/
public void setTableName(final String tableName) {
setProperty(TABLE_NAME, tableName);
}
/**
* Returns the table name to which this object maps.
*
* @return Table name
*/
public String getTableName() {
return (String) getProperty(TABLE_NAME);
}
/**
* Sets the access mode to which this {@link ClassDescriptor} maps.
* @param accessMode The access mode to be used.
*/
public void setAccessMode(final AccessMode accessMode) {
setProperty(ACCESS_MODE, accessMode);
}
/**
* Returns the access mode to which this object maps.
*
* @return Access mode
*/
public AccessMode getAccessMode() {
return (AccessMode) getProperty(ACCESS_MODE);
}
/**
* Set key generator specified for this class.
*
* @param keyGenDesc Key generator descriptor.
*/
public void setKeyGeneratorDescriptor(final KeyGeneratorDescriptor keyGenDesc) {
setProperty(KEY_GENERATOR_DESCRIPTOR, keyGenDesc);
}
/**
* Get key generator specified for this class.
*
* @return Key generator descriptor.
*/
public KeyGeneratorDescriptor getKeyGeneratorDescriptor() {
return (KeyGeneratorDescriptor) getProperty(KEY_GENERATOR_DESCRIPTOR);
}
/**
* Adds a cache parameter to this {@link ClassDescriptor}.
* @param key The cache parameter key.
* @param value The cache parameter value.
*/
public void addCacheParam(final String key, final String value) {
Properties cacheParameters = (Properties) getProperty(CACHE_PARAMETERS);
if (cacheParameters == null) {
cacheParameters = new Properties();
}
cacheParameters.put(key, value);
setProperty(CACHE_PARAMETERS, cacheParameters);
}
/**
* Returns the cache parameters defined for this {@link ClassDescriptor}.
* @return the defined cache parameters
*/
public Properties getCacheParams() {
return (Properties) getProperty(CACHE_PARAMETERS);
}
/**
* Adds a named query to this {@link ClassDescriptor}.
*
* @param name The name of the named query.
* @param query The query string
*/
@SuppressWarnings("unchecked")
public void addNamedQuery(final String name, final String query) {
Map<String, String> namedQueries = (Map<String, String>) getProperty(NAMED_QUERIES);
if (namedQueries == null) {
namedQueries = new HashMap<String, String>();
}
namedQueries.put(name, query);
setProperty(NAMED_QUERIES, namedQueries);
}
/**
* Get map of named query strings associated with their names.
*
* @return Map of named query strings associated with their names.
*/
@SuppressWarnings("unchecked")
public Map<String, String> getNamedQueries() {
return getPropertyAsMap(NAMED_QUERIES);
}
/**
* Returns the name of the version field used for checks on object
* modifications.
*
* @return The name of the version field, <code>null</code> if not set.
*/
public String getVersionField() {
return (String) getProperty(VERSION);
}
/**
* Adds a named query to this {@link ClassDescriptor}.
*
* @param name The name of the named query.
* @param query The query string
*/
@SuppressWarnings("unchecked")
public void addNamedNativeQuery(final String name, final NamedNativeQuery query) {
Map<String, NamedNativeQuery> namedNativeQueries =
(Map<String, NamedNativeQuery>) getProperty(NAMED_NATIVE_QUERIES);
if (namedNativeQueries == null) {
namedNativeQueries = new HashMap<String, NamedNativeQuery>();
}
namedNativeQueries.put(name, query);
setProperty(NAMED_NATIVE_QUERIES, namedNativeQueries);
}
/**
* Get map of named native queries associated with their names.
*
* @return Map of named native queries associated with their names.
*/
@SuppressWarnings("unchecked")
public Map<String, NamedNativeQuery> getNamedNativeQueries() {
return getPropertyAsMap(NAMED_NATIVE_QUERIES);
}
/**
* Returns the {@link FieldDescriptor} for the given name.
* @param name A field name.
* @return The associated {@link FieldDescriptor}.
*/
public FieldDescriptor getField(final String name) {
FieldDescriptor[] fields = ((ClassDescriptor) getHolder()).getFields();
for (int i = 0; i < fields.length; ++i) {
FieldDescriptor field = fields[i];
if ((field.hasNature(FieldDescriptorJDONature.class.getName()))
&& (field.getFieldName().equals(name))) {
return field;
}
}
FieldDescriptor[] identities = ((ClassDescriptorImpl) getHolder()).getIdentities();
for (int i = 0; i < identities.length; ++i) {
FieldDescriptor field = identities[i];
if ((field.hasNature(FieldDescriptorJDONature.class.getName()))
&& (field.getFieldName().equals(name))) {
return field;
}
}
return null;
}
/**
* Adds a {@link ClassDescriptor} that extends this class.
* @param classDesc A {@link ClassDescriptor} that extends this class.
*/
@SuppressWarnings("unchecked")
public void addExtended(final ClassDescriptor classDesc) {
List<ClassDescriptor> extendeds = getPropertyAsList(EXTENDED);
if (extendeds == null) {
extendeds = new ArrayList<ClassDescriptor>();
}
extendeds.add(classDesc);
setProperty(EXTENDED, extendeds);
}
/**
* Returns a collection of {@link ClassDescriptor}s that extend this class (descriptor).
* @return A collection of {@link ClassDescriptor}s that extend this class.
*/
@SuppressWarnings("unchecked")
public Collection<ClassDescriptor> getExtended() {
return getPropertyAsList(EXTENDED);
}
/**
* Sets the version field to use for object modification checks.
*
* @param versionField
* the name of the field.
*/
public void setVersionField(final String versionField) {
setProperty(VERSION, versionField);
}
}