From 4fabf40579ba5fcaf30bd4d509bd7929dc43a3c2 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Wed, 5 Jul 2017 15:35:23 -0400 Subject: [PATCH] Ignore individual target errors for hint providers if there are valid targets --- .../client/cftarget/CFTargetCache.java | 4 +++ .../yaml/AbstractCFHintsProvider.java | 28 ++++++++++++++- .../ManifestYamlCFBuildpacksProvider.java | 35 ++++++------------ .../yaml/ManifestYamlCFDomainsProvider.java | 36 +++++++------------ .../yaml/ManifestYamlCFServicesProvider.java | 33 ++++++----------- .../yaml/ManifestYamlStacksProvider.java | 33 ++++++----------- 6 files changed, 73 insertions(+), 96 deletions(-) diff --git a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java index 8d6991118..926d82349 100644 --- a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java +++ b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java @@ -121,4 +121,8 @@ public class CFTargetCache { return cfApiUrl; } } + + public CfClientConfig getCfClientConfig() { + return cfClientConfig; + } } diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/AbstractCFHintsProvider.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/AbstractCFHintsProvider.java index b03db701c..0d72f8665 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/AbstractCFHintsProvider.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/AbstractCFHintsProvider.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.springframework.ide.vscode.manifest.yaml; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.Callable; @@ -88,6 +89,31 @@ public abstract class AbstractCFHintsProvider implements Callable getHints(List targets) throws Exception; + protected Collection getHints(List targets) throws Exception { + if (targets==null || targets.isEmpty()) { + //no targets... means we don't know anything. Indicate this by returning null... + // this "don't know" value will suppress bogus warnings in the reconciler. + return null; + } + List hints = new ArrayList<>(); + boolean validTargetsPresent = false; + for (CFTarget cfTarget : targets) { + try { + // TODO: check if duplicate proposals can be the list of all hints. Duplicates don't seem to cause duplicate proposals. Verify this! + getHints(cfTarget).stream().filter(hint -> !hints.contains(hint)).forEach(hint -> hints.add(hint)); + validTargetsPresent = true; + } catch (Exception e) { + // Drop individual target error + } + } + if (validTargetsPresent) { + return hints; + } else { + throw new ConnectionException( + targetCache.getCfClientConfig().getClientParamsProvider().getMessages().noNetworkConnection()); + } + } + + abstract Collection getHints(CFTarget target) throws Exception; } diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFBuildpacksProvider.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFBuildpacksProvider.java index 1200e52ce..74d050e1e 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFBuildpacksProvider.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFBuildpacksProvider.java @@ -10,9 +10,10 @@ *******************************************************************************/ package org.springframework.ide.vscode.manifest.yaml; -import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.springframework.ide.vscode.commons.cloudfoundry.client.CFBuildpack; import org.springframework.ide.vscode.commons.cloudfoundry.client.cftarget.CFTarget; @@ -29,32 +30,16 @@ public class ManifestYamlCFBuildpacksProvider extends AbstractCFHintsProvider { } @Override - public Collection getHints(List targets) throws Exception { - if (targets==null || targets.isEmpty()) { - //no targets... means we don't know anything. Indicate this by returning null... - // this "don't know" value will suppress bogus warnings in the reconciler. - return null; - } - List hints = new ArrayList<>(); - for (CFTarget cfTarget : targets) { - - List buildpacks = cfTarget.getBuildpacks(); + public Collection getHints(CFTarget cfTarget) throws Exception { + List buildpacks = cfTarget.getBuildpacks(); + if (buildpacks == null) { + return Collections.emptyList(); + } else { Renderable targetLabel = Renderables.text(cfTarget.getLabel()); - - if (buildpacks != null && !buildpacks.isEmpty()) { - - for (CFBuildpack buildpack : buildpacks) { - String name = buildpack.getName(); - String label = getBuildpackLabel(cfTarget, buildpack); - YValueHint hint = new BasicYValueHint(name, label) - .setDocumentation(targetLabel); - if (!hints.contains(hint)) { - hints.add(hint); - } - } - } + return buildpacks.stream() + .map(buildpack -> new BasicYValueHint(buildpack.getName(), getBuildpackLabel(cfTarget, buildpack)).setDocumentation(targetLabel)) + .collect(Collectors.toList()); } - return hints; } protected String getBuildpackLabel(CFTarget target, CFBuildpack buildpack) { diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFDomainsProvider.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFDomainsProvider.java index d3496e32a..42d9cdcfb 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFDomainsProvider.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFDomainsProvider.java @@ -10,13 +10,15 @@ *******************************************************************************/ package org.springframework.ide.vscode.manifest.yaml; -import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.springframework.ide.vscode.commons.cloudfoundry.client.CFDomain; import org.springframework.ide.vscode.commons.cloudfoundry.client.cftarget.CFTarget; import org.springframework.ide.vscode.commons.cloudfoundry.client.cftarget.CFTargetCache; +import org.springframework.ide.vscode.commons.util.Renderable; import org.springframework.ide.vscode.commons.util.Renderables; import org.springframework.ide.vscode.commons.yaml.schema.BasicYValueHint; import org.springframework.ide.vscode.commons.yaml.schema.YValueHint; @@ -28,30 +30,16 @@ public class ManifestYamlCFDomainsProvider extends AbstractCFHintsProvider { } @Override - public Collection getHints(List targets) throws Exception { - if (targets==null || targets.isEmpty()) { - //no targets... means we don't know anything. Indicate this by returning null... - // this "don't know" value will suppress bogus warnings in the reconciler. - return null; + public Collection getHints(CFTarget cfTarget) throws Exception { + List domains = cfTarget.getDomains(); + if (domains == null) { + return Collections.emptyList(); + } else { + Renderable targetLabel = Renderables.text(cfTarget.getLabel()); + return domains.stream() + .map(domain -> new BasicYValueHint(domain.getName(), getLabel(cfTarget, domain)).setDocumentation(targetLabel)) + .collect(Collectors.toList()); } - List hints = new ArrayList<>(); - for (CFTarget cfTarget : targets) { - - List domains = cfTarget.getDomains(); - if (domains != null && !domains.isEmpty()) { - - for (CFDomain domain : domains) { - String name = domain.getName(); - String label = getLabel(cfTarget, domain); - YValueHint hint = new BasicYValueHint(name, label) - .setDocumentation(Renderables.text(cfTarget.getLabel())); - if (!hints.contains(hint)) { - hints.add(hint); - } - } - } - } - return hints; } protected String getLabel(CFTarget target, CFDomain domain) { diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFServicesProvider.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFServicesProvider.java index e2d329039..82998988d 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFServicesProvider.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlCFServicesProvider.java @@ -10,9 +10,10 @@ *******************************************************************************/ package org.springframework.ide.vscode.manifest.yaml; -import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.springframework.ide.vscode.commons.cloudfoundry.client.CFServiceInstance; import org.springframework.ide.vscode.commons.cloudfoundry.client.cftarget.CFTarget; @@ -29,30 +30,16 @@ public class ManifestYamlCFServicesProvider extends AbstractCFHintsProvider { } @Override - public Collection getHints(List targets) throws Exception { - if (targets==null || targets.isEmpty()) { - //no targets... means we don't know anything. Indicate this by returning null... - // this "don't know" value will suppress bogus warnings in the reconciler. - return null; - } - List hints = new ArrayList<>(); - for (CFTarget cfTarget : targets) { - List services = cfTarget.getServices(); + public Collection getHints(CFTarget cfTarget) throws Exception { + List services = cfTarget.getServices(); + if (services == null) { + return Collections.emptyList(); + } else { Renderable targetLabel = Renderables.text(cfTarget.getLabel()); - if (services != null && !services.isEmpty()) { - - for (CFServiceInstance service : services) { - String name = service.getName(); - String label = getServiceLabel(cfTarget, service); - YValueHint hint = new BasicYValueHint(name, label) - .setDocumentation(targetLabel); - if (!hints.contains(hint)) { - hints.add(hint); - } - } - } + return services.stream() + .map(service -> new BasicYValueHint(service.getName(), getServiceLabel(cfTarget, service)).setDocumentation(targetLabel)) + .collect(Collectors.toList()); } - return hints; } @Override diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlStacksProvider.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlStacksProvider.java index 3a2179850..d5237010c 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlStacksProvider.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlStacksProvider.java @@ -10,9 +10,10 @@ *******************************************************************************/ package org.springframework.ide.vscode.manifest.yaml; -import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.springframework.ide.vscode.commons.cloudfoundry.client.CFStack; import org.springframework.ide.vscode.commons.cloudfoundry.client.cftarget.CFTarget; @@ -34,30 +35,16 @@ public class ManifestYamlStacksProvider extends AbstractCFHintsProvider { } @Override - protected Collection getHints(List targets) throws Exception { - if (targets==null || targets.isEmpty()) { - //no targets... means we don't know anything. Indicate this by returning null... - // this "don't know" value will suppress bogus warnings in the reconciler. - return null; - } - List hints = new ArrayList<>(); - for (CFTarget cfTarget : targets) { - List stacks = cfTarget.getStacks(); + protected Collection getHints(CFTarget cfTarget) throws Exception { + List stacks = cfTarget.getStacks(); + if (stacks == null) { + return Collections.emptyList(); + } else { Renderable targetLabel = Renderables.text(cfTarget.getLabel()); - if (stacks != null && !stacks.isEmpty()) { - for (CFStack s : stacks) { - String name = s.getName(); - String label = name; - YValueHint hint = new BasicYValueHint(name, label) - .setDocumentation(targetLabel); - if (!hints.contains(hint)) { - hints.add(hint); - } - } - } + return stacks.stream() + .map(s -> new BasicYValueHint(s.getName(), s.getName()).setDocumentation(targetLabel)) + .collect(Collectors.toList()); } - return hints; } - }