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