blob: ec23931fa0edbfccf93e4ca328c0c8d90564cb99 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 Tasktop Technologies and others.
* 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:
* Tasktop Technologies - initial API and implementation
* Leah Findlater - improvements
*******************************************************************************/
package org.eclipse.mylyn.internal.monitor.core.collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.mylyn.monitor.core.InteractionEvent;
/**
* @author Mik Kersten
* @author Leah Findlater
*/
public class ViewUsageCollector implements IUsageCollector {
protected Map<Integer, Integer> usersNumSelections = new HashMap<Integer, Integer>();
protected Map<Integer, Map<String, Integer>> usersNormalViewSelections = new HashMap<Integer, Map<String, Integer>>();
protected int maxViewsToReport = -1;
public void consumeEvent(InteractionEvent event, int userId) {
if (!usersNumSelections.containsKey(userId)) {
usersNumSelections.put(userId, 0);
}
Map<String, Integer> normalViewSelections = usersNormalViewSelections.get(userId);
if (normalViewSelections == null) {
normalViewSelections = new HashMap<String, Integer>();
usersNormalViewSelections.put(userId, normalViewSelections);
}
if (event.getKind().equals(InteractionEvent.Kind.SELECTION)) {
if (!usersNumSelections.containsKey(userId)) {
usersNumSelections.put(userId, 0);
}
int numEvents = usersNumSelections.get(userId) + 1;
usersNumSelections.put(userId, numEvents);
String viewId = event.getOriginId();
if (!normalViewSelections.containsKey(viewId)) {
normalViewSelections.put(viewId, 0);
}
int normal = normalViewSelections.get(viewId) + 1;
normalViewSelections.put(viewId, normal);
}
}
public List<String> getSummary(int userId, boolean html) {
Map<String, Integer> normalViewSelections = usersNormalViewSelections.get(userId);
float numSelections = usersNumSelections.get(userId);
List<String> summaries = new ArrayList<String>();
List<String> viewUsage = new ArrayList<String>();
for (String view : normalViewSelections.keySet()) {
float viewUse = ((float) (normalViewSelections.get(view))) / numSelections;
String formattedViewUse = formatAsPercentage(viewUse);
String ending = ""; //$NON-NLS-1$
if (html) {
ending = "<br>"; //$NON-NLS-1$
}
viewUsage.add(formattedViewUse + ": " + view + " (" + normalViewSelections.get(view) + ")" + ending); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
Collections.sort(viewUsage, new PercentUsageComparator());
int numViewsToReport = 0;
for (String viewUsageSummary : viewUsage) {
if (maxViewsToReport == -1 || numViewsToReport < maxViewsToReport || viewUsageSummary.contains("mylar")) { //$NON-NLS-1$
summaries.add(viewUsageSummary);
numViewsToReport++;
}
}
return summaries;
}
private String formatAsPercentage(float viewUse) {
String formattedViewUse = ("" + viewUse * 100); //$NON-NLS-1$
// sometimes the floats are so small that formattedViewUsage ends up
// being
// something like 7.68334E-4, which would get formatted to 7.68% without
// this check
if (formattedViewUse.contains("E")) { //$NON-NLS-1$
return "0.00%"; //$NON-NLS-1$
}
int indexOf2ndDecimal = formattedViewUse.indexOf('.') + 3;
if (indexOf2ndDecimal <= formattedViewUse.length()) {
formattedViewUse = formattedViewUse.substring(0, indexOf2ndDecimal);
}
return formattedViewUse + "%"; //$NON-NLS-1$
}
public List<String> getReport() {
List<String> summaries = new ArrayList<String>();
for (int userId : usersNormalViewSelections.keySet()) {
summaries.addAll(getSummary(userId, true));
}
return summaries;
}
public String getReportTitle() {
return Messages.ViewUsageCollector_View_Usage;
}
public void exportAsCSVFile(String directory) {
// TODO Auto-generated method stub
}
/**
* For testing.
*/
public Map<String, Integer> getNormalViewSelections() {
Map<String, Integer> normalViewSelections = new HashMap<String, Integer>();
for (int userId : usersNormalViewSelections.keySet()) {
normalViewSelections.putAll(usersNormalViewSelections.get(userId));
}
return normalViewSelections;
}
public void setMaxViewsToReport(int maxViewsToReport) {
this.maxViewsToReport = maxViewsToReport;
}
public Map<Integer, Map<String, Integer>> getUsersNormalViewSelections() {
return usersNormalViewSelections;
}
public List<String> getPlainTextReport() {
List<String> summaries = new ArrayList<String>();
for (int userId : usersNormalViewSelections.keySet()) {
summaries.addAll(getSummary(userId, false));
}
return summaries;
}
}