Skip to content

Commit 581bad1

Browse files
committed
HV-2135 Do not create unnecessary collections copies at runtime
Signed-off-by: marko-bekhta <[email protected]>
1 parent 379e5a9 commit 581bad1

File tree

5 files changed

+22
-18
lines changed

5 files changed

+22
-18
lines changed

engine/src/main/java/org/hibernate/validator/internal/engine/MessageInterpolatorContext.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
*/
55
package org.hibernate.validator.internal.engine;
66

7-
import static org.hibernate.validator.internal.util.CollectionHelper.toImmutableMap;
8-
97
import java.lang.invoke.MethodHandles;
108
import java.util.Map;
119

@@ -47,8 +45,8 @@ public MessageInterpolatorContext(ConstraintDescriptor<?> constraintDescriptor,
4745
this.validatedValue = validatedValue;
4846
this.rootBeanType = rootBeanType;
4947
this.propertyPath = propertyPath;
50-
this.messageParameters = toImmutableMap( messageParameters );
51-
this.expressionVariables = toImmutableMap( expressionVariables );
48+
this.messageParameters = messageParameters;
49+
this.expressionVariables = expressionVariables;
5250
this.expressionLanguageFeatureLevel = expressionLanguageFeatureLevel;
5351
this.customViolation = customViolation;
5452
}

engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintValidatorContextImpl.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ public final List<ConstraintViolationCreationContext> getConstraintViolationCrea
153153
throw LOG.getAtLeastOneCustomMessageMustBeCreatedException();
154154
}
155155

156-
return CollectionHelper.toImmutableList( constraintViolationCreationContexts );
156+
return constraintViolationCreationContexts;
157157
}
158158

159159
if ( constraintViolationCreationContexts == null || constraintViolationCreationContexts.size() == 0 ) {
@@ -165,7 +165,7 @@ public final List<ConstraintViolationCreationContext> getConstraintViolationCrea
165165
returnedConstraintViolationCreationContexts.addAll( constraintViolationCreationContexts );
166166
returnedConstraintViolationCreationContexts.add( getDefaultConstraintViolationCreationContext() );
167167

168-
return CollectionHelper.toImmutableList( returnedConstraintViolationCreationContexts );
168+
return returnedConstraintViolationCreationContexts;
169169
}
170170

171171
protected final MutablePath getCopyOfBasePath() {
@@ -178,8 +178,8 @@ private ConstraintViolationCreationContext getDefaultConstraintViolationCreation
178178
defaultConstraintExpressionLanguageFeatureLevel,
179179
false,
180180
basePath,
181-
messageParameters != null ? new HashMap<>( messageParameters ) : Collections.emptyMap(),
182-
expressionVariables != null ? new HashMap<>( expressionVariables ) : Collections.emptyMap(),
181+
messageParameters != null ? Map.copyOf( messageParameters ) : Collections.emptyMap(),
182+
expressionVariables != null ? Map.copyOf( expressionVariables ) : Collections.emptyMap(),
183183
dynamicPayload
184184
);
185185
}
@@ -214,8 +214,8 @@ public ConstraintValidatorContext addConstraintViolation() {
214214
expressionLanguageFeatureLevel,
215215
true,
216216
propertyPath,
217-
messageParameters != null ? new HashMap<>( messageParameters ) : Collections.emptyMap(),
218-
expressionVariables != null ? new HashMap<>( expressionVariables ) : Collections.emptyMap(),
217+
messageParameters != null ? Map.copyOf( messageParameters ) : Collections.emptyMap(),
218+
expressionVariables != null ? Map.copyOf( expressionVariables ) : Collections.emptyMap(),
219219
dynamicPayload
220220
)
221221
);

engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintViolationCreationContext.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
*/
55
package org.hibernate.validator.internal.engine.constraintvalidation;
66

7-
import static org.hibernate.validator.internal.util.CollectionHelper.toImmutableMap;
8-
97
import java.util.Map;
108

119
import jakarta.validation.Path;
@@ -44,8 +42,8 @@ public ConstraintViolationCreationContext(String message,
4442
this.customViolation = customViolation;
4543
// at this point we make a copy of the path to avoid side effects
4644
this.propertyPath = property.materialize();
47-
this.messageParameters = toImmutableMap( messageParameters );
48-
this.expressionVariables = toImmutableMap( expressionVariables );
45+
this.messageParameters = messageParameters;
46+
this.expressionVariables = expressionVariables;
4947
this.dynamicPayload = dynamicPayload;
5048
}
5149

engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ValueExtractorResolver.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,10 +304,12 @@ private Set<ValueExtractorDescriptor> getRuntimeCompliantValueExtractors(Class<?
304304
return valueExtractorDescriptors;
305305
}
306306

307-
Set<ValueExtractorDescriptor> possibleValueExtractors = potentialValueExtractorDescriptors
308-
.stream()
309-
.filter( e -> TypeHelper.isAssignable( e.getContainerType(), runtimeType ) )
310-
.collect( Collectors.toSet() );
307+
Set<ValueExtractorDescriptor> possibleValueExtractors = CollectionHelper.newHashSet( potentialValueExtractorDescriptors.size() );
308+
for ( ValueExtractorDescriptor descriptor : potentialValueExtractorDescriptors ) {
309+
if ( TypeHelper.isAssignable( descriptor.getContainerType(), runtimeType ) ) {
310+
possibleValueExtractors.add( descriptor );
311+
}
312+
}
311313

312314
valueExtractorDescriptors = getMaximallySpecificValueExtractors( possibleValueExtractors );
313315

engine/src/main/java/org/hibernate/validator/internal/util/CollectionHelper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ public static <T> Set<T> asSet(T... ts) {
9898
* <p>
9999
* <b>NOTE:</b> the resulting list does not allow {@code null} values.
100100
* Attempt to convert a list with {@code null}s will result in an exception!
101+
* <b>NOTE:</b> do <b>NOT</b> use this util method at "runtime" as results
102+
* in creating unnecessary copies of arrays!
101103
*
102104
* @param list the list to convert.
103105
* @return the converted list.
@@ -112,6 +114,8 @@ public static <T> List<T> toImmutableList(List<? extends T> list) {
112114
* <p>
113115
* <b>NOTE:</b> the resulting set does not allow {@code null} values.
114116
* Attempt to convert a set with {@code null}s will result in an exception!
117+
* <b>NOTE:</b> do <b>NOT</b> use this util method at "runtime" as results
118+
* in creating unnecessary copies of arrays!
115119
*
116120
* @param set the set to convert.
117121
* @return the converted set.
@@ -126,6 +130,8 @@ public static <T> Set<T> toImmutableSet(Set<? extends T> set) {
126130
* <p>
127131
* <b>NOTE:</b> the resulting map does not allow {@code null} keys and values .
128132
* Attempt to convert a map with {@code null}s (either as key or a value) will result in an exception!
133+
* <b>NOTE:</b> do <b>NOT</b> use this util method at "runtime" as results
134+
* in creating unnecessary copies of arrays!
129135
*
130136
* @param map the map to convert.
131137
* @param <K> the type of the map keys.

0 commit comments

Comments
 (0)