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.validator; 016 017 import org.apache.hivemind.util.PropertyUtils; 018 import org.apache.tapestry.IMarkupWriter; 019 import org.apache.tapestry.IRequestCycle; 020 import org.apache.tapestry.form.FormComponentContributorContext; 021 import org.apache.tapestry.form.IFormComponent; 022 import org.apache.tapestry.form.TranslatedField; 023 import org.apache.tapestry.form.translator.Translator; 024 import org.apache.tapestry.json.JSONObject; 025 026 /** 027 * Abstract implementation of {@link org.apache.tapestry.form.validator.Validator}. 028 * 029 * @author Howard Lewis Ship 030 * @since 4.0 031 */ 032 033 public abstract class BaseValidator implements Validator 034 { 035 private String _message; 036 037 public BaseValidator() 038 { 039 } 040 041 public BaseValidator(String initializer) 042 { 043 PropertyUtils.configureProperties(this, initializer); 044 } 045 046 public String getMessage() 047 { 048 return _message; 049 } 050 051 public void setMessage(String message) 052 { 053 _message = message; 054 } 055 056 /** 057 * Returns false. 058 */ 059 060 public boolean getAcceptsNull() 061 { 062 return false; 063 } 064 065 /** 066 * Does nothing. 067 */ 068 069 public void renderContribution(IMarkupWriter writer, IRequestCycle cycle, 070 FormComponentContributorContext context, IFormComponent field) 071 { 072 } 073 074 /** 075 * Returns false. Subclasses may override. 076 */ 077 078 public boolean isRequired() 079 { 080 return false; 081 } 082 083 /** 084 * Utility method to store a field specific profile property which can later 085 * be used by client side validation. 086 * 087 * @param field 088 * The field to store the property for, will key off of {@link IFormComponent#getClientId()}. 089 * @param profile 090 * The profile for the form. 091 * @param key 092 * The property key to store. 093 * @param property 094 * The property to store. 095 */ 096 public void accumulateProfileProperty(IFormComponent field, JSONObject profile, 097 String key, Object property) 098 { 099 if (!profile.has(field.getClientId())) 100 profile.put(field.getClientId(), new JSONObject()); 101 102 JSONObject fieldProps = profile.getJSONObject(field.getClientId()); 103 104 accumulateProperty(fieldProps, key, property); 105 } 106 107 /** 108 * Utility used to append onto an existing property represented as an 109 * object array. 110 * @param profile 111 * @param key 112 * @param value 113 */ 114 public void accumulateProperty(JSONObject profile, String key, Object value) 115 { 116 profile.accumulate(key, value); 117 } 118 119 /** 120 * Used to grab the corresponding {@link Translator} for 121 * the field, if one exists. 122 * @param field 123 * @return The translator, or null if the required translator type 124 * doesn't exist. 125 */ 126 public Translator getFieldTranslator(IFormComponent field, Class clazz) 127 { 128 if (TranslatedField.class.isAssignableFrom(field.getClass())) { 129 Translator trans = ((TranslatedField)field).getTranslator(); 130 if (clazz.isInstance(trans)) { 131 return trans; 132 } 133 } 134 135 return null; 136 } 137 }