1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 package ca.uhn.hl7v2.validation.builder;
27
28 import java.util.regex.Pattern;
29
30 import ca.uhn.hl7v2.validation.ValidationException;
31 import ca.uhn.hl7v2.validation.impl.AbstractPrimitiveTypeRule;
32
33
34
35
36
37
38 @SuppressWarnings("serial")
39 public class PredicatePrimitiveTypeRule extends AbstractPrimitiveTypeRule implements
40 PredicateRuleSupport<String> {
41
42 private static final Pattern LEADING_WHITESPACE = Pattern.compile("^\\s+");
43 private static final Pattern TRAILING_WHITESPACE = Pattern.compile("\\s+$");
44
45
46 public enum Trimmer {
47
48 LEFT {
49 @Override public String trim(String source) { return trimPattern(LEADING_WHITESPACE, source); }
50 },
51 RIGHT {
52 @Override public String trim(String source) { return trimPattern(TRAILING_WHITESPACE, source); }
53 },
54 NONE {
55 @Override public String trim(String source) { return source; }
56 },
57 ALL {
58 @Override public String trim(String source) { return source == null ? null : source.trim(); }
59 };
60
61
62
63
64
65
66 public abstract String trim(String source);
67
68 protected String trimPattern(Pattern pattern, String source) {
69 if (source == null || pattern == null)
70 return source;
71 return pattern.matcher(source).replaceAll("");
72 }
73 }
74
75 private final Predicate predicate;
76 private final Trimmer trimmer;
77
78
79
80
81
82 public PredicatePrimitiveTypeRule(Predicate predicate) {
83 this(predicate, Trimmer.NONE);
84 }
85
86
87
88
89
90
91 public PredicatePrimitiveTypeRule(Predicate predicate, Trimmer trimmer) {
92 this.predicate = predicate;
93 this.trimmer = trimmer;
94 setDescription("Primitive value '%s' requires to be " + predicate.getDescription());
95 }
96
97 public Predicate getPredicate() {
98 return predicate;
99 }
100
101 public String correct(String value) {
102 return trimmer.trim(value);
103 }
104
105 public boolean test(String value) {
106 try {
107 return getPredicate().evaluate(value);
108 } catch (ValidationException e) {
109 return false;
110 }
111 }
112
113 public ValidationException[] apply(String value) {
114 try {
115 return result(getPredicate().evaluate(correct(value)), value);
116 } catch (ValidationException e) {
117 return failed(e);
118 }
119 }
120
121 @Override
122 public String toString() {
123 return getDescription();
124 }
125
126 }