void (ServerRuntimeInstance<D> instance, final Runnable onFinished) { instance.computeDeployments(new ServerRuntimeInstance.ComputeDeploymentsCallback() { private final List<DeploymentImpl<?>> myCollectedDeployments = Collections.synchronizedList(new ArrayList<>()); @Override public void addDeployment(@NotNull String deploymentName) { addDeployment(deploymentName, null); } @Override public void addDeployment(@NotNull String deploymentName, @Nullable DeploymentRuntime deploymentRuntime) { addDeployment(deploymentName, deploymentRuntime, null, null); } @Override public Deployment addDeployment(@NotNull String name, @Nullable DeploymentRuntime runtime, @Nullable DeploymentStatus status, @Nullable @Nls String statusText) { if (status == null) { status = DeploymentStatus.DEPLOYED; } DeploymentImpl<?> result = myAllDeployments.updateRemoteState(name, runtime, status, statusText); if (result == null) { result = new DeploymentImpl<>(ServerConnectionImpl.this, name, status, statusText, runtime, null); } myCollectedDeployments.add(result); return result; } @Override public void succeeded() { synchronized (myCollectedDeployments) { myAllDeployments.replaceRemotesWith(myCollectedDeployments); } myEventDispatcher.queueDeploymentsChanged(ServerConnectionImpl.this); onFinished.run(); } @Override public void errorOccurred(@NotNull String errorMessage) { myAllDeployments.replaceRemotesWith(Collections.emptyList()); myStatusText = CloudBundle.message("ServerConnectionImpl.error.cannot.obtain.deployments", errorMessage); myEventDispatcher.queueConnectionStatusChanged(ServerConnectionImpl.this); myEventDispatcher.queueDeploymentsChanged(ServerConnectionImpl.this); onFinished.run(); } }); }