/*
* @(#)SimplifiedProcedureProcessActivityTimeChartData.java
*
* Copyright 2010 Instituto Superior Tecnico
* Founding Authors: Luis Cruz, Nuno Ochoa, Paulo Abrantes
*
* https://fenix-ashes.ist.utl.pt/
*
* This file is part of the Expenditure Tracking Module.
*
* The Expenditure Tracking Module is free software: you can
* redistribute it and/or modify it under the terms of the GNU Lesser General
* Public License as published by the Free Software Foundation, either version
* 3 of the License, or (at your option) any later version.
*
* The Expenditure Tracking Module is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Expenditure Tracking Module. If not, see <http://www.gnu.org/licenses/>.
*
*/
package pt.ist.expenditureTrackingSystem.domain.statistics;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import module.workflow.activities.ActivityInformation;
import module.workflow.activities.WorkflowActivity;
import module.workflow.domain.ActivityLog;
import module.workflow.domain.WorkflowLog;
import module.workflow.domain.WorkflowProcess;
import org.joda.time.DateTime;
import pt.ist.expenditureTrackingSystem.domain.ExpenditureTrackingSystem;
import pt.ist.expenditureTrackingSystem.domain.ProcessState;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.AcquisitionProcessState;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.PaymentProcess;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.PaymentProcessYear;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.simplified.SimplifiedProcedureProcess;
import pt.ist.expenditureTrackingSystem.util.Calculation.Operation;
/**
*
* @author Luis Cruz
*
*/
public class SimplifiedProcedureProcessActivityTimeChartData extends PaymentProcessChartData<String> {
private List<WorkflowActivity<? extends WorkflowProcess, ? extends ActivityInformation>> activities = null;
public SimplifiedProcedureProcessActivityTimeChartData(PaymentProcessYear paymentProcessYear) {
super(paymentProcessYear, Operation.MEDIAN);
}
@Override
protected String getTitleKey() {
return "label.activity.times.average";
}
@Override
protected String[] getCategories() {
Set<WorkflowActivity<? extends WorkflowProcess, ? extends ActivityInformation>> activities =
new TreeSet<WorkflowActivity<? extends WorkflowProcess, ? extends ActivityInformation>>(
new Comparator<WorkflowActivity>() {
@Override
public int compare(WorkflowActivity o1, WorkflowActivity o2) {
final int c = o1.getLocalizedName().compareTo(o2.getLocalizedName());
return c == 0 ? o2.hashCode() - o1.hashCode() : c;
}
});
for (final PaymentProcessYear paymentProcessYear : ExpenditureTrackingSystem.getInstance().getPaymentProcessYearsSet()) {
for (final PaymentProcess paymentProcess : paymentProcessYear.getPaymentProcessSet()) {
activities.addAll(paymentProcess.getActivities());
}
}
final String[] catagories = new String[activities.size()];
int i = 0;
for (final WorkflowActivity workflowActivity : activities) {
catagories[i++] = workflowActivity.getLocalizedName();
}
return catagories;
}
@Override
protected String getLabel(final String c) {
return c;
}
@Override
protected void registerData(final String key, final Number number) {
final BigDecimal value = ((BigDecimal) number).divide(DAYS_CONST, 100, BigDecimal.ROUND_HALF_UP);
super.registerData(key, value);
}
@Override
protected void count(final PaymentProcess paymentProcess) {
if (paymentProcess.isSimplifiedProcedureProcess()) {
final SimplifiedProcedureProcess simplifiedProcedureProcess = (SimplifiedProcedureProcess) paymentProcess;
final List<WorkflowLog> operationLogs = new ArrayList<WorkflowLog>(simplifiedProcedureProcess.getExecutionLogsSet());
Collections.sort(operationLogs, WorkflowLog.COMPARATOR_BY_WHEN);
final List<ProcessState> processStates =
new ArrayList<ProcessState>(simplifiedProcedureProcess.getProcessStatesSet());
Collections.sort(processStates, ProcessState.COMPARATOR_BY_WHEN);
for (int i = 1; i < processStates.size(); i++) {
final AcquisitionProcessState processState = (AcquisitionProcessState) processStates.get(i);
if (!processState.isCanceled()) {
final AcquisitionProcessState previousState = (AcquisitionProcessState) processStates.get(i - 1);
final DateTime stateChangeDateTime = processState.getWhenDateTime();
final DateTime previousStateChangeDateTime = previousState.getWhenDateTime();
final long startMillis = stateChangeDateTime.getMillis();
final long duration = startMillis - previousStateChangeDateTime.getMillis();
final WorkflowLog workflowLog =
findLastWorkflowLog(operationLogs, previousStateChangeDateTime, stateChangeDateTime);
if (workflowLog != null) {
final WorkflowActivity abstractActivity =
getActivity(simplifiedProcedureProcess, (ActivityLog) workflowLog);
if (abstractActivity != null) {
final String key = abstractActivity.getLocalizedName();
calculation.registerValue(key, new BigDecimal(duration));
}
}
}
}
}
}
private WorkflowLog findLastWorkflowLog(final List<WorkflowLog> orderedOperationLogs, final DateTime start, final DateTime end) {
WorkflowLog result = null;
for (final WorkflowLog workflowLog : orderedOperationLogs) {
final DateTime whenOperationWasRan = workflowLog.getWhenOperationWasRan();
if (!whenOperationWasRan.isBefore(start) && !whenOperationWasRan.isAfter(end)) {
if (workflowLog instanceof ActivityLog) {
result = workflowLog;
}
}
}
return result;
}
protected int getActivityIndex(final WorkflowActivity workflowActivity) {
for (int i = 0; i < activities.size(); i++) {
if (workflowActivity == activities.get(i)) {
return i;
}
}
throw new Error("payment.process.does.not.contain.activity " + workflowActivity.getLocalizedName());
}
protected WorkflowActivity<WorkflowProcess, ActivityInformation<WorkflowProcess>> getActivity(PaymentProcess process,
ActivityLog operationLog) {
return process.getActivity(operationLog.getOperation());
}
protected long calculateDuration(final WorkflowLog operationLog, final WorkflowLog previousLog) {
final DateTime dateTime = operationLog.getWhenOperationWasRan();
final DateTime previousDateTime = previousLog.getWhenOperationWasRan();
return dateTime.getMillis() - previousDateTime.getMillis();
}
protected long calculateDuration(final ProcessState processState, final ProcessState previousProcessState) {
final DateTime dateTime = processState.getWhenDateTime();
final DateTime previousDateTime = previousProcessState.getWhenDateTime();
return dateTime.getMillis() - previousDateTime.getMillis();
}
}