001    /**
002     * Copyright 2005-2014 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.krad.datadictionary.validation;
017    
018    import org.kuali.rice.core.api.exception.RiceRuntimeException;
019    import org.kuali.rice.krad.datadictionary.exporter.ExportMap;
020    
021    import java.io.Serializable;
022    import java.util.regex.Matcher;
023    import java.util.regex.Pattern;
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    @Deprecated
091    abstract public class ValidationPattern implements Serializable {
092        // TODO: UNIT TEST: compile all patterns to test
093    
094        /**
095         * @return regular expression Pattern generated by the individual ValidationPattern subclass
096         */
097        abstract public Pattern getRegexPattern();
098    
099        /**
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         * Determines if an input string matches the pattern.
108         * 
109         * @param input input string
110         * @return true if the given String matches this pattern
111         */
112        public boolean matches(String input) {
113            Pattern p = getRegexPattern();
114    
115            Matcher m = p.matcher(input);
116    
117            return m.matches();
118        }
119    
120        /**
121         * Builds an export map describing the subclass instance. 
122         * @param exportKey
123         * 
124         * @return export map
125         */
126        abstract public ExportMap buildExportMap(String exportKey);
127    
128        abstract public String getValidationErrorMessageKey();
129    
130        public String[] getValidationErrorMessageParameters(String attributeLabel) {
131            return new String[]{attributeLabel};
132        }
133    
134        /**
135         * This method throws an exception if it is not configured properly
136         * @throws ValidationPatternException 
137         */
138        public void completeValidation() throws ValidationPatternException {
139        }
140    
141        /**
142         * exception thrown when a ValidationPattern is in an incorrect state.
143         */
144        public static class ValidationPatternException extends RiceRuntimeException {
145    
146            private static final long serialVersionUID = 2012770642382150523L;
147    
148            public ValidationPatternException(String message) {
149                super(message);
150            }
151    
152            public ValidationPatternException() {
153                super();
154            }
155    
156            public ValidationPatternException(String message, Throwable cause) {
157                super(message, cause);
158            }
159    
160            public ValidationPatternException(Throwable cause) {
161                super(cause);
162            }
163        }
164    }