Skip to content

Commit c50cdc4

Browse files
committed
[#10] Add setterTarget to referenced entries, add ReferencedItemBuildContext
1 parent 9749543 commit c50cdc4

16 files changed

+105
-36
lines changed

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/AbstractReferencedItemStorage.java

+29-12
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,20 @@
2323
import de.qaware.openapigeneratorforspring.common.reference.fortype.ReferenceDeciderForType;
2424
import de.qaware.openapigeneratorforspring.common.reference.fortype.ReferenceIdentifierBuilderForType;
2525
import de.qaware.openapigeneratorforspring.common.reference.fortype.ReferenceIdentifierConflictResolverForType;
26+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2627
import de.qaware.openapigeneratorforspring.common.util.OpenApiProxyUtils;
2728
import de.qaware.openapigeneratorforspring.model.trait.HasReference;
2829
import lombok.AccessLevel;
2930
import lombok.Builder;
31+
import lombok.EqualsAndHashCode;
3032
import lombok.Getter;
3133
import lombok.RequiredArgsConstructor;
3234
import lombok.Setter;
3335
import org.apache.commons.lang3.StringUtils;
3436
import org.apache.commons.lang3.tuple.Pair;
3537

3638
import javax.annotation.Nullable;
39+
import java.lang.reflect.Field;
3740
import java.util.ArrayList;
3841
import java.util.Collections;
3942
import java.util.Iterator;
@@ -63,6 +66,10 @@ public abstract class AbstractReferencedItemStorage<T extends HasReference<T>> {
6366

6467
private final List<Entry<T>> entries = new ArrayList<>();
6568

69+
public static ReferencedItemBuildContext createContext() {
70+
return null;
71+
}
72+
6673
@Builder
6774
@Getter(AccessLevel.PRIVATE)
6875
protected static class AddEntryParameters {
@@ -93,7 +100,23 @@ protected void addEntry(T item, Consumer<T> setter, AddEntryParameters options)
93100
ReferenceSetter.of(setter, options.isReferenceRequired()),
94101
options.getSuggestedIdentifier()
95102
);
96-
entries.add(Entry.of(item, referenceSetterWithIdentifier, options.getOwner()));
103+
entries.add(Entry.of(item, referenceSetterWithIdentifier, options.getOwner(), findSetterTarget(setter)));
104+
}
105+
106+
@Nullable
107+
private Object findSetterTarget(Consumer<T> setter) {
108+
Field[] declaredFields = setter.getClass().getDeclaredFields();
109+
if (declaredFields.length == 1) {
110+
Field declaredField = declaredFields[0];
111+
declaredField.setAccessible(true);
112+
try {
113+
return declaredField.get(setter);
114+
} catch (IllegalAccessException e) {
115+
// this should not happen, as we've made it accessible...
116+
return null;
117+
}
118+
}
119+
return null;
97120
}
98121

99122
protected void removeEntriesOwnedBy(Object owner) {
@@ -104,7 +127,7 @@ public Pair<ReferenceType, List<ReferenceType>> getBuildDependencies() {
104127
return Pair.of(referenceType, buildDependencies);
105128
}
106129

107-
public void buildReferencedItems(Consumer<Map<String, T>> referencedItemsConsumer) {
130+
public void buildReferencedItems(Consumer<Map<String, T>> referencedItemsConsumer, @Nullable ReferencedItemBuildContext context) {
108131
Map<String, T> referencedItems = new LinkedHashMap<>();
109132
ReferenceActions referenceActions = new ReferenceActions();
110133
buildGroupedEntries()
@@ -257,21 +280,15 @@ private GroupedEntry createNewGroupedEntry(Entry<T> entry) {
257280

258281
@RequiredArgsConstructor(staticName = "of")
259282
@Getter
283+
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
260284
private static class Entry<T> {
285+
@EqualsAndHashCode.Include
261286
private final T item;
262287
private final ReferenceSetterWithIdentifier<T> referenceSetterWithIdentifier;
263288
@Nullable
264289
private final Object owner;
265-
266-
@Override
267-
public boolean equals(Object obj) {
268-
return obj instanceof Entry<?> && item.equals(((Entry<?>) obj).item);
269-
}
270-
271-
@Override
272-
public int hashCode() {
273-
return item.hashCode();
274-
}
290+
@Nullable
291+
private final Object setterTarget;
275292
}
276293

277294
@RequiredArgsConstructor(staticName = "of")

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/ReferencedItemSupportFactory.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
package de.qaware.openapigeneratorforspring.common.reference;
2222

2323
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractDependentReferencedComponentHandler;
24+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2425
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemHandler;
2526
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemHandlerFactory;
2627
import de.qaware.openapigeneratorforspring.model.Components;
@@ -69,7 +70,7 @@ public void applyToOpenApi(OpenApi openApi) {
6970
return (AbstractDependentReferencedComponentHandler) itemHandler;
7071
}
7172
// non-dependent handler can already be handled here
72-
itemHandler.applyToOpenApi(openApi);
73+
itemHandler.applyToOpenApi(openApi, null);
7374
return null;
7475
})
7576
.filter(Objects::nonNull)
@@ -103,11 +104,13 @@ public DependentReferencedComponentHandlersSupport(OpenApi openApi, List<Abstrac
103104
public void handle() {
104105
Map<ReferenceType, Set<ReferenceType>> transitiveDependencies = handlersMap.keySet().stream()
105106
.collect(Collectors.toMap(r -> r, r -> buildTransitiveDependencies(r).collect(Collectors.toSet())));
107+
108+
ReferencedItemBuildContext buildContext = AbstractReferencedItemStorage.createContext();
106109
handlersMap.values().stream()
107110
.sorted(buildDependencyComparator(transitiveDependencies)) // makes less-dependent handlers go first!
108111
.forEach(handler -> {
109112
LOGGER.debug("Building components for {}", handler.getType());
110-
handler.getHandler().applyToOpenApi(openApi);
113+
handler.getHandler().applyToOpenApi(openApi, buildContext);
111114
});
112115
}
113116

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/component/callback/ReferencedCallbacksHandlerImpl.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222

2323
import de.qaware.openapigeneratorforspring.common.reference.ReferenceType;
2424
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractDependentReferencedComponentHandler;
25+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2526
import de.qaware.openapigeneratorforspring.model.Components;
2627
import de.qaware.openapigeneratorforspring.model.operation.Callback;
2728
import lombok.RequiredArgsConstructor;
2829
import org.apache.commons.lang3.tuple.Pair;
2930

31+
import javax.annotation.Nullable;
3032
import java.util.List;
3133
import java.util.Map;
3234
import java.util.function.Consumer;
@@ -48,7 +50,7 @@ public Pair<ReferenceType, List<ReferenceType>> getBuildDependencies() {
4850
}
4951

5052
@Override
51-
public void applyToComponents(Components components) {
52-
storage.buildReferencedItems(components::setCallbacks);
53+
public void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context) {
54+
storage.buildReferencedItems(components::setCallbacks, context);
5355
}
5456
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/component/example/ReferencedExamplesHandlerImpl.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222

2323
import de.qaware.openapigeneratorforspring.common.reference.ReferenceType;
2424
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractDependentReferencedComponentHandler;
25+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2526
import de.qaware.openapigeneratorforspring.model.Components;
2627
import de.qaware.openapigeneratorforspring.model.example.Example;
2728
import lombok.RequiredArgsConstructor;
2829
import org.apache.commons.lang3.tuple.Pair;
2930

31+
import javax.annotation.Nullable;
3032
import java.util.List;
3133
import java.util.Map;
3234
import java.util.function.Consumer;
@@ -48,8 +50,8 @@ public Pair<ReferenceType, List<ReferenceType>> getBuildDependencies() {
4850
}
4951

5052
@Override
51-
public void applyToComponents(Components components) {
52-
storage.buildReferencedItems(components::setExamples);
53+
public void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context) {
54+
storage.buildReferencedItems(components::setExamples, context);
5355
}
5456

5557
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/component/header/ReferencedHeadersHandlerImpl.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222

2323
import de.qaware.openapigeneratorforspring.common.reference.ReferenceType;
2424
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractDependentReferencedComponentHandler;
25+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2526
import de.qaware.openapigeneratorforspring.model.Components;
2627
import de.qaware.openapigeneratorforspring.model.header.Header;
2728
import lombok.RequiredArgsConstructor;
2829
import org.apache.commons.lang3.tuple.Pair;
2930

31+
import javax.annotation.Nullable;
3032
import java.util.List;
3133
import java.util.Map;
3234
import java.util.function.Consumer;
@@ -48,7 +50,7 @@ public Pair<ReferenceType, List<ReferenceType>> getBuildDependencies() {
4850
}
4951

5052
@Override
51-
public void applyToComponents(Components components) {
52-
storage.buildReferencedItems(components::setHeaders);
53+
public void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context) {
54+
storage.buildReferencedItems(components::setHeaders, context);
5355
}
5456
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/component/link/ReferencedLinksHandlerImpl.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222

2323
import de.qaware.openapigeneratorforspring.common.reference.ReferenceType;
2424
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractDependentReferencedComponentHandler;
25+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2526
import de.qaware.openapigeneratorforspring.model.Components;
2627
import de.qaware.openapigeneratorforspring.model.link.Link;
2728
import lombok.RequiredArgsConstructor;
2829
import org.apache.commons.lang3.tuple.Pair;
2930

31+
import javax.annotation.Nullable;
3032
import java.util.List;
3133
import java.util.Map;
3234
import java.util.function.Consumer;
@@ -48,7 +50,7 @@ public Pair<ReferenceType, List<ReferenceType>> getBuildDependencies() {
4850
}
4951

5052
@Override
51-
public void applyToComponents(Components components) {
52-
storage.buildReferencedItems(components::setLinks);
53+
public void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context) {
54+
storage.buildReferencedItems(components::setLinks, context);
5355
}
5456
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/component/parameter/ReferencedParametersHandlerImpl.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import de.qaware.openapigeneratorforspring.common.reference.ReferenceType;
2424
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractDependentReferencedComponentHandler;
25+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2526
import de.qaware.openapigeneratorforspring.model.Components;
2627
import de.qaware.openapigeneratorforspring.model.parameter.Parameter;
2728
import lombok.RequiredArgsConstructor;
@@ -52,7 +53,7 @@ public Pair<ReferenceType, List<ReferenceType>> getBuildDependencies() {
5253
}
5354

5455
@Override
55-
public void applyToComponents(Components components) {
56-
storage.buildReferencedItems(components::setParameters);
56+
public void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context) {
57+
storage.buildReferencedItems(components::setParameters, context);
5758
}
5859
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/component/requestbody/ReferencedRequestBodyHandlerImpl.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222

2323
import de.qaware.openapigeneratorforspring.common.reference.ReferenceType;
2424
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractDependentReferencedComponentHandler;
25+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2526
import de.qaware.openapigeneratorforspring.model.Components;
2627
import de.qaware.openapigeneratorforspring.model.requestbody.RequestBody;
2728
import lombok.RequiredArgsConstructor;
2829
import org.apache.commons.lang3.tuple.Pair;
2930

31+
import javax.annotation.Nullable;
3032
import java.util.List;
3133
import java.util.function.Consumer;
3234

@@ -47,7 +49,7 @@ public Pair<ReferenceType, List<ReferenceType>> getBuildDependencies() {
4749
}
4850

4951
@Override
50-
public void applyToComponents(Components components) {
51-
storage.buildReferencedItems(components::setRequestBodies);
52+
public void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context) {
53+
storage.buildReferencedItems(components::setRequestBodies, context);
5254
}
5355
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/component/response/ReferencedApiResponsesHandlerImpl.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222

2323
import de.qaware.openapigeneratorforspring.common.reference.ReferenceType;
2424
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractDependentReferencedComponentHandler;
25+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2526
import de.qaware.openapigeneratorforspring.model.Components;
2627
import de.qaware.openapigeneratorforspring.model.response.ApiResponses;
2728
import lombok.RequiredArgsConstructor;
2829
import org.apache.commons.lang3.tuple.Pair;
2930

31+
import javax.annotation.Nullable;
3032
import java.util.List;
3133
import java.util.function.Consumer;
3234

@@ -47,7 +49,7 @@ public Pair<ReferenceType, List<ReferenceType>> getBuildDependencies() {
4749
}
4850

4951
@Override
50-
public void applyToComponents(Components components) {
51-
storage.buildReferencedItems(components::setResponses);
52+
public void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context) {
53+
storage.buildReferencedItems(components::setResponses, context);
5254
}
5355
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/component/schema/ReferencedSchemaHandlerImpl.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222

2323
import de.qaware.openapigeneratorforspring.common.reference.ReferenceType;
2424
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractDependentReferencedComponentHandler;
25+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2526
import de.qaware.openapigeneratorforspring.model.Components;
2627
import de.qaware.openapigeneratorforspring.model.media.Schema;
2728
import lombok.RequiredArgsConstructor;
2829
import org.apache.commons.lang3.tuple.Pair;
2930

31+
import javax.annotation.Nullable;
3032
import java.util.List;
3133
import java.util.function.Consumer;
3234

@@ -54,7 +56,7 @@ public Pair<ReferenceType, List<ReferenceType>> getBuildDependencies() {
5456
}
5557

5658
@Override
57-
public void applyToComponents(Components components) {
58-
storage.buildReferencedItems(components::setSchemas);
59+
public void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context) {
60+
storage.buildReferencedItems(components::setSchemas, context);
5961
}
6062
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/component/securityscheme/ReferencedSecuritySchemesHandlerImpl.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@
2222

2323
import de.qaware.openapigeneratorforspring.common.mapper.SecuritySchemeAnnotationMapper;
2424
import de.qaware.openapigeneratorforspring.common.reference.handler.AbstractReferencedComponentHandler;
25+
import de.qaware.openapigeneratorforspring.common.reference.handler.ReferencedItemBuildContext;
2526
import de.qaware.openapigeneratorforspring.common.security.OpenApiSecuritySchemesSupplier;
2627
import de.qaware.openapigeneratorforspring.common.supplier.OpenApiSpringBootApplicationAnnotationsSupplier;
2728
import de.qaware.openapigeneratorforspring.model.Components;
2829
import de.qaware.openapigeneratorforspring.model.security.SecurityScheme;
2930
import lombok.extern.slf4j.Slf4j;
3031

32+
import javax.annotation.Nullable;
3133
import java.util.Collection;
3234
import java.util.LinkedHashMap;
3335
import java.util.List;
@@ -80,7 +82,7 @@ public void accept(Map<String, SecurityScheme> map) {
8082
}
8183

8284
@Override
83-
public void applyToComponents(Components components) {
85+
public void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context) {
8486
setMapIfNotEmpty(securitySchemes, components::setSecuritySchemes);
8587
}
8688
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/handler/AbstractDependentReferencedComponentHandler.java

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
import java.util.List;
2727

28+
// TODO do not derive from AbstractReferencedComponentHandler
2829
public abstract class AbstractDependentReferencedComponentHandler extends AbstractReferencedComponentHandler {
30+
2931
public abstract Pair<ReferenceType, List<ReferenceType>> getBuildDependencies();
3032
}

openapi-generator-for-spring-common/src/main/java/de/qaware/openapigeneratorforspring/common/reference/handler/AbstractReferencedComponentHandler.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,19 @@
2323
import de.qaware.openapigeneratorforspring.model.Components;
2424
import de.qaware.openapigeneratorforspring.model.OpenApi;
2525

26+
import javax.annotation.Nullable;
2627
import java.util.Objects;
2728

2829
public abstract class AbstractReferencedComponentHandler implements ReferencedItemHandler {
2930

3031
@Override
31-
public final void applyToOpenApi(OpenApi openApi) {
32+
public final void applyToOpenApi(OpenApi openApi, @Nullable ReferencedItemBuildContext context) {
3233
// ReferencedItemSupportFactory ensures that openApi.getComponents() is not null
33-
applyToComponents(Objects.requireNonNull(openApi.getComponents(), "components of openApi must not be null"));
34+
applyToComponents(
35+
Objects.requireNonNull(openApi.getComponents(), "components of openApi must not be null"),
36+
context
37+
);
3438
}
3539

36-
protected abstract void applyToComponents(Components components);
40+
protected abstract void applyToComponents(Components components, @Nullable ReferencedItemBuildContext context);
3741
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*-
2+
* #%L
3+
* OpenAPI Generator for Spring Boot :: Common
4+
* %%
5+
* Copyright (C) 2020 QAware GmbH
6+
* %%
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
* #L%
19+
*/
20+
21+
package de.qaware.openapigeneratorforspring.common.reference.handler;
22+
23+
public interface ReferencedItemBuildContext {
24+
}

0 commit comments

Comments
 (0)