001/*
002 * Copyright 2012-2015 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;
018
019import java.io.File;
020import java.net.URI;
021import java.util.ArrayList;
022import java.util.List;
023
024import org.apache.maven.settings.Profile;
025import org.apache.maven.settings.Repository;
026import org.codehaus.plexus.interpolation.InterpolationException;
027import org.codehaus.plexus.interpolation.Interpolator;
028import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;
029import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
030
031import org.springframework.boot.cli.compiler.grape.RepositoryConfiguration;
032import org.springframework.boot.cli.compiler.maven.MavenSettings;
033import org.springframework.boot.cli.compiler.maven.MavenSettingsReader;
034import org.springframework.util.StringUtils;
035
036/**
037 * Factory used to create {@link RepositoryConfiguration}s.
038 *
039 * @author Andy Wilkinson
040 * @author Dave Syer
041 */
042public final class RepositoryConfigurationFactory {
043
044        private static final RepositoryConfiguration MAVEN_CENTRAL = new RepositoryConfiguration(
045                        "central", URI.create("http://repo1.maven.org/maven2/"), false);
046
047        private static final RepositoryConfiguration SPRING_MILESTONE = new RepositoryConfiguration(
048                        "spring-milestone", URI.create("http://repo.spring.io/milestone"), false);
049
050        private static final RepositoryConfiguration SPRING_SNAPSHOT = new RepositoryConfiguration(
051                        "spring-snapshot", URI.create("http://repo.spring.io/snapshot"), true);
052
053        private RepositoryConfigurationFactory() {
054        }
055
056        /**
057         * Create a new default repository configuration.
058         * @return the newly-created default repository configuration
059         */
060        public static List<RepositoryConfiguration> createDefaultRepositoryConfiguration() {
061                MavenSettings mavenSettings = new MavenSettingsReader().readSettings();
062                List<RepositoryConfiguration> repositoryConfiguration = new ArrayList<RepositoryConfiguration>();
063                repositoryConfiguration.add(MAVEN_CENTRAL);
064                if (!Boolean.getBoolean("disableSpringSnapshotRepos")) {
065                        repositoryConfiguration.add(SPRING_MILESTONE);
066                        repositoryConfiguration.add(SPRING_SNAPSHOT);
067                }
068                addDefaultCacheAsRepository(mavenSettings.getLocalRepository(),
069                                repositoryConfiguration);
070                addActiveProfileRepositories(mavenSettings.getActiveProfiles(),
071                                repositoryConfiguration);
072                return repositoryConfiguration;
073        }
074
075        private static void addDefaultCacheAsRepository(String localRepository,
076                        List<RepositoryConfiguration> repositoryConfiguration) {
077                RepositoryConfiguration repository = new RepositoryConfiguration("local",
078                                getLocalRepositoryDirectory(localRepository).toURI(), true);
079                if (!repositoryConfiguration.contains(repository)) {
080                        repositoryConfiguration.add(0, repository);
081                }
082        }
083
084        private static void addActiveProfileRepositories(List<Profile> activeProfiles,
085                        List<RepositoryConfiguration> configurations) {
086                for (Profile activeProfile : activeProfiles) {
087                        Interpolator interpolator = new RegexBasedInterpolator();
088                        interpolator.addValueSource(
089                                        new PropertiesBasedValueSource(activeProfile.getProperties()));
090                        for (Repository repository : activeProfile.getRepositories()) {
091                                configurations.add(getRepositoryConfiguration(interpolator, repository));
092                        }
093                }
094        }
095
096        private static RepositoryConfiguration getRepositoryConfiguration(
097                        Interpolator interpolator, Repository repository) {
098                String name = interpolate(interpolator, repository.getId());
099                String url = interpolate(interpolator, repository.getUrl());
100                boolean snapshotsEnabled = false;
101                if (repository.getSnapshots() != null) {
102                        snapshotsEnabled = repository.getSnapshots().isEnabled();
103                }
104                return new RepositoryConfiguration(name, URI.create(url), snapshotsEnabled);
105        }
106
107        private static String interpolate(Interpolator interpolator, String value) {
108                try {
109                        return interpolator.interpolate(value);
110                }
111                catch (InterpolationException ex) {
112                        return value;
113                }
114        }
115
116        private static File getLocalRepositoryDirectory(String localRepository) {
117                if (StringUtils.hasText(localRepository)) {
118                        return new File(localRepository);
119                }
120                return new File(getM2HomeDirectory(), "repository");
121        }
122
123        private static File getM2HomeDirectory() {
124                String mavenRoot = System.getProperty("maven.home");
125                if (StringUtils.hasLength(mavenRoot)) {
126                        return new File(mavenRoot);
127                }
128                return new File(System.getProperty("user.home"), ".m2");
129        }
130
131}