Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,18 @@
public abstract class AbstractModelConverter implements ModelConverter {
protected final ObjectMapper _mapper;
protected final AnnotationIntrospector _intr;
protected final TypeNameResolver _typeNameResolver = TypeNameResolver.std;
protected final TypeNameResolver _typeNameResolver;
/**
* Minor optimization: no need to keep on resolving same types over and over
* again.
*/
protected Map<JavaType, String> _resolvedTypeNames = new ConcurrentHashMap<JavaType, String>();

protected AbstractModelConverter(ObjectMapper mapper) {
this(mapper, TypeNameResolver.std);
}

protected AbstractModelConverter(ObjectMapper mapper, TypeNameResolver typeNameResolver) {
mapper.registerModule(
new SimpleModule("swagger", Version.unknownVersion()) {
@Override
Expand All @@ -43,6 +47,7 @@ public void setupModule(SetupContext context) {
}
});
_mapper = mapper;
_typeNameResolver = typeNameResolver;
_intr = mapper.getSerializationConfig().getAnnotationIntrospector();

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ public class ModelResolver extends AbstractModelConverter implements ModelConver
public ModelResolver(ObjectMapper mapper) {
super(mapper);
}
public ModelResolver(ObjectMapper mapper, TypeNameResolver typeNameResolver) {
super(mapper, typeNameResolver);
}

public ObjectMapper objectMapper() {
return _mapper;
Expand Down Expand Up @@ -641,7 +644,7 @@ parent class @ApiModel annotation, then do the following:
/**
* Decorate the name based on the JsonView
*/
private String decorateModelName(ModelConverterContext context, String originalName) {
protected String decorateModelName(ModelConverterContext context, String originalName) {
String name = originalName;
if (context.getJsonView() != null && context.getJsonView().value().length > 0) {
String COMBINER = "-or-";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package io.swagger.model.override;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
import io.swagger.converter.ModelConverters;
import io.swagger.jackson.ModelResolver;
import io.swagger.jackson.TypeNameResolver;
import io.swagger.models.Model;
import io.swagger.models.properties.Property;
import io.swagger.models.properties.RefProperty;
import io.swagger.util.Json;
import org.apache.commons.lang3.StringUtils;
import org.testng.annotations.Test;

import java.util.Map;
import java.util.Set;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;

public class CustomResolverTest {

@Test(description = "it should ignore properties with type Bar")
public void testCustomConverter() {
// add the custom converter
final ModelConverters converters = new ModelConverters();
converters.addConverter(new CustomConverter(Json.mapper()));

Map<String, Model> models = converters.readAll(Foo.class);
Model model = models.get("io.swagger.model.override.CustomResolverTest$Foo");
assertNotNull(model);
assertEquals(model.getProperties().size(), 2);

final RefProperty barProperty = (RefProperty) model.getProperties().get("bar");
assertEquals(barProperty.get$ref(), "#/definitions/io.swagger.model.override.CustomResolverTest$Bar");

final Property titleProperty = model.getProperties().get("title");
assertNotNull(titleProperty);

model = models.get("io.swagger.model.override.CustomResolverTest$Bar");
assertNotNull(model);

}

class CustomConverter extends ModelResolver {

public CustomConverter(ObjectMapper mapper) {
super(mapper, new QualifiedTypeNameResolver());
}
}

class QualifiedTypeNameResolver extends TypeNameResolver {

@Override
protected String nameForClass(Class<?> cls, Set<Options> options) {
String className = cls.getName().startsWith("java.") ? cls.getSimpleName() : cls.getName();
if (options.contains(Options.SKIP_API_MODEL)) {
return className;
}
final ApiModel model = cls.getAnnotation(ApiModel.class);
final String modelName = model == null ? null : StringUtils.trimToNull(model.value());
return modelName == null ? className : modelName;
}
}

class Foo {
public Bar bar = null;
public String title = null;
}

class Bar {
public String foo = null;
}
}