/******************************************************************************* * Copyright (c) 2016 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.eclipse.boot.dash.cloudfoundry; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import org.eclipse.core.runtime.Platform; import org.springframework.ide.eclipse.boot.dash.livexp.DisposingFactory; import org.springframework.ide.eclipse.boot.dash.livexp.LiveSets; import org.springframework.ide.eclipse.boot.dash.model.AbstractDisposable; import org.springsource.ide.eclipse.commons.livexp.core.AsyncLiveExpression.AsyncMode; import org.springsource.ide.eclipse.commons.livexp.core.LiveSetVariable; import org.springsource.ide.eclipse.commons.livexp.core.ObservableSet; import com.google.common.base.Function; import com.google.common.collect.ImmutableSet; /** * An instance of this class is responsible for managing a list of {@link CloudAppDashElement}. This means: * <p> * <ul> * <li> calling 'dispose' on any no longer needed elements. * <li> ensuring that only a single object exists to represent an element with a given identity. * <li> creating the elements as needed. * </ul> * * @author Kris De Volder * @author Nieraj Singh */ public class CloudDashApplications extends AbstractDisposable { private static final boolean DEBUG = ("" + Platform.getLocation()).contains("bamboo") || ("" + Platform.getLocation()).contains("kdvolder"); private static void debug(String string) { if (DEBUG) { System.out.println(string); } } private final LiveSetVariable<String> appNames = new LiveSetVariable<>(AsyncMode.SYNC); private final ObservableSet<CloudAppDashElement> applications; private final DisposingFactory<String, CloudAppDashElement> factory; public CloudDashApplications(final CloudFoundryBootDashModel model) { factory = new DisposingFactory<String, CloudAppDashElement>(appNames) { @Override protected CloudAppDashElement create(String appName) { return new CloudAppDashElement(model, appName, model.getPropertyStore()); } }; applications = LiveSets.map(appNames, AsyncMode.SYNC, AsyncMode.ASYNC, new Function<String, CloudAppDashElement>() { @Override public CloudAppDashElement apply(String appName) { return factory.createOrGet(appName); } }); addDisposableChild(factory); addDisposableChild(applications); if (DEBUG) { applications.addListener((e, v) -> { debug("applications change event!"); debug(" event values = "+getNames(v)); debug(" current values = "+getNames(applications.getValues())); }); } } private List<String> getNames(ImmutableSet<CloudAppDashElement> v) { return v.stream().map(CloudAppDashElement::getName).collect(Collectors.toList()); } public void setAppNames(Collection<String> names) { appNames.replaceAll(names); } public ObservableSet<CloudAppDashElement> getApplications() { return applications; } public ImmutableSet<CloudAppDashElement> getApplicationValues() { return applications.getValues(); } public CloudAppDashElement getApplication(String appName) { return factory.createOrGet(appName); } public CloudAppDashElement addApplication(String name) { appNames.add(name); return factory.createOrGet(name); } public void removeApplication(String name) { appNames.remove(name); } }