001 // Copyright 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.form.translator; 016 017 import org.apache.hivemind.HiveMind; 018 import org.apache.tapestry.IMarkupWriter; 019 import org.apache.tapestry.IRequestCycle; 020 import org.apache.tapestry.form.AbstractFormComponentContributor; 021 import org.apache.tapestry.form.FormComponentContributorContext; 022 import org.apache.tapestry.form.IFormComponent; 023 import org.apache.tapestry.form.ValidationMessages; 024 import org.apache.tapestry.json.JSONObject; 025 import org.apache.tapestry.valid.ValidationConstants; 026 import org.apache.tapestry.valid.ValidatorException; 027 028 import java.util.Locale; 029 030 /** 031 * Abstract {@link Translator} implementation that provides default behavior for trimming, null 032 * object, and empty text handling. 033 * 034 * @author Paul Ferraro 035 * @since 4.0 036 */ 037 public abstract class AbstractTranslator extends AbstractFormComponentContributor implements 038 Translator 039 { 040 private boolean _trim; 041 042 private String _message; 043 044 public AbstractTranslator() 045 { 046 } 047 048 // Needed until HIVEMIND-134 fix is available 049 public AbstractTranslator(String initializer) 050 { 051 super(initializer); 052 } 053 054 /** 055 * @see org.apache.tapestry.form.translator.Translator#format(org.apache.tapestry.form.IFormComponent, 056 * Locale, java.lang.Object) 057 */ 058 public String format(IFormComponent field, Locale locale, Object object) 059 { 060 if (object == null) 061 return ""; 062 063 return formatObject(field, locale, object); 064 } 065 066 /** 067 * @see org.apache.tapestry.form.translator.Translator#parse(org.apache.tapestry.form.IFormComponent, 068 * ValidationMessages, java.lang.String) 069 */ 070 public Object parse(IFormComponent field, ValidationMessages messages, String text) 071 throws ValidatorException 072 { 073 String value = text == null ? null : (_trim ? text.trim() : text); 074 075 return HiveMind.isBlank(value) ? getValueForEmptyInput() : parseText(field, messages, value); 076 } 077 078 protected abstract String formatObject(IFormComponent field, Locale locale, Object object); 079 080 protected abstract Object parseText(IFormComponent field, ValidationMessages messages, String text) 081 throws ValidatorException; 082 083 /** 084 * The value to be used when the value supplied in the request is blank (null or empty). The 085 * default value is null, but some subclasses may override. 086 * 087 * @see #parse(IFormComponent, ValidationMessages, String) 088 * @return null, subclasses may override 089 */ 090 protected Object getValueForEmptyInput() 091 { 092 return null; 093 } 094 095 protected String buildMessage(ValidationMessages messages, IFormComponent field, String key) 096 { 097 String label = field.getDisplayName(); 098 099 Object[] parameters = getMessageParameters(messages.getLocale(), label); 100 101 return messages.formatValidationMessage(_message, key, parameters); 102 } 103 104 protected Object[] getMessageParameters(Locale locale, String label) 105 { 106 return new Object[] { label }; 107 } 108 109 /** 110 * @see org.apache.tapestry.form.FormComponentContributor#renderContribution(IMarkupWriter, IRequestCycle, FormComponentContributorContext, IFormComponent) 111 */ 112 public void renderContribution(IMarkupWriter writer, IRequestCycle cycle, 113 FormComponentContributorContext context, IFormComponent field) 114 { 115 super.renderContribution(writer, cycle, context, field); 116 117 if (_trim) { 118 JSONObject profile = context.getProfile(); 119 120 accumulateProperty(profile, ValidationConstants.TRIM, field.getClientId()); 121 } 122 } 123 124 public boolean isTrim() 125 126 { 127 return _trim; 128 } 129 130 public void setTrim(boolean trim) 131 { 132 _trim = trim; 133 } 134 135 public String getMessage() 136 { 137 return _message; 138 } 139 140 public void setMessage(String message) 141 { 142 _message = message; 143 } 144 }