public JsonGenerator writeEnd()

in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JsonObjectGenerator.java [190:259]


    public JsonGenerator writeEnd() {
        if (builders.size() == 1) {
            return this;
        }

        final Object last = builders.removeLast();

        /*
         * Previous potential cases:
         * 1. json array -> we add the builder directly
         * 2. NamedBuilder{array|object} -> we add the builder in the previous object
         */

        final String name;
        Object previous = builders.getLast();
        if (NamedBuilder.class.isInstance(previous)) {
            final NamedBuilder namedBuilder = NamedBuilder.class.cast(previous);
            name = namedBuilder.name;
            previous = namedBuilder.builder;
        } else {
            name = null;
        }

        if (JsonArrayBuilder.class.isInstance(last)) {
            final JsonArrayBuilder array = JsonArrayBuilder.class.cast(last);
            if (JsonArrayBuilder.class.isInstance(previous)) {
                arrayBuilder = JsonArrayBuilder.class.cast(previous);
                objectBuilder = null;
                arrayBuilder.add(array);
            } else if (JsonObjectBuilder.class.isInstance(previous)) {
                objectBuilder = JsonObjectBuilder.class.cast(previous);
                arrayBuilder = null;
                objectBuilder.add(name, array);
            } else {
                throw new IllegalArgumentException("Unsupported previous builder: " + previous);
            }
        } else if (JsonObjectBuilder.class.isInstance(last)) {
            final JsonObjectBuilder object = JsonObjectBuilder.class.cast(last);
            if (JsonArrayBuilder.class.isInstance(previous)) {
                arrayBuilder = JsonArrayBuilder.class.cast(previous);
                objectBuilder = null;
                arrayBuilder.add(object);
            } else if (JsonObjectBuilder.class.isInstance(previous)) {
                objectBuilder = JsonObjectBuilder.class.cast(previous);
                arrayBuilder = null;
                objectBuilder.add(name, object);
            } else {
                throw new IllegalArgumentException("Unsupported previous builder: " + previous);
            }
        } else if (NamedBuilder.class.isInstance(last)) {
            final NamedBuilder<?> namedBuilder = NamedBuilder.class.cast(last);
            if (JsonObjectBuilder.class.isInstance(previous)) {
                objectBuilder = JsonObjectBuilder.class.cast(previous);
                if (JsonArrayBuilder.class.isInstance(namedBuilder.builder)) {
                    objectBuilder.add(namedBuilder.name, JsonArrayBuilder.class.cast(namedBuilder.builder));
                    arrayBuilder = null;
                } else if (JsonObjectBuilder.class.isInstance(namedBuilder.builder)) {
                    objectBuilder.add(namedBuilder.name, JsonObjectBuilder.class.cast(namedBuilder.builder));
                    arrayBuilder = null;
                } else {
                    throw new IllegalArgumentException("Unsupported previous builder: " + previous);
                }
            } else {
                throw new IllegalArgumentException("Unsupported previous builder, expected object builder: " + previous);
            }
        } else {
            throw new IllegalArgumentException("Unsupported previous builder: " + previous);
        }
        return this;
    }