diff --git a/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTarget.java b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTarget.java index 3349c3849..c4cdfa54f 100644 --- a/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTarget.java +++ b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTarget.java @@ -75,11 +75,11 @@ public class CFTarget { return params; } - public List getBuildpacks() throws ExecutionException { + public List getBuildpacks() throws Exception { return this.buildpacksCache.get(getName()); } - public List getServices() throws ExecutionException { + public List getServices() throws Exception { return this.servicesCache.get(getName()); } @@ -95,4 +95,5 @@ public class CFTarget { public String toString() { return "CFClientTarget [params=" + params + ", targetName=" + targetName + "]"; } + } diff --git a/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java index 6deed8a03..ea194edd7 100644 --- a/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java +++ b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java @@ -52,10 +52,12 @@ public class CFTargetCache { /** * @return non-null list of targets, or throws exception if no targets found + * @throws NoTargetsException + * if no targets found * @throws Exception - * if no targets found, or error in resolving targets + * for any other error encountered */ - public synchronized List getOrCreate() throws Exception { + public synchronized List getOrCreate() throws NoTargetsException, Exception { List allParams = paramsProvider.getParams(); List targets = new ArrayList<>(); @@ -88,4 +90,6 @@ public class CFTargetCache { return cfApiUrl; } } + + } diff --git a/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CfCliParamsProvider.java b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CfCliParamsProvider.java index 297889579..6035cbed5 100644 --- a/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CfCliParamsProvider.java +++ b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CfCliParamsProvider.java @@ -15,6 +15,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; import org.springframework.ide.vscode.commons.util.StringUtil; @@ -42,39 +43,43 @@ public class CfCliParamsProvider implements ClientParamsProvider { * ClientParamsProvider#getParams() */ @Override - public List getParams() throws Exception { - File file = getConfigJsonFile(); + public List getParams() throws NoTargetsException, ExecutionException { List params = new ArrayList<>(); - if (file != null) { - ObjectMapper mapper = new ObjectMapper(); - Map userData = mapper.readValue(file, Map.class); - if (userData != null) { - String refreshToken = (String) userData.get(REFRESH_TOKEN); - // Only support connecting to CF via refresh token for now - if (isRefreshTokenSet(refreshToken)) { - CFCredentials credentials = CFCredentials.fromRefreshToken(refreshToken); - boolean sslDisabled = (Boolean) userData.get(SSL_DISABLED); - String target = (String) userData.get(TARGET); - Map orgFields = (Map) userData.get(ORGANIZATION_FIELDS); - Map spaceFields = (Map) userData.get(SPACE_FIELDS); - if (target != null && orgFields != null && spaceFields != null) { - String orgName = (String) orgFields.get(NAME); - String spaceName = (String) spaceFields.get(NAME); - params.add(new CFClientParams(target, null, credentials, orgName, spaceName, sslDisabled)); + try { + File file = getConfigJsonFile(); + if (file != null) { + ObjectMapper mapper = new ObjectMapper(); + Map userData = mapper.readValue(file, Map.class); + if (userData != null) { + String refreshToken = (String) userData.get(REFRESH_TOKEN); + // Only support connecting to CF via refresh token for now + if (isRefreshTokenSet(refreshToken)) { + CFCredentials credentials = CFCredentials.fromRefreshToken(refreshToken); + boolean sslDisabled = (Boolean) userData.get(SSL_DISABLED); + String target = (String) userData.get(TARGET); + Map orgFields = (Map) userData.get(ORGANIZATION_FIELDS); + Map spaceFields = (Map) userData.get(SPACE_FIELDS); + if (target != null && orgFields != null && spaceFields != null) { + String orgName = (String) orgFields.get(NAME); + String spaceName = (String) spaceFields.get(NAME); + params.add(new CFClientParams(target, null, credentials, orgName, spaceName, sslDisabled)); + } } } } + } catch (IOException | InterruptedException e) { + throw new ExecutionException(e); } if (params.isEmpty()) { - throw new Exception( + throw new NoTargetsException( "Unable to fetch information from Cloud Foundry. Please use cf CLI to configure and login to Cloud Foundry."); } else { return params; } } - + private boolean isRefreshTokenSet(String token) { return StringUtil.hasText(token); } diff --git a/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/ClientParamsProvider.java b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/ClientParamsProvider.java index 39e94a961..f0e02e487 100644 --- a/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/ClientParamsProvider.java +++ b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/ClientParamsProvider.java @@ -11,15 +11,15 @@ package org.springframework.ide.vscode.commons.cloudfoundry.client.cftarget; import java.util.List; +import java.util.concurrent.ExecutionException; public interface ClientParamsProvider { /** * * @return non-null list of VALID params to connect to Cloud Foundry - * @throws Exception if failure to resolve any params for Cloud Foundry + * @throws NoTargetsException if failure to resolve any params for Cloud Foundry + * @throws ExecutionException if failure occurs while resolving params */ - List getParams() throws Exception; - - + List getParams() throws NoTargetsException, ExecutionException; } \ No newline at end of file diff --git a/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/NoTargetsException.java b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/NoTargetsException.java new file mode 100644 index 000000000..e856e9c43 --- /dev/null +++ b/vscode-extensions/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/NoTargetsException.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2017 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.commons.cloudfoundry.client.cftarget; + +public class NoTargetsException extends Exception { + + public NoTargetsException(String message) { + super(message); + } + + /** + * + */ + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/AbstractCFHintsProvider.java b/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/AbstractCFHintsProvider.java index 75f651244..7a9ee84cf 100644 --- a/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/AbstractCFHintsProvider.java +++ b/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/AbstractCFHintsProvider.java @@ -21,6 +21,7 @@ import javax.inject.Provider; 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.cloudfoundry.client.cftarget.NoTargetsException; import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.ExceptionUtil; import org.springframework.ide.vscode.commons.yaml.schema.BasicYValueHint; @@ -50,12 +51,17 @@ public abstract class AbstractCFHintsProvider implements Provider