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

com.sap.cloud.yaas.servicesdk.springboot.apiconsole.ApiConsoleAutoConfiguration Maven / Gradle / Ivy

There is a newer version: 4.17.1
Show newest version
/*
 * © 2017 SAP SE or an SAP affiliate company.
 * All rights reserved.
 * Please see http://www.sap.com/corporate-en/legal/copyright/index.epx for additional trademark information and
 * notices.
 */
package com.sap.cloud.yaas.servicesdk.springboot.apiconsole;

import javax.servlet.Filter;

import com.sap.cloud.yaas.servicesdk.apiconsole.web.ApiConsoleRedirectFilter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;


/**
 * Auto Configuration class that auto-registers the functionality of api-console library of the YaaS Service SDK.
 *
 * It provides an endpoint to which any request pointing to the root folder will be redirected. There it will
 * display Mulesoft's API Console.
 */
@Configuration
@ConditionalOnClass({
		ApiConsoleRedirectFilter.class,
		WebMvcConfigurerAdapter.class,
		DelegatingFilterProxyRegistrationBean.class})
@ConditionalOnWebApplication
@EnableConfigurationProperties(ApiConsoleProperties.class)
public class ApiConsoleAutoConfiguration
{
	private static final Logger LOG = LoggerFactory.getLogger(ApiConsoleAutoConfiguration.class);

	private static final String STATIC_RESOURCES_LOCATION = "/com/sap/cloud/yaas/servicesdk/apiconsole/web/static/";

	@Autowired
	private ApiConsoleProperties properties;

	/**
	 * Registers an instance of {@link ApiConsoleRedirectFilter}.
	 *
	 * @return the apiConsoleRedirectFilter
	 */
	@Bean
	@Lazy
	public Filter apiConsoleRedirectFilter()
	{
		final URI apiConsoleUri;
		if (properties.getUri() != null)
		{
			apiConsoleUri = properties.getUri();
		}
		else
		{
			if (properties.getBasePath() == null)
			{
				throw new IllegalStateException("Property 'basePath' is missing.");
			}
			apiConsoleUri = URI.create(properties.getBasePath() + "index.html");
			LOG.info("No uri has been configured for the API-Console."
					+ " Using default uri, constructed from base-path of built-in API-Console: '" + apiConsoleUri + "'.");
		}

		return new ApiConsoleRedirectFilter(apiConsoleUri, properties.getRamlUri());
	}

	/**
	 * Factory method that registers an instance of the
	 * {@link com.sap.cloud.yaas.servicesdk.ramlrewriter.filter.RamlRewriterFilter} as a Filter for all requests.
	 *
	 * @return The ramlRewriterFilterRegistration bean.
	 */
	@Bean
	@ConditionalOnMissingBean(name = "apiConsoleRedirectFilterRegistration")
	public DelegatingFilterProxyRegistrationBean apiConsoleRedirectFilterRegistration()
	{
		final DelegatingFilterProxyRegistrationBean registration = new DelegatingFilterProxyRegistrationBean(
				"apiConsoleRedirectFilter");

		if (properties.getFilterOrder() != null)
		{
			registration.setOrder(properties.getFilterOrder());
		}

		if (properties.getRedirectPatterns() == null)
		{
			final List defaultRedirectPatterns = Arrays.asList(
					properties.getBasePath() + "index.html",
					properties.getBasePath(),
					"/",
					"");
			LOG.info("No redirect-patterns have been configured to redirecto to the API-Console."
					+ " Falling back to defaults: "
					+ defaultRedirectPatterns.stream().map(StringUtils::quote).collect(Collectors.joining(", ")) + "."
					+ " To disable API-Console redirects alltogether, configure an empty list of redirect-patterns.");
			registration.setUrlPatterns(defaultRedirectPatterns);
		}
		else if (!properties.getRedirectPatterns().isEmpty())
		{
			registration.setUrlPatterns(properties.getRedirectPatterns());
		}

		return registration;
	}

	protected void setProperties(final ApiConsoleProperties properties)
	{
		this.properties = properties;
	}

	/**
	 * Adds resource handlers that will serve static API Console of the YaaS Service SDK.
	 */
	@Configuration
	@EnableConfigurationProperties(ApiConsoleProperties.class)
	@ConditionalOnResource(resources = STATIC_RESOURCES_LOCATION)
	public static class ApiConsoleResourcesConfiguration extends WebMvcConfigurerAdapter
	{
		@Autowired
		private ApiConsoleProperties properties;

		@Override
		public void addResourceHandlers(final ResourceHandlerRegistry registry)
		{
			registry
					.addResourceHandler(properties.getBasePath() + "**")
					.addResourceLocations("classpath:" + STATIC_RESOURCES_LOCATION);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy