Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refs #2971 - adds modelConverterClasses and objectMapperProcessorClass to config #2973

Merged
merged 1 commit into from
Oct 7, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions modules/swagger-gradle-plugin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ Parameter | Description | Required | Default
`scannerClass`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|
`readAllResources`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|
`ignoredRoutes`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|
`objectMapperProcessorClass`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|
`modelConverterClasses`|see [configuration property](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-Configuration#configuration-properties)|false|

***

Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -58,6 +59,9 @@ public enum Format {JSON, YAML, JSONANDYAML};

private String encoding = "UTF-8";

private LinkedHashSet<String> modelConverterClasses;
private String objectMapperProcessorClass;

@Input
@Optional
public String getOutputFileName() {
Expand Down Expand Up @@ -139,6 +143,22 @@ public void setResourcePackages(Set<String> resourcePackages) {
this.resourcePackages = resourcePackages;
}

/**
* @since 2.0.6
*/
@Input
@Optional
public LinkedHashSet<String> getModelConverterClasses() {
return modelConverterClasses;
}

/**
* @since 2.0.6
*/
public void setModelConverterClasses(LinkedHashSet<String> modelConverterClasses) {
this.modelConverterClasses = modelConverterClasses;
}

@Input
@Optional
public Set<String> getResourceClasses() {
Expand Down Expand Up @@ -169,6 +189,22 @@ public void setReaderClass(String readerClass) {
this.readerClass = readerClass;
}

/**
* @since 2.0.6
*/
@Input
@Optional
public String getObjectMapperProcessorClass() {
return objectMapperProcessorClass;
}

/**
* @since 2.0.6
*/
public void setObjectMapperProcessorClass(String objectMapperProcessorClass) {
this.objectMapperProcessorClass = objectMapperProcessorClass;
}

@Input
@Optional
public String getScannerClass() {
Expand Down Expand Up @@ -289,6 +325,10 @@ public void resolve() throws GradleException {
method=swaggerLoaderClass.getDeclaredMethod("setResourceClasses",String.class);
method.invoke(swaggerLoader, resourceClasses.stream().map(Object::toString).collect(Collectors.joining(",")));
}
if (modelConverterClasses != null && !modelConverterClasses.isEmpty()) {
method=swaggerLoaderClass.getDeclaredMethod("setModelConverterClasses",String.class);
method.invoke(swaggerLoader, modelConverterClasses.stream().map(Object::toString).collect(Collectors.joining(",")));
}
if (ignoredRoutes != null && !ignoredRoutes.isEmpty()) {
method=swaggerLoaderClass.getDeclaredMethod("setIgnoredRoutes",String.class);
method.invoke(swaggerLoader, ignoredRoutes.stream().map(Object::toString).collect(Collectors.joining(",")));
Expand All @@ -309,6 +349,11 @@ public void resolve() throws GradleException {
method.invoke(swaggerLoader, scannerClass);
}

if (StringUtils.isNotBlank(objectMapperProcessorClass)) {
method=swaggerLoaderClass.getDeclaredMethod("setObjectMapperProcessorClass",String.class);
method.invoke(swaggerLoader, objectMapperProcessorClass);
}

method=swaggerLoaderClass.getDeclaredMethod("setPrettyPrint", Boolean.class);
method.invoke(swaggerLoader, prettyPrint);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package io.swagger.v3.oas.integration;

import io.swagger.v3.core.converter.ModelConverter;
import io.swagger.v3.core.converter.ModelConverters;
import io.swagger.v3.core.util.Json;
import io.swagger.v3.core.util.Yaml;
import io.swagger.v3.oas.integration.api.ObjectMapperProcessor;
import io.swagger.v3.oas.integration.api.OpenAPIConfiguration;
import io.swagger.v3.oas.integration.api.OpenApiConfigurationLoader;
import io.swagger.v3.oas.integration.api.OpenApiContext;
Expand All @@ -14,6 +19,7 @@
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand All @@ -33,6 +39,9 @@ public class GenericOpenApiContext<T extends GenericOpenApiContext> implements O
private OpenApiReader openApiReader;
private OpenApiScanner openApiScanner;

private ObjectMapperProcessor objectMapperProcessor;
private Set<ModelConverter> modelConverters;

private ConcurrentHashMap<String, Cache> cache = new ConcurrentHashMap<>();

// 0 doesn't cache
Expand Down Expand Up @@ -152,6 +161,53 @@ public final T parent(OpenApiContext parent) {
return (T) this;
}

/**
* @since 2.0.6
*/
public ObjectMapperProcessor getObjectMapperProcessor() {
return objectMapperProcessor;
}

/**
* @since 2.0.6
*/
@Override
public void setObjectMapperProcessor(ObjectMapperProcessor objectMapperProcessor) {
this.objectMapperProcessor = objectMapperProcessor;
}

/**
* @since 2.0.6
*/
public final T objectMapperProcessor(ObjectMapperProcessor objectMapperProcessor) {
this.objectMapperProcessor = objectMapperProcessor;
return (T) this;
}

/**
* @since 2.0.6
*/
public Set<ModelConverter> getModelConverters() {
return modelConverters;
}

/**
* @since 2.0.6
*/
@Override
public void setModelConverters(Set<ModelConverter> modelConverters) {
this.modelConverters = modelConverters;
}

/**
* @since 2.0.6
*/
public final T modelConverters(Set<ModelConverter> modelConverters) {
this.modelConverters = modelConverters;
return (T) this;
}


protected void register() {
OpenApiContextLocator.getInstance().putOpenApiContext(id, this);
}
Expand Down Expand Up @@ -203,6 +259,28 @@ protected OpenApiScanner buildScanner(final OpenAPIConfiguration openApiConfigur
return scanner;
}

protected ObjectMapperProcessor buildObjectMapperProcessor(final OpenAPIConfiguration openApiConfiguration) throws Exception {
ObjectMapperProcessor objectMapperProcessor = null;
if (StringUtils.isNotBlank(openApiConfiguration.getObjectMapperProcessorClass())) {
Class cls = getClass().getClassLoader().loadClass(openApiConfiguration.getObjectMapperProcessorClass());
objectMapperProcessor = (ObjectMapperProcessor) cls.newInstance();
}
return objectMapperProcessor;
}

protected Set<ModelConverter> buildModelConverters(final OpenAPIConfiguration openApiConfiguration) throws Exception {
if (openApiConfiguration.getModelConverterClasses() != null && !openApiConfiguration.getModelConverterClasses().isEmpty()) {
LinkedHashSet<ModelConverter> modelConverters = new LinkedHashSet<>();
for (String converterClass: openApiConfiguration.getModelConverterClasses()) {
Class cls = getClass().getClassLoader().loadClass(converterClass);
ModelConverter converter = (ModelConverter) cls.newInstance();
modelConverters.add(converter);
}
return modelConverters;
}
return null;
}

protected List<ImmutablePair<String, String>> getKnownLocations() {
return Arrays.asList(
new ImmutablePair<>("classpath", "openapi-configuration.yaml"),
Expand Down Expand Up @@ -277,11 +355,38 @@ public T init() throws OpenApiConfigurationException {
if (openApiScanner == null) {
openApiScanner = buildScanner(ContextUtils.deepCopy(openApiConfiguration));
}
if (objectMapperProcessor == null) {
objectMapperProcessor = buildObjectMapperProcessor(ContextUtils.deepCopy(openApiConfiguration));
}
if (modelConverters == null || modelConverters.isEmpty()) {
modelConverters = buildModelConverters(ContextUtils.deepCopy(openApiConfiguration));
}
} catch (Exception e) {
LOGGER.error("error initializing context: " + e.getMessage(), e);
throw new OpenApiConfigurationException("error initializing context: " + e.getMessage(), e);
}

try {
if (objectMapperProcessor != null) {
objectMapperProcessor.processJsonObjectMapper(Json.mapper());
objectMapperProcessor.processYamlObjectMapper(Yaml.mapper());
}
} catch (Exception e) {
LOGGER.error("error configuring objectMapper: " + e.getMessage(), e);
throw new OpenApiConfigurationException("error configuring objectMapper: " + e.getMessage(), e);
}

try {
if (modelConverters != null && !modelConverters.isEmpty()) {
for (ModelConverter converter: modelConverters) {
ModelConverters.getInstance().addConverter(converter);
}
}
} catch (Exception e) {
LOGGER.error("error configuring model converters: " + e.getMessage(), e);
throw new OpenApiConfigurationException("error configuring model converters: " + e.getMessage(), e);
}

// set cache TTL if present in configuration
if (openApiConfiguration.getCacheTTL() != null) {
this.cacheTTL = openApiConfiguration.getCacheTTL();
Expand Down Expand Up @@ -337,6 +442,13 @@ private OpenAPIConfiguration mergeParentConfiguration(OpenAPIConfiguration confi
if (merged.isReadAllResources() == null) {
merged.setReadAllResources(parentConfig.isReadAllResources());
}
if (merged.getObjectMapperProcessorClass() == null) {
merged.setObjectMapperProcessorClass(parentConfig.getObjectMapperProcessorClass());
}
if (merged.getModelConverterClasses() == null) {
merged.setModelConverterClassess(parentConfig.getModelConverterClasses());
}

return merged;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ public class SwaggerConfiguration implements OpenAPIConfiguration {
private Collection<String> ignoredRoutes;
private Long cacheTTL = -1L;

private Set<String> modelConverterClasses;
private String objectMapperProcessorClass;

public Long getCacheTTL() {
return cacheTTL;
}
Expand Down Expand Up @@ -185,4 +188,47 @@ public void setId(String id) {
this.id = id;
}

/**
* @since 2.0.6
*/
public SwaggerConfiguration objectMapperProcessorClass(String objectMapperProcessorClass) {
this.objectMapperProcessorClass = objectMapperProcessorClass;
return this;
}

/**
* @since 2.0.6
*/
public String getObjectMapperProcessorClass() {
return objectMapperProcessorClass;
}

/**
* @since 2.0.6
*/
public void setObjectMapperProcessorClass(String objectMapperProcessorClass) {
this.objectMapperProcessorClass = objectMapperProcessorClass;
}

/**
* @since 2.0.6
*/
public Set<String> getModelConverterClasses() {
return modelConverterClasses;
}

/**
* @since 2.0.6
*/
public void setModelConverterClassess(Set<String> modelConverterClasses) {
this.modelConverterClasses = modelConverterClasses;
}

/**
* @since 2.0.6
*/
public SwaggerConfiguration modelConverterClasses(Set<String> modelConverterClasses) {
this.modelConverterClasses = modelConverterClasses;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.swagger.v3.oas.integration.api;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
* @since 2.0.6
*/
public interface ObjectMapperProcessor {

void processJsonObjectMapper(ObjectMapper mapper);
void processYamlObjectMapper(ObjectMapper mapper);
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,15 @@ public interface OpenAPIConfiguration {
Boolean isPrettyPrint();

Long getCacheTTL();

/**
* @since 2.0.6
*/
public String getObjectMapperProcessorClass();

/**
* @since 2.0.6
*/
public Set<String> getModelConverterClasses();

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package io.swagger.v3.oas.integration.api;

import io.swagger.v3.core.converter.ModelConverter;
import io.swagger.v3.oas.integration.OpenApiConfigurationException;
import io.swagger.v3.oas.models.OpenAPI;

import java.util.Set;

public interface OpenApiContext {

String OPENAPI_CONTEXT_ID_KEY = "openapi.context.id";
Expand All @@ -25,4 +28,14 @@ public interface OpenApiContext {

void setOpenApiReader(OpenApiReader openApiReader);

/**
* @since 2.0.6
*/
void setObjectMapperProcessor(ObjectMapperProcessor objectMapperProcessor);

/**
* @since 2.0.6
*/
void setModelConverters(Set<ModelConverter> modelConverters);

}
Loading