Skip to content

Commit e043c4e

Browse files
committed
Merge branch 'feature/4.0-swagger' into feature/5.3-swagger
# Conflicts: # web/src/main/java/com/graphhopper/application/ObjectNodeConverter.java
2 parents af5ac0b + e53bfa7 commit e043c4e

File tree

3 files changed

+84
-2
lines changed

3 files changed

+84
-2
lines changed

web/pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,17 @@
5050
<scope>test</scope>
5151
</dependency>
5252

53+
<dependency>
54+
<groupId>io.swagger.core.v3</groupId>
55+
<artifactId>swagger-jaxrs2</artifactId>
56+
<version>2.1.11</version>
57+
</dependency>
58+
<dependency>
59+
<groupId>io.swagger.core.v3</groupId>
60+
<artifactId>swagger-jaxrs2-servlet-initializer-v2</artifactId>
61+
<version>2.1.11</version>
62+
</dependency>
63+
5364
<!-- for integration tests of service -->
5465
<dependency>
5566
<groupId>com.graphhopper</groupId>

web/src/main/java/com/graphhopper/application/GraphHopperApplication.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,23 @@
2626
import com.graphhopper.navigation.NavigateResource;
2727
import io.dropwizard.Application;
2828
import io.dropwizard.assets.AssetsBundle;
29+
import io.dropwizard.configuration.EnvironmentVariableSubstitutor;
30+
import io.dropwizard.configuration.SubstitutingSourceProvider;
2931
import io.dropwizard.setup.Bootstrap;
3032
import io.dropwizard.setup.Environment;
31-
32-
import javax.servlet.DispatcherType;
33+
import io.swagger.v3.core.converter.ModelConverters;
34+
import io.swagger.v3.jaxrs2.integration.JaxrsOpenApiContextBuilder;
35+
import io.swagger.v3.jaxrs2.integration.resources.OpenApiResource;
36+
import io.swagger.v3.oas.integration.OpenApiConfigurationException;
37+
import io.swagger.v3.oas.integration.SwaggerConfiguration;
38+
import io.swagger.v3.oas.models.OpenAPI;
39+
import io.swagger.v3.oas.models.info.Info;
40+
import io.swagger.v3.oas.models.servers.Server;
41+
import java.util.Collections;
3342
import java.util.EnumSet;
43+
import java.util.stream.Collectors;
44+
import java.util.stream.Stream;
45+
import javax.servlet.DispatcherType;
3446

3547
public final class GraphHopperApplication extends Application<GraphHopperServerConfiguration> {
3648

@@ -40,6 +52,9 @@ public static void main(String[] args) throws Exception {
4052

4153
@Override
4254
public void initialize(Bootstrap<GraphHopperServerConfiguration> bootstrap) {
55+
bootstrap.setConfigurationSourceProvider(new SubstitutingSourceProvider(
56+
bootstrap.getConfigurationSourceProvider(),
57+
new EnvironmentVariableSubstitutor(false)));
4358
bootstrap.addBundle(new GraphHopperBundle());
4459
bootstrap.addBundle(new RealtimeBundle());
4560
bootstrap.addCommand(new ImportCommand());
@@ -51,8 +66,34 @@ public void initialize(Bootstrap<GraphHopperServerConfiguration> bootstrap) {
5166

5267
@Override
5368
public void run(GraphHopperServerConfiguration configuration, Environment environment) {
69+
setupOpenApi(configuration.getGraphHopperConfiguration().getString("api_basepath","http://localhost:8989/"));
70+
ModelConverters.getInstance().addConverter(new ObjectNodeConverter());
5471
environment.jersey().register(new RootResource());
72+
environment.jersey().register(new OpenApiResource());
5573
environment.jersey().register(NavigateResource.class);
5674
environment.servlets().addFilter("cors", CORSFilter.class).addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "*");
5775
}
76+
77+
private void setupOpenApi(String apiBasePath) {
78+
OpenAPI oas = new OpenAPI()
79+
.info(new Info()
80+
.title("Graphhopper API")
81+
.description("Basic Graphhopper autogenerated REST API documentation."))
82+
.servers(Collections.singletonList(new Server().url(apiBasePath)));
83+
84+
SwaggerConfiguration oasConfig = new SwaggerConfiguration()
85+
.openAPI(oas)
86+
.prettyPrint(true)
87+
.resourcePackages(Stream.of("com.graphhopper").collect(Collectors.toSet()));
88+
89+
try {
90+
new JaxrsOpenApiContextBuilder()
91+
//.servletConfig(servletConfig)
92+
//.application(this)
93+
.openApiConfiguration(oasConfig)
94+
.buildContext(true);
95+
} catch (OpenApiConfigurationException e) {
96+
throw new RuntimeException(e.getMessage(), e);
97+
}
98+
}
5899
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.graphhopper.application;
2+
3+
import com.fasterxml.jackson.databind.JavaType;
4+
import com.fasterxml.jackson.databind.node.ObjectNode;
5+
import io.swagger.v3.core.converter.AnnotatedType;
6+
import io.swagger.v3.core.converter.ModelConverter;
7+
import io.swagger.v3.core.converter.ModelConverterContext;
8+
import io.swagger.v3.core.util.Json;
9+
import io.swagger.v3.oas.models.media.ObjectSchema;
10+
import io.swagger.v3.oas.models.media.Schema;
11+
import java.util.Iterator;
12+
13+
public class ObjectNodeConverter implements ModelConverter {
14+
15+
@Override
16+
public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
17+
JavaType _type = Json.mapper().constructType(type.getType());
18+
if (_type != null) {
19+
Class<?> cls = _type.getRawClass();
20+
if (ObjectNode.class.isAssignableFrom(cls)) {
21+
return new ObjectSchema();
22+
}
23+
}
24+
if (chain.hasNext()) {
25+
return chain.next().resolve(type, context, chain);
26+
} else {
27+
return null;
28+
}
29+
}
30+
}

0 commit comments

Comments
 (0)