io.spring.initializr.web.autoconfigure.InitializrAutoConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for io.spring.initializr.web.autoconfigure.InitializrAutoConfiguration.java

Source

/*
 * Copyright 2012-2018 the original author or authors.
 *
 * Licensed 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 io.spring.initializr.web.autoconfigure;

import java.util.ArrayList;
import java.util.List;

import javax.cache.configuration.MutableConfiguration;
import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.spring.initializr.generator.ProjectGenerator;
import io.spring.initializr.generator.ProjectRequestPostProcessor;
import io.spring.initializr.generator.ProjectRequestResolver;
import io.spring.initializr.generator.ProjectResourceLocator;
import io.spring.initializr.metadata.DependencyMetadataProvider;
import io.spring.initializr.metadata.InitializrMetadata;
import io.spring.initializr.metadata.InitializrMetadataBuilder;
import io.spring.initializr.metadata.InitializrMetadataProvider;
import io.spring.initializr.metadata.InitializrProperties;
import io.spring.initializr.util.TemplateRenderer;
import io.spring.initializr.web.project.MainController;
import io.spring.initializr.web.support.DefaultDependencyMetadataProvider;
import io.spring.initializr.web.support.DefaultInitializrMetadataProvider;
import io.spring.initializr.web.ui.UiController;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.servlet.resource.ResourceUrlProvider;

/**
 * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
 * Auto-configuration} to configure Spring initializr. In a web environment, configures
 * the necessary controller to serve the applications from the root context.
 *
 * <p>
 * Project generation can be customized by defining a custom {@link ProjectGenerator}.
 *
 * @author Stephane Nicoll
 */
@Configuration
@EnableConfigurationProperties(InitializrProperties.class)
@AutoConfigureAfter({ CacheAutoConfiguration.class, JacksonAutoConfiguration.class,
        RestTemplateAutoConfiguration.class })
public class InitializrAutoConfiguration {

    private final List<ProjectRequestPostProcessor> postProcessors;

    public InitializrAutoConfiguration(ObjectProvider<List<ProjectRequestPostProcessor>> postProcessors) {
        List<ProjectRequestPostProcessor> list = postProcessors.getIfAvailable();
        this.postProcessors = list != null ? list : new ArrayList<>();
    }

    @Bean
    @ConditionalOnMissingBean
    public ProjectGenerator projectGenerator() {
        return new ProjectGenerator();
    }

    @Bean
    @ConditionalOnMissingBean
    public TemplateRenderer templateRenderer(Environment environment) {
        Binder binder = Binder.get(environment);
        boolean cache = binder.bind("spring.mustache.cache", Boolean.class).orElse(true);
        TemplateRenderer templateRenderer = new TemplateRenderer();
        templateRenderer.setCache(cache);
        return templateRenderer;
    }

    @Bean
    @ConditionalOnMissingBean
    public ProjectRequestResolver projectRequestResolver() {
        return new ProjectRequestResolver(this.postProcessors);
    }

    @Bean
    public ProjectResourceLocator projectResourceLocator() {
        return new ProjectResourceLocator();
    }

    @Bean
    @ConditionalOnMissingBean(InitializrMetadataProvider.class)
    public InitializrMetadataProvider initializrMetadataProvider(InitializrProperties properties,
            ObjectMapper objectMapper, RestTemplateBuilder restTemplateBuilder) {
        InitializrMetadata metadata = InitializrMetadataBuilder.fromInitializrProperties(properties).build();
        return new DefaultInitializrMetadataProvider(metadata, objectMapper, restTemplateBuilder.build());
    }

    @Bean
    @ConditionalOnMissingBean
    public DependencyMetadataProvider dependencyMetadataProvider() {
        return new DefaultDependencyMetadataProvider();
    }

    /**
     * Initializr web configuration.
     */
    @Configuration
    @ConditionalOnWebApplication
    static class InitializrWebConfiguration {

        @Bean
        public InitializrWebConfig initializrWebConfig() {
            return new InitializrWebConfig();
        }

        @Bean
        @ConditionalOnMissingBean
        public MainController initializrMainController(InitializrMetadataProvider metadataProvider,
                TemplateRenderer templateRenderer, ResourceUrlProvider resourceUrlProvider,
                ProjectGenerator projectGenerator, DependencyMetadataProvider dependencyMetadataProvider) {
            return new MainController(metadataProvider, templateRenderer, resourceUrlProvider, projectGenerator,
                    dependencyMetadataProvider);
        }

        @Bean
        @ConditionalOnMissingBean
        public UiController initializrUiController(InitializrMetadataProvider metadataProvider) {
            return new UiController(metadataProvider);
        }

    }

    /**
     * Initializr cache configuration.
     */
    @Configuration
    @ConditionalOnClass(javax.cache.CacheManager.class)
    static class InitializrCacheConfiguration {

        @Bean
        public JCacheManagerCustomizer initializrCacheManagerCustomizer() {
            return (cm) -> {
                cm.createCache("initializr.metadata",
                        config().setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.TEN_MINUTES)));
                cm.createCache("initializr.dependency-metadata", config());
                cm.createCache("initializr.project-resources", config());
            };
        }

        private MutableConfiguration<Object, Object> config() {
            return new MutableConfiguration<>().setStoreByValue(false).setManagementEnabled(true)
                    .setStatisticsEnabled(true);
        }

    }

}