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.constraint;
017    
018    import org.kuali.rice.core.api.config.property.ConfigurationService;
019    import org.kuali.rice.krad.service.KRADServiceLocator;
020    import org.kuali.rice.krad.uif.UifConstants;
021    
022    import java.util.ArrayList;
023    import java.util.List;
024    
025    /**
026     * Parent abstract class that allows additional characters to be allowed in child constraint
027     * character sets, see AlphaNumericPatternConstraint, among others for example.
028     *
029     * By setting an allow flag to true you are allowing that character as a valid character in the set.
030     * AllowAll set to true will allow all characters which have a flag to be allowed in the set.
031     *
032     * @author Kuali Rice Team (rice.collab@kuali.org)
033     */
034    public abstract class AllowCharacterConstraint extends ValidCharactersPatternConstraint {
035        protected boolean allowWhitespace = false;
036        protected boolean omitNewline = false;
037        protected boolean allowUnderscore = false;
038        protected boolean allowPeriod = false;
039        protected boolean allowParenthesis = false;
040        protected boolean allowDollar = false;
041        protected boolean allowForwardSlash = false;
042        protected boolean allowDoubleQuote = false;
043        protected boolean allowApostrophe = false;
044        protected boolean allowComma = false;
045        protected boolean allowColon = false;
046        protected boolean allowSemiColon = false;
047        protected boolean allowQuestionMark = false;
048        protected boolean allowExclaimation = false;
049        protected boolean allowDash = false;
050        protected boolean allowPlus = false;
051        protected boolean allowEquals = false;
052        protected boolean allowAsterisk = false;
053        protected boolean allowAtSign = false;
054        protected boolean allowPercent = false;
055        protected boolean allowPound = false;
056        protected boolean allowGreaterThan = false;
057        protected boolean allowLessThan = false;
058        protected boolean allowBrackets = false;
059        protected boolean allowAmpersand = false;
060        protected boolean allowCurlyBraces = false;
061        protected boolean allowBackslash = false;
062        protected boolean allowAll = false;
063    
064        /**
065         * @return the allowWhitespace
066         */
067        public boolean isAllowWhitespace() {
068            return this.allowWhitespace;
069        }
070    
071        /**
072         * @param allowWhitespace the allowWhitespace to set
073         */
074        public void setAllowWhitespace(boolean allowWhitespace) {
075            this.allowWhitespace = allowWhitespace;
076        }
077    
078        /**
079         * @return the allowUnderscore
080         */
081        public boolean isAllowUnderscore() {
082            return this.allowUnderscore;
083        }
084    
085        /**
086         * @param allowUnderscore the allowUnderscore to set
087         */
088        public void setAllowUnderscore(boolean allowUnderscore) {
089            this.allowUnderscore = allowUnderscore;
090        }
091    
092        /**
093         * @return the allowPeriod
094         */
095        public boolean isAllowPeriod() {
096            return this.allowPeriod;
097        }
098    
099        /**
100         * @param allowPeriod the allowPeriod to set
101         */
102        public void setAllowPeriod(boolean allowPeriod) {
103            this.allowPeriod = allowPeriod;
104        }
105    
106        /**
107         * @return the allowParenthesis
108         */
109        public boolean isAllowParenthesis() {
110            return this.allowParenthesis;
111        }
112    
113        /**
114         * @param allowParenthesis the allowParenthesis to set
115         */
116        public void setAllowParenthesis(boolean allowParenthesis) {
117            this.allowParenthesis = allowParenthesis;
118        }
119    
120        /**
121         * @return the allowDollar
122         */
123        public boolean isAllowDollar() {
124            return this.allowDollar;
125        }
126    
127        /**
128         * @param allowDollar the allowDollar to set
129         */
130        public void setAllowDollar(boolean allowDollar) {
131            this.allowDollar = allowDollar;
132        }
133    
134        /**
135         * @return the allowForwardSlash
136         */
137        public boolean isAllowForwardSlash() {
138            return this.allowForwardSlash;
139        }
140    
141        /**
142         * @param allowForwardSlash the allowForwardSlash to set
143         */
144        public void setAllowForwardSlash(boolean allowForwardSlash) {
145            this.allowForwardSlash = allowForwardSlash;
146        }
147    
148        /**
149         * @return the allowDoubleQuote
150         */
151        public boolean isAllowDoubleQuote() {
152            return this.allowDoubleQuote;
153        }
154    
155        /**
156         * @param allowDoubleQuote the allowDoubleQuote to set
157         */
158        public void setAllowDoubleQuote(boolean allowDoubleQuote) {
159            this.allowDoubleQuote = allowDoubleQuote;
160        }
161    
162        /**
163         * @return the allowApostrophe
164         */
165        public boolean isAllowApostrophe() {
166            return this.allowApostrophe;
167        }
168    
169        /**
170         * @param allowApostrophe the allowApostrophe to set
171         */
172        public void setAllowApostrophe(boolean allowApostrophe) {
173            this.allowApostrophe = allowApostrophe;
174        }
175    
176        /**
177         * @return the allowComma
178         */
179        public boolean isAllowComma() {
180            return this.allowComma;
181        }
182    
183        /**
184         * @param allowComma the allowComma to set
185         */
186        public void setAllowComma(boolean allowComma) {
187            this.allowComma = allowComma;
188        }
189    
190        /**
191         * @return the allowColon
192         */
193        public boolean isAllowColon() {
194            return this.allowColon;
195        }
196    
197        /**
198         * @param allowColon the allowColon to set
199         */
200        public void setAllowColon(boolean allowColon) {
201            this.allowColon = allowColon;
202        }
203    
204        /**
205         * @return the allowSemiColon
206         */
207        public boolean isAllowSemiColon() {
208            return this.allowSemiColon;
209        }
210    
211        /**
212         * @param allowSemiColon the allowSemiColon to set
213         */
214        public void setAllowSemiColon(boolean allowSemiColon) {
215            this.allowSemiColon = allowSemiColon;
216        }
217    
218        /**
219         * @return the allowQuestionMark
220         */
221        public boolean isAllowQuestionMark() {
222            return this.allowQuestionMark;
223        }
224    
225        /**
226         * @param allowQuestionMark the allowQuestionMark to set
227         */
228        public void setAllowQuestionMark(boolean allowQuestionMark) {
229            this.allowQuestionMark = allowQuestionMark;
230        }
231    
232        /**
233         * @return the allowExclaimation
234         */
235        public boolean isAllowExclaimation() {
236            return this.allowExclaimation;
237        }
238    
239        /**
240         * @param allowExclaimation the allowExclaimation to set
241         */
242        public void setAllowExclaimation(boolean allowExclaimation) {
243            this.allowExclaimation = allowExclaimation;
244        }
245    
246        /**
247         * @return the allowDash
248         */
249        public boolean isAllowDash() {
250            return this.allowDash;
251        }
252    
253        /**
254         * @param allowDash the allowDash to set
255         */
256        public void setAllowDash(boolean allowDash) {
257            this.allowDash = allowDash;
258        }
259    
260        /**
261         * @return the allowPlus
262         */
263        public boolean isAllowPlus() {
264            return this.allowPlus;
265        }
266    
267        /**
268         * @param allowPlus the allowPlus to set
269         */
270        public void setAllowPlus(boolean allowPlus) {
271            this.allowPlus = allowPlus;
272        }
273    
274        /**
275         * @return the allowEquals
276         */
277        public boolean isAllowEquals() {
278            return this.allowEquals;
279        }
280    
281        /**
282         * @param allowEquals the allowEquals to set
283         */
284        public void setAllowEquals(boolean allowEquals) {
285            this.allowEquals = allowEquals;
286        }
287    
288        /**
289         * @return the allowAsterisk
290         */
291        public boolean isAllowAsterisk() {
292            return this.allowAsterisk;
293        }
294    
295        /**
296         * @param allowAsterisk the allowAsterisk to set
297         */
298        public void setAllowAsterisk(boolean allowAsterisk) {
299            this.allowAsterisk = allowAsterisk;
300        }
301    
302        /**
303         * @return the allowAtSign
304         */
305        public boolean isAllowAtSign() {
306            return this.allowAtSign;
307        }
308    
309        /**
310         * @param allowAtSign the allowAtSign to set
311         */
312        public void setAllowAtSign(boolean allowAtSign) {
313            this.allowAtSign = allowAtSign;
314        }
315    
316        /**
317         * @return the allowPercent
318         */
319        public boolean isAllowPercent() {
320            return this.allowPercent;
321        }
322    
323        /**
324         * @param allowPercent the allowPercent to set
325         */
326        public void setAllowPercent(boolean allowPercent) {
327            this.allowPercent = allowPercent;
328        }
329    
330        /**
331         * @return the allowPound
332         */
333        public boolean isAllowPound() {
334            return this.allowPound;
335        }
336    
337        /**
338         * @param allowPound the allowPound to set
339         */
340        public void setAllowPound(boolean allowPound) {
341            this.allowPound = allowPound;
342        }
343    
344        public boolean isAllowGreaterThan() {
345            return allowGreaterThan;
346        }
347    
348        public void setAllowGreaterThan(boolean allowGreaterThan) {
349            this.allowGreaterThan = allowGreaterThan;
350        }
351    
352        public boolean isAllowLessThan() {
353            return allowLessThan;
354        }
355    
356        public void setAllowLessThan(boolean allowLessThan) {
357            this.allowLessThan = allowLessThan;
358        }
359    
360        public boolean isAllowBrackets() {
361            return allowBrackets;
362        }
363    
364        public void setAllowBrackets(boolean allowBrackets) {
365            this.allowBrackets = allowBrackets;
366        }
367    
368        public boolean isAllowAmpersand() {
369            return allowAmpersand;
370        }
371    
372        public void setAllowAmpersand(boolean allowAmpersand) {
373            this.allowAmpersand = allowAmpersand;
374        }
375    
376        public boolean isAllowCurlyBraces() {
377            return allowCurlyBraces;
378        }
379    
380        public void setAllowCurlyBraces(boolean allowCurlyBraces) {
381            this.allowCurlyBraces = allowCurlyBraces;
382        }
383    
384        public boolean isAllowBackslash() {
385            return allowBackslash;
386        }
387    
388        public void setAllowBackslash(boolean allowBackslash) {
389            this.allowBackslash = allowBackslash;
390        }
391    
392        /**
393         * If true, this constraint will allow all symbols that have flags for them. Equivalent to
394         * setting each flag to true separately.
395         *
396         * @return the allowAll
397         */
398        public boolean isAllowAll() {
399            return this.allowAll;
400        }
401    
402        /**
403         * @param allowAll the allowAll to set
404         */
405        public void setAllowAll(boolean allowAll) {
406            this.allowAll = allowAll;
407        }
408    
409        public boolean isOmitNewline() {
410            return omitNewline;
411        }
412    
413        /**
414         * When set to true, omit new line characters from the set of valid characters.  This flag
415         * will only have an effect if the allowWhitespace flag is true, otherwise all whitespace
416         * including new lines characters are omitted.
417         *
418         * @param omitNewline
419         */
420        public void setOmitNewline(boolean omitNewline) {
421            this.omitNewline = omitNewline;
422        }
423    
424        /**
425         * This method returns the allowed set of characters allowed by this constraint, based on the
426         * flags set. This string is intended to be placed within the or set of a regex, ie between the
427         * [ ] symbols
428         *
429         * @return
430         */
431        protected String getAllowedCharacterRegex() {
432            StringBuilder regexString = new StringBuilder("");
433            if (allowWhitespace || allowAll) {
434                regexString.append("\\t\\v\\040");
435                if (!omitNewline) {
436                    regexString.append("\\f\\r\\n");
437                }
438            }
439            if (allowUnderscore || allowAll) {
440                regexString.append("_");
441            }
442            if (allowPeriod || allowAll) {
443                regexString.append(".");
444            }
445            if (allowParenthesis || allowAll) {
446                regexString.append("(");
447                regexString.append(")");
448            }
449            if (allowDollar || allowAll) {
450                regexString.append("$");
451            }
452            if (allowForwardSlash || allowAll) {
453                regexString.append("/");
454            }
455            if (allowDoubleQuote || allowAll) {
456                regexString.append("\\\"");
457            }
458            if (allowApostrophe || allowAll) {
459                regexString.append("'");
460            }
461            if (allowComma || allowAll) {
462                regexString.append(",");
463            }
464            if (allowColon || allowAll) {
465                regexString.append(":");
466            }
467            if (allowSemiColon || allowAll) {
468                regexString.append(";");
469            }
470            if (allowQuestionMark || allowAll) {
471                regexString.append("?");
472            }
473            if (allowExclaimation || allowAll) {
474                regexString.append("!");
475            }
476            if (allowDash || allowAll) {
477                regexString.append("\\-");
478            }
479            if (allowPlus || allowAll) {
480                regexString.append("+");
481            }
482            if (allowEquals || allowAll) {
483                regexString.append("=");
484            }
485            if (allowAsterisk || allowAll) {
486                regexString.append("*");
487            }
488            if (allowAtSign || allowAll) {
489                regexString.append("@");
490            }
491            if (allowPercent || allowAll) {
492                regexString.append("%");
493            }
494            if (allowPound || allowAll) {
495                regexString.append("#");
496            }
497            if (allowLessThan || allowAll) {
498                regexString.append("\\0074");
499            }
500            if (allowGreaterThan || allowAll) {
501                regexString.append("\\0076");
502            }
503            if (allowAmpersand || allowAll) {
504                regexString.append("\\0046");
505            }
506            if (allowBackslash || allowAll) {
507                regexString.append("\\0134");
508            }
509            if (allowCurlyBraces || allowAll) {
510                regexString.append("\\0173\\0175");
511            }
512            if (allowBrackets || allowAll) {
513                regexString.append("\\0133\\0135");
514            }
515            return regexString.toString();
516        }
517    
518        /**
519         * Generates a comma separated string of the allowed set of characters, for the {0} parameter to
520         * be used within its validation message
521         *
522         * @return the validationMessageParams
523         */
524        public List<String> getValidationMessageParams() {
525            if (validationMessageParams == null) {
526                validationMessageParams = new ArrayList<String>();
527                ConfigurationService configService = KRADServiceLocator.getKualiConfigurationService();
528                StringBuilder paramString = new StringBuilder("");
529    
530                if (allowWhitespace || allowAll) {
531                    paramString.append(", " + configService.getPropertyValueAsString(
532                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "whitespace"));
533                    if (!omitNewline) {
534                        paramString.append(", " + configService.getPropertyValueAsString(
535                                UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "newline"));
536                    }
537                }
538                if (allowUnderscore || allowAll) {
539                    paramString.append(", " + configService.getPropertyValueAsString(
540                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "underscore"));
541                }
542                if (allowPeriod || allowAll) {
543                    paramString.append(", " + configService.getPropertyValueAsString(
544                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "period"));
545                }
546                if (allowParenthesis || allowAll) {
547                    paramString.append(", " + configService.getPropertyValueAsString(
548                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "parenthesis"));
549                }
550                if (allowDollar || allowAll) {
551                    paramString.append(", " + configService.getPropertyValueAsString(
552                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "dollar"));
553                }
554                if (allowForwardSlash || allowAll) {
555                    paramString.append(", " + configService.getPropertyValueAsString(
556                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "forwardSlash"));
557                }
558                if (allowDoubleQuote || allowAll) {
559                    paramString.append(", " + configService.getPropertyValueAsString(
560                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "doubleQuote"));
561                }
562                if (allowApostrophe || allowAll) {
563                    paramString.append(", " + configService.getPropertyValueAsString(
564                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "apostrophe"));
565                }
566                if (allowComma || allowAll) {
567                    paramString.append(", " + configService.getPropertyValueAsString(
568                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "comma"));
569                }
570                if (allowColon || allowAll) {
571                    paramString.append(", " + configService.getPropertyValueAsString(
572                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "colon"));
573                }
574                if (allowSemiColon || allowAll) {
575                    paramString.append(", " + configService.getPropertyValueAsString(
576                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "semiColon"));
577                }
578                if (allowQuestionMark || allowAll) {
579                    paramString.append(", " + configService.getPropertyValueAsString(
580                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "questionMark"));
581                }
582                if (allowExclaimation || allowAll) {
583                    paramString.append(", " + configService.getPropertyValueAsString(
584                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "exclaimation"));
585                }
586                if (allowDash || allowAll) {
587                    paramString.append(", " + configService.getPropertyValueAsString(
588                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "dash"));
589                }
590                if (allowPlus || allowAll) {
591                    paramString.append(", " + configService.getPropertyValueAsString(
592                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "plus"));
593                }
594                if (allowEquals || allowAll) {
595                    paramString.append(", " + configService.getPropertyValueAsString(
596                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "equals"));
597                }
598                if (allowAsterisk || allowAll) {
599                    paramString.append(", " + configService.getPropertyValueAsString(
600                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "asterisk"));
601                }
602                if (allowAtSign || allowAll) {
603                    paramString.append(", " + configService.getPropertyValueAsString(
604                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "atSign"));
605                }
606                if (allowPercent || allowAll) {
607                    paramString.append(", " + configService.getPropertyValueAsString(
608                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "percent"));
609                }
610                if (allowPound || allowAll) {
611                    paramString.append(", " + configService.getPropertyValueAsString(
612                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "pound"));
613                }
614                if (allowLessThan || allowAll) {
615                    paramString.append(", " + configService.getPropertyValueAsString(
616                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "lessThan"));
617                }
618                if (allowGreaterThan || allowAll) {
619                    paramString.append(", " + configService.getPropertyValueAsString(
620                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "greaterThan"));
621                }
622                if (allowAmpersand || allowAll) {
623                    paramString.append(", " + configService.getPropertyValueAsString(
624                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "ampersand"));
625                }
626                if (allowBackslash || allowAll) {
627                   paramString.append(", " + configService.getPropertyValueAsString(
628                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "backslash"));
629                }
630                if (allowCurlyBraces || allowAll) {
631                    paramString.append(", " + configService.getPropertyValueAsString(
632                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "curlyBraces"));
633                }
634                if (allowBrackets || allowAll) {
635                    paramString.append(", " + configService.getPropertyValueAsString(
636                            UifConstants.Messages.VALIDATION_MSG_KEY_PREFIX + "brackets"));
637                }
638    
639                validationMessageParams.add(paramString.toString());
640            }
641            return this.validationMessageParams;
642        }
643    
644    }