blob: 57d7f849fece104cefea1e7a0ef252d253f835de [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.ats.operation;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.osee.ats.core.config.TeamDefinitionArtifact;
import org.eclipse.osee.ats.core.task.TaskArtifact;
import org.eclipse.osee.ats.core.task.TaskStates;
import org.eclipse.osee.ats.core.team.TeamWorkFlowArtifact;
import org.eclipse.osee.ats.core.type.AtsArtifactTypes;
import org.eclipse.osee.ats.core.type.AtsAttributeTypes;
import org.eclipse.osee.ats.core.type.AtsRelationTypes;
import org.eclipse.osee.ats.core.workflow.SMAState;
import org.eclipse.osee.ats.core.workflow.XCurrentStateDam;
import org.eclipse.osee.ats.core.workflow.XStateDam;
import org.eclipse.osee.ats.internal.AtsPlugin;
import org.eclipse.osee.ats.util.widgets.XHyperlabelTeamDefinitionSelection;
import org.eclipse.osee.framework.core.exception.OseeCoreException;
import org.eclipse.osee.framework.core.exception.OseeExceptions;
import org.eclipse.osee.framework.core.model.IBasicUser;
import org.eclipse.osee.framework.jdk.core.type.CountingMap;
import org.eclipse.osee.framework.jdk.core.type.MutableInteger;
import org.eclipse.osee.framework.jdk.core.util.Lib;
import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
import org.eclipse.osee.framework.plugin.core.util.AIFile;
import org.eclipse.osee.framework.plugin.core.util.OseeData;
import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
import org.eclipse.osee.framework.ui.skynet.blam.AbstractBlam;
import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
import org.eclipse.osee.framework.ui.skynet.widgets.XArtifactMultiChoiceSelect;
import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
import org.eclipse.swt.program.Program;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* @author Ryan D. Brooks
*/
public class TaskMetrics extends AbstractBlam {
private final CountingMap<IBasicUser> metrics;
private CharBackedInputStream charBak;
private ISheetWriter excelWriter;
private XHyperlabelTeamDefinitionSelection teamCombo;
private XArtifactMultiChoiceSelect versionsWidget;
public TaskMetrics() {
metrics = new CountingMap<IBasicUser>();
}
@Override
public String getName() {
return "Task Metrics";
}
@Override
public String getDescriptionUsage() {
return "Generates task metrics specific to LBA artifacts.";
}
@Override
public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws OseeCoreException {
try {
monitor.beginTask("TaskMetrics", 100);
metrics.clear();
charBak = new CharBackedInputStream();
excelWriter = new ExcelXmlWriter(charBak.getWriter());
//IArtifactType artifctType = variableMap.getArtifactType("Artifact Type");
List<Artifact> versionArtifacts = versionsWidget.getSelected();
if (!versionArtifacts.isEmpty()) {
Set<Artifact> teamWorkflows =
RelationManager.getRelatedArtifacts(versionArtifacts, 1,
AtsRelationTypes.TeamWorkflowTargetedForVersion_Workflow);
int counter = 0;
for (Artifact art : teamWorkflows) {
monitor.worked(1 / teamWorkflows.size());
counter++;
if (art.isOfType(AtsArtifactTypes.TeamWorkflow)) {
TeamWorkFlowArtifact workflow = (TeamWorkFlowArtifact) art;
if (teamCombo.getSelectedTeamDefintions().contains(workflow.getTeamDefinition())) {
for (Artifact task : workflow.getTaskArtifacts()) {
tallyState((TaskArtifact) task);
}
}
}
}
}
writeSummary();
excelWriter.endWorkbook();
IFile iFile = OseeData.getIFile("Task_Metrics_" + Lib.getDateTimeString() + ".xml");
AIFile.writeToFile(iFile, charBak);
Program.launch(iFile.getLocation().toOSString());
} catch (Exception ex) {
OseeExceptions.wrapAndThrow(ex);
}
}
private void tallyState(TaskArtifact task) throws OseeCoreException {
XStateDam stateDam = new XStateDam(task);
SMAState state = stateDam.getState(TaskStates.InWork, false);
if (state == null) {
XCurrentStateDam currentStateDam = new XCurrentStateDam(task);
state = currentStateDam.getState(TaskStates.InWork, false);
}
for (IBasicUser user : state.getAssignees()) {
int percentComplete = state.getPercentComplete();
if (percentComplete == 100) {
task.getCompletedDate();
String resolution = task.getSoleAttributeValue(AtsAttributeTypes.Resolution, "");
if (resolution.equals("Complete")) {
metrics.put(user, 100);
} else {
metrics.put(user, 5);
}
} else {
metrics.put(user, percentComplete);
}
}
}
private void writeSummary() throws IOException {
excelWriter.startSheet("task metrics", 6);
excelWriter.writeRow("Engineer", "TaskMetric");
for (Entry<IBasicUser, MutableInteger> entry : metrics.getCounts()) {
IBasicUser user = entry.getKey();
MutableInteger metric = entry.getValue();
excelWriter.writeRow(user.getName(), metric.toString());
}
}
@Override
public void widgetCreating(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) {
String widgetLabel = xWidget.getLabel();
if (widgetLabel.equals("Version(s)")) {
versionsWidget = (XArtifactMultiChoiceSelect) xWidget;
}
}
@Override
public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) {
if (xWidget instanceof XHyperlabelTeamDefinitionSelection) {
teamCombo = (XHyperlabelTeamDefinitionSelection) xWidget;
teamCombo.addXModifiedListener(new TeamSelectedListener());
}
}
@Override
public String getXWidgetsXml() throws OseeCoreException {
return getXWidgetsXmlFromUiFile(getClass().getSimpleName(), AtsPlugin.PLUGIN_ID);
}
@Override
public Collection<String> getCategories() {
return Arrays.asList("ATS.Report");
}
private class TeamSelectedListener implements XModifiedListener {
@Override
public void widgetModified(XWidget widget) {
Collection<Artifact> versions = new HashSet<Artifact>();
versionsWidget.setSelectableItems(Collections.<Artifact> emptyList());
for (TeamDefinitionArtifact teamDef : teamCombo.getSelectedTeamDefintions()) {
TeamDefinitionArtifact teamDefinitionHoldingVersions;
try {
teamDefinitionHoldingVersions = teamDef.getTeamDefinitionHoldingVersions();
if (teamDefinitionHoldingVersions != null) {
versions.addAll(teamDefinitionHoldingVersions.getVersionsArtifacts());
}
} catch (OseeCoreException ex) {
log(ex);
}
}
if (!versions.isEmpty()) {
versionsWidget.setSelectableItems(versions);
}
}
}
}