diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/AbstractSpringBootApp.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/AbstractSpringBootApp.java index 7e83606c5..d57e8c1a2 100644 --- a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/AbstractSpringBootApp.java +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/AbstractSpringBootApp.java @@ -213,13 +213,10 @@ public abstract class AbstractSpringBootApp implements SpringBootApp { synchronized(this) { if (cachedBeansModel == null || !md5.equals(cachedBeansModelMD5)) { - cachedBeansModel = LiveBeansModel.parse(gson.toJson(json)); cachedBeansModelMD5 = md5; - logger.debug("Got {} beans for {}", cachedBeansModel.getBeanNames().size(), this); - } - else { + } else { logger.debug("Got {} beans for {} - from cache", cachedBeansModel.getBeanNames().size(), this); } } diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/Classpath.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/Classpath.java index dc999e2dd..dcc095e63 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/Classpath.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/Classpath.java @@ -62,9 +62,10 @@ public class Classpath { return outputFolder; } - public void setOutputFolder(String outputFolder) { + public CPE setOutputFolder(String outputFolder) { Assert.isLegal(outputFolder==null || new File(outputFolder).isAbsolute()); this.outputFolder = outputFolder; + return this; } public CPE() {} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringResource.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringResource.java index 0f82f153d..423d8b2fb 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringResource.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringResource.java @@ -31,6 +31,7 @@ public class SpringResource { public static final String FILE = "file"; public static final String CLASS_PATH_RESOURCE = "class path resource"; + private static final String CF_CLASSPATH_PREFIX = "/home/vcap/app/"; private SourceLinks sourceLinks; private String type; @@ -38,7 +39,7 @@ public class SpringResource { private IJavaProject project; private static final Pattern BRACKETS = Pattern.compile("\\[[^\\]]*\\]"); - + private static final String ID_PATTERN = "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*"; private static final String REGEX_FQCN = ID_PATTERN + "(\\." + ID_PATTERN + ")*"; @@ -49,6 +50,10 @@ public class SpringResource { if (matcher.find()) { type = toParse.substring(0, matcher.start()).trim(); path = toParse.substring(matcher.start()+1, matcher.end()-1); + if (type.equals("file") && path.startsWith(CF_CLASSPATH_PREFIX)) { + type = CLASS_PATH_RESOURCE; + path = path.substring(CF_CLASSPATH_PREFIX.length()); + } } else if (Pattern.matches(REGEX_FQCN, toParse)) { // Resource is fully qualified Java type name type = CLASS_PATH_RESOURCE; diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/livehover/test/SpringResourceTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/livehover/test/SpringResourceTest.java new file mode 100644 index 000000000..0e8a377c5 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/livehover/test/SpringResourceTest.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2018 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.java.livehover.test; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.springframework.ide.vscode.boot.java.links.EclipseSourceLinks; +import org.springframework.ide.vscode.boot.java.links.SourceLinks; +import org.springframework.ide.vscode.boot.java.utils.SpringResource; +import org.springframework.ide.vscode.boot.java.value.test.MockProjects; +import org.springframework.ide.vscode.boot.java.value.test.MockProjects.MockProject; + +public class SpringResourceTest { + + private MockProjects projects = new MockProjects(); + private MockProject project = projects.create("test-project"); + + private SourceLinks sourceLinks = new EclipseSourceLinks(); + + @Test public void vcapResourceToMarkdown() throws Exception { + assertEquals( + "[com/github/kdvolder/helloworldservice/Greeter.class]" + + "(http://org.eclipse.ui.intro/execute?command=org.springframework.tooling.boot.ls.OpenJavaType%28fqName%3Dcom.github.kdvolder.helloworldservice.Greeter%2CprojectName%3Dtest-project%29)" + , + toMarkdown("file [/home/vcap/app/com/github/kdvolder/helloworldservice/Greeter.class]") + ); + } + + private String toMarkdown(String beanResourceString) { + return new SpringResource(sourceLinks, beanResourceString, project).toMarkdown(); + } + +} diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/MockProjects.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/MockProjects.java index 1726a7555..dd1e87ff8 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/MockProjects.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/MockProjects.java @@ -72,6 +72,7 @@ public class MockProjects { final private File root; final private String name; final private List sourceFolders = new ArrayList(); + private File defaultOutputFolder; final private IClasspath classpath = new IClasspath() { @@ -84,7 +85,7 @@ public class MockProjects { public Collection getClasspathEntries() throws Exception { List cp = new ArrayList<>(); for (File sf : sourceFolders) { - cp.add(new CPE(Classpath.ENTRY_KIND_SOURCE, sf.getAbsolutePath())); + cp.add(new CPE(Classpath.ENTRY_KIND_SOURCE, sf.getAbsolutePath()).setOutputFolder(defaultOutputFolder.getAbsolutePath())); } return cp; } @@ -97,6 +98,7 @@ public class MockProjects { this.root = Files.createTempDir(); createSourceFolder("src/main/java"); createSourceFolder("src/main/resources"); + createOutputFolder("target/classes"); projectsByName.put(name, this); } synchronized (observer.listeners) { @@ -110,6 +112,13 @@ public class MockProjects { return file.toPath().startsWith(root.toPath()); } + private void createOutputFolder(String projectRelativePath) { + Assert.assertNull("Output folder already created", this.defaultOutputFolder); + File outFolder = new File(root, projectRelativePath); + outFolder.mkdirs(); + this.defaultOutputFolder = outFolder; + } + public void createSourceFolder(String projectRelativePath) { File sourceFolder = new File(root, projectRelativePath); sourceFolder.mkdirs();