/*******************************************************************************
* Copyright (c) 2012 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:
* Pivotal Software, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.boot.wizard;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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 that keeps track of 'popular' dependencies used in the NewSpringBootWizard.
* It keeps a persistent count of how many times a given dependency has been used.
*
* @author Kris De Volder
*/
public class PopularityTracker {
public static final String PREFIX = PopularityTracker.class.getName()+".";
private IPreferenceStore store;
public PopularityTracker(IPreferenceStore store) {
this.store = store;
}
protected String key(String id) {
String key = PREFIX+id;
return key;
}
public void incrementUsageCount(Dependency d) {
incrementUsageCount(d.getId());
}
public int getUsageCount(Dependency d) {
return getUsageCount(d.getId());
}
public int getUsageCount(String id) {
return store.getInt(key(id));
}
private void incrementUsageCount(String id) {
String key = key(id);
store.setValue(key, store.getInt(key)+1);
}
public void incrementUsageCount(Collection<Dependency> selected) {
for (Dependency d : selected) {
incrementUsageCount(d);
}
}
public List<CheckBoxModel<Dependency>> getMostPopular(HierarchicalMultiSelectionFieldModel<Dependency> dependencies, int howMany) {
final Map<CheckBoxModel<Dependency>, Integer> useCounts = new HashMap<CheckBoxModel<Dependency>, Integer>(); //usecounts by dependency id
ArrayList<CheckBoxModel<Dependency>> allUsedBoxes = new ArrayList<CheckBoxModel<Dependency>>();
for (String category : dependencies.getCategories()) {
allUsedBoxes.addAll(dependencies.getContents(category).getCheckBoxModels());
}
for (Iterator<CheckBoxModel<Dependency>> iterator = allUsedBoxes.iterator(); iterator.hasNext();) {
CheckBoxModel<Dependency> cb = iterator.next();
int useCount = this.getUsageCount(cb.getValue());
if (useCount==0) {
iterator.remove(); //don't care about those options never used at all.
} else {
useCounts.put(cb, this.getUsageCount(cb.getValue()));
}
}
Collections.sort(allUsedBoxes, new Comparator<CheckBoxModel<Dependency>>() {
public int compare(CheckBoxModel<Dependency> o1, CheckBoxModel<Dependency> o2) {
return useCounts.get(o2) - useCounts.get(o1);
}
});
howMany = Math.min(allUsedBoxes.size(), howMany);
List<CheckBoxModel<Dependency>> result = new ArrayList<CheckBoxModel<Dependency>>();
for (int i = 0; i < howMany; i++) {
result.add(allUsedBoxes.get(i));
}
return Collections.unmodifiableList(result);
}
}