diff --git a/atom-extensions/atom-spring-boot/properties.json b/atom-extensions/atom-spring-boot/properties.json index fd23a8bb8..97c16b6ea 100644 --- a/atom-extensions/atom-spring-boot/properties.json +++ b/atom-extensions/atom-spring-boot/properties.json @@ -1,3 +1,3 @@ { - "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/spring-boot-language-server-0.1.5-201803091709.jar" + "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/spring-boot-language-server-0.2.1-201805111942.jar" } diff --git a/headless-services/bosh-language-server/pom.xml b/headless-services/bosh-language-server/pom.xml index 6cfe9f00b..ad50b4d11 100644 --- a/headless-services/bosh-language-server/pom.xml +++ b/headless-services/bosh-language-server/pom.xml @@ -37,6 +37,32 @@ commons-yaml ${dependencies.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson-2-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-2-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-2-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson-2-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + ${jackson-2-version} + org.springframework.ide.vscode diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ClasspathFileBasedCache.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ClasspathFileBasedCache.java index ac5827e19..5d96dc0eb 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ClasspathFileBasedCache.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ClasspathFileBasedCache.java @@ -11,16 +11,21 @@ package org.springframework.ide.vscode.commons.java; import java.io.File; +import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; -import org.springframework.ide.vscode.commons.util.Log; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; public class ClasspathFileBasedCache { + private static final Gson gson = new Gson(); + private static final Logger log = LoggerFactory.getLogger(ClasspathFileBasedCache.class); + public static final ClasspathFileBasedCache NULL = new ClasspathFileBasedCache(null); public static final String CLASSPATH_DATA_CACHE_FILE = "classpath-data.json"; @@ -38,16 +43,15 @@ public class ClasspathFileBasedCache { try { Files.createDirectories(file.getParentFile().toPath()); writer = new FileWriter(file); - ObjectMapper mapper = new ObjectMapper(); - mapper.writeValue(writer, data); + gson.toJson(data, writer); } catch (IOException e) { - Log.log(e); + log.error("Failed to write JSON data to " + file, e); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { - Log.log(e); + log.error("Failed to close file writer for file: " + file, e); } } } @@ -60,11 +64,20 @@ public class ClasspathFileBasedCache { public synchronized ClasspathData load() { if (file != null && file.exists()) { - ObjectMapper mapper = new ObjectMapper(); + FileReader fileReader = null; try { - return mapper.readValue(file, ClasspathData.class); + fileReader = new FileReader(file); + return gson.fromJson(fileReader, ClasspathData.class); } catch (Throwable e) { - Log.log(e); + log.error("Failed to read JSON data from " + file, e); + } finally { + if (fileReader != null) { + try { + fileReader.close(); + } catch (IOException e) { + log.error("Failed to close file reader for file: " + file, e); + } + } } } return ClasspathData.EMPTY_CLASSPATH_DATA; diff --git a/headless-services/commons/commons-language-server/pom.xml b/headless-services/commons/commons-language-server/pom.xml index 006eb5a75..54cb6b3d7 100644 --- a/headless-services/commons/commons-language-server/pom.xml +++ b/headless-services/commons/commons-language-server/pom.xml @@ -19,31 +19,6 @@ ${project.version} - - com.fasterxml.jackson.core - jackson-core - ${jackson-2-version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson-2-version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-2-version} - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - ${jackson-2-version} - - - com.fasterxml.jackson.datatype - jackson-datatype-jdk8 - ${jackson-2-version} - io.projectreactor reactor-core diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java index 7514bc78c..aad758a86 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.languageserver.util; +import static org.springframework.ide.vscode.commons.languageserver.util.AsyncRunner.thenLog; + import java.net.URI; import java.nio.file.Paths; import java.util.ArrayList; @@ -78,12 +80,12 @@ import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import reactor.core.Disposable; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; -import static org.springframework.ide.vscode.commons.languageserver.util.AsyncRunner.*; /** * Abstract base class to implement LanguageServer. Bits and pieces copied from @@ -185,7 +187,7 @@ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientA if (CODE_ACTION_COMMAND_ID.equals(params.getCommand())) { Assert.isLegal(params.getArguments().size()==2); QuickfixResolveParams quickfixParams = new QuickfixResolveParams( - (String)params.getArguments().get(0), params.getArguments().get(1) + ((JsonPrimitive)params.getArguments().get(0)).getAsString(), params.getArguments().get(1) ); return quickfixResolve(quickfixParams) .flatMap((QuickfixEdit edit) -> { diff --git a/headless-services/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java b/headless-services/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java index 1987748cd..03832c58d 100644 --- a/headless-services/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java +++ b/headless-services/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java @@ -11,45 +11,26 @@ package org.springframework.ide.vscode.commons.maven.java; import java.io.File; -import java.net.MalformedURLException; import java.net.URL; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; -import java.util.Optional; import java.util.Set; -import java.util.concurrent.Callable; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Generated; import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.model.Resource; import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.util.DirectoryScanner; -import org.springframework.ide.vscode.commons.jandex.JandexClasspath; -import org.springframework.ide.vscode.commons.jandex.JandexIndex; import org.springframework.ide.vscode.commons.java.ClasspathData; import org.springframework.ide.vscode.commons.java.IClasspath; -import org.springframework.ide.vscode.commons.java.IJavadocProvider; -import org.springframework.ide.vscode.commons.javadoc.HtmlJavadocProvider; -import org.springframework.ide.vscode.commons.javadoc.TypeUrlProviderFromContainerUrl; -import org.springframework.ide.vscode.commons.languageserver.jdt.ls.Classpath; import org.springframework.ide.vscode.commons.languageserver.jdt.ls.Classpath.CPE; import org.springframework.ide.vscode.commons.maven.MavenCore; import org.springframework.ide.vscode.commons.maven.MavenException; import org.springframework.ide.vscode.commons.util.Log; import org.springframework.ide.vscode.commons.util.RunnableWithException; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.google.common.base.Objects; import com.google.common.collect.ImmutableList; -import com.google.gson.internal.Streams; /** * Classpath for a maven project diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/quickfix/YamlQuickfixes.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/quickfix/YamlQuickfixes.java index cb936ef0f..db716d708 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/quickfix/YamlQuickfixes.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/quickfix/YamlQuickfixes.java @@ -13,17 +13,18 @@ package org.springframework.ide.vscode.commons.yaml.quickfix; import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WorkspaceEdit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits.TextReplace; import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixEdit; +import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixEdit.CursorMovement; import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixRegistry; import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixType; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; -import org.springframework.ide.vscode.commons.util.Log; import org.springframework.ide.vscode.commons.util.text.IRegion; import org.springframework.ide.vscode.commons.util.text.TextDocument; import org.springframework.ide.vscode.commons.yaml.completion.YamlPathEdits; import org.springframework.ide.vscode.commons.yaml.path.YamlPath; -import org.springframework.ide.vscode.commons.yaml.path.YamlPathSegment; import org.springframework.ide.vscode.commons.yaml.reconcile.MissingPropertiesData; import org.springframework.ide.vscode.commons.yaml.reconcile.ReplaceStringData; import org.springframework.ide.vscode.commons.yaml.structure.YamlDocument; @@ -32,14 +33,15 @@ import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider; import org.springframework.ide.vscode.commons.yaml.util.YamlIndentUtil; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; - -import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixEdit.CursorMovement; +import com.google.gson.Gson; +import com.google.gson.JsonElement; public class YamlQuickfixes { + private static final Logger LOG = LoggerFactory.getLogger(YamlQuickfixes.class); + private static final QuickfixEdit NULL_FIX = new QuickfixEdit( new WorkspaceEdit(ImmutableMap.of(), null), null @@ -47,9 +49,11 @@ public class YamlQuickfixes { public final QuickfixType MISSING_PROP_FIX; public final QuickfixType SIMPLE_TEXT_EDIT; + private final Gson gson = new Gson(); + public YamlQuickfixes(QuickfixRegistry r, SimpleTextDocumentService textDocumentService, YamlStructureProvider structureProvider) { MISSING_PROP_FIX = r.register("MISSING_PROP_FIX", (Object _params) -> { - MissingPropertiesData params = new ObjectMapper().convertValue(_params, MissingPropertiesData.class); + MissingPropertiesData params = gson.fromJson((JsonElement)_params, MissingPropertiesData.class); try { TextDocument _doc = textDocumentService.getDocument(params.getUri()); if (_doc!=null) { @@ -90,7 +94,7 @@ public class YamlQuickfixes { } } } catch (Exception e) { - Log.log(e); + LOG.error("", e); } //Something went wrong. Return empty edit object. return NULL_FIX; @@ -98,7 +102,7 @@ public class YamlQuickfixes { SIMPLE_TEXT_EDIT = r.register("SIMPLE_TEXT_EDIT", (_params) -> { try { - ReplaceStringData params = new ObjectMapper().convertValue(_params, ReplaceStringData.class); + ReplaceStringData params = gson.fromJson((JsonElement)_params, ReplaceStringData.class); TextDocument _doc = textDocumentService.getDocument(params.getUri()); if (_doc!=null) { return new QuickfixEdit( @@ -110,7 +114,7 @@ public class YamlQuickfixes { ); } } catch (Exception e) { - Log.log(e); + LOG.error("", e); } //Something went wrong. Return empty edit object. return NULL_FIX; @@ -130,7 +134,7 @@ public class YamlQuickfixes { return doc.toPosition(newSelection.getOffset()); } } catch (Exception e) { - Log.log(e); + LOG.error("", e); } return null; } diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java index b11b9e69d..b322894f0 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java @@ -110,10 +110,11 @@ import org.springframework.ide.vscode.commons.util.UriUtil; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; +import com.google.gson.Gson; +import com.google.gson.JsonArray; import reactor.core.publisher.Mono; @@ -134,6 +135,7 @@ public class LanguageServerHarness { private Multimap> highlights = MultimapBuilder.hashKeys().linkedListValues().build(); private Map diagnostics = new HashMap<>(); private List activeEditors = new ArrayList<>(); + private Gson gson = new Gson(); public LanguageServerHarness(Callable factory, LanguageId defaultLanguageId) { @@ -657,14 +659,14 @@ public class LanguageServerHarness { .collect(Collectors.toList()); } - ObjectMapper mapper = new ObjectMapper(); - @SuppressWarnings({ "unchecked", "rawtypes" }) public void perform(Command command) throws Exception { List args = command.getArguments(); //Note convert the params to a 'typeless' Object because that is more representative on how it will be // received when we get it in a real client/server setting (i.e. parsed from json). - List untypedParams = mapper.convertValue(args, List.class); + JsonArray jsonArray = gson.toJsonTree(args).getAsJsonArray(); + List untypedParams = new ArrayList<>(jsonArray.size()); + jsonArray.forEach(e -> untypedParams.add(e)); getServer().getWorkspaceService() .executeCommand(new ExecuteCommandParams(command.getCommand(), untypedParams)) .get();