001 package net.sf.tacos.form.translator;
002
003 import java.util.Locale;
004
005 import org.apache.tapestry.form.IFormComponent;
006 import org.apache.tapestry.form.ValidationMessages;
007 import org.apache.tapestry.form.AbstractFormComponentContributor;
008 import org.apache.tapestry.form.FormComponentContributorContext;
009 import org.apache.tapestry.form.translator.Translator;
010 import org.apache.tapestry.valid.ValidatorException;
011 import org.apache.tapestry.valid.ValidationConstants;
012 import org.apache.tapestry.IMarkupWriter;
013 import org.apache.tapestry.IRequestCycle;
014 import org.apache.tapestry.json.JSONObject;
015 import org.apache.hivemind.HiveMind;
016
017 /**
018 * The generics version of Tapestry's AbstractTranslator.
019 */
020 public abstract class AbstractTranslator<T> extends AbstractFormComponentContributor implements Translator
021 {
022 private boolean _trim;
023
024 private String _message;
025
026 public AbstractTranslator()
027 {
028 }
029
030 // Needed until HIVEMIND-134 fix is available
031 public AbstractTranslator(String initializer)
032 {
033 super(initializer);
034 }
035
036 /**
037 * @see org.apache.tapestry.form.translator.Translator#format(org.apache.tapestry.form.IFormComponent,
038 * Locale, java.lang.Object)
039 */
040 public String format(IFormComponent field, Locale locale, Object object)
041 {
042 if (object == null)
043 return "";
044
045 return formatObject(field, locale, (T) object);
046 }
047
048 /**
049 * @see org.apache.tapestry.form.translator.Translator#parse(org.apache.tapestry.form.IFormComponent,
050 * ValidationMessages, java.lang.String)
051 */
052 public Object parse(IFormComponent field, ValidationMessages messages, String text)
053 throws ValidatorException
054 {
055 String value = text == null ? null : (_trim ? text.trim() : text);
056
057 return HiveMind.isBlank(value) ? getValueForEmptyInput() : parseText(field, messages, value);
058 }
059
060 protected abstract String formatObject(IFormComponent field, Locale locale, T object);
061
062 protected abstract T parseText(IFormComponent field, ValidationMessages messages, String text)
063 throws ValidatorException;
064
065 /**
066 * The value to be used when the value supplied in the request is blank (null or empty). The
067 * default value is null, but some subclasses may override.
068 *
069 * @see #parse(IFormComponent, ValidationMessages, String)
070 * @return null, subclasses may override
071 */
072 protected Object getValueForEmptyInput()
073 {
074 return null;
075 }
076
077 protected String buildMessage(ValidationMessages messages, IFormComponent field, String key)
078 {
079 String label = field.getDisplayName();
080
081 Object[] parameters = getMessageParameters(messages.getLocale(), label);
082
083 return messages.formatValidationMessage(_message, key, parameters);
084 }
085
086 protected Object[] getMessageParameters(Locale locale, String label)
087 {
088 return new Object[] { label };
089 }
090
091 /**
092 * @see org.apache.tapestry.form.FormComponentContributor#renderContribution(org.apache.tapestry.IMarkupWriter , org.apache.tapestry.IRequestCycle , org.apache.tapestry.form.FormComponentContributorContext , IFormComponent)
093 */
094 public void renderContribution(IMarkupWriter writer, IRequestCycle cycle,
095 FormComponentContributorContext context, IFormComponent field)
096 {
097 super.renderContribution(writer, cycle, context, field);
098
099 if (_trim) {
100 JSONObject profile = context.getProfile();
101
102 accumulateProperty(profile, ValidationConstants.TRIM, field.getClientId());
103 }
104 }
105
106 public boolean isTrim()
107 {
108 return _trim;
109 }
110
111 public void setTrim(boolean trim)
112 {
113 _trim = trim;
114 }
115
116 public String getMessage()
117 {
118 return _message;
119 }
120
121 public void setMessage(String message)
122 {
123 _message = message;
124 }
125 }