blob: af718565eec7c02a2c97d7759db40b2b29992563 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2018 Boeing
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Boeing - initial API and implementation
**********************************************************************/
package org.eclipse.osee.ats.api.task;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.osee.ats.api.AtsApi;
import org.eclipse.osee.ats.api.IAtsWorkItem;
import org.eclipse.osee.ats.api.data.AtsAttributeTypes;
import org.eclipse.osee.ats.api.data.AtsRelationTypes;
import org.eclipse.osee.ats.api.task.create.CreateTasksDefinitionBuilder;
import org.eclipse.osee.ats.api.workdef.IAtsWorkDefinition;
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.framework.core.data.ArtifactId;
import org.eclipse.osee.framework.core.data.ArtifactToken;
import org.eclipse.osee.framework.core.data.BranchId;
import org.eclipse.osee.framework.core.data.BranchToken;
import org.eclipse.osee.framework.core.data.IAttribute;
import org.eclipse.osee.framework.core.data.TransactionToken;
import org.eclipse.osee.framework.core.enums.DeletionFlag;
import org.eclipse.osee.framework.jdk.core.util.Conditions;
import org.eclipse.osee.framework.jdk.core.util.Strings;
/**
* @author Donald G. Dunne
*/
public abstract class AbstractAtsTaskService implements IAtsTaskService {
protected final AtsApi atsApi;
public AbstractAtsTaskService(AtsApi atsApi) {
this.atsApi = atsApi;
}
@Override
public Collection<IAtsTask> getTasks(IAtsTeamWorkflow teamWf, IStateToken relatedToState) {
ArtifactId artifact = atsApi.getArtifactResolver().get(teamWf);
Conditions.checkNotNull(artifact, "teamWf", "Can't Find Artifact matching [%s]", teamWf.toString());
List<IAtsTask> tasks = new LinkedList<>();
for (IAtsTask task : atsApi.getRelationResolver().getRelated(teamWf, AtsRelationTypes.TeamWfToTask_Task,
IAtsTask.class)) {
if (atsApi.getAttributeResolver().getSoleAttributeValue(task, AtsAttributeTypes.RelatedToState, "").equals(
relatedToState.getName())) {
tasks.add(task);
}
}
return tasks;
}
@Override
public Collection<? extends IAtsTask> getTasks(IAtsWorkItem workItem, IStateToken state) {
ArtifactId artifact = atsApi.getArtifactResolver().get(workItem);
Conditions.checkNotNull(artifact, "workItem", "Can't Find Artifact matching [%s]", workItem.toString());
if (workItem instanceof IAtsTeamWorkflow) {
return getTasks((IAtsTeamWorkflow) workItem, state);
}
return java.util.Collections.emptyList();
}
@Override
public Collection<IAtsTask> getTasks(IAtsTeamWorkflow teamWf) {
ArtifactId artifact = atsApi.getArtifactResolver().get(teamWf);
Conditions.checkNotNull(artifact, "teamWf", "Can't Find Artifact matching [%s]", teamWf.toString());
return atsApi.getRelationResolver().getRelated(teamWf, AtsRelationTypes.TeamWfToTask_Task, IAtsTask.class);
}
@Override
public Collection<IAtsTask> getTask(IAtsWorkItem workItem) {
if (workItem.isTeamWorkflow()) {
return getTasks((IAtsTeamWorkflow) workItem);
}
return java.util.Collections.emptyList();
}
@Override
public boolean hasTasks(IAtsTeamWorkflow teamWf) {
return atsApi.getRelationResolver().getRelatedCount(teamWf, AtsRelationTypes.TeamWfToTask_Task) > 0;
}
@Override
public boolean isRelatedToState(IAtsTask task, String stateName) {
return atsApi.getAttributeResolver().getSoleAttributeValue(task, AtsAttributeTypes.RelatedToState, "").equals(
stateName);
}
@Override
public ArtifactId getTaskToRelatedArtifactChanged(IAtsTask task) {
ArtifactId relatedArt = atsApi.getAttributeResolver().getSoleArtifactIdReference(task,
AtsAttributeTypes.TaskToChangedArtifactReference, ArtifactId.SENTINEL);
if (relatedArt.isValid()) {
IAtsTeamWorkflow parentTeamWf = task.getParentTeamWorkflow();
ArtifactToken derivedArt =
atsApi.getRelationResolver().getRelatedOrSentinel(parentTeamWf, AtsRelationTypes.Derive_From);
if (derivedArt.isValid() && derivedArt instanceof IAtsTeamWorkflow) {
IAtsTeamWorkflow derivedTeamWf = (IAtsTeamWorkflow) derivedArt;
// First, attempt to get from Working Branch if still exists
if (atsApi.getBranchService().isWorkingBranchInWork(derivedTeamWf)) {
BranchToken workingBranch = atsApi.getBranchService().getWorkingBranch(derivedTeamWf);
relatedArt = atsApi.getQueryService().getArtifact(relatedArt, BranchId.valueOf(workingBranch.getId()),
DeletionFlag.INCLUDE_DELETED);
} else {
// Else get from first commit transaction
// NOTE: Each workflow has it's own commit in parallel dev
TransactionToken earliestTransactionId =
atsApi.getBranchService().getEarliestTransactionId(derivedTeamWf);
if (earliestTransactionId != null) {
relatedArt = atsApi.getQueryService().getHistoricalArtifactOrNull(relatedArt, earliestTransactionId,
DeletionFlag.INCLUDE_DELETED);
}
}
}
}
return relatedArt;
}
@Override
public Collection<IAtsWorkDefinition> calculateTaskWorkDefs(IAtsTeamWorkflow teamWf) {
Collection<IAttribute<Object>> workDefIds = atsApi.getAttributeResolver().getAttributes(
teamWf.getTeamDefinition(), AtsAttributeTypes.RelatedTaskWorkflowDefinitionReference);
List<IAtsWorkDefinition> workDefs = new ArrayList<IAtsWorkDefinition>();
for (IAttribute<Object> attr : workDefIds) {
ArtifactId id = (ArtifactId) attr.getValue();
IAtsWorkDefinition workDef = atsApi.getWorkDefinitionService().getWorkDefinition(id);
workDefs.add(workDef);
}
return workDefs;
}
@Override
public Collection<CreateTasksDefinitionBuilder> getTaskSets(IAtsTeamWorkflow teamWf) {
List<CreateTasksDefinitionBuilder> taskSets = new LinkedList<>();
for (String idStr : atsApi.getAttributeResolver().getAttributesToStringList(teamWf.getTeamDefinition(),
AtsAttributeTypes.TaskSetId)) {
if (Strings.isValid(idStr)) {
CreateTasksDefinitionBuilder taskSet =
atsApi.getTaskSetDefinitionProviderService().getTaskSetDefinition(Long.valueOf(idStr));
if (taskSet != null) {
taskSets.add(taskSet);
}
}
}
return taskSets;
}
}