diff --git a/vscode-extensions/commons/application-properties-metadata/pom.xml b/vscode-extensions/commons/application-properties-metadata/pom.xml index d9ed5f0d6..3fae23258 100644 --- a/vscode-extensions/commons/application-properties-metadata/pom.xml +++ b/vscode-extensions/commons/application-properties-metadata/pom.xml @@ -64,6 +64,12 @@ commons-language-server ${project.version} + + org.springframework.ide.vscode + language-server-test-harness + ${project.version} + test + \ No newline at end of file diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/PropertiesLoader.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/PropertiesLoader.java index 26384054d..166691fb9 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/PropertiesLoader.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/PropertiesLoader.java @@ -21,6 +21,7 @@ import java.util.zip.ZipEntry; import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; import org.springframework.boot.configurationmetadata.ConfigurationMetadataRepository; import org.springframework.boot.configurationmetadata.ConfigurationMetadataRepositoryJsonBuilder; +import org.springframework.ide.vscode.commons.java.IClasspath; public class PropertiesLoader { @@ -48,8 +49,9 @@ public class PropertiesLoader { private ConfigurationMetadataRepositoryJsonBuilder builder = ConfigurationMetadataRepositoryJsonBuilder.create(); - public ConfigurationMetadataRepository load(Path projectPath) { - return load(projectPath.resolve("classpath.txt"), projectPath.resolve("target/classes")); + public ConfigurationMetadataRepository load(IClasspath classPath) { + Path path = classPath.getPath(); + return load(path.resolve("classpath.txt"), path.resolve("target/classes")); } private ConfigurationMetadataRepository load(Path classPathFilePath, Path outputFolderPath) { @@ -154,8 +156,8 @@ public class PropertiesLoader { public static void main(String[] args) { if (args.length > 0) { - Path projectPath = Paths.get(args[0]); - ConfigurationMetadataRepository repo = new PropertiesLoader().load(projectPath); + Path projectPath = Paths.get(args[0]); + ConfigurationMetadataRepository repo = new PropertiesLoader().load(() -> projectPath); Map allProperties = repo.getAllProperties(); allProperties.keySet().forEach(System.out::println); } diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertiesIndexManager.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertiesIndexManager.java index d6f0252cd..24e594679 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertiesIndexManager.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertiesIndexManager.java @@ -17,6 +17,8 @@ import java.util.Map; import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap; import org.springframework.ide.vscode.application.properties.metadata.util.Listener; import org.springframework.ide.vscode.application.properties.metadata.util.ListenerManager; +import org.springframework.ide.vscode.commons.java.IClasspath; +import org.springframework.ide.vscode.commons.java.IJavaProject; /** * Support for Reconciling, Content Assist and Hover Text in spring properties @@ -28,21 +30,21 @@ import org.springframework.ide.vscode.application.properties.metadata.util.Liste */ public class SpringPropertiesIndexManager extends ListenerManager> { - private Map indexes = null; + private Map indexes = null; final private ValueProviderRegistry valueProviders; public SpringPropertiesIndexManager(ValueProviderRegistry valueProviders) { this.valueProviders = valueProviders; } - public synchronized FuzzyMap get(Path projectFolder) { + public synchronized FuzzyMap get(IJavaProject project) { if (indexes==null) { indexes = new HashMap<>(); } - SpringPropertyIndex index = indexes.get(projectFolder); + SpringPropertyIndex index = indexes.get(project); if (index==null) { - index = new SpringPropertyIndex(valueProviders, projectFolder); - indexes.put(projectFolder, index); + index = new SpringPropertyIndex(valueProviders, project.getClasspath()); + indexes.put(project, index); } return index; } diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertyIndex.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertyIndex.java index 756e7fabd..f4335826a 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertyIndex.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertyIndex.java @@ -10,7 +10,6 @@ *******************************************************************************/ package org.springframework.ide.vscode.application.properties.metadata; -import java.nio.file.Path; import java.util.Collection; import java.util.List; @@ -19,12 +18,13 @@ import org.springframework.boot.configurationmetadata.ConfigurationMetadataPrope import org.springframework.boot.configurationmetadata.ConfigurationMetadataRepository; import org.springframework.boot.configurationmetadata.ConfigurationMetadataSource; import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap; +import org.springframework.ide.vscode.commons.java.IClasspath; public class SpringPropertyIndex extends FuzzyMap { private ValueProviderRegistry valueProviders; - public SpringPropertyIndex(ValueProviderRegistry valueProviders, Path projectPath) { + public SpringPropertyIndex(ValueProviderRegistry valueProviders, IClasspath projectPath) { this.valueProviders = valueProviders; if (projectPath!=null) { // try { diff --git a/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/PropertiesIndexTest.java b/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/PropertiesIndexTest.java index bc5d85bf5..2d947d260 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/PropertiesIndexTest.java +++ b/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/PropertiesIndexTest.java @@ -14,18 +14,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.junit.BeforeClass; import org.junit.Test; import org.springframework.ide.vscode.application.properties.metadata.PropertyInfo; import org.springframework.ide.vscode.application.properties.metadata.SpringPropertiesIndexManager; import org.springframework.ide.vscode.application.properties.metadata.ValueProviderRegistry; import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap; -import org.springframework.ide.vscode.commons.util.ExternalCommand; -import org.springframework.ide.vscode.commons.util.ExternalProcess; +import org.springframework.ide.vscode.languageserver.testharness.TestProjectHarness; /** * Sanity test the boot properties index @@ -35,26 +29,12 @@ import org.springframework.ide.vscode.commons.util.ExternalProcess; */ public class PropertiesIndexTest { - /** - * Build test project demo-1 if it's not built already - * @throws Exception - */ - @BeforeClass - public static void initTestProject() throws Exception { - Path testProjectPath = Paths.get(PropertiesIndexTest.class.getResource("/demo-1").toURI()); - if (!Files.exists(testProjectPath.resolve("classpath.txt"))) { - testProjectPath.resolve("mvnw").toFile().setExecutable(true); - ExternalProcess process = new ExternalProcess(testProjectPath.toFile(), new ExternalCommand("./mvnw", "clean", "package"), true); - if (process.getExitValue() != 0) { - throw new RuntimeException("Failed to build test project"); - } - } - } + private TestProjectHarness projects = new TestProjectHarness(); @Test public void springStandardPropertyPresent() throws Exception { SpringPropertiesIndexManager indexManager = new SpringPropertiesIndexManager(ValueProviderRegistry.getDefault()); - FuzzyMap index = indexManager.get(Paths.get(getClass().getResource("/demo-1").toURI())); + FuzzyMap index = indexManager.get(projects.mavenProject("demo-1")); PropertyInfo propertyInfo = index.get("server.port"); assertNotNull(propertyInfo); assertEquals(Integer.class.getName(), propertyInfo.getType()); @@ -64,7 +44,7 @@ public class PropertiesIndexTest { @Test public void customPropertyPresent() throws Exception { SpringPropertiesIndexManager indexManager = new SpringPropertiesIndexManager(ValueProviderRegistry.getDefault()); - FuzzyMap index = indexManager.get(Paths.get(getClass().getResource("/demo-1").toURI())); + FuzzyMap index = indexManager.get(projects.mavenProject("demo-1")); PropertyInfo propertyInfo = index.get("demo.settings.user"); assertNotNull(propertyInfo); assertEquals(String.class.getName(), propertyInfo.getType()); @@ -74,7 +54,7 @@ public class PropertiesIndexTest { @Test public void propertyNotPresent() throws Exception { SpringPropertiesIndexManager indexManager = new SpringPropertiesIndexManager(ValueProviderRegistry.getDefault()); - FuzzyMap index = indexManager.get(Paths.get(getClass().getResource("/demo-1").toURI())); + FuzzyMap index = indexManager.get(projects.mavenProject("demo-1")); PropertyInfo propertyInfo = index.get("my.server.port"); assertNull(propertyInfo); } diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java new file mode 100644 index 000000000..3575fa11c --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java @@ -0,0 +1,14 @@ +package org.springframework.ide.vscode.commons.java; + +import java.nio.file.Path; + +public interface IClasspath { + + /** + * Deprecated: Remove this. We should expose here information about classpath as a list of entries. Not + * depend on where it is read from. + */ + @Deprecated + Path getPath(); + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java index 13dfb5dcf..9aefc9e0a 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java @@ -1,8 +1,6 @@ package org.springframework.ide.vscode.commons.java; -import java.nio.file.Path; - public interface IJavaProject extends IJavaElement { IType findType(String fqName); - Path getPath(); + IClasspath getClasspath(); } diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/DefaultJavaProjectFinder.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/DefaultJavaProjectFinder.java index 38aead3ab..f940a628f 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/DefaultJavaProjectFinder.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/DefaultJavaProjectFinder.java @@ -3,12 +3,9 @@ package org.springframework.ide.vscode.commons.languageserver.java; import java.io.File; import java.net.URI; import java.net.URISyntaxException; -import java.nio.file.Path; import org.springframework.ide.vscode.commons.java.IJavaProject; -import org.springframework.ide.vscode.commons.java.IType; import org.springframework.ide.vscode.commons.languageserver.util.IDocument; -import org.springframework.ide.vscode.commons.util.HtmlSnippet; import org.springframework.ide.vscode.commons.util.StringUtil; public class DefaultJavaProjectFinder implements JavaProjectFinder { @@ -48,45 +45,5 @@ public class DefaultJavaProjectFinder implements JavaProjectFinder { } } return null; - }; - - private static class JavaProjectWithClasspathFile implements IJavaProject { - - private File cpFile; - - public JavaProjectWithClasspathFile(File cpFile) { - this.cpFile = cpFile; - } - - @Override - public String getElementName() { - return cpFile.getParentFile().getName(); - } - - @Override - public HtmlSnippet getJavaDoc() { - return null; - } - - @Override - public boolean exists() { - return cpFile.exists(); - } - - @Override - public IType findType(String fqName) { - //TODO: implement - return null; - } - - @Override - public Path getPath() { - return cpFile.getParentFile().toPath(); - } - - @Override - public String toString() { - return "JavaProjectWithClasspathFile("+cpFile+")"; - } } } diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/JavaProjectWithClasspathFile.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/JavaProjectWithClasspathFile.java new file mode 100644 index 000000000..228b91820 --- /dev/null +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/JavaProjectWithClasspathFile.java @@ -0,0 +1,75 @@ +package org.springframework.ide.vscode.commons.languageserver.java; + +import java.io.File; + +import org.springframework.ide.vscode.commons.java.IClasspath; +import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.java.IType; +import org.springframework.ide.vscode.commons.util.HtmlSnippet; + +public class JavaProjectWithClasspathFile implements IJavaProject { + + private File cpFile; + + public JavaProjectWithClasspathFile(File cpFile) { + this.cpFile = cpFile; + } + + @Override + public String getElementName() { + return cpFile.getParentFile().getName(); + } + + @Override + public HtmlSnippet getJavaDoc() { + return null; + } + + @Override + public boolean exists() { + return cpFile.exists(); + } + + @Override + public IType findType(String fqName) { + //TODO: implement + return null; + } + + @Override + public IClasspath getClasspath() { + return () -> cpFile.toPath(); + } + + @Override + public String toString() { + return "JavaProjectWithClasspathFile("+cpFile+")"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((cpFile == null) ? 0 : cpFile.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + JavaProjectWithClasspathFile other = (JavaProjectWithClasspathFile) obj; + if (cpFile == null) { + if (other.cpFile != null) + return false; + } else if (!cpFile.equals(other.cpFile)) + return false; + return true; + } + + +} \ No newline at end of file diff --git a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/TestProjectHarness.java b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/TestProjectHarness.java index d45c8b419..3f3535231 100644 --- a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/TestProjectHarness.java +++ b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/TestProjectHarness.java @@ -6,6 +6,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.IType; import org.springframework.ide.vscode.commons.util.ExternalCommand; @@ -21,10 +22,45 @@ import com.google.common.cache.CacheBuilder; */ public class TestProjectHarness { + private static final class TestProject implements IJavaProject { + private Path location; + + public TestProject(Path location) { + this.location = location; + } + + @Override + public HtmlSnippet getJavaDoc() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getElementName() { + return location.toFile().getName(); + } + + @Override + public boolean exists() { + return true; + } + + @Override + public IClasspath getClasspath() { + return () -> location; + } + + @Override + public IType findType(String fqName) { + // TODO Auto-generated method stub + return null; + } + } + public Cache cache = CacheBuilder.newBuilder().build(); - public IJavaProject get(String name) throws Exception { - Path testProjectPath = Paths.get(TestProjectHarness.class.getResource("/demo-1").toURI()); + public IJavaProject mavenProject(String name) throws Exception { + Path testProjectPath = Paths.get(TestProjectHarness.class.getResource("/"+name).toURI()); assertTrue(Files.exists(testProjectPath)); if (!Files.exists(testProjectPath.resolve("classpath.txt"))) { testProjectPath.resolve("mvnw").toFile().setExecutable(true); @@ -33,34 +69,7 @@ public class TestProjectHarness { throw new RuntimeException("Failed to build test project"); } } - return new IJavaProject() { - - @Override - public HtmlSnippet getJavaDoc() { - return null; - } - - @Override - public String getElementName() { - return name; - } - - @Override - public boolean exists() { - return true; - } - - @Override - public Path getPath() { - return testProjectPath; - } - - @Override - public IType findType(String string) { - //throw new UnsupportedOperationException("Not yet implemented"); - return null; - } - }; + return new TestProject(testProjectPath); } } diff --git a/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/DefaultSpringPropertyIndexProvider.java b/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/DefaultSpringPropertyIndexProvider.java index 32f554d0f..7724078ba 100644 --- a/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/DefaultSpringPropertyIndexProvider.java +++ b/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/DefaultSpringPropertyIndexProvider.java @@ -1,7 +1,5 @@ package org.springframework.ide.vscode.application.yaml; -import java.nio.file.Path; - import org.springframework.ide.vscode.application.properties.metadata.PropertyInfo; import org.springframework.ide.vscode.application.properties.metadata.SpringPropertiesIndexManager; import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndexProvider; @@ -20,10 +18,7 @@ public class DefaultSpringPropertyIndexProvider implements SpringPropertyIndexPr public FuzzyMap getIndex(IDocument doc) { IJavaProject jp = javaProjectFinder.find(doc); if (jp!=null) { - Path projectFolder = jp.getPath(); - if (projectFolder!=null) { - return indexManager.get(projectFolder); - } + return indexManager.get(jp); } return null; } diff --git a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/PropertyIndexHarness.java b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/PropertyIndexHarness.java index 408d71799..62a6dbb90 100644 --- a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/PropertyIndexHarness.java +++ b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/PropertyIndexHarness.java @@ -14,6 +14,7 @@ import org.springframework.ide.vscode.application.properties.metadata.SpringProp import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.application.properties.metadata.ValueProviderRegistry; import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap; +import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.util.IDocument; @@ -30,8 +31,8 @@ public class PropertyIndexHarness { protected SpringPropertyIndexProvider indexProvider = new SpringPropertyIndexProvider() { public FuzzyMap getIndex(IDocument doc) { if (index==null) { - Path path = testProject == null ? null : testProject.getPath(); - index = new SpringPropertyIndex(valueProviders, path); + IClasspath classpath = testProject == null ? null : testProject.getClasspath(); + index = new SpringPropertyIndex(valueProviders, classpath); for (ConfigurationMetadataProperty propertyInfo : datas.values()) { index.add(propertyInfo); }