Skip to content

Commit 7810660

Browse files
committed
refs #3060 #3935 - build time / ext app applicationPath resolving
1 parent 6e99f8d commit 7810660

File tree

14 files changed

+119
-4
lines changed

14 files changed

+119
-4
lines changed

modules/swagger-gradle-plugin/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ Parameter | Description | Required | Default
8484
`resourceClasses`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|
8585
`prettyPrint`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|`TRUE`
8686
`sortOutput`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|`FALSE`
87+
`alwaysResolveAppPath`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|`FALSE`
8788
`openApiFile`|openapi file to be merged with resolved specification, equivalent to [config](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties) openAPI|false|
8889
`filterClass`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|
8990
`readerClass`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|
@@ -118,3 +119,5 @@ info:
118119
119120
Since version 2.1.6, `sortOutput` parameter is available, allowing to sort object properties and map keys alphabetically.
120121
Since version 2.1.6, `objectMapperProcessorClass` allows to configure also the ObjectMapper instance used to serialize the resolved OpenAPI
122+
Since version 2.1.9, `alwaysResolveAppPath` parameter is available, allowing to trigger resolving of Application Path from annotaion also not in runtime (e.g. using servlet in separate application, or in maven plugin at build time, etc)
123+

modules/swagger-gradle-plugin/src/main/java/io/swagger/v3/plugins/gradle/tasks/ResolveTask.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ public enum Format {JSON, YAML, JSONANDYAML};
6767
private String objectMapperProcessorClass;
6868

6969
private Boolean sortOutput = Boolean.FALSE;
70+
private Boolean alwaysResolveAppPath = Boolean.FALSE;
71+
7072

7173
private String contextId;
7274

@@ -306,6 +308,15 @@ public void setSortOutput(Boolean sortOutput) {
306308
this.sortOutput = sortOutput;
307309
}
308310

311+
@Input
312+
@Optional
313+
public Boolean getAlwaysResolveAppPath() {
314+
return alwaysResolveAppPath;
315+
}
316+
317+
public void setAlwaysResolveAppPath(Boolean alwaysResolveAppPath) {
318+
this.alwaysResolveAppPath = alwaysResolveAppPath;
319+
}
309320

310321
@TaskAction
311322
public void resolve() throws GradleException {
@@ -406,6 +417,9 @@ public void resolve() throws GradleException {
406417
method=swaggerLoaderClass.getDeclaredMethod("setSortOutput", Boolean.class);
407418
method.invoke(swaggerLoader, sortOutput);
408419

420+
method=swaggerLoaderClass.getDeclaredMethod("setAlwaysResolveAppPath", Boolean.class);
421+
method.invoke(swaggerLoader, alwaysResolveAppPath);
422+
409423
method=swaggerLoaderClass.getDeclaredMethod("setReadAllResources", Boolean.class);
410424
method.invoke(swaggerLoader, readAllResources);
411425

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,9 @@ private OpenAPIConfiguration mergeParentConfiguration(OpenAPIConfiguration confi
527527
if (merged.isSortOutput() == null) {
528528
merged.setSortOutput(parentConfig.isSortOutput());
529529
}
530+
if (merged.isAlwaysResolveAppPath() == null) {
531+
merged.setAlwaysResolveAppPath(parentConfig.isAlwaysResolveAppPath());
532+
}
530533
if (merged.isReadAllResources() == null) {
531534
merged.setReadAllResources(parentConfig.isReadAllResources());
532535
}

modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/SwaggerConfiguration.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public class SwaggerConfiguration implements OpenAPIConfiguration {
3232

3333
private Boolean sortOutput;
3434

35+
private Boolean alwaysResolveAppPath;
36+
3537
public Long getCacheTTL() {
3638
return cacheTTL;
3739
}
@@ -256,4 +258,27 @@ public SwaggerConfiguration sortOutput(Boolean sortOutput) {
256258
setSortOutput(sortOutput);
257259
return this;
258260
}
261+
262+
/**
263+
* @since 2.1.9
264+
*/
265+
@Override
266+
public Boolean isAlwaysResolveAppPath() {
267+
return alwaysResolveAppPath;
268+
}
269+
270+
/**
271+
* @since 2.1.9
272+
*/
273+
public void setAlwaysResolveAppPath(Boolean alwaysResolveAppPath) {
274+
this.alwaysResolveAppPath = alwaysResolveAppPath;
275+
}
276+
277+
/**
278+
* @since 2.1.9
279+
*/
280+
public SwaggerConfiguration alwaysResolveAppPath(Boolean alwaysResolveAppPath) {
281+
setAlwaysResolveAppPath(alwaysResolveAppPath);
282+
return this;
283+
}
259284
}

modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/api/OpenAPIConfiguration.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,9 @@ public interface OpenAPIConfiguration {
4444
*/
4545
Boolean isSortOutput();
4646

47+
/**
48+
* @since 2.1.9
49+
*/
50+
Boolean isAlwaysResolveAppPath();
51+
4752
}

modules/swagger-jaxrs2-servlet-initializer-v2/src/main/java/io/swagger/v3/jaxrs2/integration/servlet/SwaggerServletInitializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import javax.servlet.ServletContext;
1111
import javax.servlet.ServletException;
1212
import javax.servlet.annotation.HandlesTypes;
13+
import javax.ws.rs.ApplicationPath;
1314
import javax.ws.rs.Path;
1415
import java.util.HashSet;
1516
import java.util.LinkedHashSet;
@@ -20,7 +21,7 @@
2021
*
2122
* @since 2.1.2
2223
*/
23-
@HandlesTypes({Path.class, OpenAPIDefinition.class})
24+
@HandlesTypes({Path.class, OpenAPIDefinition.class, ApplicationPath.class})
2425
public class SwaggerServletInitializer implements ServletContainerInitializer {
2526

2627
static final Set<String> ignored = new HashSet();

modules/swagger-jaxrs2-servlet-initializer/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerServletInitializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import javax.servlet.ServletContext;
1010
import javax.servlet.ServletException;
1111
import javax.servlet.annotation.HandlesTypes;
12+
import javax.ws.rs.ApplicationPath;
1213
import javax.ws.rs.Path;
1314
import java.util.HashSet;
1415
import java.util.LinkedHashSet;
@@ -20,7 +21,7 @@
2021
* swagger-jaxrs2-servlet-initializer-v2
2122
*/
2223
@Deprecated
23-
@HandlesTypes({Path.class, OpenAPIDefinition.class})
24+
@HandlesTypes({Path.class, OpenAPIDefinition.class, ApplicationPath.class})
2425
public class SwaggerServletInitializer implements ServletContainerInitializer {
2526

2627
static final Set<String> ignored = new HashSet();

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ public OpenAPI read(Class<?> cls) {
132132
* @return the generated OpenAPI definition
133133
*/
134134
public OpenAPI read(Set<Class<?>> classes) {
135+
135136
Set<Class<?>> sortedClasses = new TreeSet<>((class1, class2) -> {
136137
if (class1.equals(class2)) {
137138
return 0;
@@ -146,6 +147,8 @@ public OpenAPI read(Set<Class<?>> classes) {
146147

147148
Map<Class<?>, ReaderListener> listeners = new HashMap<>();
148149

150+
String appPath = "";
151+
149152
for (Class<?> cls : sortedClasses) {
150153
if (ReaderListener.class.isAssignableFrom(cls) && !listeners.containsKey(cls)) {
151154
try {
@@ -154,6 +157,14 @@ public OpenAPI read(Set<Class<?>> classes) {
154157
LOGGER.error("Failed to create ReaderListener", e);
155158
}
156159
}
160+
if (config != null && Boolean.TRUE.equals(config.isAlwaysResolveAppPath())) {
161+
if (Application.class.isAssignableFrom(cls)) {
162+
ApplicationPath appPathAnnotation = ReflectionUtils.getAnnotation(cls, ApplicationPath.class);
163+
if (appPathAnnotation != null) {
164+
appPath = appPathAnnotation.value();
165+
}
166+
}
167+
}
157168
}
158169

159170
for (ReaderListener listener : listeners.values()) {
@@ -163,9 +174,13 @@ public OpenAPI read(Set<Class<?>> classes) {
163174
LOGGER.error("Unexpected error invoking beforeScan listener [" + listener.getClass().getName() + "]", e);
164175
}
165176
}
177+
String appPathRuntime = resolveApplicationPath();
178+
if (StringUtils.isNotBlank(appPathRuntime)) {
179+
appPath = appPathRuntime;
180+
}
166181

167182
for (Class<?> cls : sortedClasses) {
168-
read(cls, resolveApplicationPath(), null, false, null, null, new LinkedHashSet<String>(), new ArrayList<Parameter>(), new HashSet<Class<?>>());
183+
read(cls, appPath, null, false, null, null, new LinkedHashSet<String>(), new ArrayList<Parameter>(), new HashSet<Class<?>>());
169184
}
170185

171186
for (ReaderListener listener : listeners.values()) {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.slf4j.Logger;
1212
import org.slf4j.LoggerFactory;
1313

14+
import javax.ws.rs.ApplicationPath;
1415
import javax.ws.rs.core.Application;
1516
import java.util.HashMap;
1617
import java.util.HashSet;
@@ -92,6 +93,9 @@ public Set<Class<?>> classes() {
9293
try (ScanResult scanResult = graph.scan()) {
9394
classes = new HashSet<>(scanResult.getClassesWithAnnotation(javax.ws.rs.Path.class.getName()).loadClasses());
9495
classes.addAll(new HashSet<>(scanResult.getClassesWithAnnotation(OpenAPIDefinition.class.getName()).loadClasses()));
96+
if (Boolean.TRUE.equals(openApiConfiguration.isAlwaysResolveAppPath())) {
97+
classes.addAll(new HashSet<>(scanResult.getClassesWithAnnotation(ApplicationPath.class.getName()).loadClasses()));
98+
}
9599
}
96100

97101
for (Class<?> cls : classes) {

modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/ServletConfigContextUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public class ServletConfigContextUtils {
3131
*/
3232
public static final String OPENAPI_CONFIGURATION_SORTOUTPUT_KEY = "openApi.configuration.sortOutput";
3333

34+
/**
35+
* @since 2.1.9
36+
*/
37+
public static final String OPENAPI_CONFIGURATION_ALWAYSRESOLVEAPPPATH_KEY = "openApi.configuration.alwaysResolveAppPath";
38+
3439
/**
3540
* @since 2.0.6
3641
*/

0 commit comments

Comments
 (0)