1
7 package org.hibernate.validator.internal.metadata.aggregated;
8
9 import java.lang.reflect.Type;
10 import java.util.Collections;
11 import java.util.List;
12 import java.util.Set;
13
14 import javax.validation.ElementKind;
15 import javax.validation.metadata.ReturnValueDescriptor;
16
17 import org.hibernate.validator.internal.engine.path.PathImpl;
18 import org.hibernate.validator.internal.metadata.core.MetaConstraint;
19 import org.hibernate.validator.internal.metadata.descriptor.ReturnValueDescriptorImpl;
20 import org.hibernate.validator.internal.metadata.facets.Cascadable;
21 import org.hibernate.validator.internal.metadata.facets.Validatable;
22 import org.hibernate.validator.internal.metadata.location.ConstraintLocation.ConstraintLocationKind;
23 import org.hibernate.validator.internal.util.stereotypes.Immutable;
24
25
31 public class ReturnValueMetaData extends AbstractConstraintMetaData
32 implements Validatable, Cascadable {
33
34 private static final String RETURN_VALUE_NODE_NAME = null;
35
36 @Immutable
37 private final List<Cascadable> cascadables;
38
39 private final CascadingMetaData cascadingMetaData;
40
41 public ReturnValueMetaData(Type type,
42 Set<MetaConstraint<?>> constraints,
43 Set<MetaConstraint<?>> containerElementsConstraints,
44 CascadingMetaData cascadingMetaData) {
45 super(
46 RETURN_VALUE_NODE_NAME,
47 type,
48 constraints,
49 containerElementsConstraints,
50 cascadingMetaData.isMarkedForCascadingOnAnnotatedObjectOrContainerElements(),
51 !constraints.isEmpty() || containerElementsConstraints.isEmpty() || cascadingMetaData.isMarkedForCascadingOnAnnotatedObjectOrContainerElements()
52 );
53
54
55 this.cascadables = isCascading() ? Collections.singletonList( this ) : Collections.emptyList();
56 this.cascadingMetaData = cascadingMetaData;
57 }
58
59 @Override
60 public Iterable<Cascadable> getCascadables() {
61 return cascadables;
62 }
63
64 @Override
65 public boolean hasCascadables() {
66 return !cascadables.isEmpty();
67 }
68
69 @Override
70 public ConstraintLocationKind getConstraintLocationKind() {
71 return ConstraintLocationKind.METHOD;
72 }
73
74 @Override
75 public ReturnValueDescriptor asDescriptor(boolean defaultGroupSequenceRedefined, List<Class<?>> defaultGroupSequence) {
76 return new ReturnValueDescriptorImpl(
77 getType(),
78 asDescriptors( getDirectConstraints() ),
79 asContainerElementTypeDescriptors( getContainerElementsConstraints(), cascadingMetaData, defaultGroupSequenceRedefined, defaultGroupSequence ),
80 cascadingMetaData.isCascading(),
81 defaultGroupSequenceRedefined,
82 defaultGroupSequence,
83 cascadingMetaData.getGroupConversionDescriptors()
84 );
85 }
86
87 @Override
88 public Object getValue(Object parent) {
89 return parent;
90 }
91
92 @Override
93 public Type getCascadableType() {
94 return getType();
95 }
96
97 @Override
98 public void appendTo(PathImpl path) {
99 path.addReturnValueNode();
100 }
101
102 @Override
103 public CascadingMetaData getCascadingMetaData() {
104 return cascadingMetaData;
105 }
106
107 @Override
108 public ElementKind getKind() {
109 return ElementKind.RETURN_VALUE;
110 }
111 }
112