All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.raml.builder.RamlDocumentBuilder Maven / Gradle / Ivy

The newest version!
package org.raml.builder;

import org.raml.v2.api.model.v10.api.Api;
import org.raml.v2.api.model.v10.datamodel.TypeDeclaration;
import org.raml.v2.internal.impl.commons.model.DefaultModelElement;
import org.raml.v2.internal.impl.commons.model.StringType;
import org.raml.v2.internal.impl.commons.model.factory.TypeDeclarationModelFactory;
import org.raml.v2.internal.impl.commons.nodes.RamlDocumentNode;
import org.raml.yagi.framework.model.DefaultModelBindingConfiguration;
import org.raml.yagi.framework.model.ModelBindingConfiguration;
import org.raml.yagi.framework.model.NodeModel;
import org.raml.yagi.framework.model.NodeModelFactory;
import org.raml.yagi.framework.nodes.KeyValueNode;
import org.raml.yagi.framework.nodes.KeyValueNodeImpl;
import org.raml.yagi.framework.nodes.Node;
import org.raml.yagi.framework.nodes.StringNodeImpl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.raml.v2.api.RamlModelBuilder.MODEL_PACKAGE;

/**
 * Created. There, you have it.
 */
public class RamlDocumentBuilder implements NodeBuilder, ModelBuilder {

    private static final ModelBindingConfiguration binding = createV10Binding();
    private List builders = new ArrayList<>();

    private KeyValueNodeBuilderMap annotationTypeBuilders = KeyValueNodeBuilderMap.createMap();
    private KeyValueNodeBuilderMap typeDeclarationBuilders = KeyValueNodeBuilderMap.createMap();
    private KeyValueNodeBuilderMap resourceBuilders = KeyValueNodeBuilderMap.createMap();
    private String baseUri;
    private String title;
    private String version;
    private String mediaType;


    RamlDocumentBuilder() {

    }

    @Override
    public Node buildNode() {

        Node documentNode = new RamlDocumentNode();
        for (NodeBuilder builder : builders) {
            documentNode.addChild(builder.buildNode());
        }

        if ( baseUri != null ) {
            KeyValueNode baseUriNode = new KeyValueNodeImpl(new StringNodeImpl("baseUri"), new StringNodeImpl(baseUri));
            documentNode.addChild(baseUriNode);
        }

        if( title != null ) {
            KeyValueNode titleNode = new KeyValueNodeImpl(new StringNodeImpl("title"), new StringNodeImpl(title));
            documentNode.addChild(titleNode);
        }

        if ( version != null ) {
            KeyValueNode version = new KeyValueNodeImpl(new StringNodeImpl("version"), new StringNodeImpl(this.version));
            documentNode.addChild(version);
        }

        if ( mediaType != null ) {
            KeyValueNode mediaType = new KeyValueNodeImpl(new StringNodeImpl("mediaType"), new StringNodeImpl(this.mediaType));
            documentNode.addChild(mediaType);
        }

        annotationTypeBuilders.addAllToNamedNode("annotationTypes", documentNode);
        typeDeclarationBuilders.addAllToNamedNode("types", documentNode);
        resourceBuilders.addToParent(documentNode);


        return documentNode;
    }

    public RamlDocumentBuilder with(NodeBuilder... builders) {

        this.builders.addAll(Arrays.asList(builders));
        return this;
    }

    public RamlDocumentBuilder withAnnotationTypes(AnnotationTypeBuilder... annotationTypeBuilders) {
        this.annotationTypeBuilders.addAll(annotationTypeBuilders);
        return this;
    }

    public RamlDocumentBuilder withTypes(TypeDeclarationBuilder... typeBuilders) {
        this.typeDeclarationBuilders.addAll(typeBuilders);
        return this;
    }

    public RamlDocumentBuilder withResources(ResourceBuilder... resourceBuilders) {
        this.resourceBuilders.addAll(resourceBuilders);
        return this;
    }

    public Api buildModel() {

        NodeModelFactory fac = binding.bindingOf(Api.class);
        Node node = buildNode();
        NodeModel model = fac.create(node);
        //return ModelProxyBuilder.createModel(Api.class, model, binding);
        return Util.buildModel(binding, node, Api.class);
    }

    static private ModelBindingConfiguration createV10Binding()
    {
        final DefaultModelBindingConfiguration bindingConfiguration = new DefaultModelBindingConfiguration();
        bindingConfiguration.bindPackage(MODEL_PACKAGE);
        // Bind all StringTypes to the StringType implementation they are only marker interfaces
        bindingConfiguration.bind(org.raml.v2.api.model.v10.system.types.StringType.class, StringType.class);
        bindingConfiguration.bind(org.raml.v2.api.model.v10.system.types.ValueType.class, StringType.class);
        bindingConfiguration.defaultTo(DefaultModelElement.class);
        bindingConfiguration.bind(TypeDeclaration.class, new TypeDeclarationModelFactory());
        bindingConfiguration.reverseBindPackage("org.raml.v2.api.model.v10.datamodel");
        return bindingConfiguration;
    }

    public static RamlDocumentBuilder document() {

        return new RamlDocumentBuilder();
    }

    public RamlDocumentBuilder baseUri(String baseUri) {

        this.baseUri = baseUri;
        return this;
    }

    public RamlDocumentBuilder title(String title) {

        this.title = title;
        return this;
    }

    public RamlDocumentBuilder version(String version) {
        this.version = version;
        return this;
    }

    public RamlDocumentBuilder mediaType(String mediaType) {

        this.mediaType = mediaType;
        return this;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy