1
7 package org.hibernate.validator.internal.xml.config;
8
9 import java.util.Collections;
10 import java.util.EnumSet;
11 import java.util.HashMap;
12 import java.util.HashSet;
13 import java.util.Map;
14 import java.util.Set;
15
16 import javax.validation.BootstrapConfiguration;
17 import javax.validation.executable.ExecutableType;
18
19 import org.hibernate.validator.internal.util.CollectionHelper;
20 import org.hibernate.validator.internal.util.stereotypes.Immutable;
21
22
27 class BootstrapConfigurationImpl implements BootstrapConfiguration {
28
29
32 @Immutable
33 private static final Set<ExecutableType> DEFAULT_VALIDATED_EXECUTABLE_TYPES =
34 Collections.unmodifiableSet(
35 EnumSet.of( ExecutableType.CONSTRUCTORS, ExecutableType.NON_GETTER_METHODS )
36 );
37
38
41 @Immutable
42 private static final Set<ExecutableType> ALL_VALIDATED_EXECUTABLE_TYPES =
43 Collections.unmodifiableSet(
44 EnumSet.complementOf(
45 EnumSet.of(
46 ExecutableType.ALL,
47 ExecutableType.NONE,
48 ExecutableType.IMPLICIT
49 )
50 )
51 );
52
53 private static final BootstrapConfiguration DEFAULT_BOOTSTRAP_CONFIGURATION = new BootstrapConfigurationImpl();
54
55 private final String defaultProviderClassName;
56 private final String constraintValidatorFactoryClassName;
57 private final String messageInterpolatorClassName;
58 private final String traversableResolverClassName;
59 private final String parameterNameProviderClassName;
60 private final String clockProviderClassName;
61 private final Set<String> valueExtractorClassNames;
62 private final Set<String> constraintMappingResourcePaths;
63 private final Map<String, String> properties;
64 private final Set<ExecutableType> validatedExecutableTypes;
65 private final boolean isExecutableValidationEnabled;
66
67 private BootstrapConfigurationImpl() {
68 this.defaultProviderClassName = null;
69 this.constraintValidatorFactoryClassName = null;
70 this.messageInterpolatorClassName = null;
71 this.traversableResolverClassName = null;
72 this.parameterNameProviderClassName = null;
73 this.clockProviderClassName = null;
74 this.valueExtractorClassNames = new HashSet<>();
75 this.validatedExecutableTypes = DEFAULT_VALIDATED_EXECUTABLE_TYPES;
76 this.isExecutableValidationEnabled = true;
77 this.constraintMappingResourcePaths = new HashSet<>();
78 this.properties = new HashMap<>();
79 }
80
81 public BootstrapConfigurationImpl(String defaultProviderClassName,
82 String constraintValidatorFactoryClassName,
83 String messageInterpolatorClassName,
84 String traversableResolverClassName,
85 String parameterNameProviderClassName,
86 String clockProviderClassName,
87 Set<String> valueExtractorClassNames,
88 EnumSet<ExecutableType> validatedExecutableTypes,
89 boolean isExecutableValidationEnabled,
90 Set<String> constraintMappingResourcePaths,
91 Map<String, String> properties) {
92 this.defaultProviderClassName = defaultProviderClassName;
93 this.constraintValidatorFactoryClassName = constraintValidatorFactoryClassName;
94 this.messageInterpolatorClassName = messageInterpolatorClassName;
95 this.traversableResolverClassName = traversableResolverClassName;
96 this.parameterNameProviderClassName = parameterNameProviderClassName;
97 this.clockProviderClassName = clockProviderClassName;
98 this.valueExtractorClassNames = valueExtractorClassNames;
99 this.validatedExecutableTypes = prepareValidatedExecutableTypes( validatedExecutableTypes );
100 this.isExecutableValidationEnabled = isExecutableValidationEnabled;
101 this.constraintMappingResourcePaths = constraintMappingResourcePaths;
102 this.properties = properties;
103 }
104
105 public static BootstrapConfiguration getDefaultBootstrapConfiguration() {
106 return DEFAULT_BOOTSTRAP_CONFIGURATION;
107 }
108
109 private Set<ExecutableType> prepareValidatedExecutableTypes(EnumSet<ExecutableType> validatedExecutableTypes) {
110 if ( validatedExecutableTypes == null ) {
111 return DEFAULT_VALIDATED_EXECUTABLE_TYPES;
112 }
113
114 if ( validatedExecutableTypes.contains( ExecutableType.ALL ) ) {
115 return ALL_VALIDATED_EXECUTABLE_TYPES;
116 }
117
118 if ( validatedExecutableTypes.contains( ExecutableType.NONE ) ) {
119 if ( validatedExecutableTypes.size() == 1 ) {
120 return Collections.emptySet();
121 }
122 else {
123 EnumSet<ExecutableType> preparedValidatedExecutableTypes = EnumSet.copyOf( validatedExecutableTypes );
124 preparedValidatedExecutableTypes.remove( ExecutableType.NONE );
125 return CollectionHelper.toImmutableSet( preparedValidatedExecutableTypes );
126 }
127 }
128
129 return CollectionHelper.toImmutableSet( validatedExecutableTypes );
130 }
131
132 @Override
133 public String getDefaultProviderClassName() {
134 return defaultProviderClassName;
135 }
136
137 @Override
138 public String getConstraintValidatorFactoryClassName() {
139 return constraintValidatorFactoryClassName;
140 }
141
142 @Override
143 public String getMessageInterpolatorClassName() {
144 return messageInterpolatorClassName;
145 }
146
147 @Override
148 public String getTraversableResolverClassName() {
149 return traversableResolverClassName;
150 }
151
152 @Override
153 public String getParameterNameProviderClassName() {
154 return parameterNameProviderClassName;
155 }
156
157 @Override
158 public String getClockProviderClassName() {
159 return clockProviderClassName;
160 }
161
162 @Override
163 public Set<String> getValueExtractorClassNames() {
164 return new HashSet<>( valueExtractorClassNames );
165 }
166
167 @Override
168 public Set<String> getConstraintMappingResourcePaths() {
169 return new HashSet<>( constraintMappingResourcePaths );
170 }
171
172 @Override
173 public boolean isExecutableValidationEnabled() {
174 return isExecutableValidationEnabled;
175 }
176
177 @Override
178 public Set<ExecutableType> getDefaultValidatedExecutableTypes() {
179 return new HashSet<>( validatedExecutableTypes );
180 }
181
182 @Override
183 public Map<String, String> getProperties() {
184 return new HashMap<>( properties );
185 }
186
187 @Override
188 public String toString() {
189 final StringBuilder sb = new StringBuilder();
190 sb.append( "BootstrapConfigurationImpl" );
191 sb.append( "{defaultProviderClassName='" ).append( defaultProviderClassName ).append( '\'' );
192 sb.append( ", constraintValidatorFactoryClassName='" )
193 .append( constraintValidatorFactoryClassName )
194 .append( '\'' );
195 sb.append( ", messageInterpolatorClassName='" ).append( messageInterpolatorClassName ).append( '\'' );
196 sb.append( ", traversableResolverClassName='" ).append( traversableResolverClassName ).append( '\'' );
197 sb.append( ", parameterNameProviderClassName='" ).append( parameterNameProviderClassName ).append( '\'' );
198 sb.append( ", clockProviderClassName='" ).append( clockProviderClassName ).append( '\'' );
199 sb.append( ", validatedExecutableTypes='" ).append( validatedExecutableTypes ).append( '\'' );
200 sb.append( ", constraintMappingResourcePaths=" ).append( constraintMappingResourcePaths ).append( '\'' );
201 sb.append( ", properties=" ).append( properties );
202 sb.append( '}' );
203 return sb.toString();
204 }
205 }
206