Skip to main content
summaryrefslogtreecommitdiffstats
blob: b3e7b5714a34cbc3a49f64896e1380288e6b32a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/*******************************************************************************
 * 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.AtsApi;
import org.eclipse.osee.ats.api.IAtsConfigObject;
import org.eclipse.osee.ats.api.IAtsObject;
import org.eclipse.osee.ats.api.IAtsWorkItem;
import org.eclipse.osee.ats.api.ai.IAtsActionableItem;
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.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.util.IAtsChangeSet;
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.core.data.ArtifactToken;
import org.eclipse.osee.framework.jdk.core.util.Conditions;
import org.eclipse.osee.logger.Log;

/**
 * @author Donald G. Dunne
 */
public abstract class AtsAbstractEarnedValueImpl implements IAtsEarnedValueService {

   protected final Log logger;
   protected final AtsApi atsApi;

   public AtsAbstractEarnedValueImpl(Log logger, AtsApi atsApi) {
      this.logger = logger;
      this.atsApi = atsApi;
   }

   @Override
   public IAtsWorkPackage getWorkPackageById(ArtifactId workPackageId) {
      IAtsWorkPackage workPackage = null;
      if (workPackageId instanceof IAtsWorkPackage) {
         workPackage = (IAtsWorkPackage) workPackageId;
      } else {
         ArtifactToken art = atsApi.getQueryService().getArtifact(workPackageId);
         if (atsApi.getStoreService().isOfType(art, AtsArtifactTypes.WorkPackage)) {
            workPackage = new WorkPackage(atsApi.getLogger(), atsApi, art);
         }
      }
      return workPackage;
   }

   @Override
   public ArtifactId getWorkPackageId(IAtsWorkItem workItem) {
      ArtifactId artifact = atsApi.getQueryService().getArtifact(workItem);
      Conditions.checkNotNull(artifact, "workItem", "Can't Find Work Package matching %s", workItem.toStringWithId());
      return atsApi.getAttributeResolver().getSoleAttributeValue(artifact, AtsAttributeTypes.WorkPackageReference,
         ArtifactId.SENTINEL);
   }

   @Override
   public IAtsWorkPackage getWorkPackage(IAtsWorkItem workItem) {
      ArtifactId workPackageId = getWorkPackageId(workItem);
      if (workPackageId.isValid()) {
         ArtifactToken workPkgArt = atsApi.getQueryService().getArtifact(workPackageId);
         return new WorkPackage(logger, atsApi, workPkgArt);
      }
      return null;
   }

   @Override
   public Collection<IAtsWorkPackage> getWorkPackageOptions(IAtsObject object) {
      List<IAtsWorkPackage> workPackageOptions = new ArrayList<>();
      getWorkPackageOptions(object, workPackageOptions);
      return workPackageOptions;
   }

   public Collection<IAtsWorkPackage> getWorkPackageOptions(IAtsObject object, List<IAtsWorkPackage> workPackageOptions) {
      // Config objects get work package options from related work package artifacts
      if (object instanceof IAtsConfigObject) {
         IAtsConfigObject configObj = (IAtsConfigObject) object;
         ArtifactId artifact = atsApi.getQueryService().getArtifact(configObj);
         if (artifact != null) {
            for (ArtifactToken workPackageArt : atsApi.getRelationResolver().getRelated(artifact,
               AtsRelationTypes.WorkPackage_WorkPackage)) {
               workPackageOptions.add(new WorkPackage(logger, atsApi, workPackageArt));
            }
         }
      }
      // 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) {
      ArtifactToken realArt = atsApi.getQueryService().getArtifact(artifact);
      return new WorkPackage(logger, atsApi, realArt);
   }

   @Override
   public Collection<IAtsWorkPackage> getWorkPackages(IAtsInsertionActivity insertionActivity) {
      List<IAtsWorkPackage> workPackages = new ArrayList<>();
      for (ArtifactToken artifact : atsApi.getRelationResolver().getRelated(
         atsApi.getQueryService().getArtifact(insertionActivity.getId()),
         AtsRelationTypes.InsertionActivityToWorkPackage_WorkPackage)) {
         workPackages.add(new WorkPackage(logger, atsApi, artifact));
      }
      return workPackages;
   }

   @Override
   public double getEstimatedHoursFromArtifact(IAtsWorkItem workItem) {
      return atsApi.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 : atsApi.getTaskService().getTask(workItem)) {
         hours += getEstimatedHoursFromArtifact(task);
      }
      return hours;
   }

   @Override
   public double getEstimatedHoursFromReviews(IAtsWorkItem workItem) {
      double hours = 0;
      if (workItem.isTeamWorkflow()) {
         for (IAtsAbstractReview review : atsApi.getReviewService().getReviews((IAtsTeamWorkflow) workItem)) {
            hours += getEstimatedHoursFromArtifact(review);
         }
      }
      return hours;
   }

   @Override
   public double getEstimatedHoursFromReviews(IAtsWorkItem workItem, IStateToken relatedToState) {
      double hours = 0;
      if (workItem.isTeamWorkflow()) {
         IAtsTeamWorkflow teamWf = (IAtsTeamWorkflow) workItem;
         for (IAtsAbstractReview review : atsApi.getReviewService().getReviews(teamWf)) {
            if (review.getRelatedToState().equals(relatedToState.getName())) {
               hours += getEstimatedHoursFromArtifact(review);
            }
         }
      }
      return hours;
   }

   @Override
   public double getEstimatedHoursTotal(IAtsWorkItem workItem, IStateToken relatedToState) {
      return getEstimatedHoursFromArtifact(workItem) + getEstimatedHoursFromTasks(workItem,
         relatedToState) + getEstimatedHoursFromReviews(workItem, relatedToState);
   }

   @Override
   public double getEstimatedHoursTotal(IAtsWorkItem workItem) {
      return getEstimatedHoursFromArtifact(workItem) + getEstimatedHoursFromTasks(
         workItem) + getEstimatedHoursFromReviews(workItem);
   }

   @Override
   public void setWorkPackage(IAtsWorkPackage workPackage, IAtsWorkItem workItem, IAtsChangeSet changes) {
      changes.setSoleAttributeValue(workItem, AtsAttributeTypes.WorkPackageReference, workPackage);
   }
}

Back to the top