/*
- * Copyright (C) 2001, 2002 The Mir-coders group
+ * Copyright (C) 2005 The Mir-coders group
*
* This file is part of Mir.
*
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, The Mir-coders gives permission to link
- * the code of this program with the com.oreilly.servlet library, any library
- * licensed under the Apache Software License, The Sun (tm) Java Advanced
- * Imaging library (JAI), The Sun JIMI library (or with modified versions of
- * the above that use the same license as the above), and distribute linked
- * combinations including the two. You must obey the GNU General Public
- * License in all respects for all of the code used other than the above
- * mentioned libraries. If you modify this file, you may extend this exception
- * to your version of the file, but you are not obligated to do so. If you do
- * not wish to do so, delete this exception statement from your version.
+ * the code of this program with any library licensed under the Apache Software License.
+ * You must obey the GNU General Public License in all respects for all of the code used
+ * other than the above mentioned libraries. If you modify this file, you may extend this
+ * exception to your version of the file, but you are not obligated to do so.
+ * If you do not wish to do so, delete this exception statement from your version.
*/
-
package mir.entity.adapter;
-import java.util.*;
-import mir.entity.*;
-import mir.storage.*;
-import mir.util.*;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TimeZone;
+
+import mir.entity.Entity;
+import mir.misc.StringUtil;
+import mir.util.GeneratorFormatAdapters;
+/**
+ * <code>EntityAdapterDefinition</code> defines the fields for an entity adapter of
+ * a particular "type". Custom calculated fields can be defined.
+ *
+ */
public class EntityAdapterDefinition {
- Map calculatedFields;
+ private Map calculatedFields;
public EntityAdapterDefinition() {
calculatedFields = new HashMap();
}
+ /**
+ *
+ *
+ * @param anEntity the entity that will be wrapped by the entity adapter
+ * @param aModel the base model
+ * @return the resulting entity adapter
+ */
public EntityAdapter makeEntityAdapter(Entity anEntity, EntityAdapterModel aModel) {
return new EntityAdapter(anEntity, this, aModel);
}
+ /**
+ *
+ * @param aFieldName
+ * @return the <code>CalculatedField</code> if it exists. <code>null</code> otherwise
+ */
public CalculatedField getCalculatedField(String aFieldName) {
return (CalculatedField) calculatedFields.get(aFieldName);
}
+ /**
+ *
+ * @param aFieldName
+ * @return boolean true if aFieldName is a calculated Field
+ */
public boolean hasCalculatedField(String aFieldName) {
return calculatedFields.containsKey(aFieldName);
}
+ /**
+ *
+ * @param aFieldName
+ * @param aField
+ */
public void addCalculatedField(String aFieldName, CalculatedField aField) {
calculatedFields.put(aFieldName, aField);
}
- public void addMirDateField(String aDestinationFieldName, String aSourceFieldName) {
- addCalculatedField(aDestinationFieldName, new MirDateField(aSourceFieldName));
+ /**
+ * To add a calculated field based on a "mir" date field: a string field of the form yyyyMMdd[hhmm]
+ *
+ * @param aDestinationFieldName
+ * @param aSourceFieldName
+ * @param aDefaultTimezone
+ */
+ public void addMirDateField(String aDestinationFieldName, String aSourceFieldName, String aDefaultTimezone) {
+ addCalculatedField(aDestinationFieldName, new MirDateField(aSourceFieldName, aDefaultTimezone));
}
- public void addDBDateField(String aDestinationFieldName, String aSourceFieldName) {
- addCalculatedField(aDestinationFieldName, new DBDateField(aSourceFieldName));
+ /**
+ * Adds a calculated field based on a db date field
+ *
+ * @param aDestinationFieldName the field name of the calculated field
+ * @param aSourceFieldName the field name of the entity (must be a date field)
+ * @param aDefaultTimezone the default timezone to use
+ */
+ public void addDBDateField(String aDestinationFieldName, String aSourceFieldName, String aDefaultTimezone) {
+ addCalculatedField(aDestinationFieldName, new DBDateField(aSourceFieldName, aDefaultTimezone));
}
+ /**
+ * a calculated field: field gets its value from other fields.
+ */
public interface CalculatedField {
+ /**
+ * Method to retrieve the calculated value of the field.
+ *
+ * @param anEntityAdapter the entity
+ * @return the value of the field.
+ */
public Object getValue(EntityAdapter anEntityAdapter);
}
private class MirDateField implements CalculatedField {
private String fieldName;
+ private String defaultTimezone;
- public MirDateField(String aFieldName) {
+ public MirDateField(String aFieldName, String aDefaultTimezone) {
fieldName = aFieldName;
+ defaultTimezone = aDefaultTimezone;
}
public Object getValue(EntityAdapter anEntityAdapter) {
-
- Map result = new HashMap();
- String textValue = anEntityAdapter.getEntity().getValue(fieldName);
- Calendar calendar = GregorianCalendar.getInstance();
- int year;
- int month;
- int day;
- Date date;
-
- if (textValue!=null) {
- try {
- year = Integer.parseInt(textValue.substring(0,4));
- month = Integer.parseInt(textValue.substring(4,6));
- day = Integer.parseInt(textValue.substring(6,8));
-
- calendar.set(year, month-1, day);
- date = calendar.getTime();
- ;
-
- result.put("date", date);
- result.put("formatted", new DateToMapAdapter(date));
-
- }
- catch (Throwable t) {
- result=null;
- }
- }
- return result;
- }
+ Object result = null;
+ String textValue = anEntityAdapter.getEntity().getFieldValue(fieldName);
+ Calendar calendar = GregorianCalendar.getInstance();
+ int year;
+ int month;
+ int day;
+ Date date;
+
+ if (textValue!=null) {
+ try {
+ year = Integer.parseInt(textValue.substring(0,4));
+ month = Integer.parseInt(textValue.substring(4,6));
+ day = Integer.parseInt(textValue.substring(6,8));
+
+ calendar.setTimeZone(TimeZone.getTimeZone(defaultTimezone));
+ calendar.set(year, month-1, day);
+
+ date = calendar.getTime();
+
+ result = new GeneratorFormatAdapters.DateFormatAdapter(date, defaultTimezone);
+ }
+ catch (Throwable t) {
+ result=null;
+ }
+ }
+ return result;
+ }
}
private class DBDateField implements CalculatedField {
private String fieldName;
+ private String defaultTimezone;
- public DBDateField(String aFieldName) {
+ public DBDateField(String aFieldName, String aDefaultTimezone) {
fieldName = aFieldName;
+ defaultTimezone = aDefaultTimezone;
}
public Object getValue(EntityAdapter anEntityAdapter) {
+ Object result = null;
+ String text = anEntityAdapter.getEntity().getFieldValue(fieldName);
- Map result = new HashMap();
- String textValue = anEntityAdapter.getEntity().getValue(fieldName);
- Calendar calendar = GregorianCalendar.getInstance();
- int year;
- int month;
- int day;
- int hours;
- int minutes;
-
- Date date;
-
- if (textValue!=null) {
+ if (text!=null) {
try {
- year = Integer.parseInt(textValue.substring(0,4));
- month = Integer.parseInt(textValue.substring(5,7));
- day = Integer.parseInt(textValue.substring(8,10));
- hours = Integer.parseInt(textValue.substring(11,13));
- minutes = Integer.parseInt(textValue.substring(14,16));
-
- calendar.set(year, month-1, day, hours, minutes);
- date = calendar.getTime();
-
- result.put("date", date);
- result.put("formatted", new DateToMapAdapter(date));
- result.put("raw", textValue);
+ result = new GeneratorFormatAdapters.DateFormatAdapter(StringUtil.convertMirInternalDateToDate(text), defaultTimezone);
}
catch (Throwable t) {
- result=null;
}
}