001    /**
002     * Copyright 2005-2013 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.charlevel;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.rice.krad.datadictionary.exporter.ExportMap;
020    import org.kuali.rice.krad.datadictionary.validation.CharacterLevelValidationPattern;
021    
022    import java.util.regex.Pattern;
023    
024    /**
025     * Pattern for matching any character in the given list (String)
026     * 
027     * 
028     */
029    public class CharsetValidationPattern extends CharacterLevelValidationPattern {
030        protected String validChars;
031    
032        /**
033         * @return String containing all valid chars for this charset
034         */
035        public String getValidChars() {
036            return validChars;
037        }
038    
039        /**
040         * @param validChars for this charset
041         */
042        public void setValidChars(String validChars) {
043            if (StringUtils.isEmpty(validChars)) {
044                throw new IllegalArgumentException("invalid (empty) validChars");
045            }
046    
047            this.validChars = validChars;
048        }
049    
050    
051        /**
052         * Escapes every special character I could think of, to limit potential misuse of this pattern.
053         * 
054         * @see org.kuali.rice.krad.datadictionary.validation.ValidationPattern#getRegexString()
055         */
056        protected String getRegexString() {
057            if (StringUtils.isEmpty(validChars)) {
058                throw new IllegalStateException("validChars is empty");
059            }
060    
061            // filter out and escape chars which would confuse the pattern-matcher
062            Pattern filteringChars = Pattern.compile("([\\-\\[\\]\\{\\}\\$\\.\\^\\(\\)\\*\\&\\|])");
063            String filteredChars = filteringChars.matcher(validChars).replaceAll("\\\\$1");
064    
065            StringBuffer regexString = new StringBuffer("[");
066            regexString.append(filteredChars);
067            if (filteredChars.endsWith("\\")) {
068                regexString.append("\\");
069            }
070            regexString.append("]");
071    
072            return regexString.toString();
073        }
074    
075    
076        /**
077         * @see org.kuali.rice.krad.datadictionary.validation.CharacterLevelValidationPattern#extendExportMap(org.kuali.bo.datadictionary.exporter.ExportMap)
078         */
079        public void extendExportMap(ExportMap exportMap) {
080            exportMap.set("type", "charset");
081    
082            exportMap.set("validChars", getValidChars());
083        }
084    
085            /**
086             * This overridden method ...
087             * 
088             * @see org.kuali.rice.krad.datadictionary.validation.CharacterLevelValidationPattern#getValidationErrorMessageParameters(java.lang.String, java.lang.String)
089             */
090            @Override
091            public String[] getValidationErrorMessageParameters(String attributeLabel) {
092                    // build character list
093                    StringBuilder buf = new StringBuilder();
094                    for (int i = 0; i < validChars.length(); i++) {
095                            buf.append(validChars.charAt(i));
096                            if (i != validChars.length() - 1) {
097                                    buf.append(", ");
098                            }
099                    }
100                    String characterList = buf.toString();
101                    
102                    if (getMaxLength() != -1) {
103                            return new String[] {attributeLabel, String.valueOf(getMaxLength()), characterList};
104                    }
105                    if (getExactLength() != -1) {
106                            return new String[] {attributeLabel, String.valueOf(getExactLength()), characterList};
107                    }
108                    return new String[] {attributeLabel, "0", characterList};
109            }
110    }