18
18
import java .lang .reflect .Method ;
19
19
import java .util .ArrayList ;
20
20
import java .util .Arrays ;
21
+ import java .util .Collections ;
21
22
import java .util .List ;
23
+ import java .util .stream .Collectors ;
22
24
23
25
import javax .persistence .NamedStoredProcedureQueries ;
24
26
import javax .persistence .NamedStoredProcedureQuery ;
28
30
import org .springframework .core .annotation .AnnotatedElementUtils ;
29
31
import org .springframework .lang .Nullable ;
30
32
import org .springframework .util .Assert ;
33
+ import org .springframework .util .ObjectUtils ;
31
34
import org .springframework .util .StringUtils ;
32
35
33
36
/**
40
43
* @author Diego Diez
41
44
* @author Jeff Sheets
42
45
* @author Gabriel Basilio
46
+ * @author Greg Turnquist
43
47
* @since 1.6
44
48
*/
45
49
enum StoredProcedureAttributeSource {
@@ -69,9 +73,9 @@ public StoredProcedureAttributes createFrom(Method method, JpaEntityMetadata<?>
69
73
}
70
74
71
75
String procedureName = deriveProcedureNameFrom (method , procedure );
72
- if (StringUtils .isEmpty (procedureName )) {
73
- throw new IllegalArgumentException ("Could not determine name of procedure for @Procedure annotated method: "
74
- + method );
76
+ if (ObjectUtils .isEmpty (procedureName )) {
77
+ throw new IllegalArgumentException (
78
+ "Could not determine name of procedure for @Procedure annotated method: " + method );
75
79
}
76
80
77
81
return new StoredProcedureAttributes (procedureName , createOutputProcedureParameterFrom (method , procedure ));
@@ -96,42 +100,57 @@ private String deriveProcedureNameFrom(Method method, Procedure procedure) {
96
100
}
97
101
98
102
/**
103
+ * Extract procedure attributes from method and procedure.
104
+ *
99
105
* @param method
100
106
* @param namedStoredProc
101
107
* @param procedure
102
108
* @return
103
109
*/
104
- private StoredProcedureAttributes newProcedureAttributesFrom (Method method ,
105
- NamedStoredProcedureQuery namedStoredProc , Procedure procedure ) {
110
+ private StoredProcedureAttributes newProcedureAttributesFrom (Method method , NamedStoredProcedureQuery namedStoredProc ,
111
+ Procedure procedure ) {
106
112
107
- List <ProcedureParameter > outputParameters = new ArrayList <>() ;
113
+ List <ProcedureParameter > outputParameters ;
108
114
109
115
if (!procedure .outputParameterName ().isEmpty ()) {
116
+
110
117
// we give the output parameter definition from the @Procedure annotation precedence
111
- outputParameters . add (createOutputProcedureParameterFrom (method , procedure ));
118
+ outputParameters = Collections . singletonList (createOutputProcedureParameterFrom (method , procedure ));
112
119
} else {
113
120
114
121
// try to discover the output parameter
115
- List <StoredProcedureParameter > namedProcedureOutputParameters = extractOutputParametersFrom (namedStoredProc );
116
-
117
- for (StoredProcedureParameter outputParameter : namedProcedureOutputParameters ) {
118
- outputParameters .add (new ProcedureParameter (
119
- outputParameter .name (), outputParameter .mode (), outputParameter .type ()));
120
- }
122
+ outputParameters = extractOutputParametersFrom (namedStoredProc ).stream () //
123
+ .map (namedParameter -> new ProcedureParameter (namedParameter .name (), namedParameter .mode (),
124
+ namedParameter .type ())) //
125
+ .collect (Collectors .toList ());
121
126
}
122
127
123
128
return new StoredProcedureAttributes (namedStoredProc .name (), outputParameters , true );
124
129
}
125
130
131
+ /**
132
+ * Create a {@link ProcedureParameter} from relevant {@link Method} and {@link Procedure}.
133
+ *
134
+ * @param method
135
+ * @param procedure
136
+ * @return
137
+ */
126
138
private ProcedureParameter createOutputProcedureParameterFrom (Method method , Procedure procedure ) {
139
+
127
140
return new ProcedureParameter (procedure .outputParameterName (),
128
- procedure .refCursor () ? ParameterMode .REF_CURSOR : ParameterMode .OUT ,
129
- method .getReturnType ());
141
+ procedure .refCursor () ? ParameterMode .REF_CURSOR : ParameterMode .OUT , method .getReturnType ());
130
142
}
131
143
144
+ /**
145
+ * Translate all the {@Link NamedStoredProcedureQuery} parameters into a {@link List} of
146
+ * {@link StoredProcedureParameter}s.
147
+ *
148
+ * @param namedStoredProc
149
+ * @return
150
+ */
132
151
private List <StoredProcedureParameter > extractOutputParametersFrom (NamedStoredProcedureQuery namedStoredProc ) {
133
152
134
- List <StoredProcedureParameter > outputParameters = new ArrayList <StoredProcedureParameter >();
153
+ List <StoredProcedureParameter > outputParameters = new ArrayList <>();
135
154
136
155
for (StoredProcedureParameter param : namedStoredProc .parameters ()) {
137
156
@@ -190,9 +209,12 @@ private NamedStoredProcedureQuery tryFindAnnotatedNamedStoredProcedureQuery(Meth
190
209
* @param procedure
191
210
* @return
192
211
*/
193
- private String derivedNamedProcedureNameFrom (Method method , JpaEntityMetadata <?> entityMetadata , Procedure procedure ) {
194
- return StringUtils .hasText (procedure .name ()) ? procedure .name () : entityMetadata .getEntityName () + "."
195
- + method .getName ();
212
+ private String derivedNamedProcedureNameFrom (Method method , JpaEntityMetadata <?> entityMetadata ,
213
+ Procedure procedure ) {
214
+
215
+ return StringUtils .hasText (procedure .name ()) //
216
+ ? procedure .name () //
217
+ : entityMetadata .getEntityName () + "." + method .getName ();
196
218
}
197
219
198
220
/**
@@ -201,7 +223,7 @@ private String derivedNamedProcedureNameFrom(Method method, JpaEntityMetadata<?>
201
223
*/
202
224
private List <NamedStoredProcedureQuery > collectNamedStoredProcedureQueriesFrom (Class <?> entityType ) {
203
225
204
- List <NamedStoredProcedureQuery > queries = new ArrayList <NamedStoredProcedureQuery >();
226
+ List <NamedStoredProcedureQuery > queries = new ArrayList <>();
205
227
206
228
NamedStoredProcedureQueries namedQueriesAnnotation = AnnotatedElementUtils .findMergedAnnotation (entityType ,
207
229
NamedStoredProcedureQueries .class );
0 commit comments