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);
}