Skip to content

Commit 5398159

Browse files
gsmetgunnarmorling
authored andcommitted
HV-1480 Avoid initializing lists and maps in the common case where we
only have the default group Also optimize a bit the advanced case with groups.
1 parent e3b444e commit 5398159

File tree

3 files changed

+61
-18
lines changed

3 files changed

+61
-18
lines changed

engine/src/main/java/org/hibernate/validator/internal/engine/groups/DefaultValidationOrder.java

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,58 @@
77
package org.hibernate.validator.internal.engine.groups;
88

99
import java.util.ArrayList;
10+
import java.util.Collections;
1011
import java.util.Iterator;
1112
import java.util.List;
1213
import java.util.Map;
14+
1315
import javax.validation.GroupDefinitionException;
1416

17+
import org.hibernate.validator.internal.util.CollectionHelper;
1518
import org.hibernate.validator.internal.util.logging.Log;
1619
import org.hibernate.validator.internal.util.logging.LoggerFactory;
1720

18-
import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList;
19-
import static org.hibernate.validator.internal.util.CollectionHelper.newHashMap;
20-
2121
/**
2222
* An instance of {@code ValidationOrder} defines the group order during one validation call.
2323
*
2424
* @author Hardy Ferentschik
25+
* @author Guillaume Smet
2526
*/
2627
public final class DefaultValidationOrder implements ValidationOrder {
2728
private static final Log log = LoggerFactory.make();
2829

2930
/**
3031
* The list of single groups to be used this validation.
3132
*/
32-
private List<Group> groupList = newArrayList();
33+
private List<Group> groupList;
3334

3435
/**
3536
* The different sequences for this validation. The map contains the sequences mapped to their sequence
3637
* name.
3738
*/
38-
private Map<Class<?>, Sequence> sequenceMap = newHashMap();
39+
private Map<Class<?>, Sequence> sequenceMap;
3940

4041
@Override
4142
public Iterator<Group> getGroupIterator() {
43+
if ( groupList == null ) {
44+
return Collections.<Group>emptyIterator();
45+
}
4246
return groupList.iterator();
4347
}
4448

4549
@Override
4650
public Iterator<Sequence> getSequenceIterator() {
51+
if ( sequenceMap == null ) {
52+
return Collections.<Sequence>emptyIterator();
53+
}
4754
return sequenceMap.values().iterator();
4855
}
4956

5057
public void insertGroup(Group group) {
58+
if ( groupList == null ) {
59+
groupList = new ArrayList<>( 5 );
60+
}
61+
5162
if ( !groupList.contains( group ) ) {
5263
groupList.add( group );
5364
}
@@ -58,9 +69,11 @@ public void insertSequence(Sequence sequence) {
5869
return;
5970
}
6071

61-
if ( !sequenceMap.containsKey( sequence.getDefiningClass() ) ) {
62-
sequenceMap.put( sequence.getDefiningClass(), sequence );
72+
if ( sequenceMap == null ) {
73+
sequenceMap = CollectionHelper.newHashMap( 5 );
6374
}
75+
76+
sequenceMap.putIfAbsent( sequence.getDefiningClass(), sequence );
6477
}
6578

6679
@Override
@@ -83,6 +96,10 @@ public String toString() {
8396
@Override
8497
public void assertDefaultGroupSequenceIsExpandable(List<Class<?>> defaultGroupSequence)
8598
throws GroupDefinitionException {
99+
if ( sequenceMap == null ) {
100+
return;
101+
}
102+
86103
for ( Map.Entry<Class<?>, Sequence> entry : sequenceMap.entrySet() ) {
87104
List<Group> sequenceGroups = entry.getValue().getComposingGroups();
88105
int defaultGroupIndex = sequenceGroups.indexOf( Group.DEFAULT_GROUP );

engine/src/main/java/org/hibernate/validator/internal/engine/groups/ValidationOrder.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
* Interface defining the methods needed to execute groups and sequences in the right order.
1717
*
1818
* @author Hardy Ferentschik
19+
* @author Guillaume Smet
1920
*/
2021
public interface ValidationOrder {
2122

@@ -35,17 +36,22 @@ public interface ValidationOrder {
3536
void assertDefaultGroupSequenceIsExpandable(List<Class<?>> defaultGroupSequence)
3637
throws GroupDefinitionException;
3738

39+
/**
40+
* A {@link org.hibernate.validator.internal.engine.groups.ValidationOrder} which contains a single group, {@code Default}.
41+
*/
42+
ValidationOrder DEFAULT_GROUP = new DefaultGroupValidationOrder();
43+
3844
/**
3945
* A {@link org.hibernate.validator.internal.engine.groups.ValidationOrder} which contains a single sequence which
4046
* in turn contains a single group, {@code Default}.
4147
*/
42-
ValidationOrder DEFAULT_SEQUENCE = new DefaultValidationOrder();
48+
ValidationOrder DEFAULT_SEQUENCE = new DefaultSequenceValidationOrder();
4349

44-
class DefaultValidationOrder implements ValidationOrder {
50+
class DefaultSequenceValidationOrder implements ValidationOrder {
4551

4652
private final List<Sequence> defaultSequences;
4753

48-
private DefaultValidationOrder() {
54+
private DefaultSequenceValidationOrder() {
4955
defaultSequences = Collections.singletonList( Sequence.DEFAULT );
5056
}
5157

@@ -63,4 +69,27 @@ public Iterator<Sequence> getSequenceIterator() {
6369
public void assertDefaultGroupSequenceIsExpandable(List<Class<?>> defaultGroupSequence) throws GroupDefinitionException {
6470
}
6571
}
72+
73+
class DefaultGroupValidationOrder implements ValidationOrder {
74+
75+
private final List<Group> defaultGroups;
76+
77+
private DefaultGroupValidationOrder() {
78+
defaultGroups = Collections.singletonList( Group.DEFAULT_GROUP );
79+
}
80+
81+
@Override
82+
public Iterator<Group> getGroupIterator() {
83+
return defaultGroups.iterator();
84+
}
85+
86+
@Override
87+
public Iterator<Sequence> getSequenceIterator() {
88+
return Collections.<Sequence>emptyIterator();
89+
}
90+
91+
@Override
92+
public void assertDefaultGroupSequenceIsExpandable(List<Class<?>> defaultGroupSequence) throws GroupDefinitionException {
93+
}
94+
}
6695
}

engine/src/main/java/org/hibernate/validator/internal/engine/groups/ValidationOrderGenerator.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,6 @@ public class ValidationOrderGenerator {
3131

3232
private final ConcurrentMap<Class<?>, Sequence> resolvedSequences = new ConcurrentHashMap<Class<?>, Sequence>();
3333

34-
private final DefaultValidationOrder validationOrderForDefaultGroup;
35-
36-
public ValidationOrderGenerator() {
37-
validationOrderForDefaultGroup = new DefaultValidationOrder();
38-
validationOrderForDefaultGroup.insertGroup( Group.DEFAULT_GROUP );
39-
}
40-
4134
/**
4235
* Creates a {@link ValidationOrder} for the given validation group.
4336
*
@@ -49,6 +42,10 @@ public ValidationOrderGenerator() {
4942
* @return a {@link ValidationOrder} for the given validation group
5043
*/
5144
public ValidationOrder getValidationOrder(Class<?> group, boolean expand) {
45+
if ( Default.class.equals( group ) ) {
46+
return ValidationOrder.DEFAULT_GROUP;
47+
}
48+
5249
if ( expand ) {
5350
return getValidationOrder( Arrays.<Class<?>>asList( group ) );
5451
}
@@ -74,7 +71,7 @@ public ValidationOrder getValidationOrder(Collection<Class<?>> groups) {
7471
// HV-621 - if we deal with the Default group we return the default ValidationOrder. No need to
7572
// process Default as other groups which saves several reflection calls (HF)
7673
if ( groups.size() == 1 && groups.contains( Default.class ) ) {
77-
return validationOrderForDefaultGroup;
74+
return ValidationOrder.DEFAULT_GROUP;
7875
}
7976

8077
for ( Class<?> clazz : groups ) {

0 commit comments

Comments
 (0)