package io.swagger.models; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.annotations.ApiModelProperty; import io.swagger.converter.ModelConverter; import io.swagger.converter.ModelConverterContext; import io.swagger.jackson.AbstractModelConverter; import io.swagger.models.Model; import io.swagger.models.ModelImpl; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.tuple.Pair; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.Iterator; import java.util.Set; public class ModelWithTuple2 { @ApiModelProperty(value = "Possible values for state property of timesheet or timesheet entry", required = true) public Pair<String, String> timesheetStates; @ApiModelProperty(value = "set of pairs", required = true) public Set<Pair<String, String>> manyPairs; @ApiModelProperty(value = "set of pairs with complex left", required = true) public Set<Pair<ComplexLeft, String>> complexLeft; static class ComplexLeft { public String name; public Integer age; } public static class TupleAsMapModelConverter extends AbstractModelConverter { public TupleAsMapModelConverter(ObjectMapper mapper) { super(mapper); } @Override public Model resolve(Type type, ModelConverterContext context, Iterator<ModelConverter> chain) { final JavaType javaType = _mapper.constructType(type); if (Pair.class.isAssignableFrom(javaType.getRawClass())) { final JavaType left = javaType.containedType(0); final String name = "MapOf" + WordUtils.capitalize(_typeName(left)); return new ModelImpl().name(name).additionalProperties(context.resolveProperty(left, new Annotation[]{})); } return super.resolve(type, context, chain); } } public static class TupleAsMapPropertyConverter extends AbstractModelConverter { public TupleAsMapPropertyConverter(ObjectMapper mapper) { super(mapper); } @Override public Property resolveProperty(Type type, ModelConverterContext context, Annotation[] annotations, Iterator<ModelConverter> chain) { final JavaType javaType = _mapper.constructType(type); if (Pair.class.isAssignableFrom(javaType.getRawClass())) { final JavaType left = javaType.containedType(0); return new MapProperty(context.resolveProperty(left, new Annotation[]{})); } return super.resolveProperty(type, context, annotations, chain); } @Override public Model resolve(Type type, ModelConverterContext context, Iterator<ModelConverter> chain) { final JavaType javaType = _mapper.constructType(type); if (Pair.class.isAssignableFrom(javaType.getRawClass())) { return null; } return super.resolve(type, context, chain); } } }