diff options
author | donald.g.dunne | 2016-02-12 15:30:47 +0000 |
---|---|---|
committer | Ryan D. Brooks | 2016-02-12 15:30:47 +0000 |
commit | 6f2502aa6039770325f733fbefedf18d64ceecc0 (patch) | |
tree | bb2177d4fee68206adc97cd1708913f99b2e1fd9 /plugins | |
parent | 7ef50bfc435bb99f9dfc8dd1bc7270658f207bda (diff) | |
download | org.eclipse.osee-6f2502aa6039770325f733fbefedf18d64ceecc0.tar.gz org.eclipse.osee-6f2502aa6039770325f733fbefedf18d64ceecc0.tar.xz org.eclipse.osee-6f2502aa6039770325f733fbefedf18d64ceecc0.zip |
feature[ats_ATS263337]: Add metrics to ATS Earned Value Service
Change-Id: I7cf59de6b98dd46bda4627356787a2c6b3f50003
Diffstat (limited to 'plugins')
13 files changed, 355 insertions, 101 deletions
diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/IAtsServices.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/IAtsServices.java index 1139bc4d7bb..126975c1bf3 100644 --- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/IAtsServices.java +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/IAtsServices.java @@ -11,6 +11,7 @@ package org.eclipse.osee.ats.api; import java.util.Collection; +import org.eclipse.osee.ats.api.ev.IAtsEarnedValueService; import org.eclipse.osee.ats.api.program.IAtsProgramService; import org.eclipse.osee.ats.api.query.IAtsQueryService; import org.eclipse.osee.ats.api.review.IAtsReviewService; @@ -104,4 +105,6 @@ public interface IAtsServices { IAtsQueryService getQueryService(); + IAtsEarnedValueService getEarnedValueService(); + } diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/IAtsWorkItem.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/IAtsWorkItem.java index a03b5c10773..ee580e174bf 100644 --- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/IAtsWorkItem.java +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/IAtsWorkItem.java @@ -73,4 +73,12 @@ public interface IAtsWorkItem extends IAtsObject, HasAssignees { boolean isGoal(); + boolean isInWork(); + + boolean isCompleted(); + + boolean isCompletedOrCancelled(); + + boolean isCancelled(); + } diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/IAtsEarnedValueService.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/IAtsEarnedValueService.java index 7ca1065c105..73af8a54fe0 100644 --- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/IAtsEarnedValueService.java +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/IAtsEarnedValueService.java @@ -14,6 +14,7 @@ import java.util.Collection; import org.eclipse.osee.ats.api.IAtsObject; import org.eclipse.osee.ats.api.IAtsWorkItem; import org.eclipse.osee.ats.api.insertion.IAtsInsertionActivity; +import org.eclipse.osee.ats.api.workdef.IStateToken; import org.eclipse.osee.framework.core.data.ArtifactId; import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; @@ -38,4 +39,18 @@ public interface IAtsEarnedValueService { public Collection<IAtsWorkPackage> getWorkPackages(IAtsInsertionActivity insertionActivity); + double getEstimatedHoursFromArtifact(IAtsWorkItem workItem); + + double getEstimatedHoursFromTasks(IAtsWorkItem workItem, IStateToken relatedToState); + + double getEstimatedHoursFromTasks(IAtsWorkItem workItem); + + double getEstimatedHoursFromReviews(IAtsWorkItem workItem) throws OseeCoreException; + + double getEstimatedHoursFromReviews(IAtsWorkItem workItem, IStateToken relatedToState) throws OseeCoreException; + + double getEstimatedHoursTotal(IAtsWorkItem workItem, IStateToken relatedToState) throws OseeCoreException; + + double getEstimatedHoursTotal(IAtsWorkItem workItem) throws OseeCoreException; + } diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/review/IAtsAbstractReview.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/review/IAtsAbstractReview.java index 8bbcd727238..eb90754ad93 100644 --- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/review/IAtsAbstractReview.java +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/review/IAtsAbstractReview.java @@ -17,5 +17,7 @@ import org.eclipse.osee.ats.api.ai.IAtsActionableItemProvider; * @author Donald G. Dunne */ public interface IAtsAbstractReview extends IAtsWorkItem, IAtsActionableItemProvider { - // do nothing + + String getRelatedToState(); + } diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ev/AtsEarnedValueImpl.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ev/AtsEarnedValueImpl.java index ca04ca68829..3dc6258acf2 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ev/AtsEarnedValueImpl.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ev/AtsEarnedValueImpl.java @@ -10,35 +10,20 @@ *******************************************************************************/ package org.eclipse.osee.ats.core.client.internal.ev; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; -import org.eclipse.osee.ats.api.IAtsConfigObject; -import org.eclipse.osee.ats.api.IAtsObject; import org.eclipse.osee.ats.api.IAtsServices; import org.eclipse.osee.ats.api.IAtsWorkItem; -import org.eclipse.osee.ats.api.ai.IAtsActionableItem; import org.eclipse.osee.ats.api.data.AtsAttributeTypes; -import org.eclipse.osee.ats.api.data.AtsRelationTypes; import org.eclipse.osee.ats.api.ev.AtsWorkPackageEndpointApi; -import org.eclipse.osee.ats.api.ev.IAtsEarnedValueService; import org.eclipse.osee.ats.api.ev.IAtsWorkPackage; import org.eclipse.osee.ats.api.ev.JaxWorkPackageData; -import org.eclipse.osee.ats.api.insertion.IAtsInsertionActivity; -import org.eclipse.osee.ats.api.review.IAtsAbstractReview; import org.eclipse.osee.ats.api.util.AtsEvents; -import org.eclipse.osee.ats.api.workflow.IAtsTeamWorkflow; import org.eclipse.osee.ats.core.client.internal.AtsClientService; import org.eclipse.osee.ats.core.client.workflow.AbstractWorkflowArtifact; -import org.eclipse.osee.ats.core.model.WorkPackage; +import org.eclipse.osee.ats.core.util.AtsAbstractEarnedValueImpl; import org.eclipse.osee.ats.core.util.AtsObjects; -import org.eclipse.osee.ats.core.util.AtsUtilCore; -import org.eclipse.osee.framework.core.data.ArtifactId; -import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; import org.eclipse.osee.framework.jdk.core.util.Conditions; -import org.eclipse.osee.framework.jdk.core.util.Strings; import org.eclipse.osee.framework.skynet.core.artifact.Artifact; -import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery; import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager; import org.eclipse.osee.framework.skynet.core.event.OseeEventManager; import org.eclipse.osee.framework.skynet.core.event.model.EventType; @@ -48,15 +33,12 @@ import org.eclipse.osee.logger.Log; /** * @author Donald G. Dunne */ -public class AtsEarnedValueImpl implements IAtsEarnedValueService { - - private final Log logger; - private final IAtsServices services; +public class AtsEarnedValueImpl extends AtsAbstractEarnedValueImpl { public AtsEarnedValueImpl(Log logger, IAtsServices services) { - this.logger = logger; - this.services = services; + super(logger, services); } + @Override public String getWorkPackageId(IAtsWorkItem workItem) { String guid = null; @@ -70,65 +52,6 @@ public class AtsEarnedValueImpl implements IAtsEarnedValueService { } @Override - public IAtsWorkPackage getWorkPackage(IAtsWorkItem workItem) throws OseeCoreException { - WorkPackage wpa = null; - String workPackageGuid = getWorkPackageId(workItem); - if (Strings.isValid(workPackageGuid)) { - Artifact workPkgArt = ArtifactQuery.getArtifactFromId(workPackageGuid, AtsUtilCore.getAtsBranch()); - wpa = new WorkPackage(logger, workPkgArt, services); - } - return wpa; - } - - @Override - public Collection<IAtsWorkPackage> getWorkPackageOptions(IAtsObject object) throws OseeCoreException { - List<IAtsWorkPackage> workPackageOptions = new ArrayList<>(); - getWorkPackageOptions(object, workPackageOptions); - return workPackageOptions; - } - - public Collection<IAtsWorkPackage> getWorkPackageOptions(IAtsObject object, List<IAtsWorkPackage> workPackageOptions) throws OseeCoreException { - // Config objects get work package options from related work package artifacts - if (object instanceof IAtsConfigObject) { - IAtsConfigObject configObj = (IAtsConfigObject) object; - Artifact artifact = AtsClientService.get().getArtifact(configObj); - if (artifact != null) { - for (Artifact workPackageArt : artifact.getRelatedArtifacts(AtsRelationTypes.WorkPackage_WorkPackage)) { - workPackageOptions.add(new WorkPackage(logger, workPackageArt, services)); - } - } - } - // Team Wf get work package options of Ais and Team Definition - else if (object instanceof IAtsTeamWorkflow) { - IAtsTeamWorkflow teamWf = (IAtsTeamWorkflow) object; - getWorkPackageOptions(teamWf.getTeamDefinition(), workPackageOptions); - for (IAtsActionableItem ai : teamWf.getActionableItems()) { - getWorkPackageOptions(ai, workPackageOptions); - } - } - // Children work items inherit the work packages options of their parent team workflow - else if (object instanceof IAtsWorkItem) { - IAtsWorkItem workItem = (IAtsWorkItem) object; - // Work Items related to Team Wf get their options from Team Wf - IAtsTeamWorkflow teamWf = workItem.getParentTeamWorkflow(); - if (teamWf != null) { - getWorkPackageOptions(teamWf, workPackageOptions); - } - // Stand-alone reviews get their options from related AIs and Team Defs - else if (workItem instanceof IAtsAbstractReview) { - IAtsAbstractReview review = (IAtsAbstractReview) workItem; - for (IAtsActionableItem ai : review.getActionableItems()) { - getWorkPackageOptions(ai, workPackageOptions); - if (ai.getTeamDefinition() != null) { - getWorkPackageOptions(ai.getTeamDefinition(), workPackageOptions); - } - } - } - } - return workPackageOptions; - } - - @Override public void setWorkPackage(IAtsWorkPackage workPackage, Collection<IAtsWorkItem> workItems) { changeWorkPackage(workPackage, workItems, false); } @@ -140,7 +63,7 @@ public class AtsEarnedValueImpl implements IAtsEarnedValueService { private void changeWorkPackage(IAtsWorkPackage workPackage, Collection<IAtsWorkItem> workItems, boolean remove) { JaxWorkPackageData data = new JaxWorkPackageData(); - data.setAsUserId(AtsClientService.get().getUserService().getCurrentUserId()); + data.setAsUserId(services.getUserService().getCurrentUserId()); for (IAtsWorkItem workItem : workItems) { data.getWorkItemUuids().add(workItem.getUuid()); } @@ -156,12 +79,7 @@ public class AtsEarnedValueImpl implements IAtsEarnedValueService { AtsObjects.toUuidsString(";", workItems), EventType.LocalAndRemote); OseeEventManager.kickTopicEvent(getClass(), event); - AtsClientService.get().getStoreService().reload(workItems); - } - - @Override - public IAtsWorkPackage getWorkPackage(ArtifactId artifact) { - return new WorkPackage(logger, artifact, services); + services.getStoreService().reload(workItems); } @Override @@ -169,14 +87,4 @@ public class AtsEarnedValueImpl implements IAtsEarnedValueService { return AttributeTypeManager.getEnumerationValues(AtsAttributeTypes.ColorTeam); } - @Override - public Collection<IAtsWorkPackage> getWorkPackages(IAtsInsertionActivity insertionActivity) { - List<IAtsWorkPackage> workPackages = new ArrayList<>(); - for (Artifact artifact : AtsClientService.get().getArtifact(insertionActivity.getUuid()).getRelatedArtifacts( - AtsRelationTypes.InsertionActivityToWorkPackage_WorkPackage)) { - workPackages.add(new WorkPackage(logger, artifact, services)); - } - return workPackages; - } - } diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/workflow/WorkItem.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/workflow/WorkItem.java index 6ec1e5435c9..10f838ab1ec 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/workflow/WorkItem.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/workflow/WorkItem.java @@ -278,4 +278,23 @@ public class WorkItem extends AtsObject implements IAtsWorkItem { return artifact.getSoleAttributeValue(AtsAttributeTypes.CancelledReason, null); } + @Override + public boolean isInWork() { + return getStateMgr().getStateType().isInWork(); + } + + @Override + public boolean isCompleted() { + return getStateMgr().getStateType().isCompleted(); + } + + @Override + public boolean isCompletedOrCancelled() { + return isCompleted() || isCancelled(); + } + + @Override + public boolean isCancelled() { + return getStateMgr().getStateType().isCancelled(); + } } diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/review/AbstractReviewArtifact.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/review/AbstractReviewArtifact.java index 4f86fe4bda6..a6b190ccf9c 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/review/AbstractReviewArtifact.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/review/AbstractReviewArtifact.java @@ -16,10 +16,10 @@ import java.util.List; import java.util.Set; import java.util.logging.Level; import org.eclipse.osee.ats.api.ai.IAtsActionableItem; -import org.eclipse.osee.ats.api.ai.IAtsActionableItemProvider; import org.eclipse.osee.ats.api.data.AtsArtifactTypes; import org.eclipse.osee.ats.api.data.AtsAttributeTypes; import org.eclipse.osee.ats.api.data.AtsRelationTypes; +import org.eclipse.osee.ats.api.review.IAtsAbstractReview; import org.eclipse.osee.ats.api.review.UserRole; import org.eclipse.osee.ats.api.team.IAtsTeamDefinition; import org.eclipse.osee.ats.api.user.IAtsUser; @@ -41,7 +41,7 @@ import org.eclipse.osee.framework.skynet.core.artifact.Artifact; /** * @author Donald G. Dunne */ -public abstract class AbstractReviewArtifact extends AbstractWorkflowArtifact implements IAtsActionableItemProvider { +public abstract class AbstractReviewArtifact extends AbstractWorkflowArtifact implements IAtsAbstractReview { private ActionableItemManager actionableItemsDam; private Boolean standAlone = null; @@ -206,4 +206,9 @@ public abstract class AbstractReviewArtifact extends AbstractWorkflowArtifact im return getActionableItemsDam().getActionableItems(); } + @Override + public String getRelatedToState() { + return getSoleAttributeValue(AtsAttributeTypes.RelatedToState, ""); + } + } diff --git a/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/mock/MockWorkItem.java b/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/mock/MockWorkItem.java index cb7256601f8..6bc54fe23e6 100644 --- a/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/mock/MockWorkItem.java +++ b/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/mock/MockWorkItem.java @@ -246,4 +246,24 @@ public class MockWorkItem implements IAtsWorkItem { return false; } + @Override + public boolean isInWork() { + return getStateMgr().getStateType().isInWork(); + } + + @Override + public boolean isCompleted() { + return getStateMgr().getStateType().isCompleted(); + } + + @Override + public boolean isCompletedOrCancelled() { + return isCompleted() || isCancelled(); + } + + @Override + public boolean isCancelled() { + return getStateMgr().getStateType().isCancelled(); + } + } diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/util/AtsAbstractEarnedValueImpl.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/util/AtsAbstractEarnedValueImpl.java new file mode 100644 index 00000000000..96f4f39b689 --- /dev/null +++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/util/AtsAbstractEarnedValueImpl.java @@ -0,0 +1,198 @@ +/******************************************************************************* + * Copyright (c) 2013 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.core.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.eclipse.osee.ats.api.IAtsConfigObject; +import org.eclipse.osee.ats.api.IAtsObject; +import org.eclipse.osee.ats.api.IAtsServices; +import org.eclipse.osee.ats.api.IAtsWorkItem; +import org.eclipse.osee.ats.api.ai.IAtsActionableItem; +import org.eclipse.osee.ats.api.data.AtsAttributeTypes; +import org.eclipse.osee.ats.api.data.AtsRelationTypes; +import org.eclipse.osee.ats.api.ev.IAtsEarnedValueService; +import org.eclipse.osee.ats.api.ev.IAtsWorkPackage; +import org.eclipse.osee.ats.api.insertion.IAtsInsertionActivity; +import org.eclipse.osee.ats.api.review.IAtsAbstractReview; +import org.eclipse.osee.ats.api.workdef.IStateToken; +import org.eclipse.osee.ats.api.workflow.IAtsTask; +import org.eclipse.osee.ats.api.workflow.IAtsTeamWorkflow; +import org.eclipse.osee.ats.core.model.WorkPackage; +import org.eclipse.osee.framework.core.data.ArtifactId; +import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; +import org.eclipse.osee.framework.jdk.core.util.Conditions; +import org.eclipse.osee.framework.jdk.core.util.Strings; +import org.eclipse.osee.logger.Log; + +/** + * @author Donald G. Dunne + */ +public abstract class AtsAbstractEarnedValueImpl implements IAtsEarnedValueService { + + protected final Log logger; + protected final IAtsServices services; + + public AtsAbstractEarnedValueImpl(Log logger, IAtsServices services) { + this.logger = logger; + this.services = services; + } + + @Override + public String getWorkPackageId(IAtsWorkItem workItem) { + ArtifactId artifact = services.getArtifact(workItem); + Conditions.checkNotNull(artifact, "workItem", "Can't Find Work Package matching %s", workItem.toStringWithId()); + return services.getAttributeResolver().getSoleAttributeValue(workItem, AtsAttributeTypes.WorkPackageGuid, null); + } + + @Override + public IAtsWorkPackage getWorkPackage(IAtsWorkItem workItem) throws OseeCoreException { + WorkPackage wpa = null; + String workPackageGuid = getWorkPackageId(workItem); + if (Strings.isValid(workPackageGuid)) { + ArtifactId workPkgArt = services.getArtifactById(workPackageGuid); + wpa = new WorkPackage(logger, workPkgArt, services); + } + return wpa; + } + + @Override + public Collection<IAtsWorkPackage> getWorkPackageOptions(IAtsObject object) throws OseeCoreException { + List<IAtsWorkPackage> workPackageOptions = new ArrayList<>(); + getWorkPackageOptions(object, workPackageOptions); + return workPackageOptions; + } + + public Collection<IAtsWorkPackage> getWorkPackageOptions(IAtsObject object, List<IAtsWorkPackage> workPackageOptions) throws OseeCoreException { + // Config objects get work package options from related work package artifacts + if (object instanceof IAtsConfigObject) { + IAtsConfigObject configObj = (IAtsConfigObject) object; + ArtifactId artifact = services.getArtifact(configObj); + if (artifact != null) { + for (ArtifactId workPackageArt : services.getRelationResolver().getRelated(artifact, + AtsRelationTypes.WorkPackage_WorkPackage)) { + workPackageOptions.add(new WorkPackage(logger, workPackageArt, services)); + } + } + } + // Team Wf get work package options of Ais and Team Definition + else if (object instanceof IAtsTeamWorkflow) { + IAtsTeamWorkflow teamWf = (IAtsTeamWorkflow) object; + getWorkPackageOptions(teamWf.getTeamDefinition(), workPackageOptions); + for (IAtsActionableItem ai : teamWf.getActionableItems()) { + getWorkPackageOptions(ai, workPackageOptions); + } + } + // Children work items inherit the work packages options of their parent team workflow + else if (object instanceof IAtsWorkItem) { + IAtsWorkItem workItem = (IAtsWorkItem) object; + // Work Items related to Team Wf get their options from Team Wf + IAtsTeamWorkflow teamWf = workItem.getParentTeamWorkflow(); + if (teamWf != null) { + getWorkPackageOptions(teamWf, workPackageOptions); + } + // Stand-alone reviews get their options from related AIs and Team Defs + else if (workItem instanceof IAtsAbstractReview) { + IAtsAbstractReview review = (IAtsAbstractReview) workItem; + for (IAtsActionableItem ai : review.getActionableItems()) { + getWorkPackageOptions(ai, workPackageOptions); + if (ai.getTeamDefinition() != null) { + getWorkPackageOptions(ai.getTeamDefinition(), workPackageOptions); + } + } + } + } + return workPackageOptions; + } + + @Override + public IAtsWorkPackage getWorkPackage(ArtifactId artifact) { + return new WorkPackage(logger, artifact, services); + } + + @Override + public Collection<IAtsWorkPackage> getWorkPackages(IAtsInsertionActivity insertionActivity) { + List<IAtsWorkPackage> workPackages = new ArrayList<>(); + for (ArtifactId artifact : services.getRelationResolver().getRelated( + services.getArtifact(insertionActivity.getUuid()), + AtsRelationTypes.InsertionActivityToWorkPackage_WorkPackage)) { + workPackages.add(new WorkPackage(logger, artifact, services)); + } + return workPackages; + } + + @Override + public double getEstimatedHoursFromArtifact(IAtsWorkItem workItem) { + return services.getAttributeResolver().getSoleAttributeValue(workItem, AtsAttributeTypes.EstimatedHours, 0.0); + } + + @Override + public double getEstimatedHoursFromTasks(IAtsWorkItem workItem, IStateToken relatedToState) { + if (!(workItem instanceof IAtsTeamWorkflow)) { + return 0; + } + return getEstimatedHoursFromTasks((workItem), relatedToState); + } + + /** + * Return Estimated Hours for all tasks + */ + @Override + public double getEstimatedHoursFromTasks(IAtsWorkItem workItem) { + if (!(workItem instanceof IAtsTeamWorkflow)) { + return 0; + } + double hours = 0; + for (IAtsTask task : services.getTaskService().getTaskArtifacts(workItem)) { + hours += getEstimatedHoursFromArtifact(task); + } + return hours; + } + + @Override + public double getEstimatedHoursFromReviews(IAtsWorkItem workItem) throws OseeCoreException { + double hours = 0; + if (workItem.isTeamWorkflow()) { + for (IAtsAbstractReview review : services.getReviewService().getReviews((IAtsTeamWorkflow) workItem)) { + hours += getEstimatedHoursFromArtifact(review); + } + } + return hours; + } + + @Override + public double getEstimatedHoursFromReviews(IAtsWorkItem workItem, IStateToken relatedToState) throws OseeCoreException { + double hours = 0; + if (workItem.isTeamWorkflow()) { + IAtsTeamWorkflow teamWf = (IAtsTeamWorkflow) workItem; + for (IAtsAbstractReview review : services.getReviewService().getReviews(teamWf)) { + if (review.getRelatedToState().equals(relatedToState.getName())) { + hours += getEstimatedHoursFromArtifact(review); + } + } + } + return hours; + } + + @Override + public double getEstimatedHoursTotal(IAtsWorkItem workItem, IStateToken relatedToState) throws OseeCoreException { + return getEstimatedHoursFromArtifact(workItem) + getEstimatedHoursFromTasks(workItem, + relatedToState) + getEstimatedHoursFromReviews(workItem, relatedToState); + } + + @Override + public double getEstimatedHoursTotal(IAtsWorkItem workItem) throws OseeCoreException { + return getEstimatedHoursFromArtifact(workItem) + getEstimatedHoursFromTasks( + workItem) + getEstimatedHoursFromReviews(workItem); + } + +} diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/AtsServerImpl.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/AtsServerImpl.java index b72a36ff282..cd39e5a9193 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/AtsServerImpl.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/AtsServerImpl.java @@ -26,6 +26,7 @@ import org.eclipse.osee.ats.api.IAtsWorkItem; import org.eclipse.osee.ats.api.agile.IAgileService; import org.eclipse.osee.ats.api.data.AtsArtifactToken; import org.eclipse.osee.ats.api.data.AtsAttributeTypes; +import org.eclipse.osee.ats.api.ev.IAtsEarnedValueService; import org.eclipse.osee.ats.api.notify.AtsNotificationCollector; import org.eclipse.osee.ats.api.program.IAtsProgramService; import org.eclipse.osee.ats.api.query.IAtsQueryService; @@ -78,6 +79,7 @@ import org.eclipse.osee.ats.rest.internal.util.ArtifactResolverImpl; import org.eclipse.osee.ats.rest.internal.util.AtsArtifactConfigCache; import org.eclipse.osee.ats.rest.internal.util.AtsAttributeResolverServiceImpl; import org.eclipse.osee.ats.rest.internal.util.AtsBranchServiceImpl; +import org.eclipse.osee.ats.rest.internal.util.AtsEarnedValueImpl; import org.eclipse.osee.ats.rest.internal.util.AtsRelationResolverServiceImpl; import org.eclipse.osee.ats.rest.internal.util.AtsReviewServiceImpl; import org.eclipse.osee.ats.rest.internal.util.AtsStoreServiceImpl; @@ -143,6 +145,7 @@ public class AtsServerImpl extends AtsCoreServiceImpl implements IAtsServer { private IAgileService agileService; private IAtsQueryService atsQueryService; private IAtsTaskService taskService; + private IAtsEarnedValueService earnedValueService; private volatile boolean emailEnabled = true; private boolean loggedNotificationDisabled = false; @@ -239,6 +242,7 @@ public class AtsServerImpl extends AtsCoreServiceImpl implements IAtsServer { atsQueryService = new AtsQueryServiceIimpl(this); versionService = new AtsVersionServiceImpl(getServices()); taskService = new AtsTaskService(this); + earnedValueService = new AtsEarnedValueImpl(logger, this); addAtsDatabaseConversion(new ConvertBaselineGuidToBaselineUuid(logger, jdbcClient, orcsApi, this)); addAtsDatabaseConversion(new ConvertFavoriteBranchGuidToUuid(logger, jdbcClient, orcsApi, this)); @@ -604,4 +608,8 @@ public class AtsServerImpl extends AtsCoreServiceImpl implements IAtsServer { name).getResults().getAtMostOneOrNull(); } + @Override + public IAtsEarnedValueService getEarnedValueService() { + return earnedValueService; + } } diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsEarnedValueImpl.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsEarnedValueImpl.java new file mode 100644 index 00000000000..0877102b5b5 --- /dev/null +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsEarnedValueImpl.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2016 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.rest.internal.util; + +import java.util.Collection; +import org.eclipse.osee.ats.api.IAtsServices; +import org.eclipse.osee.ats.api.IAtsWorkItem; +import org.eclipse.osee.ats.api.ev.IAtsWorkPackage; +import org.eclipse.osee.ats.core.util.AtsAbstractEarnedValueImpl; +import org.eclipse.osee.logger.Log; + +/** + * @author Donald G. Dunne + */ +public class AtsEarnedValueImpl extends AtsAbstractEarnedValueImpl { + + public AtsEarnedValueImpl(Log logger, IAtsServices services) { + super(logger, services); + } + + @Override + public void setWorkPackage(IAtsWorkPackage workPackage, Collection<IAtsWorkItem> workItems) { + throw new UnsupportedOperationException("operation not supported on server"); + } + + @Override + public void removeWorkPackage(IAtsWorkPackage workPackage, Collection<IAtsWorkItem> workItems) { + throw new UnsupportedOperationException("operation not supported on server"); + } + + @Override + public Collection<String> getColorTeams() { + throw new UnsupportedOperationException("operation not supported on server"); + } + +} diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/model/AbstractReview.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/model/AbstractReview.java index bb64a555627..d62a97ef9c7 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/model/AbstractReview.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/model/AbstractReview.java @@ -41,4 +41,8 @@ public abstract class AbstractReview extends WorkItem implements IAtsAbstractRev return ais; } + @Override + public String getRelatedToState() { + return artifact.getSoleAttributeValue(AtsAttributeTypes.RelatedToState, ""); + } } diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/model/WorkItem.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/model/WorkItem.java index 038df26900b..57fea74b2dc 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/model/WorkItem.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/model/WorkItem.java @@ -273,4 +273,24 @@ public class WorkItem extends AtsObject implements IAtsWorkItem { return artifact.getSoleAttributeValue(AtsAttributeTypes.CancelledReason, null); } + @Override + public boolean isInWork() { + return getStateMgr().getStateType().isInWork(); + } + + @Override + public boolean isCompleted() { + return getStateMgr().getStateType().isCompleted(); + } + + @Override + public boolean isCompletedOrCancelled() { + return isCompleted() || isCancelled(); + } + + @Override + public boolean isCancelled() { + return getStateMgr().getStateType().isCancelled(); + } + } |