public void fillSchema()

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());
            }
        }
    }