// Copyright 2012 Georg-August-Universität Göttingen, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package de.ugoe.cs.autoquest.plugin.usability2.rules.metrics;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import com.google.common.base.Optional;
import de.ugoe.cs.autoquest.eventcore.Event;
import de.ugoe.cs.autoquest.usability.EvaluationMethodCaller;
import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescription;
import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescriptionResolver;
import de.ugoe.cs.autoquest.usability.rules.UsabilityMetric;
import de.ugoe.cs.autoquest.usability.rules.UsabilityRule;
import de.ugoe.cs.autoquest.plugin.usability2.rules.metrics.visitor.AbstractMetricVisitor;
import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel;
/**
*
* Metric, which measures the total time spend on running each task by each user. >>>>
*
*
* @author Konni Hartmann
*/
public class OnTaskTimeMetric extends UsabilityRule implements UsabilityMetric {
private static final int MINIMUM_NO_OF_INSTANCES = 40;
/**
*
* Constructor. Creates a new {@code OnTaskTimeMetric} for a given task model.
*
*
* @param taskTree
*/
public OnTaskTimeMetric(ITaskModel taskModel) {
super(taskModel);
this.name = "OnTaskTimeMetric";
this.defect =
new UsabilityProblemDescriptionResolver().descriptionFor(this.getClass()
.getSimpleName());
}
/*
* (non-Javadoc)
*
* @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#check()
*/
@Override
public Optional calculate() {
Collection ses = taskModel.getTasks();
float evaluationMetric = calculateEvaluationMetric(ses);
return this.defect.isPresent(evaluationMetric);
}
static class DataEntry {
long minTimestamp = Long.MAX_VALUE;
long maxTimestamp = Long.MIN_VALUE;
void update(long timestamp) {
if (timestamp > maxTimestamp)
maxTimestamp = timestamp;
if (timestamp < minTimestamp)
minTimestamp = timestamp;
}
long getTimeDifference() {
return maxTimestamp - minTimestamp;
}
}
class Data {
Map map = new HashMap();
int currentUser = 0;
void update(Event event) {
DataEntry data = map.get(currentUser);
if (data == null) {
data = new DataEntry();
}
data.update(event.getTimestamp());
map.put(currentUser, data);
}
public void setUserID(int currentUser) {
this.currentUser = currentUser;
}
}
private float calculateEvaluationMetric(Collection tasks) {
ITask maxTask = null;
DescriptiveStatistics maxVariance = null;
float result = 0;
for (ITask task : tasks) {
Collection instances = task.getInstances();
final Data data = new Data();
int userCounter = 0;
for (ITaskInstance iTaskInstance : instances) {
AbstractMetricVisitor visitor = new AbstractMetricVisitor() {
@Override
public void visit(IEventTaskInstance instance) {
data.update(instance.getEvent());
}
};
visitor.visit(iTaskInstance);
userCounter++;
data.setUserID(userCounter);
}
DescriptiveStatistics stats = new DescriptiveStatistics();
for (DataEntry entry : data.map.values()) {
long difference = entry.getTimeDifference();
if (difference > 0)
// ignore single event tasks
stats.addValue(difference);
}
if (stats.getN() == 0)
continue;
if ((maxVariance == null) ||
((stats.getN() > MINIMUM_NO_OF_INSTANCES) && (maxVariance.getStandardDeviation() < stats.getStandardDeviation())))
{
maxTask = task;
maxVariance = stats;
}
}
System.out.println();
if (maxVariance != null) {
result = (float) maxVariance.getVariance();
System.out.printf("(OTT) Highest task: %s (%s)\n", maxTask.getDescription(),
maxVariance.getVariance());
System.out.println(maxVariance.toString());
System.out.println("Values:");
for (double val : maxVariance.getValues()) {
System.out.println(val);
}
}
else
System.out.println("(OTT) No target found");
return result;
}
/*
* (non-Javadoc)
*
* @see
* de.ugoe.cs.autoquest.usability.rules.UsabilityRule#callEvaluationMetho(de.ugoe.cs.autoquest
* .usability.EvaluationMethodCaller)
*/
@Override
public Optional callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller)
{
return evaluationMethodCaller.check(this);
}
}