1 /*
2  * Hibernate Validator, declare and validate application constraints
3  *
4  * License: Apache License, Version 2.0
5  * See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6  */

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 /**
26  * Represents the constraint related meta data of the return value of a method
27  * or constructor.
28  *
29  * @author Gunnar Morling
30  */

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