package org.wildfly.swarm.bootstrap.env; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * @author Heiko Braun * @since 18/07/16 */ class SystemDependencyResolution implements DependencyResolution { SystemDependencyResolution() { final String classpathProp = System.getProperty("java.class.path"); final String javaHomProp = System.getProperty("java.home"); final String userDirProp = System.getProperty("user.dir"); final String testClasspatProp = System.getProperty("swarm.test.dependencies"); //Dedect gradle cache this.useGradleRepo = classpathProp.contains(File.separator + ".gradle"); this.classpath = Arrays.asList(classpathProp.split(File.pathSeparator)); this.testClasspath = testClasspatProp != null ? Arrays.asList(testClasspatProp.split(File.pathSeparator)) : Collections.emptyList(); this.pwd = userDirProp; this.javaHome = javaHomProp.endsWith(JRE) ? javaHomProp.substring(0, javaHomProp.lastIndexOf(JRE)) : javaHomProp; } @Override public Set<String> resolve(List<String> exclusions) throws IOException { final Set<String> archivesPaths = new HashSet<>(); exclusions.replaceAll(s -> s.replace('.', File.separatorChar)); if (classpath != null) { ApplicationEnvironment env = ApplicationEnvironment.get(); Set<String> classpathElements = new HashSet<>(); Set<String> providedGAVs = new HashSet<>(); List<String> testClasspathElements = testClasspath != null ? testClasspath : Collections.emptyList(); for (final String element : classpath) { if (!element.startsWith(javaHome) && !element.startsWith(pwd + File.separatorChar) && !element.endsWith(".pom")) { // explicit exclusions if (!excluded(exclusions, element)) { classpathElements.add(element); } } } // prepare the list of provided dep's, these will be implicitly excluded providedGAVs.addAll( env.getRemovableDependencies() .stream() .map(e -> e.split(":")) .map(e -> e[0] + File.separatorChar + e[1] + File.separatorChar) .map(m -> (useGradleRepo ? m : m.replace('.', File.separatorChar))) .collect(Collectors.toList()) ); // implicit exclusions for (final String element : classpathElements) { boolean excludedByProvidedGAVs = excluded(providedGAVs, element); boolean excludedByTestClasspath = excluded(testClasspathElements, element); if (!excludedByProvidedGAVs && !excludedByTestClasspath) { archivesPaths.add(element); } } } return archivesPaths; } private static final String JRE = "jre"; private final List<String> classpath; private final String javaHome; private final String pwd; private final List<String> testClasspath; private final boolean useGradleRepo; }