From e5c49704ccc75bdd0c02ae72c5a4ad8ec334d485 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 8 Dec 2016 15:40:12 -0500 Subject: [PATCH 1/2] Ensure maven dependencies are downloaded. Unit test added --- .../maven/DefaultMavenCinfiguration.java | 27 ++ .../commons/maven/IMavenConfiguration.java | 11 + .../ide/vscode/commons/maven/MavenBridge.java | 34 ++- .../ide/vscode/commons/maven/MavenCore.java | 73 +++-- .../commons/maven/java/MavenJavaProject.java | 2 +- .../maven/java/MavenProjectClasspath.java | 2 +- .../commons/maven/DependencyTreeTest.java | 77 +++++- .../vscode/commons/maven/JavaIndexTest.java | 8 +- .../test/resources/maven-config/settings.xml | 253 ++++++++++++++++++ 9 files changed, 439 insertions(+), 48 deletions(-) create mode 100644 vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenCinfiguration.java create mode 100644 vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/IMavenConfiguration.java create mode 100644 vscode-extensions/commons/commons-maven/src/test/resources/maven-config/settings.xml diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenCinfiguration.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenCinfiguration.java new file mode 100644 index 000000000..dc546605a --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenCinfiguration.java @@ -0,0 +1,27 @@ +package org.springframework.ide.vscode.commons.maven; + +public class DefaultMavenCinfiguration implements IMavenConfiguration { + + private String userSettingsFile = null; + + private String globalSettingsFile = null; + + public void setUserSettingsFile(String userSettingsFile) { + this.userSettingsFile = userSettingsFile; + } + + public void setGlobalSettingsFile(String globalSettingsFile) { + this.globalSettingsFile = globalSettingsFile; + } + + @Override + public String getUserSettingsFile() { + return userSettingsFile; + } + + @Override + public String getGlobalSettingsFile() { + return globalSettingsFile; + } + +} diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/IMavenConfiguration.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/IMavenConfiguration.java new file mode 100644 index 000000000..4c910c3bc --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/IMavenConfiguration.java @@ -0,0 +1,11 @@ +package org.springframework.ide.vscode.commons.maven; + +public interface IMavenConfiguration { + + public static IMavenConfiguration DEFAULT = new DefaultMavenCinfiguration(); + + String getUserSettingsFile(); + + String getGlobalSettingsFile(); + +} diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBridge.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBridge.java index 969269d77..f89876d7c 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBridge.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBridge.java @@ -124,7 +124,7 @@ class MavenBridge { private DefaultPlexusContainer plexus; - // private final IMavenConfiguration mavenConfiguration; + private final IMavenConfiguration mavenConfiguration; /** * Cached parsed settings.xml instance @@ -137,8 +137,8 @@ class MavenBridge { /** Last modified timestamp of cached user settings */ private long settings_timestamp; - public MavenBridge(/* IMavenConfiguration mavenConfiguration */) { - // this.mavenConfiguration = mavenConfiguration; + public MavenBridge(IMavenConfiguration mavenConfiguration) { + this.mavenConfiguration = mavenConfiguration; } /* package */@SuppressWarnings("deprecation") @@ -151,17 +151,15 @@ class MavenBridge { // workspace // request.setStartTime( new Date() ); - // if(mavenConfiguration.getGlobalSettingsFile() != null) { - // request.setGlobalSettingsFile(new - // File(mavenConfiguration.getGlobalSettingsFile())); - // } + if (mavenConfiguration.getGlobalSettingsFile() != null) { + request.setGlobalSettingsFile(new File(mavenConfiguration.getGlobalSettingsFile())); + } File userSettingsFile = SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE; - // if(mavenConfiguration.getUserSettingsFile() != null) { - // userSettingsFile = new - // File(mavenConfiguration.getUserSettingsFile()); - // } + if (mavenConfiguration.getUserSettingsFile() != null) { + userSettingsFile = new File(mavenConfiguration.getUserSettingsFile()); + } request.setUserSettingsFile(userSettingsFile); try { @@ -247,10 +245,9 @@ class MavenBridge { // MUST NOT use createRequest! File userSettingsFile = SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE; - // if(mavenConfiguration.getUserSettingsFile() != null) { - // userSettingsFile = new - // File(mavenConfiguration.getUserSettingsFile()); - // } + if (mavenConfiguration.getUserSettingsFile() != null) { + userSettingsFile = new File(mavenConfiguration.getUserSettingsFile()); + } boolean reload = force_reload || settings == null; @@ -266,10 +263,9 @@ class MavenBridge { Properties systemProperties = new Properties(); copyProperties(systemProperties, System.getProperties()); request.setSystemProperties(systemProperties); - // if(mavenConfiguration.getGlobalSettingsFile() != null) { - // request.setGlobalSettingsFile(new - // File(mavenConfiguration.getGlobalSettingsFile())); - // } + if (mavenConfiguration.getGlobalSettingsFile() != null) { + request.setGlobalSettingsFile(new File(mavenConfiguration.getGlobalSettingsFile())); + } if (userSettingsFile != null) { request.setUserSettingsFile(userSettingsFile); } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java index 0a5be0d27..5c264ce18 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java @@ -20,6 +20,7 @@ import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -40,6 +41,7 @@ import org.eclipse.aether.artifact.ArtifactTypeRegistry; import org.eclipse.aether.collection.CollectRequest; import org.eclipse.aether.collection.DependencyCollectionException; import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.graph.DependencyVisitor; import org.eclipse.aether.repository.LocalRepositoryManager; import org.eclipse.aether.util.filter.ScopeDependencyFilter; import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; @@ -78,9 +80,9 @@ public class MavenCore { public static final String CLASSPATH_TXT = "classpath.txt"; public static final String POM_XML = "pom.xml"; - private static MavenCore instance = null; + private static MavenCore defaultInstance = null; - private MavenBridge maven = new MavenBridge(); + private MavenBridge maven; private Supplier javaCoreIndex = Suppliers.memoize(() -> { try { @@ -102,11 +104,15 @@ public class MavenCore { } }); - public static MavenCore getInstance() { - if (instance == null) { - instance = new MavenCore(); + public static MavenCore getDefault() { + if (defaultInstance == null) { + defaultInstance = new MavenCore(IMavenConfiguration.DEFAULT); } - return instance; + return defaultInstance; + } + + public MavenCore(IMavenConfiguration config) { + this.maven = new MavenBridge(config); } /** @@ -212,28 +218,55 @@ public class MavenCore { * @throws MavenException */ public Set resolveDependencies(MavenProject project, String scope) throws MavenException { - Set artifacts = new LinkedHashSet<>(); - MavenExecutionRequest request = maven.createExecutionRequest(); DefaultRepositorySystemSession session = maven.createRepositorySession(request); DependencyNode graph = readDependencyTree(maven.lookupComponent(org.eclipse.aether.RepositorySystem.class), session, project, scope); if (graph != null) { - RepositoryUtils.toArtifacts(artifacts, graph.getChildren(), - Collections.singletonList(project.getArtifact().getId()), null); - - // Maven 2.x quirk: an artifact always points at the local repo, - // regardless whether resolved or not - LocalRepositoryManager lrm = session.getLocalRepositoryManager(); - for (Artifact artifact : artifacts) { - if (!artifact.isResolved()) { - String path = lrm.getPathForLocalArtifact(RepositoryUtils.toArtifact(artifact)); - artifact.setFile(new File(lrm.getRepository().getBasedir(), path)); + + ArrayList dependencyNodes = new ArrayList<>(); + graph.accept(new DependencyVisitor() { + public boolean visitEnter(DependencyNode node) { + if (node.getDependency() != null) { + dependencyNodes.add(node); + } + return true; } - } + + public boolean visitLeave(DependencyNode dependencynode) { + return true; + } + }); + + LinkedHashSet artifacts = new LinkedHashSet<>(); + RepositoryUtils.toArtifacts(artifacts, dependencyNodes, + Collections.singletonList(project.getArtifact().getId()), null); + + return artifacts.parallelStream().map(artifact -> { + if (!artifact.isResolved()) { + try { + artifact = maven.resolve(artifact, null, request); + } catch (MavenException e) { + Log.log(e); + // Maven 2.x quirk: an artifact always points at the local repo, + // regardless whether resolved or not + LocalRepositoryManager lrm = session.getLocalRepositoryManager(); + String path = lrm.getPathForLocalArtifact(RepositoryUtils.toArtifact(artifact)); + artifact.setFile(new File(lrm.getRepository().getBasedir(), path)); + } + } + return artifact; + }).collect(Collectors.toSet()); } - return artifacts; + return Collections.emptySet(); + } + + public File localRepositoryFolder() throws MavenException { + MavenExecutionRequest request = maven.createExecutionRequest(); + DefaultRepositorySystemSession session = maven.createRepositorySession(request); + LocalRepositoryManager lrm = session.getLocalRepositoryManager(); + return lrm.getRepository().getBasedir(); } public Artifact getSources(Artifact artifact) throws MavenException { diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java index ba190dcca..e372788da 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java @@ -36,7 +36,7 @@ public class MavenJavaProject implements IJavaProject { private MavenCore maven; public MavenJavaProject(File pom) throws Exception { - this.maven = MavenCore.getInstance(); + this.maven = MavenCore.getDefault(); this.mavenProject = maven.readProject(pom); this.classpath = new MavenProjectClasspath(mavenProject, maven); } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java index 5060bca06..b07d61ca1 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java @@ -61,7 +61,7 @@ public class MavenProjectClasspath implements IClasspath { private Supplier javaIndex; public MavenProjectClasspath(MavenProject project) { - this(project, MavenCore.getInstance()); + this(project, MavenCore.getDefault()); } MavenProjectClasspath(MavenProject project, MavenCore maven) { diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java index 9a4ff0e45..062dbc416 100644 --- a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java @@ -11,12 +11,22 @@ package org.springframework.ide.vscode.commons.maven; * Pivotal, Inc. - initial API and implementation *******************************************************************************/ import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.attribute.BasicFileAttributes; import java.util.Set; import java.util.stream.Collectors; +import org.apache.maven.artifact.Artifact; import org.apache.maven.project.MavenProject; import org.junit.Test; @@ -32,10 +42,10 @@ public class DependencyTreeTest { Path testProjectPath = Paths.get(DependencyTreeTest.class.getResource("/" + projectName).toURI()); MavenBuilder.newBuilder(testProjectPath).clean().pack().skipTests().execute(); - MavenProject project = MavenCore.getInstance().readProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); - Set calculatedClassPath = MavenCore.getInstance().resolveDependencies(project, null).stream().map(artifact -> { + MavenProject project = MavenCore.getDefault().readProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); + Set calculatedClassPath = MavenCore.getDefault().resolveDependencies(project, null).stream().map(artifact -> { return Paths.get(artifact.getFile().toURI()); - }).collect(Collectors.toSet());; + }).collect(Collectors.toSet()); Set expectedClasspath = MavenCore.readClassPathFile(testProjectPath.resolve(MavenCore.CLASSPATH_TXT)).collect(Collectors.toSet()); assertEquals(expectedClasspath, calculatedClassPath); @@ -51,4 +61,65 @@ public class DependencyTreeTest { testMavenClasspath("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); } + @Test + public void dowloadDependenciesTest() throws Exception { + String userSettingsFile = Paths.get(getClass().getResource("/maven-config/settings.xml").toURI()).toFile().toString(); + DefaultMavenCinfiguration mavenConfig = new DefaultMavenCinfiguration(); + mavenConfig.setUserSettingsFile(userSettingsFile); + + MavenCore maven = new MavenCore(mavenConfig); + File localRepoFolder = maven.localRepositoryFolder(); + if (localRepoFolder.exists()) { + deleteFolderAndContents(localRepoFolder.toPath()); + } + + assertFalse(localRepoFolder.exists()); + + Path testProjectPath = Paths.get(getClass().getResource("/gs-rest-service-cors-boot-1.4.1-with-classpath-file").toURI()); + MavenProject project = maven.readProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); + + Set calculatedClassPath = maven.resolveDependencies(project, null); + + String parentFolderPathStr = localRepoFolder.toString(); + for (Artifact artifact : calculatedClassPath) { + assertTrue(artifact.isResolved()); + File file = artifact.getFile(); + assertNotNull(file); + assertTrue(file.toString().startsWith(parentFolderPathStr)); + assertTrue(file.exists()); + System.out.println(file); + } + + deleteFolderAndContents(localRepoFolder.toPath()); + assertFalse(localRepoFolder.exists()); + } + + private static void deleteFolderAndContents(Path folder) throws IOException { + Files.walkFileTree(folder, new FileVisitor() { + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + + }); + } + } diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java index 28076c9e3..c7b5433ca 100644 --- a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java @@ -59,7 +59,7 @@ public class JavaIndexTest { } private static boolean javaVersionHigherThan(int version) { - String versionStr = MavenCore.getInstance().getJavaRuntimeMinorVersion(); + String versionStr = MavenCore.getDefault().getJavaRuntimeMinorVersion(); try { return versionStr != null && Integer.valueOf(versionStr) > version; } catch (NumberFormatException e) { @@ -69,7 +69,7 @@ public class JavaIndexTest { @Test public void fuzzySearchNoFilter() throws Exception { - List> results = MavenCore.getInstance().getJavaIndexForJreLibs() + List> results = MavenCore.getDefault().getJavaIndexForJreLibs() .fuzzySearchTypes("util.Map", null) .collectSortedList((o1, o2) -> o2.getT2().compareTo(o1.getT2())) .block(); @@ -79,7 +79,7 @@ public class JavaIndexTest { @Test public void fuzzySearchWithFilter() throws Exception { - List> results = MavenCore.getInstance().getJavaIndexForJreLibs() + List> results = MavenCore.getDefault().getJavaIndexForJreLibs() .fuzzySearchTypes("util.Map", (type) -> Flags.isPrivate(type.getFlags())) .collectSortedList((o1, o2) -> o2.getT2().compareTo(o1.getT2())) .block(); @@ -89,7 +89,7 @@ public class JavaIndexTest { @Test public void fuzzySearchPackage() throws Exception { - List> results = MavenCore.getInstance().getJavaIndexForJreLibs() + List> results = MavenCore.getDefault().getJavaIndexForJreLibs() .fuzzySearchPackages("util") .collectSortedList((o1, o2) -> o2.getT2().compareTo(o1.getT2())) .block(); diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/maven-config/settings.xml b/vscode-extensions/commons/commons-maven/src/test/resources/maven-config/settings.xml new file mode 100644 index 000000000..48b3aa0c2 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/maven-config/settings.xml @@ -0,0 +1,253 @@ + + + + + + + + ${java.io.tmpdir}/test-m2-repository + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b03eca232a8fe6b63bda373adbdee7468a154427 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 8 Dec 2016 15:50:24 -0500 Subject: [PATCH 2/2] Fix a spelling mistake --- ...ltMavenCinfiguration.java => DefaultMavenConfiguration.java} | 2 +- .../ide/vscode/commons/maven/IMavenConfiguration.java | 2 +- .../ide/vscode/commons/maven/DependencyTreeTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/{DefaultMavenCinfiguration.java => DefaultMavenConfiguration.java} (89%) diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenCinfiguration.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenConfiguration.java similarity index 89% rename from vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenCinfiguration.java rename to vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenConfiguration.java index dc546605a..2c81e2907 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenCinfiguration.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/DefaultMavenConfiguration.java @@ -1,6 +1,6 @@ package org.springframework.ide.vscode.commons.maven; -public class DefaultMavenCinfiguration implements IMavenConfiguration { +public class DefaultMavenConfiguration implements IMavenConfiguration { private String userSettingsFile = null; diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/IMavenConfiguration.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/IMavenConfiguration.java index 4c910c3bc..17dd55b99 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/IMavenConfiguration.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/IMavenConfiguration.java @@ -2,7 +2,7 @@ package org.springframework.ide.vscode.commons.maven; public interface IMavenConfiguration { - public static IMavenConfiguration DEFAULT = new DefaultMavenCinfiguration(); + public static IMavenConfiguration DEFAULT = new DefaultMavenConfiguration(); String getUserSettingsFile(); diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java index 062dbc416..a6b5d2a21 100644 --- a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java @@ -64,7 +64,7 @@ public class DependencyTreeTest { @Test public void dowloadDependenciesTest() throws Exception { String userSettingsFile = Paths.get(getClass().getResource("/maven-config/settings.xml").toURI()).toFile().toString(); - DefaultMavenCinfiguration mavenConfig = new DefaultMavenCinfiguration(); + DefaultMavenConfiguration mavenConfig = new DefaultMavenConfiguration(); mavenConfig.setUserSettingsFile(userSettingsFile); MavenCore maven = new MavenCore(mavenConfig);