blob: 7be7c340f56166419040f17ef9acef4f0c0207bb [file] [log] [blame]
/*
* 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.spi;
import java.util.Map;
/**
* Configuration use by {@link org.apache.camel.spi.RestConsumerFactory} and {@link org.apache.camel.spi.RestApiConsumerFactory}
* for Camel components to support the Camel {@link org.apache.camel.model.rest.RestDefinition rest} DSL.
*/
public class RestConfiguration {
public static final String CORS_ACCESS_CONTROL_ALLOW_ORIGIN = "*";
public static final String CORS_ACCESS_CONTROL_ALLOW_METHODS = "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATCH";
public static final String CORS_ACCESS_CONTROL_MAX_AGE = "3600";
public static final String CORS_ACCESS_CONTROL_ALLOW_HEADERS = "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers";
public enum RestBindingMode {
auto, off, json, xml, json_xml
}
public enum RestHostNameResolver {
allLocalIp, localIp, localHostName
}
private String component;
private String apiComponent;
private String producerComponent;
private String producerApiDoc;
private String scheme;
private String host;
private boolean useXForwardHeaders = true;
private String apiHost;
private int port;
private String contextPath;
private String apiContextPath;
private String apiContextRouteId;
private String apiContextIdPattern;
private boolean apiContextListing;
private boolean apiVendorExtension;
private RestHostNameResolver hostNameResolver = RestHostNameResolver.allLocalIp;
private RestBindingMode bindingMode = RestBindingMode.off;
private boolean skipBindingOnErrorCode = true;
private boolean clientRequestValidation;
private boolean enableCORS;
private String jsonDataFormat;
private String xmlDataFormat;
private Map<String, Object> componentProperties;
private Map<String, Object> endpointProperties;
private Map<String, Object> consumerProperties;
private Map<String, Object> dataFormatProperties;
private Map<String, Object> apiProperties;
private Map<String, String> corsHeaders;
/**
* Gets the name of the Camel component to use as the REST consumer
*
* @return the component name, or <tt>null</tt> to let Camel search the {@link Registry} to find suitable implementation
*/
public String getComponent() {
return component;
}
/**
* Sets the name of the Camel component to use as the REST consumer
*
* @param componentName the name of the component (such as netty-http, jetty, servlet, undertow, etc.)
*/
public void setComponent(String componentName) {
this.component = componentName;
}
/**
* Gets the name of the Camel component to use as the REST API (such as swagger)
*
* @return the component name, or <tt>null</tt> to let Camel use the default name <tt>swagger</tt>
*/
public String getApiComponent() {
return apiComponent;
}
/**
* Sets the name of the Camel component to use as the REST API (such as swagger)
*
* @param apiComponent the name of the component (such as swagger)
*/
public void setApiComponent(String apiComponent) {
this.apiComponent = apiComponent;
}
/**
* Gets the name of the Camel component to use as the REST producer
*
* @return the component name, or <tt>null</tt> to let Camel search the {@link Registry} to find suitable implementation
*/
public String getProducerComponent() {
return producerComponent;
}
/**
* Sets the name of the Camel component to use as the REST producer
*
* @param componentName the name of the component (such as http, netty-http, undertow, etc.)
*/
public void setProducerComponent(String componentName) {
this.producerComponent = componentName;
}
/**
* Gets 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.
*/
public String getProducerApiDoc() {
return producerApiDoc;
}
/**
* 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).
* <p/>
* The location of the api document is loaded from classpath by default, but you can use
* <tt>file:</tt> or <tt>http:</tt> to refer to resources to load from file or http url.
*/
public void setProducerApiDoc(String producerApiDoc) {
this.producerApiDoc = producerApiDoc;
}
/**
* Gets the hostname to use by the REST consumer
*
* @return the hostname, or <tt>null</tt> to use default hostname
*/
public String getHost() {
return host;
}
/**
* Sets the hostname to use by the REST consumer
*
* @param host the hostname
*/
public void setHost(String host) {
this.host = host;
}
/**
* WWhether to use X-Forward headers to set host etc. for Swagger.
* <p/>
* This option is default <tt>true</tt>.
*/
public boolean isUseXForwardHeaders() {
return useXForwardHeaders;
}
/**
* WWhether to use X-Forward headers to set host etc. for Swagger.
* <p/>
* This option is default <tt>true</tt>.
*
* @param useXForwardHeaders whether to use X-Forward headers
*/
public void setUseXForwardHeaders(boolean useXForwardHeaders) {
this.useXForwardHeaders = useXForwardHeaders;
}
public String getApiHost() {
return apiHost;
}
/**
* To use an specific hostname for the API documentation (eg swagger)
* <p/>
* This can be used to override the generated host with this configured hostname
*/
public void setApiHost(String apiHost) {
this.apiHost = apiHost;
}
/**
* Gets the scheme to use by the REST consumer
*
* @return the scheme, or <tt>null</tt> to use default scheme
*/
public String getScheme() {
return scheme;
}
/**
* Sets the scheme to use by the REST consumer
*
* @param scheme the scheme
*/
public void setScheme(String scheme) {
this.scheme = scheme;
}
/**
* Gets the port to use by the REST consumer
*
* @return the port, or <tt>0</tt> or <tt>-1</tt> to use default port
*/
public int getPort() {
return port;
}
/**
* Sets the port to use by the REST consumer
*
* @param port the port number
*/
public void setPort(int port) {
this.port = port;
}
/**
* Gets the configured context-path
*
* @return the context path, or <tt>null</tt> if none configured.
*/
public String getContextPath() {
return contextPath;
}
/**
* Sets a leading context-path the REST services will be using.
* <p/>
* This can be used when using components such as <tt>camel-servlet</tt> where the deployed web application
* is deployed using a context-path. Or for components such as <tt>camel-jetty</tt> or <tt>camel-netty-http</tt>
* that includes a HTTP server.
*
* @param contextPath the context path
*/
public void setContextPath(String contextPath) {
this.contextPath = contextPath;
}
public String getApiContextPath() {
return apiContextPath;
}
/**
* Sets a leading API context-path the REST API services will be using.
* <p/>
* This can be used when using components such as <tt>camel-servlet</tt> where the deployed web application
* is deployed using a context-path.
*
* @param contextPath the API context path
*/
public void setApiContextPath(String contextPath) {
this.apiContextPath = contextPath;
}
public String getApiContextRouteId() {
return apiContextRouteId;
}
/**
* Sets the route id to use for the route that services the REST API.
* <p/>
* The route will by default use an auto assigned route id.
*
* @param apiContextRouteId the route id
*/
public void setApiContextRouteId(String apiContextRouteId) {
this.apiContextRouteId = apiContextRouteId;
}
public String getApiContextIdPattern() {
return apiContextIdPattern;
}
/**
* Optional CamelContext id pattern to only allow Rest APIs from rest services within CamelContext's which name matches the pattern.
* <p/>
* The pattern <tt>#name#</tt> refers to the CamelContext name, to match on the current CamelContext only.
* For any other value, the pattern uses the rules from {@link org.apache.camel.support.EndpointHelper#matchPattern(String, String)}
*
* @param apiContextIdPattern the pattern
*/
public void setApiContextIdPattern(String apiContextIdPattern) {
this.apiContextIdPattern = apiContextIdPattern;
}
public boolean isApiContextListing() {
return apiContextListing;
}
/**
* 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 <tt>false</tt> then only the current CamelContext is in use.
*/
public void setApiContextListing(boolean apiContextListing) {
this.apiContextListing = apiContextListing;
}
public boolean isApiVendorExtension() {
return apiVendorExtension;
}
/**
* 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.
*/
public void setApiVendorExtension(boolean apiVendorExtension) {
this.apiVendorExtension = apiVendorExtension;
}
/**
* Gets the resolver to use for resolving hostname
*
* @return the resolver
*/
public RestHostNameResolver getHostNameResolver() {
return hostNameResolver;
}
/**
* Sets the resolver to use for resolving hostname
*
* @param hostNameResolver the resolver
*/
public void setHostNameResolver(RestHostNameResolver hostNameResolver) {
this.hostNameResolver = hostNameResolver;
}
/**
* Sets the resolver to use for resolving hostname
*
* @param hostNameResolver the resolver
*/
public void setHostNameResolver(String hostNameResolver) {
this.hostNameResolver = RestHostNameResolver.valueOf(hostNameResolver);
}
/**
* Gets the binding mode used by the REST consumer
*
* @return the binding mode
*/
public RestBindingMode getBindingMode() {
return bindingMode;
}
/**
* Sets the binding mode to be used by the REST consumer
*
* @param bindingMode the binding mode
*/
public void setBindingMode(RestBindingMode bindingMode) {
this.bindingMode = bindingMode;
}
/**
* Sets the binding mode to be used by the REST consumer
*
* @param bindingMode the binding mode
*/
public void setBindingMode(String bindingMode) {
this.bindingMode = RestBindingMode.valueOf(bindingMode);
}
/**
* Whether to skip binding output if there is a custom HTTP error code, and instead use the response body as-is.
* <p/>
* This option is default <tt>true</tt>.
*
* @return whether to skip binding on error code
*/
public boolean isSkipBindingOnErrorCode() {
return skipBindingOnErrorCode;
}
/**
* Whether to skip binding output if there is a custom HTTP error code, and instead use the response body as-is.
* <p/>
* This option is default <tt>true</tt>.
*
* @param skipBindingOnErrorCode whether to skip binding on error code
*/
public void setSkipBindingOnErrorCode(boolean skipBindingOnErrorCode) {
this.skipBindingOnErrorCode = skipBindingOnErrorCode;
}
public boolean isClientRequestValidation() {
return clientRequestValidation;
}
/**
* 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.
* <p/>
* This can be turned on, to enable this check. In case of validation error, then HTTP Status codes 415 or 406 is returned.
* <p/>
* The default value is false.
*/
public void setClientRequestValidation(boolean clientRequestValidation) {
this.clientRequestValidation = clientRequestValidation;
}
/**
* To specify whether to enable CORS which means Camel will automatic include CORS in the HTTP headers in the response.
* <p/>
* This option is default <tt>false</tt>
*
* @return whether CORS is enabled or not
*/
public boolean isEnableCORS() {
return enableCORS;
}
/**
* To specify whether to enable CORS which means Camel will automatic include CORS in the HTTP headers in the response.
* <p/>
* This option is default <tt>false</tt>
*
* @param enableCORS <tt>true</tt> to enable CORS
*/
public void setEnableCORS(boolean enableCORS) {
this.enableCORS = enableCORS;
}
/**
* Gets the name of the json data format.
* <p/>
* <b>Important:</b> This option is only for setting a custom name of the data format, not to refer to an existing data format instance.
*
* @return the name, or <tt>null</tt> to use default
*/
public String getJsonDataFormat() {
return jsonDataFormat;
}
/**
* Sets a custom json data format to be used
* <p/>
* <b>Important:</b> This option is only for setting a custom name of the data format, not to refer to an existing data format instance.
*
* @param name name of the data format
*/
public void setJsonDataFormat(String name) {
this.jsonDataFormat = name;
}
/**
* Gets the name of the xml data format.
* <p/>
* <b>Important:</b> This option is only for setting a custom name of the data format, not to refer to an existing data format instance.
*
* @return the name, or <tt>null</tt> to use default
*/
public String getXmlDataFormat() {
return xmlDataFormat;
}
/**
* Sets a custom xml data format to be used.
* <p/>
* <b>Important:</b> This option is only for setting a custom name of the data format, not to refer to an existing data format instance.
*
* @param name name of the data format
*/
public void setXmlDataFormat(String name) {
this.xmlDataFormat = name;
}
/**
* Gets additional options on component level
*
* @return additional options
*/
public Map<String, Object> getComponentProperties() {
return componentProperties;
}
/**
* Sets additional options on component level
*
* @param componentProperties the options
*/
public void setComponentProperties(Map<String, Object> componentProperties) {
this.componentProperties = componentProperties;
}
/**
* Gets additional options on endpoint level
*
* @return additional options
*/
public Map<String, Object> getEndpointProperties() {
return endpointProperties;
}
/**
* Sets additional options on endpoint level
*
* @param endpointProperties the options
*/
public void setEndpointProperties(Map<String, Object> endpointProperties) {
this.endpointProperties = endpointProperties;
}
/**
* Gets additional options on consumer level
*
* @return additional options
*/
public Map<String, Object> getConsumerProperties() {
return consumerProperties;
}
/**
* Sets additional options on consumer level
*
* @param consumerProperties the options
*/
public void setConsumerProperties(Map<String, Object> consumerProperties) {
this.consumerProperties = consumerProperties;
}
/**
* Gets additional options on data format level
*
* @return additional options
*/
public Map<String, Object> getDataFormatProperties() {
return dataFormatProperties;
}
/**
* Sets additional options on data format level
*
* @param dataFormatProperties the options
*/
public void setDataFormatProperties(Map<String, Object> dataFormatProperties) {
this.dataFormatProperties = dataFormatProperties;
}
public Map<String, Object> getApiProperties() {
return apiProperties;
}
/**
* Sets additional options on api level
*
* @param apiProperties the options
*/
public void setApiProperties(Map<String, Object> apiProperties) {
this.apiProperties = apiProperties;
}
/**
* Gets the CORS headers to use if CORS has been enabled.
*
* @return the CORS headers
*/
public Map<String, String> getCorsHeaders() {
return corsHeaders;
}
/**
* Sets the CORS headers to use if CORS has been enabled.
*
* @param corsHeaders the CORS headers
*/
public void setCorsHeaders(Map<String, String> corsHeaders) {
this.corsHeaders = corsHeaders;
}
}