001/**
002 * Copyright 2005-2018 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 */
016package org.kuali.rice.krad.datadictionary.validation;
017
018import org.kuali.rice.krad.datadictionary.exporter.ExportMap;
019import org.kuali.rice.krad.util.KRADConstants;
020
021import java.util.regex.Pattern;
022
023/**
024 * Abstraction of the regular expressions used to validate attribute values.
025 */
026@Deprecated
027abstract public class CharacterLevelValidationPattern extends ValidationPattern {
028    protected Pattern regexPattern;
029
030    protected int maxLength = -1;
031    protected int exactLength = -1;
032
033    /**
034     * Sets maxLength parameter for the associated regex.
035     *
036     * @param maxLength
037     */
038    public void setMaxLength(int maxLength) {
039        if (this.exactLength != -1) {
040            throw new IllegalStateException(
041                    "illegal attempt to set maxLength after mutually-exclusive exactLength has been set");
042        }
043
044        this.maxLength = maxLength;
045    }
046
047    /**
048     * @return current maxLength, or -1 if none has been set
049     */
050    public int getMaxLength() {
051        return maxLength;
052    }
053
054    /**
055     * Sets exactLength parameter for the associated regex.
056     *
057     * @param exactLength
058     */
059    public void setExactLength(int exactLength) {
060        if (this.maxLength != -1) {
061            throw new IllegalStateException(
062                    "illegal attempt to set exactLength after mutually-exclusive maxLength has been set");
063        }
064
065        this.exactLength = exactLength;
066    }
067
068    /**
069     * @return current exactLength, or -1 if none has been set
070     */
071    public int getExactLength() {
072        return exactLength;
073    }
074
075    /**
076     * @return regular expression Pattern generated using the individual ValidationPattern subclass
077     */
078    final public Pattern getRegexPattern() {
079        if (regexPattern == null) {
080            String regexString = getRegexString();
081
082            StringBuffer completeRegex = new StringBuffer("^");
083            completeRegex.append(getRegexString());
084
085            if (maxLength != -1) {
086                completeRegex.append("{0," + maxLength + "}");
087            } else if (exactLength != -1) {
088                completeRegex.append("{" + exactLength + "}");
089            } else {
090                completeRegex.append("*");
091            }
092
093            completeRegex.append("$");
094
095            regexPattern = Pattern.compile(completeRegex.toString());
096        }
097        return regexPattern;
098    }
099
100    /**
101     * @see org.kuali.rice.krad.datadictionary.validation.ValidationPattern#buildExportMap(java.lang.String)
102     */
103    final public ExportMap buildExportMap(String exportKey) {
104        ExportMap exportMap = new ExportMap(exportKey);
105
106        if (getMaxLength() != -1) {
107            exportMap.set("maxLength", Integer.toString(getMaxLength()));
108        } else if (getExactLength() != -1) {
109            exportMap.set("exactLength", Integer.toString(getExactLength()));
110        }
111
112        extendExportMap(exportMap);
113
114        return exportMap;
115    }
116
117    /**
118     * Extends the given (parent class) exportMap as needed to represent subclass instances
119     *
120     * @param exportMap
121     */
122    abstract public void extendExportMap(ExportMap exportMap);
123
124    @Override
125    public String[] getValidationErrorMessageParameters(String attributeLabel) {
126        if (getMaxLength() != -1) {
127            return new String[]{attributeLabel, String.valueOf(getMaxLength())};
128        }
129        if (getExactLength() != -1) {
130            return new String[]{attributeLabel, String.valueOf(getExactLength())};
131        }
132        return new String[]{attributeLabel};
133    }
134
135    /**
136     * This overridden method ...
137     *
138     * @see org.kuali.rice.krad.datadictionary.validation.ValidationPattern#getValidationErrorMessageKey()
139     */
140    @Override
141    public String getValidationErrorMessageKey() {
142        StringBuilder buf = new StringBuilder();
143        buf.append("error.format.").append(getClass().getName()).append(getValidationErrorMessageKeyOptions());
144        if (getMaxLength() != -1) {
145            buf.append(".maxLength");
146        }
147        if (getExactLength() != -1) {
148            buf.append(".exactLength");
149        }
150        return buf.toString();
151    }
152
153    protected String getValidationErrorMessageKeyOptions() {
154        return KRADConstants.EMPTY_STRING;
155    }
156}