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

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

The newest version!
package org.raml.builder;

import org.raml.v2.api.loader.ResourceLoader;
import org.raml.v2.api.model.v10.RamlFragment;
import org.raml.v2.api.model.v10.datamodel.TypeDeclaration;
import org.raml.v2.internal.impl.commons.RamlHeader;
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.phase.*;
import org.raml.v2.internal.impl.v10.grammar.Raml10Grammar;
import org.raml.v2.internal.impl.v10.phase.AnnotationValidationPhase;
import org.raml.v2.internal.impl.v10.phase.ExampleValidationPhase;
import org.raml.v2.internal.impl.v10.phase.MediaTypeInjectionPhase;
import org.raml.v2.internal.impl.v10.phase.ReferenceResolverTransformer;
import org.raml.yagi.framework.model.*;
import org.raml.yagi.framework.nodes.ErrorNode;
import org.raml.yagi.framework.nodes.Node;
import org.raml.yagi.framework.phase.GrammarPhase;
import org.raml.yagi.framework.phase.Phase;
import org.raml.yagi.framework.phase.TransformationPhase;

import javax.annotation.Nullable;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

import static org.raml.v2.api.RamlModelBuilder.MODEL_PACKAGE;
import static org.raml.v2.api.model.v10.RamlFragment.Default;
import static org.raml.v2.internal.impl.commons.RamlVersion.RAML_10;

/**
 * Created. There, you have it.
 */
public class Util {
    public static ModelBindingConfiguration bindingConfiguration() {

        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  T buildModel(ModelBindingConfiguration binding, Node node, Class cls) {
        NodeModelFactory fac = binding.bindingOf(cls);
        NodeModel model = fac.create(node);
        T m = ModelProxyBuilder.createModel(cls, model, binding);

        final Phase grammarPhase = createPhases(new ResourceLoader() {
            @Nullable
            @Override
            public InputStream fetchResource(String resourceName) {
                return null;
            }
        }, new RamlHeader(RAML_10, Default).getFragment());
        Node newNode = ((NodeModel) m).getNode();
        grammarPhase.apply(newNode);

        List errors = node.findDescendantsWith(ErrorNode.class);
        if (!errors.isEmpty()) {

            throw new ModelBuilderException(errors);
        }

        return m;
    }

    private static Phase createPhases(ResourceLoader resourceLoader, RamlFragment fragment) {
        final TransformationPhase ramlFragmentsValidator = new TransformationPhase(new RamlFragmentGrammarTransformer());

        // Runs Schema. Applies the Raml rules and changes each node for a more specific. Annotations Library TypeSystem
        final GrammarPhase grammarPhase = new GrammarPhase(RamlHeader.getFragmentRule(fragment));

        final TransformationPhase referenceCheck = new TransformationPhase(new ReferenceResolverTransformer());

        // Applies resourceTypes and Traits Library
        final TransformationPhase resourcePhase = new TransformationPhase(new ResourceTypesTraitsTransformer(new Raml10Grammar()));

        final TransformationPhase duplicatedPaths = new TransformationPhase(new DuplicatedPathsTransformer());

        // Check unused uri parameters
        final TransformationPhase checkUnusedParameters = new TransformationPhase(new UnusedParametersTransformer());

        // Run grammar again to re-validate tree

        final AnnotationValidationPhase annotationValidationPhase = new AnnotationValidationPhase(resourceLoader);

        final MediaTypeInjectionPhase mediaTypeInjection = new MediaTypeInjectionPhase();

        // Schema Types example validation
        final TransformationPhase schemaValidationPhase = new TransformationPhase(new SchemaValidationTransformer(resourceLoader));

        // Checks types consistency and custom facets
        final TypeValidationPhase typeValidationPhase = new TypeValidationPhase();

        final ExampleValidationPhase exampleValidationPhase = new ExampleValidationPhase(resourceLoader);

        Phase phase = new Phase() {
            @Override
            public Node apply(Node tree) {

                List phases = Arrays.asList(
                        //      includePhase,
                        ramlFragmentsValidator,
                        grammarPhase,
                        referenceCheck,
                        resourcePhase,
                        duplicatedPaths,
                        checkUnusedParameters,
                        annotationValidationPhase,
                        mediaTypeInjection,
                        grammarPhase,
                        schemaValidationPhase,
                        typeValidationPhase,
                        exampleValidationPhase
                );

                Node node = null;
                for (Phase phase : phases) {

                    node = phase.apply(tree);
                    List descendantsWith = node.findDescendantsWith(ErrorNode.class);
                    if (descendantsWith.size() != 0) {
                        throw new ModelBuilderException(descendantsWith);
                    }
                }

                return node;
            }
        };

        return phase;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy