/* * AbstractData.java * * This work is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. * * This work 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * * Copyright (c) 2004-2006 Per Cederberg. All rights reserved. */ package org.liquidsite.core.data; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import org.liquidsite.util.db.DatabaseDataException; import org.liquidsite.util.db.DatabaseResults; /** * An abstract data object. This is the base class for all the data * objects in this package. It contains methods for handling the data * parameters. * * @author Per Cederberg, <per at percederberg dot net> * @version 1.0 */ public abstract class AbstractData { /** * The parameter sets for all data objects. The parameter sets * are indexed by their data object class. */ private static HashMap parameterSets = new HashMap(); /** * Returns the parameter set for a specified data class. If no * parameter set existed for the specified class, a new one will * be created. * * @param dataClass the data class * * @return the parameter set for the specified data class */ protected static ParameterSet getParameterSet(Class dataClass) { ParameterSet set; set = (ParameterSet) parameterSets.get(dataClass); if (set == null) { set = new ParameterSet(); parameterSets.put(dataClass, set); } return set; } /** * The parameter values. */ private HashMap values = new HashMap(); /** * Creates a new data object. This will initialize all parameters * to their default values. */ protected AbstractData() { getParameterSet(this.getClass()).initialize(this); } /** * Returns a parameter object value. * * @param param the parameter name * * @return the parameter object value, or * null if the parameter doesn't exist */ private Object getObject(Parameter param) { return values.get(param); } /** * Returns a parameter boolean value. * * @param param the parameter name * * @return the parameter boolean value, or * false if the parameter doesn't exist */ public boolean getBoolean(Parameter param) { Object obj = getObject(param); if (obj instanceof Boolean) { return ((Boolean) obj).booleanValue(); } else { return false; } } /** * Returns a parameter date value. * * @param param the parameter name * * @return the parameter date value, or * null if the parameter doesn't exist */ public Date getDate(Parameter param) { Object obj = getObject(param); if (obj instanceof Date) { return (Date) obj; } else { return null; } } /** * Returns a parameter integer value. * * @param param the parameter name * * @return the parameter integer value, or * zero (0) if the parameter doesn't exist */ public int getInt(Parameter param) { Object obj = getObject(param); if (obj instanceof Number) { return ((Number) obj).intValue(); } else { return 0; } } /** * Returns a parameter long value. * * @param param the parameter name * * @return the parameter long value, or * zero (0) if the parameter doesn't exist */ public long getLong(Parameter param) { Object obj = getObject(param); if (obj instanceof Number) { return ((Number) obj).longValue(); } else { return 0; } } /** * Returns a parameter string value. * * @param param the parameter name * * @return the parameter string value, or * an empty string if the parameter doesn't exist */ public String getString(Parameter param) { Object obj = getObject(param); if (obj != null) { return obj.toString(); } else { return ""; } } /** * Sets a parameter object value. * * @param param the parameter name * @param value the parameter value */ private void setObject(Parameter param, Object value) { values.put(param, value); } /** * Sets a parameter boolean value. * * @param param the parameter name * @param value the parameter value */ public void setBoolean(Parameter param, boolean value) { setObject(param, new Boolean(value)); } /** * Sets a parameter date value. * * @param param the parameter name * @param value the parameter value */ public void setDate(Parameter param, Date value) { setObject(param, value); } /** * Sets a parameter integer value. * * @param param the parameter name * @param value the parameter value */ public void setInt(Parameter param, int value) { setObject(param, new Integer(value)); } /** * Sets a parameter long value. * * @param param the parameter name * @param value the parameter value */ public void setLong(Parameter param, long value) { setObject(param, new Long(value)); } /** * Sets a parameter string value. * * @param param the parameter name * @param value the parameter value */ public void setString(Parameter param, String value) { setObject(param, value); } /** * Sets all parameters with values from a database row. * * @param row the database row * * @throws DatabaseDataException if the database row contained * malformed data */ void setAll(DatabaseResults.Row row) throws DatabaseDataException { getParameterSet(this.getClass()).transfer(row, this); } /** * A set of parameters. A parameter set is created for each data * object class, containing all the parameters for that data * object. * * @author Per Cederberg, <per at percederberg dot net> * @version 1.0 */ private static class ParameterSet { /** * The parameters in the set. */ private ArrayList parameters = new ArrayList(); /** * Creates a new empty parameter set. */ public ParameterSet() { // No further initialization needed } /** * Adds a parameter to the set. * * @param param the parameter to add */ public void add(Parameter param) { parameters.add(param); } /** * Initializes a data object with the default values for all * parameters. * * @param data the data object */ public void initialize(AbstractData data) { Parameter param; for (int i = 0; i < parameters.size(); i++) { param = (Parameter) parameters.get(i); param.initialize(data); } } /** * Transfers a database row to a data object. This will set * the values for all data object parameters. * * @param row the database row * @param data the data object * * @throws DatabaseDataException if the database row * contained malformed data */ public void transfer(DatabaseResults.Row row, AbstractData data) throws DatabaseDataException { Parameter param; for (int i = 0; i < parameters.size(); i++) { param = (Parameter) parameters.get(i); param.transfer(row, data); } } } /** * A data object parameter. A parameter corresponds to a column * in the database table. * * @author Per Cederberg, <per at percederberg dot net> * @version 1.0 */ protected abstract static class Parameter { /** * The parameter column name. */ private String column; /** * Creates a new parameter. The new parameter will be added * to the corresponding parameter set in the set of all data * object parameters. If no parameter set exists for the data * object class, a new parameter set will be created. * * @param dataClass the data object class * @param column the column name */ protected Parameter(Class dataClass, String column) { this.column = column; getParameterSet(dataClass).add(this); } /** * Returns the parameter column name. * * @return the parameter column name */ public String getColumn() { return column; } /** * Initializes a data object with the default value for this * parameter. * * @param data the data object */ public abstract void initialize(AbstractData data); /** * Transfers this parameter from a database row to a data * object. * * @param row the database row * @param data the data object * * @throws DatabaseDataException if the database row * contained malformed data */ public abstract void transfer(DatabaseResults.Row row, AbstractData data) throws DatabaseDataException; } /** * A boolean data object parameter. A parameter corresponds to a * column in the database table. * * @author Per Cederberg, <per at percederberg dot net> * @version 1.0 */ protected static class BooleanParameter extends Parameter { /** * The default parameter value. */ private boolean defaultValue; /** * Creates a new boolean parameter. * * @param dataClass the data object class * @param column the column name * @param defaultValue the default value */ public BooleanParameter(Class dataClass, String column, boolean defaultValue) { super(dataClass, column); this.defaultValue = defaultValue; } /** * Initializes a data object with the default value for this * parameter. * * @param data the data object */ public void initialize(AbstractData data) { data.setBoolean(this, defaultValue); } /** * Transfers this parameter from a database row to a data * object. * * @param row the database row * @param data the data object * * @throws DatabaseDataException if the database row * contained malformed data */ public void transfer(DatabaseResults.Row row, AbstractData data) throws DatabaseDataException { data.setBoolean(this, row.getBoolean(getColumn())); } } /** * A date data object parameter. A parameter corresponds to a * column in the database table. * * @author Per Cederberg, <per at percederberg dot net> * @version 1.0 */ protected static class DateParameter extends Parameter { /** * The default parameter value. */ private Date defaultValue; /** * Creates a new date parameter. * * @param dataClass the data object class * @param column the column name * @param defaultValue the default value */ public DateParameter(Class dataClass, String column, Date defaultValue) { super(dataClass, column); this.defaultValue = defaultValue; } /** * Initializes a data object with the default value for this * parameter. * * @param data the data object */ public void initialize(AbstractData data) { data.setDate(this, defaultValue); } /** * Transfers this parameter from a database row to a data * object. * * @param row the database row * @param data the data object * * @throws DatabaseDataException if the database row * contained malformed data */ public void transfer(DatabaseResults.Row row, AbstractData data) throws DatabaseDataException { data.setDate(this, row.getDate(getColumn())); } } /** * An integer data object parameter. A parameter corresponds to a * column in the database table. * * @author Per Cederberg, <per at percederberg dot net> * @version 1.0 */ protected static class IntegerParameter extends Parameter { /** * The default parameter value. */ private int defaultValue; /** * Creates a new integer parameter. * * @param dataClass the data object class * @param column the column name * @param defaultValue the default value */ public IntegerParameter(Class dataClass, String column, int defaultValue) { super(dataClass, column); this.defaultValue = defaultValue; } /** * Initializes a data object with the default value for this * parameter. * * @param data the data object */ public void initialize(AbstractData data) { data.setInt(this, defaultValue); } /** * Transfers this parameter from a database row to a data * object. * * @param row the database row * @param data the data object * * @throws DatabaseDataException if the database row * contained malformed data */ public void transfer(DatabaseResults.Row row, AbstractData data) throws DatabaseDataException { data.setInt(this, row.getInt(getColumn())); } } /** * A long data object parameter. A parameter corresponds to a column in * the database table. * * @author Per Cederberg, <per at percederberg dot net> * @version 1.0 */ protected static class LongParameter extends Parameter { /** * The default parameter value. */ private long defaultValue; /** * Creates a new long parameter. * * @param dataClass the data object class * @param column the column name * @param defaultValue the default value */ public LongParameter(Class dataClass, String column, long defaultValue) { super(dataClass, column); this.defaultValue = defaultValue; } /** * Initializes a data object with the default value for this * parameter. * * @param data the data object */ public void initialize(AbstractData data) { data.setLong(this, defaultValue); } /** * Transfers this parameter from a database row to a data * object. * * @param row the database row * @param data the data object * * @throws DatabaseDataException if the database row * contained malformed data */ public void transfer(DatabaseResults.Row row, AbstractData data) throws DatabaseDataException { data.setLong(this, row.getLong(getColumn())); } } /** * A string data object parameter. A parameter corresponds to a * column in the database table. * * @author Per Cederberg, <per at percederberg dot net> * @version 1.0 */ protected static class StringParameter extends Parameter { /** * The default parameter value. */ private String defaultValue; /** * Creates a new string parameter. * * @param dataClass the data object class * @param column the column name * @param defaultValue the default value */ public StringParameter(Class dataClass, String column, String defaultValue) { super(dataClass, column); this.defaultValue = defaultValue; } /** * Initializes a data object with the default value for this * parameter. * * @param data the data object */ public void initialize(AbstractData data) { data.setString(this, defaultValue); } /** * Transfers this parameter from a database row to a data * object. * * @param row the database row * @param data the data object * * @throws DatabaseDataException if the database row * contained malformed data */ public void transfer(DatabaseResults.Row row, AbstractData data) throws DatabaseDataException { data.setString(this, row.getString(getColumn())); } } }