in johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/generator/SchemaProcessor.java [110:195]
public void fillSchema(final Type rawModel, final Schema schema, final Cache cache,
final ReflectionValueExtractor reflectionValueExtractor,
final Instance instance) {
final Type model = unwrapType(rawModel);
if (Class.class.isInstance(model)) {
if (boolean.class == model) {
schema.setType(Schema.SchemaType.bool);
} else if (Boolean.class == model) {
schema.setType(Schema.SchemaType.bool);
schema.setNullable(true);
} else if (String.class == model || JsonString.class == model) {
schema.setType(Schema.SchemaType.string);
} else if (double.class == model || float.class == model) {
schema.setType(Schema.SchemaType.number);
} else if (Double.class == model || Float.class == model || JsonNumber.class == model) {
schema.setType(Schema.SchemaType.number);
schema.setNullable(true);
} else if (int.class == model || short.class == model || byte.class == model || long.class == model) {
schema.setType(Schema.SchemaType.integer);
} else if (Integer.class == model || Short.class == model || Byte.class == model || Long.class == model) {
schema.setType(Schema.SchemaType.integer);
schema.setNullable(true);
} else if (JsonObject.class == model || JsonValue.class == model || JsonStructure.class == model) {
schema.setType(Schema.SchemaType.object);
schema.setNullable(true);
schema.setProperties(new TreeMap<>());
} else if (JsonArray.class == model) {
schema.setType(Schema.SchemaType.array);
schema.setNullable(true);
final Schema items = new Schema();
items.setType(Schema.SchemaType.object);
items.setProperties(new TreeMap<>());
} else if (isStringable(model)) {
schema.setType(Schema.SchemaType.string);
schema.setNullable(true);
} else {
final Class<?> from = Class.class.cast(model);
if (from.isEnum()) {
schema.setId(from.getName().replace('.', '_').replace('$', '_'));
schema.setType(Schema.SchemaType.string);
schema.setEnumeration(asList(from.getEnumConstants()));
schema.setNullable(true);
} else if (from.isArray()) {
schema.setType(Schema.SchemaType.array);
final Schema items = new Schema();
fillSchema(from.getComponentType(), items, cache, reflectionValueExtractor, instance);
schema.setItems(items);
} else if (Collection.class.isAssignableFrom(from)) {
schema.setType(Schema.SchemaType.array);
final Schema items = new Schema();
fillSchema(Object.class, items, cache, reflectionValueExtractor, instance);
schema.setItems(items);
} else {
schema.setType(Schema.SchemaType.object);
getOrCreateReusableObjectComponent(from, schema, cache, reflectionValueExtractor, instance);
}
}
} else {
if (ParameterizedType.class.isInstance(model)) {
final ParameterizedType pt = ParameterizedType.class.cast(model);
if (Class.class.isInstance(pt.getRawType()) && Map.class.isAssignableFrom(Class.class.cast(pt.getRawType()))) {
schema.setType(Schema.SchemaType.object);
getOrCreateReusableObjectComponent(Object.class, schema, cache, reflectionValueExtractor, instance);
} else if (pt.getActualTypeArguments().length == 1 && Class.class.isInstance(pt.getActualTypeArguments()[0])) {
schema.setType(Schema.SchemaType.array);
final Schema items = new Schema();
final Class<?> type = Class.class.cast(pt.getActualTypeArguments()[0]);
final Instance item;
if (instance != null && Collection.class.isInstance(instance.value) && !Collection.class.cast(instance.value).isEmpty()) {
item = new Instance(Collection.class.cast(instance.value).iterator().next(), instance.isCreated());
} else {
item = null;
}
fillSchema(type, items, cache, reflectionValueExtractor, item);
schema.setItems(items);
} else {
schema.setType(Schema.SchemaType.array);
}
} else if (TypeVariable.class.isInstance(model)) {
schema.setType(Schema.SchemaType.object);
} else { // todo?
schema.setType(Schema.SchemaType.array);
schema.setItems(new Schema());
}
}
}