1 /**
2 * Copyright 2005-2013 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.rice.krad.datadictionary.validation;
17
18 import org.kuali.rice.core.api.exception.RiceRuntimeException;
19 import org.kuali.rice.krad.datadictionary.exporter.ExportMap;
20
21 import java.io.Serializable;
22 import java.util.regex.Matcher;
23 import java.util.regex.Pattern;
24
25 /**
26 * Abstraction of the regular expressions used to validate attribute values.
27 *
28 * The validationPattern element defines the allowable character-level
29 * or field-level values for an attribute.
30 *
31 * JSTL: validationPattern is a Map which is accessed using a key
32 * of "validationPattern". Each entry may contain some of the keys
33 * listed below. The keys that may be present for a given attribute
34 * are dependent upon the type of validationPattern.
35 *
36 * maxLength (String)
37 * exactLength
38 * type
39 * allowWhitespace
40 * allowUnderscore
41 * allowPeriod
42 * validChars
43 * precision
44 * scale
45 * allowNegative
46 *
47 * The allowable keys (in addition to type) for each type are:
48 * ***Type**** ***Keys***
49 * alphanumeric exactLength
50 * maxLength
51 * allowWhitespace
52 * allowUnderscore
53 * allowPeriod
54 *
55 * alpha exactLength
56 * maxLength
57 * allowWhitespace
58 *
59 * anyCharacter exactLength
60 * maxLength
61 * allowWhitespace
62 *
63 * charset validChars
64 *
65 * numeric exactLength
66 * maxLength
67 *
68 * fixedPoint allowNegative
69 * precision
70 * scale
71 *
72 * floatingPoint allowNegative
73 *
74 * date n/a
75 * emailAddress n/a
76 * javaClass n/a
77 * month n/a
78 * phoneNumber n/a
79 * timestamp n/a
80 * year n/a
81 * zipcode n/a
82 *
83 * Note: maxLength and exactLength are mutually exclusive.
84 * If one is entered, the other may not be entered.
85 *
86 * Note: See ApplicationResources.properties for
87 * exact regex patterns.
88 * e.g. validationPatternRegex.date for regex used in date validation.
89 */
90 @Deprecated
91 abstract public class ValidationPattern implements Serializable {
92 // TODO: UNIT TEST: compile all patterns to test
93
94 /**
95 * @return regular expression Pattern generated by the individual ValidationPattern subclass
96 */
97 abstract public Pattern getRegexPattern();
98
99 /**
100 * @return String version of regular expression base, suitable for modification with length-specifiers and used
101 * internally by
102 * getRegexPattern
103 */
104 abstract protected String getRegexString();
105
106 /**
107 * @return true if the given String matches this pattern
108 */
109 public boolean matches(String input) {
110 Pattern p = getRegexPattern();
111
112 Matcher m = p.matcher(input);
113
114 return m.matches();
115 }
116
117 /**
118 * @return ExportMap describing the subclass instance
119 */
120 abstract public ExportMap buildExportMap(String exportKey);
121
122 abstract public String getValidationErrorMessageKey();
123
124 public String[] getValidationErrorMessageParameters(String attributeLabel) {
125 return new String[]{attributeLabel};
126 }
127
128 /**
129 * This method throws an exception if it is not configured properly
130 */
131 public void completeValidation() throws ValidationPatternException {
132 }
133
134 /**
135 * exception thrown when a ValidationPattern is in an incorrect state.
136 */
137 public static class ValidationPatternException extends RiceRuntimeException {
138
139 private static final long serialVersionUID = 2012770642382150523L;
140
141 public ValidationPatternException(String message) {
142 super(message);
143 }
144
145 public ValidationPatternException() {
146 super();
147 }
148
149 public ValidationPatternException(String message, Throwable cause) {
150 super(message, cause);
151 }
152
153 public ValidationPatternException(Throwable cause) {
154 super(cause);
155 }
156 }
157 }