/******************************************************************************* * Copyright (c) 2016 Pivotal Software, 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: * GoPivotal, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.boot.wizard; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.preference.IPreferenceStore; import org.springframework.ide.eclipse.boot.core.initializr.InitializrServiceSpec.Dependency; import org.springframework.ide.eclipse.boot.wizard.CheckBoxesSection.CheckBoxModel; /** * Component responsible for storing/loading dependencies selected by default. * It is also capable to select the default dependencies if appropriate model is * passed. * * @author Alex Boyko * */ public class DefaultDependencies { private static final String PREF_DEFAULT_DEPENDENCIES = "dependencies"; private static final String DEPENDECIES_DELIMITER = " "; private String PREFIX = PreferredSelections.class.getName()+"."; private IPreferenceStore store; public DefaultDependencies(IPreferenceStore store) { Assert.isNotNull(store); this.store = store; } protected String key(String id) { String key = PREFIX+id; return key; } private void put(String id, String value) { String key = key(id); store.setValue(key, value); } private String get(String name, String dflt) { String key = key(name); String v = store.getString(key); if (StringUtils.isNotBlank(v)) { return v; } return dflt; } /** * Stores currently selection dependencies as default dependencies * * @param model dependency selection model * @return <code>true</code> if dependencies were stored, i.e. currently stored are different from the current ones. */ public boolean save(HierarchicalMultiSelectionFieldModel<Dependency> model) { Set<String> ids = getDependciesIdSet(); String[] currentSelection = model.getCurrentSelection().stream().map(Dependency::getId).toArray(String[]::new); if (ids.size() == currentSelection.length && ids.containsAll(Arrays.asList(currentSelection))) { // Nothing to store no changes detected return false; } else { // Store dependencies ids as current selection has differences from currently stored dependencies put(PREF_DEFAULT_DEPENDENCIES, String.join(DEPENDECIES_DELIMITER, currentSelection)); return true; } } /** * Selects stored default dependencies on the passed selection model * * @param model dependency selection model */ public void restore(HierarchicalMultiSelectionFieldModel<Dependency> model) { Arrays.asList(get(PREF_DEFAULT_DEPENDENCIES, "").split(DEPENDECIES_DELIMITER)).forEach(id -> { model.getCategories().stream().filter(category -> { Optional<Dependency> matchedDependency = Arrays.asList(model.getContents(category).getChoices()).stream().filter(dependency -> { return id.equals(dependency.getId()); }).findFirst(); matchedDependency.ifPresent(d -> { model.setSelection(category, d, true); }); return matchedDependency.isPresent(); }).findFirst(); }); } /** * Finds check-box models from the selection model corresponding to stored default dependencies (ids) * * @param model dependency selection model * @return check-box models of stored default dependencies */ public List<CheckBoxModel<Dependency>> getDependencies(HierarchicalMultiSelectionFieldModel<Dependency> model) { Set<String> ids = getDependciesIdSet(); List<CheckBoxModel<Dependency>> dependencies = Collections.synchronizedList(new ArrayList<>(ids.size())); model.getCategories().parallelStream().forEach(category -> { model.getContents(category).getCheckBoxModels().stream().filter(checkboxModel -> { return ids.contains(checkboxModel.getValue().getId()); }).forEach(dependencies::add); }); return dependencies; } /** * Set of stored default dependencies * * @return ids of default dependencies */ public Set<String> getDependciesIdSet() { return new HashSet<>(Arrays.asList(get(PREF_DEFAULT_DEPENDENCIES, "").split(DEPENDECIES_DELIMITER))); } }