Skip to content

Commit b979a56

Browse files
committed
refs swagger-api#2312 - enhanced support for custom reader and scanner
1 parent f4aea21 commit b979a56

File tree

14 files changed

+110
-64
lines changed

14 files changed

+110
-64
lines changed

modules/swagger-integration/src/main/java/io/swagger/oas/integration/ContextUtils.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.swagger.oas.integration;
22

3+
import io.swagger.oas.web.OpenAPIConfig;
34
import io.swagger.util.Json;
45
import org.slf4j.Logger;
56
import org.slf4j.LoggerFactory;
@@ -20,4 +21,18 @@ public static OpenApiConfiguration deepCopy (OpenApiConfiguration config) {
2021
}
2122
}
2223

24+
public static OpenApiConfiguration cloneConfigFromInterface(OpenAPIConfig configInterface) {
25+
26+
return new OpenApiConfiguration()
27+
.openApi(configInterface.getOpenAPI())
28+
.userDefinedOptions(configInterface.getUserDefinedOptions())
29+
.filterClass(configInterface.getFilterClass())
30+
.prettyPrint(configInterface.isPrettyPrint())
31+
.readerClass(configInterface.getReaderClass())
32+
.resourcePackages(configInterface.getResourcePackages())
33+
.resourceClasses(configInterface.getResourceClasses())
34+
.scanAllResources(configInterface.isScanAllResources())
35+
.scannerClass(configInterface.getScannerClass());
36+
}
37+
2338
}

modules/swagger-integration/src/main/java/io/swagger/oas/integration/GenericOpenApiContext.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.swagger.oas.integration;
22

33
import io.swagger.oas.models.OpenAPI;
4+
import io.swagger.oas.web.OpenAPIConfig;
45
import io.swagger.oas.web.OpenApiReader;
56
import io.swagger.oas.web.OpenApiScanner;
67
import org.apache.commons.lang3.StringUtils;
@@ -166,27 +167,36 @@ protected OpenApiReader buildReader(final OpenApiConfiguration openApiConfigurat
166167
OpenApiReader reader;
167168
if (StringUtils.isNotBlank(openApiConfiguration.getReaderClass())) {
168169
Class cls = getClass().getClassLoader().loadClass(openApiConfiguration.getReaderClass());
169-
// TODO instantiate with configuration
170170
reader = (OpenApiReader) cls.newInstance();
171171
} else {
172-
reader = (classes, resources) -> {
173-
OpenAPI openApi = openApiConfiguration.getOpenAPI();
174-
return openApi;
172+
reader = new OpenApiReader() {
175173

174+
OpenAPIConfig openApiConfiguration;
175+
@Override
176+
public void setConfiguration(OpenAPIConfig openApiConfiguration) {
177+
this.openApiConfiguration = openApiConfiguration;
178+
}
179+
180+
@Override
181+
public OpenAPI read(Set<Class<?>> classes, Map<String, Object> resources) {
182+
OpenAPI openApi = openApiConfiguration.getOpenAPI();
183+
return openApi;
184+
}
176185
};
177186
}
187+
reader.setConfiguration(openApiConfiguration);
178188
return reader;
179189
}
180190

181191
protected OpenApiScanner buildScanner(final OpenApiConfiguration openApiConfiguration) throws Exception {
182192
OpenApiScanner scanner;
183193
if (StringUtils.isNotBlank(openApiConfiguration.getScannerClass())) {
184194
Class cls = getClass().getClassLoader().loadClass(openApiConfiguration.getScannerClass());
185-
// TODO instantiate with configuration
186195
scanner = (OpenApiScanner) cls.newInstance();
187196
} else {
188-
scanner = new GenericOpenApiScanner(openApiConfiguration);
197+
scanner = new GenericOpenApiScanner();
189198
}
199+
scanner.setConfiguration(openApiConfiguration);
190200
return scanner;
191201
}
192202

modules/swagger-integration/src/main/java/io/swagger/oas/integration/GenericOpenApiScanner.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.swagger.oas.integration;
22

3+
import io.swagger.oas.web.OpenAPIConfig;
34
import io.swagger.oas.web.OpenApiScanner;
45
import org.apache.commons.lang3.StringUtils;
56
import org.reflections.Reflections;
@@ -22,8 +23,9 @@ public class GenericOpenApiScanner implements OpenApiScanner {
2223

2324
OpenApiConfiguration openApiConfiguration;
2425

25-
public GenericOpenApiScanner(OpenApiConfiguration openApiConfiguration) {
26-
this.openApiConfiguration = openApiConfiguration;
26+
@Override
27+
public void setConfiguration(OpenAPIConfig openApiConfiguration) {
28+
this.openApiConfiguration = ContextUtils.cloneConfigFromInterface(openApiConfiguration);
2729
}
2830

2931
@Override

modules/swagger-integration/src/main/java/io/swagger/oas/integration/ServiceOpenApiConfigurationLoader.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.swagger.oas.integration;
22

3-
import io.swagger.oas.web.OpenAPIConfig;
43
import io.swagger.oas.web.OpenAPIConfigBuilder;
54

65
import java.io.IOException;
@@ -14,7 +13,7 @@ public OpenApiConfiguration load(String path) throws IOException {
1413

1514
ServiceLoader<OpenAPIConfigBuilder> loader = ServiceLoader.load(OpenAPIConfigBuilder.class);
1615
if (loader.iterator().hasNext()) {
17-
return cloneFromInterface(loader.iterator().next().build());
16+
return ContextUtils.cloneConfigFromInterface(loader.iterator().next().build());
1817
}
1918
throw new IOException("Error loading OpenAPIConfigBuilder service implementation.");
2019
}
@@ -33,18 +32,4 @@ public boolean exists(String path) {
3332
return false;
3433
}
3534
}
36-
37-
private OpenApiConfiguration cloneFromInterface(OpenAPIConfig configInterface) {
38-
39-
return new OpenApiConfiguration()
40-
.openApi(configInterface.getOpenAPI())
41-
.userDefinedOptions(configInterface.getUserDefinedOptions())
42-
.filterClass(configInterface.getFilterClass())
43-
.prettyPrint(configInterface.isPrettyPrint())
44-
.readerClass(configInterface.getReaderClass())
45-
.resourcePackages(configInterface.getResourcePackages())
46-
.resourceClasses(configInterface.getResourceClasses())
47-
.scanAllResources(configInterface.isScanAllResources())
48-
.scannerClass(configInterface.getScannerClass());
49-
}
5035
}

modules/swagger-integration/src/main/resources/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Manifest-Version: 1.0
2-
Bnd-LastModified: 1501577298741
2+
Bnd-LastModified: 1501600916611
33
Build-Jdk: 1.8.0_72
44
Built-By: frantuma
55
Bundle-Description: Sonatype helps open source projects to set up Maven

modules/swagger-jaxrs2/src/main/java/io/swagger/jaxrs2/Reader.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.swagger.oas.models.parameters.RequestBody;
2424
import io.swagger.oas.models.security.SecurityScheme;
2525
import io.swagger.oas.models.tags.Tag;
26+
import io.swagger.oas.web.OpenAPIConfig;
2627
import io.swagger.oas.web.OpenApiReader;
2728
import io.swagger.util.Json;
2829
import io.swagger.util.ParameterProcessor;
@@ -54,7 +55,7 @@ public class Reader implements OpenApiReader {
5455
private static final Logger LOGGER = LoggerFactory.getLogger(Reader.class);
5556
public static final String DEFAULT_MEDIA_TYPE_VALUE = "*/*";
5657

57-
private final OpenApiConfiguration config;
58+
protected OpenApiConfiguration config;
5859

5960
private OpenAPI openAPI;
6061
private Components components;
@@ -73,20 +74,22 @@ public class Reader implements OpenApiReader {
7374
private static final String HEAD_METHOD = "head";
7475
private static final String OPTIONS_METHOD = "options";
7576

77+
public Reader() {
78+
this.openAPI = new OpenAPI();
79+
paths = new Paths();
80+
openApiTags = new LinkedHashSet<>();
81+
components = new Components();
82+
83+
}
7684
public Reader(OpenAPI openAPI) {
77-
this(ContextUtils.deepCopy(new OpenApiConfiguration().openApi(openAPI)));
85+
this();
86+
setConfiguration(new OpenApiConfiguration().openApi(openAPI));
7887
}
7988

8089
public Reader(OpenApiConfiguration openApiConfiguration) {
81-
this.config = ContextUtils.deepCopy(openApiConfiguration);
82-
83-
// TODO init openApi by cloning the one in config
84-
//clone openApiConfiguration.getOpenAPI();
90+
this();
91+
setConfiguration(openApiConfiguration);
8592
this.openAPI = config.getOpenAPI();
86-
paths = new Paths();
87-
openApiTags = new LinkedHashSet<>();
88-
//this.config = new DefaultReaderConfig();
89-
components = new Components();
9093
}
9194

9295
public OpenAPI getOpenAPI() {
@@ -131,6 +134,11 @@ public int compare(Class<?> class1, Class<?> class2) {
131134
return openAPI;
132135
}
133136

137+
@Override
138+
public void setConfiguration(OpenAPIConfig openApiConfiguration) {
139+
this.config = ContextUtils.deepCopy(ContextUtils.cloneConfigFromInterface(openApiConfiguration));
140+
}
141+
134142
public OpenAPI read(Set<Class<?>> classes, Map<String, Object> resources) {
135143
return read(classes);
136144
}

modules/swagger-jaxrs2/src/main/java/io/swagger/jaxrs2/integration/JaxrsAnnotationScanner.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package io.swagger.jaxrs2.integration;
22

3+
import io.swagger.oas.integration.ContextUtils;
34
import io.swagger.oas.integration.OpenApiConfiguration;
4-
import io.swagger.oas.web.OpenApiScanner;
5+
import io.swagger.oas.web.OpenAPIConfig;
56
import org.reflections.Reflections;
67
import org.reflections.scanners.ResourcesScanner;
78
import org.reflections.scanners.SubTypesScanner;
@@ -11,21 +12,40 @@
1112
import org.slf4j.Logger;
1213
import org.slf4j.LoggerFactory;
1314

15+
import javax.ws.rs.core.Application;
1416
import java.util.HashMap;
1517
import java.util.HashSet;
1618
import java.util.Map;
1719
import java.util.Set;
1820

19-
public class JaxrsAnnotationScanner<T extends JaxrsAnnotationScanner<T>> implements OpenApiScanner {
21+
public class JaxrsAnnotationScanner<T extends JaxrsAnnotationScanner<T>> implements JaxrsOpenApiScanner {
2022

21-
private OpenApiConfiguration openApiConfiguration;
23+
protected OpenApiConfiguration openApiConfiguration;
24+
protected Application application;
2225
protected static Logger LOGGER = LoggerFactory.getLogger(JaxrsAnnotationScanner.class);
2326

27+
public JaxrsAnnotationScanner application (Application application) {
28+
this.application = application;
29+
return this;
30+
}
31+
32+
@Override
33+
public void setApplication(Application application) {
34+
this.application = application;
35+
}
36+
37+
38+
2439
public T openApiConfiguration (OpenApiConfiguration openApiConfiguration) {
2540
this.openApiConfiguration = openApiConfiguration;
2641
return (T)this;
2742
}
2843

44+
@Override
45+
public void setConfiguration(OpenAPIConfig openApiConfiguration) {
46+
this.openApiConfiguration = ContextUtils.cloneConfigFromInterface(openApiConfiguration);
47+
}
48+
2949
@Override
3050
public Set<Class<?>> classes() {
3151

modules/swagger-jaxrs2/src/main/java/io/swagger/jaxrs2/integration/JaxrsApplicationAndAnnotationScanner.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,21 @@
11
package io.swagger.jaxrs2.integration;
22

3-
import javax.ws.rs.core.Application;
43
import java.util.HashSet;
54
import java.util.Set;
65

76
public class JaxrsApplicationAndAnnotationScanner extends JaxrsAnnotationScanner<JaxrsApplicationAndAnnotationScanner> {
87

9-
private Application app;
10-
11-
public JaxrsApplicationAndAnnotationScanner application (Application app) {
12-
this.app = app;
13-
return this;
14-
}
158

169
@Override
1710
public Set<Class<?>> classes() {
1811
Set<Class<?>> classes = super.classes();
1912
Set<Class<?>> output = new HashSet<Class<?>>();
20-
if (app != null) {
21-
Set<Class<?>> clz = app.getClasses();
13+
if (application != null) {
14+
Set<Class<?>> clz = application.getClasses();
2215
if (clz != null) {
2316
output.addAll(clz);
2417
}
25-
Set<Object> singletons = app.getSingletons();
18+
Set<Object> singletons = application.getSingletons();
2619
if (singletons != null) {
2720
for (Object o : singletons) {
2821
output.add(o.getClass());

modules/swagger-jaxrs2/src/main/java/io/swagger/jaxrs2/integration/JaxrsApplicationScanner.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,19 @@
11
package io.swagger.jaxrs2.integration;
22

3-
import javax.ws.rs.core.Application;
43
import java.util.HashSet;
54
import java.util.Set;
65

76
public class JaxrsApplicationScanner extends JaxrsAnnotationScanner<JaxrsApplicationScanner> {
87

9-
private Application app;
10-
11-
public JaxrsApplicationScanner application (Application app) {
12-
this.app = app;
13-
return this;
14-
}
15-
168
@Override
179
public Set<Class<?>> classes() {
1810
Set<Class<?>> output = new HashSet<Class<?>>();
19-
if (app != null) {
20-
Set<Class<?>> clz = app.getClasses();
11+
if (application != null) {
12+
Set<Class<?>> clz = application.getClasses();
2113
if (clz != null) {
2214
output.addAll(clz);
2315
}
24-
Set<Object> singletons = app.getSingletons();
16+
Set<Object> singletons = application.getSingletons();
2517
if (singletons != null) {
2618
for (Object o : singletons) {
2719
output.add(o.getClass());

modules/swagger-jaxrs2/src/main/java/io/swagger/jaxrs2/integration/JaxrsOpenApiContext.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,28 @@ protected OpenApiReader buildReader(OpenApiConfiguration openApiConfiguration) t
3232
OpenApiReader reader;
3333
if (StringUtils.isNotBlank(openApiConfiguration.getReaderClass())) {
3434
Class cls = getClass().getClassLoader().loadClass(openApiConfiguration.getReaderClass());
35-
// TODO instantiate with configuration
3635
reader = (OpenApiReader) cls.newInstance();
3736
} else {
3837
reader = new Reader(openApiConfiguration);
3938
}
39+
reader.setConfiguration(openApiConfiguration);
4040
return reader;
4141
}
4242

4343
@Override
4444
protected OpenApiScanner buildScanner(OpenApiConfiguration openApiConfiguration) throws Exception {
45+
4546
OpenApiScanner scanner;
4647
if (StringUtils.isNotBlank(openApiConfiguration.getScannerClass())) {
4748
Class cls = getClass().getClassLoader().loadClass(openApiConfiguration.getScannerClass());
48-
// TODO instantiate with configuration
4949
scanner = (OpenApiScanner) cls.newInstance();
5050
} else {
51-
scanner = new JaxrsApplicationAndAnnotationScanner().application(app).openApiConfiguration(openApiConfiguration);
51+
scanner = new JaxrsApplicationAndAnnotationScanner();
52+
}
53+
scanner.setConfiguration(openApiConfiguration);
54+
if (scanner instanceof JaxrsOpenApiScanner) {
55+
((JaxrsOpenApiScanner)scanner).setApplication(app);
5256
}
5357
return scanner;
5458
}
55-
5659
}

0 commit comments

Comments
 (0)