package io.swagger.jackson; import io.swagger.annotations.ApiModel; import io.swagger.util.PrimitiveType; import com.fasterxml.jackson.databind.JavaType; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.WordUtils; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; import java.util.Set; /** * Helper class used for converting well-known (property) types into * Swagger type names. */ public class TypeNameResolver { public final static TypeNameResolver std = new TypeNameResolver(); protected TypeNameResolver() { } public String nameForType(JavaType type, Options... options) { return nameForType(type, options.length == 0 ? Collections.<Options>emptySet() : EnumSet.copyOf(Arrays.asList(options))); } public String nameForType(JavaType type, Set<Options> options) { if (type.hasGenericTypes()) { return nameForGenericType(type, options); } final String name = findStdName(type); return (name == null) ? nameForClass(type, options) : name; } protected String nameForClass(JavaType type, Set<Options> options) { return nameForClass(type.getRawClass(), options); } protected String nameForClass(Class<?> cls, Set<Options> options) { if (options.contains(Options.SKIP_API_MODEL)) { return cls.getSimpleName(); } final ApiModel model = cls.getAnnotation(ApiModel.class); final String modelName = model == null ? null : StringUtils.trimToNull(model.value()); return modelName == null ? cls.getSimpleName() : modelName; } protected String nameForGenericType(JavaType type, Set<Options> options) { final StringBuilder generic = new StringBuilder(nameForClass(type, options)); final int count = type.containedTypeCount(); for (int i = 0; i < count; ++i) { final JavaType arg = type.containedType(i); final String argName = PrimitiveType.fromType(arg) != null ? nameForClass(arg, options) : nameForType(arg, options); generic.append(WordUtils.capitalize(argName)); } return generic.toString(); } protected String findStdName(JavaType type) { return PrimitiveType.getCommonName(type); } public enum Options { SKIP_API_MODEL; } }