/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.camel.model.rest.springboot;

import java.util.Map;

import javax.annotation.Generated;

import org.apache.camel.model.rest.RestBindingMode;
import org.apache.camel.model.rest.RestHostNameResolver;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * To configure rest
 * 
 * Generated by camel-package-maven-plugin - do not edit this file!
 */
@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo")
@ConfigurationProperties(prefix = "camel.rest")
public class RestConfigurationDefinitionProperties {

    /**
     * The Camel Rest component to use for the REST transport (consumer), such
     * as netty-http, jetty, servlet, undertow. If no component has been explicit configured,
     * then Camel will lookup if there is a Camel component that integrates with
     * the Rest DSL, or if a org.apache.camel.spi.RestConsumerFactory is
     * registered in the registry. If either one is found, then that is being
     * used.
     */
    private String component;
    /**
     * The name of the Camel component to use as the REST API (such as swagger)
     */
    private String apiComponent = "swagger";
    /**
     * Sets the name of the Camel component to use as the REST producer
     */
    private String producerComponent;
    /**
     * The scheme to use for exposing the REST service. Usually http or https is
     * supported. The default value is http
     */
    private String scheme;
    /**
     * The hostname to use for exposing the REST service.
     */
    private String host;
    /**
     * To use an specific hostname for the API documentation (eg swagger) This
     * can be used to override the generated host with this configured hostname
     */
    private String apiHost;
    /**
     * Whether to use X-Forward headers for Host and related setting. The
     * default value is true.
     */
    private Boolean useXForwardHeaders = true;
    /**
     * The port number to use for exposing the REST service. Notice if you use
     * servlet component then the port number configured here does not apply, as
     * the port number in use is the actual port number the servlet component is
     * using. eg if using Apache Tomcat its the tomcat http port, if using
     * Apache Karaf its the HTTP service in Karaf that uses port 8181 by default
     * etc. Though in those situations setting the port number here, allows
     * tooling and JMX to know the port number, so its recommended to set the
     * port number to the number that the servlet engine uses.
     */
    private String port;
    /**
     * Sets the location of the api document (swagger api) the REST producer
     * will use to validate the REST uri and query parameters are valid
     * accordingly to the api document. This requires adding camel-swagger-java
     * to the classpath, and any miss configuration will let Camel fail on
     * startup and report the error(s). The location of the api document is
     * loaded from classpath by default, but you can use file: or http: to refer
     * to resources to load from file or http url.
     */
    private String producerApiDoc;
    /**
     * Sets a leading context-path the REST services will be using. This can be
     * used when using components such as camel-servlet where the deployed web
     * application is deployed using a context-path. Or for components such as
     * camel-jetty or camel-netty-http that includes a HTTP server.
     */
    private String contextPath;
    /**
     * Sets a leading API context-path the REST API services will be using. This
     * can be used when using components such as camel-servlet where the
     * deployed web application is deployed using a context-path.
     */
    private String apiContextPath;
    /**
     * Sets the route id to use for the route that services the REST API. The
     * route will by default use an auto assigned route id.
     */
    private String apiContextRouteId;
    /**
     * Sets an CamelContext id pattern to only allow Rest APIs from rest
     * services within CamelContext's which name matches the pattern. The
     * pattern #name# refers to the CamelContext name, to match on the current
     * CamelContext only. For any other value, the pattern uses the rules from
     * {link PatternHelper#matchPattern(String, String)}
     */
    private String apiContextIdPattern;
    /**
     * Sets whether listing of all available CamelContext's with REST services
     * in the JVM is enabled. If enabled it allows to discover these contexts,
     * if false then only the current CamelContext is in use.
     */
    private Boolean apiContextListing = false;
    /**
     * Whether vendor extension is enabled in the Rest APIs. If enabled then
     * Camel will include additional information as vendor extension (eg keys
     * starting with x-) such as route ids, class names etc. Not all 3rd party
     * API gateways and tools supports vendor-extensions when importing your API
     * docs.
     */
    private Boolean apiVendorExtension = false;
    /**
     * If no hostname has been explicit configured, then this resolver is used
     * to compute the hostname the REST service will be using.
     */
    private RestHostNameResolver hostNameResolver;
    /**
     * Sets the binding mode to use. The default value is off
     */
    private RestBindingMode bindingMode;
    /**
     * Whether to skip binding on output if there is a custom HTTP error code
     * header. This allows to build custom error messages that do not bind to
     * json / xml etc, as success messages otherwise will do.
     */
    private Boolean skipBindingOnErrorCode = false;
    /**
     * Whether to enable validation of the client request to check whether the
     * Content-Type and Accept headers from the client is supported by the
     * Rest-DSL configuration of its consumes/produces settings. This can be
     * turned on, to enable this check. In case of validation error, then HTTP
     * Status codes 415 or 406 is returned. The default value is false.
     */
    private Boolean clientRequestValidation = false;
    /**
     * Whether to enable CORS headers in the HTTP response. The default value is
     * false.
     */
    private Boolean enableCors = false;
    /**
     * Name of specific json data format to use. By default json-jackson will be
     * used. Important: This option is only for setting a custom name of the
     * data format, not to refer to an existing data format instance.
     */
    private String jsonDataFormat;
    /**
     * Name of specific XML data format to use. By default jaxb will be used.
     * Important: This option is only for setting a custom name of the data
     * format, not to refer to an existing data format instance.
     */
    private String xmlDataFormat;
    /**
     * Allows to configure as many additional properties for the rest component
     * in use.
     */
    private Map<String, Object> componentProperty;
    /**
     * Allows to configure as many additional properties for the rest endpoint
     * in use.
     */
    private Map<String, Object> endpointProperty;
    /**
     * Allows to configure as many additional properties for the rest consumer
     * in use.
     */
    private Map<String, Object> consumerProperty;
    /**
     * Allows to configure as many additional properties for the data formats in
     * use. For example set property prettyPrint to true to have json outputted
     * in pretty mode. The properties can be prefixed to denote the option is
     * only for either JSON or XML and for either the IN or the OUT. The
     * prefixes are: json.in. json.out. xml.in. xml.out. For example a key with
     * value xml.out.mustBeJAXBElement is only for the XML data format for the
     * outgoing. A key without a prefix is a common key for all situations.
     */
    private Map<String, Object> dataFormatProperty;
    /**
     * Allows to configure as many additional properties for the api
     * documentation (swagger). For example set property api.title to my cool
     * stuff
     */
    private Map<String, Object> apiProperty;
    /**
     * Allows to configure custom CORS headers.
     */
    private Map<String, Object> corsHeaders;

    public String getComponent() {
        return component;
    }

    public void setComponent(String component) {
        this.component = component;
    }

    public String getApiComponent() {
        return apiComponent;
    }

    public void setApiComponent(String apiComponent) {
        this.apiComponent = apiComponent;
    }

    public String getProducerComponent() {
        return producerComponent;
    }

    public void setProducerComponent(String producerComponent) {
        this.producerComponent = producerComponent;
    }

    public String getScheme() {
        return scheme;
    }

    public void setScheme(String scheme) {
        this.scheme = scheme;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getApiHost() {
        return apiHost;
    }

    public void setApiHost(String apiHost) {
        this.apiHost = apiHost;
    }

    public Boolean getUseXForwardHeaders() {
        return useXForwardHeaders;
    }

    public void setUseXForwardHeaders(Boolean useXForwardHeaders) {
        this.useXForwardHeaders = useXForwardHeaders;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

    public String getProducerApiDoc() {
        return producerApiDoc;
    }

    public void setProducerApiDoc(String producerApiDoc) {
        this.producerApiDoc = producerApiDoc;
    }

    public String getContextPath() {
        return contextPath;
    }

    public void setContextPath(String contextPath) {
        this.contextPath = contextPath;
    }

    public String getApiContextPath() {
        return apiContextPath;
    }

    public void setApiContextPath(String apiContextPath) {
        this.apiContextPath = apiContextPath;
    }

    public String getApiContextRouteId() {
        return apiContextRouteId;
    }

    public void setApiContextRouteId(String apiContextRouteId) {
        this.apiContextRouteId = apiContextRouteId;
    }

    public String getApiContextIdPattern() {
        return apiContextIdPattern;
    }

    public void setApiContextIdPattern(String apiContextIdPattern) {
        this.apiContextIdPattern = apiContextIdPattern;
    }

    public Boolean getApiContextListing() {
        return apiContextListing;
    }

    public void setApiContextListing(Boolean apiContextListing) {
        this.apiContextListing = apiContextListing;
    }

    public Boolean getApiVendorExtension() {
        return apiVendorExtension;
    }

    public void setApiVendorExtension(Boolean apiVendorExtension) {
        this.apiVendorExtension = apiVendorExtension;
    }

    public RestHostNameResolver getHostNameResolver() {
        return hostNameResolver;
    }

    public void setHostNameResolver(RestHostNameResolver hostNameResolver) {
        this.hostNameResolver = hostNameResolver;
    }

    public RestBindingMode getBindingMode() {
        return bindingMode;
    }

    public void setBindingMode(RestBindingMode bindingMode) {
        this.bindingMode = bindingMode;
    }

    public Boolean getSkipBindingOnErrorCode() {
        return skipBindingOnErrorCode;
    }

    public void setSkipBindingOnErrorCode(Boolean skipBindingOnErrorCode) {
        this.skipBindingOnErrorCode = skipBindingOnErrorCode;
    }

    public Boolean getClientRequestValidation() {
        return clientRequestValidation;
    }

    public void setClientRequestValidation(Boolean clientRequestValidation) {
        this.clientRequestValidation = clientRequestValidation;
    }

    public Boolean getEnableCors() {
        return enableCors;
    }

    public void setEnableCors(Boolean enableCors) {
        this.enableCors = enableCors;
    }

    public String getJsonDataFormat() {
        return jsonDataFormat;
    }

    public void setJsonDataFormat(String jsonDataFormat) {
        this.jsonDataFormat = jsonDataFormat;
    }

    public String getXmlDataFormat() {
        return xmlDataFormat;
    }

    public void setXmlDataFormat(String xmlDataFormat) {
        this.xmlDataFormat = xmlDataFormat;
    }

    public Map<String, Object> getComponentProperty() {
        return componentProperty;
    }

    public void setComponentProperty(Map<String, Object> componentProperty) {
        this.componentProperty = componentProperty;
    }

    public Map<String, Object> getEndpointProperty() {
        return endpointProperty;
    }

    public void setEndpointProperty(Map<String, Object> endpointProperty) {
        this.endpointProperty = endpointProperty;
    }

    public Map<String, Object> getConsumerProperty() {
        return consumerProperty;
    }

    public void setConsumerProperty(Map<String, Object> consumerProperty) {
        this.consumerProperty = consumerProperty;
    }

    public Map<String, Object> getDataFormatProperty() {
        return dataFormatProperty;
    }

    public void setDataFormatProperty(Map<String, Object> dataFormatProperty) {
        this.dataFormatProperty = dataFormatProperty;
    }

    public Map<String, Object> getApiProperty() {
        return apiProperty;
    }

    public void setApiProperty(Map<String, Object> apiProperty) {
        this.apiProperty = apiProperty;
    }

    public Map<String, Object> getCorsHeaders() {
        return corsHeaders;
    }

    public void setCorsHeaders(Map<String, Object> corsHeaders) {
        this.corsHeaders = corsHeaders;
    }
}
