/* * Copyright 2008 Tobias Hochwallner * * 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.builder.info.nature; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.castor.core.nature.BaseNature; import org.exolab.castor.builder.info.ClassInfo; import org.exolab.castor.builder.info.FieldInfo; import org.exolab.castor.mapping.AccessMode; /** * A JDO specific view of a {@link ClassInfo}. Implementation on property based * {@link ClassInfo} access. * * TODO Add key generator support. * * @author Tobias Hochwallner * @since 1.2.1 */ public final class JDOClassInfoNature extends BaseNature { /** * Property key of primary key. */ private static final String PRIMARY_KEY = "primarykey"; /** * Property key of table name. */ private static final String TABLE_NAME = "tablename"; /** * The {@link AccessMode} of the jdo entity. */ private static final String ACCESS_MODE = "accessmode"; /** * Property key of 'detachable' flag. */ private static final String DETACHABLE = "detachable"; /** * @param classInfo * the classinfo in focus. */ public JDOClassInfoNature(final ClassInfo classInfo) { super(classInfo); } /** * Returns the id of the Nature. Implementation returns the fully qualified * class name. * * @return the id. * @see org.exolab.castor.builder.info.nature.Nature#getId() */ public String getId() { return getClass().getName(); } /** * Adds a column to the primary key. The order of the key columns is not * guaranteed. * * @param column * column name */ public void addPrimaryKey(final String column) { List<String> primaryKey = getPropertyAsList(PRIMARY_KEY); primaryKey.add(column); } /** * Returns a List of {@String}s holding the columns of the primary key. * Keep in mind that by contract of * <code>addPrimaryKey(String primaryKey)</code> the order is not * guaranteed. * * @return the names of the primary key's columns or null if no key added * before. */ public List<String> getPrimaryKeys() { return (List<String>) this.getProperty(PRIMARY_KEY); } /** * Returns the table name. * * @return the SQL table Name */ public String getTableName() { return (String) this.getProperty(TABLE_NAME); } /** * Sets the table name to the given String. * * @param tableName * of the SQL table. */ public void setTableName(final String tableName) { this.setProperty(TABLE_NAME, tableName); } /** * Sets the {@link org.exolab.castor.mapping.AccessMode} to the given * AccessMode. * * @param accessMode * access mode */ public void setAccessMode(final AccessMode accessMode) { this.setProperty(ACCESS_MODE, accessMode); } /** * Returns the {@link org.exolab.castor.mapping.AccessMode}. * * @return access mode of the jdo entity. */ public AccessMode getAccessMode() { return (AccessMode) this.getProperty(ACCESS_MODE); } /** * Sets whether the entity is 'detachable'. * * @param detachable True if entity should be detachable */ public void setDetachable(final boolean detachable) { this.setProperty(DETACHABLE, new Boolean(detachable)); } /** * Indicates whether the entity in question is 'detachable'. * * @return True if the entity is 'detachable'. */ public boolean getDetachable() { return this.getBooleanPropertyDefaultFalse(DETACHABLE); } /** * Returns a List of {@link JDOFieldInfoNature}s of all {@link FieldInfo}s * if the field has a a {@link JDOFieldInfoNature} or an empty List if no * field has the Nature. Included are attribute, text and element fields. * * @return List of {@link JDOFieldInfoNature}s. */ public List<JDOFieldInfoNature> getFields() { ClassInfo holder = (ClassInfo) getHolder(); // Now merge all fields. List<FieldInfo> mergedFields = new LinkedList<FieldInfo>(); mergedFields.addAll(holder.getAttributeFieldsAsCollection()); mergedFields.addAll(holder.getElementFieldsAsCollection()); FieldInfo textField = holder.getTextField(); if (textField != null) { mergedFields.add(textField); } // Walk through all fields and check for Nature. Iterator<FieldInfo> fieldIterator = mergedFields.iterator(); List<JDOFieldInfoNature> naturedFields = new LinkedList<JDOFieldInfoNature>(); while (fieldIterator.hasNext()) { FieldInfo field = fieldIterator.next(); if (field.hasNature(JDOFieldInfoNature.class.getName())) { JDOFieldInfoNature nature = new JDOFieldInfoNature(field); naturedFields.add(nature); } } return naturedFields; } }