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 }