001/*
002 * Copyright 2012-2017 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.springframework.boot.cli.compiler.grape;
018
019import java.util.ArrayList;
020import java.util.List;
021import java.util.ServiceLoader;
022
023import groovy.lang.GroovyClassLoader;
024import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
025import org.eclipse.aether.DefaultRepositorySystemSession;
026import org.eclipse.aether.RepositorySystem;
027import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
028import org.eclipse.aether.impl.DefaultServiceLocator;
029import org.eclipse.aether.internal.impl.DefaultRepositorySystem;
030import org.eclipse.aether.repository.RemoteRepository;
031import org.eclipse.aether.repository.RepositoryPolicy;
032import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
033import org.eclipse.aether.spi.connector.transport.TransporterFactory;
034import org.eclipse.aether.spi.locator.ServiceLocator;
035import org.eclipse.aether.transport.file.FileTransporterFactory;
036import org.eclipse.aether.transport.http.HttpTransporterFactory;
037
038/**
039 * Utility class to create a pre-configured {@link AetherGrapeEngine}.
040 *
041 * @author Andy Wilkinson
042 */
043public abstract class AetherGrapeEngineFactory {
044
045        public static AetherGrapeEngine create(GroovyClassLoader classLoader,
046                        List<RepositoryConfiguration> repositoryConfigurations,
047                        DependencyResolutionContext dependencyResolutionContext, boolean quiet) {
048                RepositorySystem repositorySystem = createServiceLocator()
049                                .getService(RepositorySystem.class);
050                DefaultRepositorySystemSession repositorySystemSession = MavenRepositorySystemUtils
051                                .newSession();
052                ServiceLoader<RepositorySystemSessionAutoConfiguration> autoConfigurations = ServiceLoader
053                                .load(RepositorySystemSessionAutoConfiguration.class);
054                for (RepositorySystemSessionAutoConfiguration autoConfiguration : autoConfigurations) {
055                        autoConfiguration.apply(repositorySystemSession, repositorySystem);
056                }
057                new DefaultRepositorySystemSessionAutoConfiguration()
058                                .apply(repositorySystemSession, repositorySystem);
059                return new AetherGrapeEngine(classLoader, repositorySystem,
060                                repositorySystemSession, createRepositories(repositoryConfigurations),
061                                dependencyResolutionContext, quiet);
062        }
063
064        private static ServiceLocator createServiceLocator() {
065                DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
066                locator.addService(RepositorySystem.class, DefaultRepositorySystem.class);
067                locator.addService(RepositoryConnectorFactory.class,
068                                BasicRepositoryConnectorFactory.class);
069                locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
070                locator.addService(TransporterFactory.class, FileTransporterFactory.class);
071                return locator;
072        }
073
074        private static List<RemoteRepository> createRepositories(
075                        List<RepositoryConfiguration> repositoryConfigurations) {
076                List<RemoteRepository> repositories = new ArrayList<RemoteRepository>(
077                                repositoryConfigurations.size());
078                for (RepositoryConfiguration repositoryConfiguration : repositoryConfigurations) {
079                        RemoteRepository.Builder builder = new RemoteRepository.Builder(
080                                        repositoryConfiguration.getName(), "default",
081                                        repositoryConfiguration.getUri().toASCIIString());
082
083                        if (!repositoryConfiguration.getSnapshotsEnabled()) {
084                                builder.setSnapshotPolicy(
085                                                new RepositoryPolicy(false, RepositoryPolicy.UPDATE_POLICY_NEVER,
086                                                                RepositoryPolicy.CHECKSUM_POLICY_IGNORE));
087                        }
088                        repositories.add(builder.build());
089                }
090                return repositories;
091        }
092
093}