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

de.codecentric.hikaku.converters.raml.RamlConverter.kt Maven / Gradle / Ivy

package de.codecentric.hikaku.converters.raml

import de.codecentric.hikaku.SupportedFeatures
import de.codecentric.hikaku.SupportedFeatures.Feature
import de.codecentric.hikaku.converters.AbstractEndpointConverter
import de.codecentric.hikaku.converters.EndpointConverterException
import de.codecentric.hikaku.converters.raml.extensions.*
import de.codecentric.hikaku.endpoints.Endpoint
import de.codecentric.hikaku.extensions.checkFileValidity
import org.raml.v2.api.RamlModelBuilder
import org.raml.v2.api.RamlModelResult
import org.raml.v2.api.model.v10.resources.Resource
import java.io.File
import java.nio.file.Path

class RamlConverter(private val ramlSpecification: File) : AbstractEndpointConverter()  {

    constructor(ramlSpecification: Path) : this(ramlSpecification.toFile())

    override val supportedFeatures = SupportedFeatures(
            Feature.QueryParameters,
            Feature.PathParameters,
            Feature.HeaderParameters,
            Feature.Produces,
            Feature.Consumes,
            Feature.Deprecation
    )

    override fun convert(): Set {
        val ramlParserResult: RamlModelResult?

        try {
            ramlSpecification.checkFileValidity(".raml")
            ramlParserResult = RamlModelBuilder().buildApi(ramlSpecification)
        } catch(throwable: Throwable) {
            throw EndpointConverterException(throwable)
        }

        if (ramlParserResult.isVersion08) {
            throw EndpointConverterException("Unsupported RAML version")
        }

        if (ramlParserResult.hasErrors()) {
            throw EndpointConverterException(ramlParserResult.validationResults.joinToString("\n"))
        }

        return ramlParserResult.apiV10?.resources()?.let { resourceList ->
            resourceList.flatMap { findEndpoints(it) }
        }
        .orEmpty()
        .toSet()
    }

    private fun findEndpoints(resource: Resource): List {
        val endpoints = mutableListOf()

        if (resource.resources().isNotEmpty()) {
            endpoints += resource.resources().flatMap {
                return@flatMap findEndpoints(it)
            }
        }

        if (resource.methods().isNotEmpty()) {
            endpoints += resource.methods().map {
                    Endpoint(
                            path = resource.resourcePath(),
                            httpMethod = it.hikakuHttpMethod(),
                            queryParameters = it.hikakuQueryParameters(),
                            pathParameters = it.resource()?.hikakuPathParameters().orEmpty(),
                            headerParameters = it?.hikakuHeaderParameters().orEmpty(),
                            consumes = it.requestMediaTypes(),
                            produces = it.responseMediaTypes(),
                            deprecated = it.isEndpointDeprecated()
                    )
            }
        }

        return endpoints
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy