2121 * * * *
2222 * * *
2323 * *
24- *
24+ *
2525 */
2626package org .springdoc .core .extractor ;
2727
5050import java .util .concurrent .atomic .AtomicInteger ;
5151import java .util .concurrent .atomic .AtomicLong ;
5252import java .util .function .Predicate ;
53- import java .util .stream .Collectors ;
5453import java .util .stream .Stream ;
5554
5655import io .swagger .v3 .core .util .PrimitiveType ;
5756import io .swagger .v3 .oas .annotations .Parameter ;
58- import io .swagger .v3 .oas .annotations .media .Schema ;
59- import org .springdoc .core .service .AbstractRequestService ;
6057
6158import org .springframework .core .GenericTypeResolver ;
6259import org .springframework .core .MethodParameter ;
6663/**
6764 * The type Method parameter pojo extractor.
6865 *
69- * @author bnasslahsen, michael.clarke
66+ * @author bnasslahsen
7067 */
7168public class MethodParameterPojoExtractor {
7269
@@ -116,21 +113,20 @@ private MethodParameterPojoExtractor() {
116113 * @return the stream
117114 */
118115 static Stream <MethodParameter > extractFrom (Class <?> clazz ) {
119- return extractFrom (clazz , "" , true );
116+ return extractFrom (clazz , "" );
120117 }
121118
122119 /**
123120 * Extract from stream.
124121 *
125122 * @param clazz the clazz
126123 * @param fieldNamePrefix the field name prefix
127- * @param parentRequired whether the field that hold the class currently being inspected was required or optional
128124 * @return the stream
129125 */
130- private static Stream <MethodParameter > extractFrom (Class <?> clazz , String fieldNamePrefix , boolean parentRequired ) {
126+ private static Stream <MethodParameter > extractFrom (Class <?> clazz , String fieldNamePrefix ) {
131127 return allFieldsOf (clazz ).stream ()
132128 .filter (field -> !field .getType ().equals (clazz ))
133- .flatMap (f -> fromGetterOfField (clazz , f , fieldNamePrefix , parentRequired ))
129+ .flatMap (f -> fromGetterOfField (clazz , f , fieldNamePrefix ))
134130 .filter (Objects ::nonNull );
135131 }
136132
@@ -140,96 +136,20 @@ private static Stream<MethodParameter> extractFrom(Class<?> clazz, String fieldN
140136 * @param paramClass the param class
141137 * @param field the field
142138 * @param fieldNamePrefix the field name prefix
143- * @param parentRequired whether the field that holds the class currently being examined was required or optional
144139 * @return the stream
145140 */
146- private static Stream <MethodParameter > fromGetterOfField (Class <?> paramClass , Field field , String fieldNamePrefix , boolean parentRequired ) {
141+ private static Stream <MethodParameter > fromGetterOfField (Class <?> paramClass , Field field , String fieldNamePrefix ) {
147142 Class <?> type = extractType (paramClass , field );
148143
149144 if (Objects .isNull (type ))
150145 return Stream .empty ();
151146
152147 if (isSimpleType (type ))
153- return fromSimpleClass (paramClass , field , fieldNamePrefix , parentRequired );
148+ return fromSimpleClass (paramClass , field , fieldNamePrefix );
154149 else {
155- Parameter parameter = field .getAnnotation (Parameter .class );
156- Schema schema = field .getAnnotation (Schema .class );
157- boolean visible = resolveVisible (parameter , schema );
158- if (!visible ) {
159- return Stream .empty ();
160- }
161- String prefix = fieldNamePrefix + resolveName (parameter , schema ).orElse (field .getName ()) + DOT ;
162- Set <String > annotationSimpleNames = Arrays .stream (field .getDeclaredAnnotations ())
163- .map (Annotation ::annotationType )
164- .map (Class ::getSimpleName )
165- .collect (Collectors .toSet ());
166- boolean notNullAnnotationsPresent = AbstractRequestService .hasNotNullAnnotation (annotationSimpleNames );
167- return extractFrom (type , prefix , resolveRequired (schema , parameter , !notNullAnnotationsPresent ));
168- }
169- }
170-
171- private static Optional <String > resolveName (Parameter parameter , Schema schema ) {
172- if (parameter != null ) {
173- return resolveNameFromParameter (parameter );
174- }
175- if (schema != null ) {
176- return resolveNameFromSchema (schema );
177- }
178- return Optional .empty ();
179- }
180-
181- private static Optional <String > resolveNameFromParameter (Parameter parameter ) {
182- if (parameter .name ().isEmpty ()) {
183- return Optional .empty ();
184- }
185- return Optional .of (parameter .name ());
186- }
187-
188- private static Optional <String > resolveNameFromSchema (Schema schema ) {
189- if (schema .name ().isEmpty ()) {
190- return Optional .empty ();
150+ String prefix = fieldNamePrefix + field .getName () + DOT ;
151+ return extractFrom (type , prefix );
191152 }
192- return Optional .of (schema .name ());
193- }
194-
195- private static boolean resolveVisible (Parameter parameter , Schema schema ) {
196- if (parameter != null ) {
197- return !parameter .hidden ();
198- }
199- if (schema != null ) {
200- return !schema .hidden ();
201- }
202- return true ;
203- }
204-
205- private static boolean resolveRequired (Schema schema , Parameter parameter , boolean nullable ) {
206- if (parameter != null ) {
207- return resolveRequiredFromParameter (parameter , nullable );
208- }
209- if (schema != null ) {
210- return resolveRequiredFromSchema (schema , nullable );
211- }
212- return !nullable ;
213- }
214-
215- private static boolean resolveRequiredFromParameter (Parameter parameter , boolean nullable ) {
216- if (parameter .required ()) {
217- return true ;
218- }
219- return !nullable ;
220- }
221-
222- private static boolean resolveRequiredFromSchema (Schema schema , boolean nullable ) {
223- if (schema .required ()) {
224- return true ;
225- }
226- else if (schema .requiredMode () == Schema .RequiredMode .REQUIRED ) {
227- return true ;
228- }
229- else if (schema .requiredMode () == Schema .RequiredMode .NOT_REQUIRED ) {
230- return false ;
231- }
232- return !nullable ;
233153 }
234154
235155 /**
@@ -261,32 +181,18 @@ private static Class<?> extractType(Class<?> paramClass, Field field) {
261181 * @param fieldNamePrefix the field name prefix
262182 * @return the stream
263183 */
264- private static Stream <MethodParameter > fromSimpleClass (Class <?> paramClass , Field field , String fieldNamePrefix , boolean isParentRequired ) {
184+ private static Stream <MethodParameter > fromSimpleClass (Class <?> paramClass , Field field , String fieldNamePrefix ) {
265185 Annotation [] fieldAnnotations = field .getDeclaredAnnotations ();
266186 try {
267187 Parameter parameter = field .getAnnotation (Parameter .class );
268- Schema schema = field .getAnnotation (Schema .class );
269- boolean visible = resolveVisible (parameter , schema );
270- if (!visible ) {
271- return Stream .empty ();
272- }
273-
274- Set <String > annotationSimpleNames = Arrays .stream (field .getDeclaredAnnotations ())
275- .map (Annotation ::annotationType )
276- .map (Class ::getSimpleName )
277- .collect (Collectors .toSet ());
278-
279- boolean isNotRequired = !resolveRequired (schema , parameter , !AbstractRequestService .hasNotNullAnnotation (annotationSimpleNames ));
280- Annotation [] notNullFieldAnnotations = Arrays .stream (fieldAnnotations )
281- .filter (annotation -> AbstractRequestService .hasNotNullAnnotation (List .of (annotation .annotationType ().getSimpleName ())))
282- .toArray (Annotation []::new );
188+ boolean isNotRequired = parameter == null || !parameter .required ();
283189 if (paramClass .getSuperclass () != null && paramClass .isRecord ()) {
284190 return Stream .of (paramClass .getRecordComponents ())
285191 .filter (d -> d .getName ().equals (field .getName ()))
286192 .map (RecordComponent ::getAccessor )
287193 .map (method -> new MethodParameter (method , -1 ))
288194 .map (methodParameter -> DelegatingMethodParameter .changeContainingClass (methodParameter , paramClass ))
289- .map (param -> new DelegatingMethodParameter (param , fieldNamePrefix + field .getName (), fieldAnnotations , param .getMethodAnnotations (), notNullFieldAnnotations , true , isNotRequired ));
195+ .map (param -> new DelegatingMethodParameter (param , fieldNamePrefix + field .getName (), fieldAnnotations , param .getMethodAnnotations (), true , isNotRequired ));
290196
291197 }
292198 else
@@ -296,7 +202,7 @@ private static Stream<MethodParameter> fromSimpleClass(Class<?> paramClass, Fiel
296202 .filter (Objects ::nonNull )
297203 .map (method -> new MethodParameter (method , -1 ))
298204 .map (methodParameter -> DelegatingMethodParameter .changeContainingClass (methodParameter , paramClass ))
299- .map (param -> new DelegatingMethodParameter (param , fieldNamePrefix + field .getName (), fieldAnnotations , param .getMethodAnnotations (), notNullFieldAnnotations , true , isNotRequired ));
205+ .map (param -> new DelegatingMethodParameter (param , fieldNamePrefix + field .getName (), fieldAnnotations , param .getMethodAnnotations (), true , isNotRequired ));
300206 }
301207 catch (IntrospectionException e ) {
302208 return Stream .of ();
0 commit comments