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}