001 /*
002 * Copyright 2005-2008 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.kns.datadictionary.validation;
017
018 import java.io.Serializable;
019 import java.util.regex.Matcher;
020 import java.util.regex.Pattern;
021
022 import org.kuali.rice.core.exception.RiceRuntimeException;
023 import org.kuali.rice.kns.datadictionary.exporter.ExportMap;
024
025 /**
026 * Abstraction of the regular expressions used to validate attribute values.
027 *
028 The validationPattern element defines the allowable character-level
029 or field-level values for an attribute.
030
031 JSTL: validationPattern is a Map which is accessed using a key
032 of "validationPattern". Each entry may contain some of the keys
033 listed below. The keys that may be present for a given attribute
034 are dependent upon the type of validationPattern.
035
036 * maxLength (String)
037 * exactLength
038 * type
039 * allowWhitespace
040 * allowUnderscore
041 * allowPeriod
042 * validChars
043 * precision
044 * scale
045 * allowNegative
046
047 The allowable keys (in addition to type) for each type are:
048 ****Type**** ***Keys***
049 alphanumeric exactLength
050 maxLength
051 allowWhitespace
052 allowUnderscore
053 allowPeriod
054
055 alpha exactLength
056 maxLength
057 allowWhitespace
058
059 anyCharacter exactLength
060 maxLength
061 allowWhitespace
062
063 charset validChars
064
065 numeric exactLength
066 maxLength
067
068 fixedPoint allowNegative
069 precision
070 scale
071
072 floatingPoint allowNegative
073
074 date n/a
075 emailAddress n/a
076 javaClass n/a
077 month n/a
078 phoneNumber n/a
079 timestamp n/a
080 year n/a
081 zipcode n/a
082
083 Note: maxLength and exactLength are mutually exclusive.
084 If one is entered, the other may not be entered.
085
086 Note: See ApplicationResources.properties for
087 exact regex patterns.
088 e.g. validationPatternRegex.date for regex used in date validation.
089 */
090 abstract public class ValidationPattern implements Serializable {
091 // TODO: UNIT TEST: compile all patterns to test
092
093 /**
094 * @return regular expression Pattern generated by the individual ValidationPattern subclass
095 */
096 abstract public Pattern getRegexPattern();
097
098 /**
099 * @return String version of regular expression base, suitable for modification with length-specifiers and used internally by
100 * getRegexPattern
101 */
102 abstract protected String getRegexString();
103
104
105 /**
106 * @return true if the given String matches this pattern
107 */
108 public boolean matches(String input) {
109 Pattern p = getRegexPattern();
110
111 Matcher m = p.matcher(input);
112
113 return m.matches();
114 }
115
116 /**
117 * @return ExportMap describing the subclass instance
118 */
119 abstract public ExportMap buildExportMap(String exportKey);
120
121 abstract public String getValidationErrorMessageKey();
122
123 public String[] getValidationErrorMessageParameters(String attributeLabel) {
124 return new String[] {attributeLabel};
125 }
126
127 /**
128 * This method throws an exception if it is not configured properly
129 *
130 */
131 public void completeValidation() throws ValidationPatternException {
132 }
133
134 /** exception thrown when a ValidationPattern is in an incorrect state. */
135 public static class ValidationPatternException extends RiceRuntimeException {
136
137 private static final long serialVersionUID = 2012770642382150523L;
138
139 public ValidationPatternException(String message) {
140 super(message);
141 }
142
143 public ValidationPatternException() {
144 super();
145 }
146
147 public ValidationPatternException(String message, Throwable cause) {
148 super(message, cause);
149 }
150
151 public ValidationPatternException(Throwable cause) {
152 super(cause);
153 }
154 }
155 }