blob: c8ebaea686176d803f8ad42be6480a288c78bda2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 - 2005 University Of British Columbia 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:
* University Of British Columbia - initial API and implementation
*******************************************************************************/
package org.eclipse.mylar.internal.monitor.reports.collectors;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.mylar.internal.monitor.reports.InteractionEventClassifier;
import org.eclipse.mylar.monitor.reports.IUsageCollector;
import org.eclipse.mylar.provisional.core.InteractionEvent;
public class DataOverviewCollector implements IUsageCollector {
private static long FIVEMININMS = 5 * 60 * 1000;
private Map<Integer, Integer> interactionHistorySizes = new HashMap<Integer, Integer>();
private Map<Integer, List<Date>> interactionHistoryRanges = new HashMap<Integer, List<Date>>();
private Map<Integer, Long> interactionHistoryActiveDuration = new HashMap<Integer, Long>();
// For calculating active milliseconds
private int currentUser = -1;
private InteractionEvent lastUserEvent;
private static int startDatePosition = 0;
private static int endDatePosition = 1;
private String filePrefix = "";
public DataOverviewCollector(String prefix) {
filePrefix = prefix;
}
public String getReportTitle() {
return "Data Overview";
}
public void consumeEvent(InteractionEvent event, int userId) {
// Add to size of history
if (!interactionHistorySizes.containsKey(userId)) {
interactionHistorySizes.put(userId, 0);
}
interactionHistorySizes.put(userId, interactionHistorySizes.get(userId) + 1);
// Record start and end date of history
List<Date> dateRange;
if (!interactionHistoryRanges.containsKey(userId)) {
// There are two positions in the array: start and end date
dateRange = new ArrayList<Date>(2);
interactionHistoryRanges.put(userId, dateRange);
}
dateRange = interactionHistoryRanges.get(userId);
if (dateRange.size() == 0) {
dateRange.add(event.getDate());
} else if (dateRange.size() == 1) {
dateRange.add(event.getDate());
} else {
dateRange.set(endDatePosition, event.getDate());
}
// Accumulate active duration -- assumes see all of events of a user in
// order
if (currentUser == -1 || currentUser != userId) {
lastUserEvent = event;
currentUser = userId;
}
// Restart accumulation if greater than 5 min has elapsed between events
long elapsed = event.getDate().getTime() - lastUserEvent.getDate().getTime();
if (elapsed < FIVEMININMS) {
if (!interactionHistoryActiveDuration.containsKey(userId)) {
interactionHistoryActiveDuration.put(userId, new Long(0));
}
interactionHistoryActiveDuration.put(userId, interactionHistoryActiveDuration.get(userId) + elapsed);
}
lastUserEvent = event;
}
public List<String> getReport() {
List<String> report = new ArrayList<String>();
report.add("<h4>Data Overview</h4>");
report.add("Number of Users: " + interactionHistorySizes.keySet().size() + "<br>");
for (Map.Entry<Integer, Integer> entry : interactionHistorySizes.entrySet()) {
report.add(entry.getKey() + ": " + entry.getValue() + " events; ");
report.add(InteractionEventClassifier.formatDuration(interactionHistoryActiveDuration.get(entry.getKey()))
+ " active use; ");
List<Date> dateRange = interactionHistoryRanges.get(entry.getKey());
long duration = dateRange.get(endDatePosition).getTime() - dateRange.get(startDatePosition).getTime();
report.add(dateRange.get(startDatePosition) + " to " + dateRange.get(endDatePosition) + ", a period of "
+ InteractionEventClassifier.formatDuration(duration) + " hours.");
report.add("<br><br>");
}
return report;
}
public void exportAsCSVFile(String directory) {
String filename = directory + File.separator + filePrefix + "baseLine.csv";
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(filename)));
// Write the header
writer.write("User");
writer.write(",");
writer.write("Events");
writer.write(",");
writer.write("Start");
writer.write(",");
writer.write("End");
writer.write(",");
writer.write("Active Use");
writer.write(",");
writer.write("Elapsed Use");
writer.newLine();
// Writer the rows
for (Map.Entry<Integer, Integer> entry : interactionHistorySizes.entrySet()) {
writer.write(entry.getKey().toString());
writer.write(",");
writer.write(entry.getValue().toString());
writer.write(",");
List<Date> dateRange = interactionHistoryRanges.get(entry.getKey());
writer.write(dateRange.get(startDatePosition).toString());
writer.write(",");
writer.write(dateRange.get(endDatePosition).toString());
writer.write(",");
long elapsed = interactionHistoryActiveDuration.get(entry.getKey());
writer.write(InteractionEventClassifier.formatDuration(elapsed));
writer.write(",");
long duration = dateRange.get(endDatePosition).getTime() - dateRange.get(startDatePosition).getTime();
writer.write(InteractionEventClassifier.formatDuration(duration));
writer.newLine();
}
writer.flush();
writer.close();
} catch (IOException e) {
System.err.println("Unable to write CVS file <" + filename + ">");
e.printStackTrace(System.err);
}
}
/**
* For testing - return active use of a user
*/
public long getActiveUseOfUser(int userid) {
if (interactionHistoryActiveDuration.containsKey(userid)) {
return interactionHistoryActiveDuration.get(userid);
}
return -1;
}
/**
* For testing - return number of users
*/
public int getNumberOfUsers() {
return interactionHistorySizes.size();
}
/**
* For testing - return duration of use
*/
public long getDurationUseOfUser(int userid) {
if (interactionHistoryRanges.containsKey(userid)) {
List<Date> dateRange = interactionHistoryRanges.get(userid);
return (dateRange.get(endDatePosition).getTime() - dateRange.get(startDatePosition).getTime());
}
return -1;
}
/**
* For testing - return size of interaction history
*/
public int getSizeOfHistory(int userid) {
if (interactionHistorySizes.containsKey(userid)) {
return interactionHistorySizes.get(userid);
}
return -1;
}
}