blob: 09b1b4d43a7ec3af34a9246e5a750b4bec7a9eb0 [file] [log] [blame]
/*******************************************************************************
* 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.dsl.integration.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;
import org.eclipse.osee.ats.api.IAtsWorkItem;
import org.eclipse.osee.ats.api.config.IWorkDefinitionStringProvider;
import org.eclipse.osee.ats.api.review.IAtsAbstractReview;
import org.eclipse.osee.ats.api.user.IAtsUserService;
import org.eclipse.osee.ats.api.workdef.IAtsCompositeLayoutItem;
import org.eclipse.osee.ats.api.workdef.IAtsLayoutItem;
import org.eclipse.osee.ats.api.workdef.IAtsRuleDefinition;
import org.eclipse.osee.ats.api.workdef.IAtsStateDefinition;
import org.eclipse.osee.ats.api.workdef.IAtsWidgetDefinition;
import org.eclipse.osee.ats.api.workdef.IAtsWorkDefinition;
import org.eclipse.osee.ats.api.workdef.IAtsWorkDefinitionService;
import org.eclipse.osee.ats.api.workdef.IAtsWorkDefinitionStore;
import org.eclipse.osee.ats.api.workdef.IAttributeResolver;
import org.eclipse.osee.ats.api.workdef.RuleDefinitionOption;
import org.eclipse.osee.ats.api.workflow.IAtsTeamWorkflow;
import org.eclipse.osee.ats.dsl.ModelUtil;
import org.eclipse.osee.ats.dsl.atsDsl.AtsDsl;
import org.eclipse.osee.framework.core.util.XResultData;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.jdk.core.type.Pair;
import org.eclipse.osee.framework.jdk.core.util.Conditions;
import org.eclipse.osee.framework.jdk.core.util.Lib;
import org.eclipse.osee.framework.jdk.core.util.Strings;
import org.eclipse.osee.framework.jdk.core.util.io.StringOutputStream;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.logger.Log;
/**
* Provides new and stored Work Definitions
*
* @author Donald G. Dunne
*/
public class AtsWorkDefinitionServiceImpl implements IAtsWorkDefinitionService {
private IAtsWorkDefinitionStore workDefStore;
private IAttributeResolver attrResolver;
private IAtsUserService userService;
private Log logger;
private IWorkDefinitionStringProvider workDefinitionStringProvider;
public void setLogger(Log logger) {
this.logger = logger;
}
public void setAtsWorkDefinitionStore(IAtsWorkDefinitionStore workDefStore) {
this.workDefStore = workDefStore;
}
public void setAttributeResolver(IAttributeResolver attrResolver) {
this.attrResolver = attrResolver;
}
public void setAtsUserService(IAtsUserService userService) {
this.userService = userService;
}
public void start() throws OseeCoreException {
logger.info("AtsWorkDefinitionServiceImpl started");
}
@Override
public IAtsWorkDefinition copyWorkDefinition(String newName, IAtsWorkDefinition workDef, XResultData resultData) {
ConvertWorkDefinitionToAtsDsl converter = new ConvertWorkDefinitionToAtsDsl(resultData);
AtsDsl atsDsl = converter.convert(newName, workDef);
// Convert back to WorkDefinition
ConvertAtsDslToWorkDefinition converter2 =
new ConvertAtsDslToWorkDefinition(newName, atsDsl, resultData, attrResolver, userService);
IAtsWorkDefinition newWorkDef = converter2.convert().iterator().next();
return newWorkDef;
}
@Override
public String getStorageString(IAtsWorkDefinition workDef, XResultData resultData) throws Exception {
ConvertWorkDefinitionToAtsDsl converter = new ConvertWorkDefinitionToAtsDsl(resultData);
AtsDsl atsDsl = converter.convert(workDef.getName(), workDef);
StringOutputStream writer = new StringOutputStream();
ModelUtil.saveModel(atsDsl, "ats:/mock" + Lib.getDateTimeString() + ".ats", writer);
return writer.toString();
}
@Override
public List<IAtsRuleDefinition> getRuleDefinitions() {
List<IAtsRuleDefinition> ruleDefs = new ArrayList<>();
String ruleDefintionsDslStr = workDefStore.loadRuleDefinitionString();
if (Strings.isValid(ruleDefintionsDslStr)) {
AtsDsl atsDsl;
try {
atsDsl = ModelUtil.loadModel("Rule Definitions" + ".ats", ruleDefintionsDslStr);
ConvertAtsDslToRuleDefinition convert = new ConvertAtsDslToRuleDefinition(atsDsl, ruleDefs, userService);
ruleDefs = convert.convert();
} catch (Exception ex) {
OseeLog.log(AtsWorkDefinitionServiceImpl.class, Level.SEVERE, ex);
}
}
return ruleDefs;
}
@Override
public IAtsWorkDefinition getWorkDef(String workDefId, XResultData resultData) throws Exception {
Conditions.checkNotNullOrEmpty(workDefId, "workDefId");
String workDefStr = null;
if (workDefinitionStringProvider != null && workDefinitionStringProvider.getWorkDefIdToWorkDef() != null) {
workDefStr = workDefinitionStringProvider.getWorkDefIdToWorkDef().get(workDefId);
}
if (workDefStr == null) {
workDefStr = workDefStore.loadWorkDefinitionString(workDefId);
}
Conditions.checkNotNullOrEmpty(workDefStr, "workDefStr");
AtsDsl atsDsl = ModelUtil.loadModel(workDefId + ".ats", workDefStr);
ConvertAtsDslToWorkDefinition convert =
new ConvertAtsDslToWorkDefinition(workDefId, atsDsl, resultData, attrResolver, userService);
for (IAtsWorkDefinition workDef : convert.convert()) {
if (workDef.getId().equals(workDefId)) {
return workDef;
}
}
return null;
}
@Override
public boolean isStateWeightingEnabled(IAtsWorkDefinition workDef) {
for (IAtsStateDefinition stateDef : workDef.getStates()) {
if (stateDef.getStateWeight() != 0) {
return true;
}
}
return false;
}
@Override
public Collection<String> getStateNames(IAtsWorkDefinition workDef) {
List<String> names = new ArrayList<>();
for (IAtsStateDefinition state : workDef.getStates()) {
names.add(state.getName());
}
return names;
}
@Override
public List<IAtsStateDefinition> getStatesOrderedByOrdinal(IAtsWorkDefinition workDef) {
List<IAtsStateDefinition> orderedPages = new ArrayList<>();
List<IAtsStateDefinition> unOrderedPages = new ArrayList<>();
for (int x = 1; x < workDef.getStates().size() + 1; x++) {
for (IAtsStateDefinition state : workDef.getStates()) {
if (state.getOrdinal() == x) {
orderedPages.add(state);
} else if (state.getOrdinal() == 0 && !unOrderedPages.contains(state)) {
unOrderedPages.add(state);
}
}
}
orderedPages.addAll(unOrderedPages);
return orderedPages;
}
@Override
public void getStatesOrderedByDefaultToState(IAtsWorkDefinition workDef, IAtsStateDefinition stateDefinition, List<IAtsStateDefinition> pages) {
if (pages.contains(stateDefinition)) {
return;
}
// Add this page first
pages.add(stateDefinition);
// Add default page
IAtsStateDefinition defaultToState = stateDefinition.getDefaultToState();
if (defaultToState != null && !defaultToState.getName().equals(stateDefinition.getName())) {
getStatesOrderedByDefaultToState(workDef, stateDefinition.getDefaultToState(), pages);
}
// Add remaining pages
for (IAtsStateDefinition stateDef : stateDefinition.getToStates()) {
if (!pages.contains(stateDef)) {
getStatesOrderedByDefaultToState(workDef, stateDef, pages);
}
}
}
/**
* Recursively decend StateItems and grab all widgetDefs.<br>
* <br>
* Note: Modifing this list will not affect the state widgets. Use addStateItem().
*/
@Override
public List<IAtsWidgetDefinition> getWidgetsFromLayoutItems(IAtsStateDefinition stateDef) {
List<IAtsWidgetDefinition> widgets = new ArrayList<>();
getWidgets(stateDef, widgets, stateDef.getLayoutItems());
return widgets;
}
private static void getWidgets(IAtsStateDefinition stateDef, List<IAtsWidgetDefinition> widgets, List<IAtsLayoutItem> stateItems) {
for (IAtsLayoutItem stateItem : stateItems) {
if (stateItem instanceof IAtsCompositeLayoutItem) {
getWidgets(stateDef, widgets, ((IAtsCompositeLayoutItem) stateItem).getaLayoutItems());
} else if (stateItem instanceof IAtsWidgetDefinition) {
widgets.add((IAtsWidgetDefinition) stateItem);
}
}
}
@Override
public boolean hasWidgetNamed(IAtsStateDefinition stateDef, String name) {
for (IAtsWidgetDefinition widgetDef : getWidgetsFromLayoutItems(stateDef)) {
if (widgetDef.getName().equals(name)) {
return true;
}
}
return false;
}
@Override
public IAtsWorkDefinition getWorkDefinition(String workDefinitionDsl) throws Exception {
AtsDsl atsDsl = ModelUtil.loadModel("model.ats", workDefinitionDsl);
XResultData result = new XResultData(false);
ConvertAtsDslToWorkDefinition convert = new ConvertAtsDslToWorkDefinition(
Strings.unquote(atsDsl.getWorkDef().iterator().next().getName()), atsDsl, result, attrResolver, userService);
if (!result.isEmpty()) {
throw new IllegalStateException(result.toString());
}
return convert.convert().iterator().next();
}
@Override
public boolean teamDefHasRule(IAtsWorkItem workItem, RuleDefinitionOption option) {
boolean hasRule = false;
IAtsTeamWorkflow teamWf = null;
try {
if (workItem instanceof IAtsTeamWorkflow) {
teamWf = (IAtsTeamWorkflow) workItem;
} else if (this instanceof IAtsAbstractReview) {
teamWf = ((IAtsAbstractReview) this).getParentTeamWorkflow();
}
if (teamWf != null) {
hasRule = teamWf.getTeamDefinition().hasRule(option.name());
}
} catch (Exception ex) {
OseeLog.log(AtsWorkDefinitionServiceImpl.class, Level.SEVERE, ex);
}
return hasRule;
}
@Override
public boolean isInState(IAtsWorkItem workItem, IAtsStateDefinition stateDef) {
return workItem.getStateMgr().getCurrentStateName().equals(stateDef.getName());
}
@Override
public Collection<IAtsWorkDefinition> getAllWorkDefinitions(XResultData resultData) {
List<IAtsWorkDefinition> workDefs = new ArrayList<>();
if (workDefinitionStringProvider != null && workDefinitionStringProvider.getWorkDefIdToWorkDef() != null) {
for (Entry<String, String> entry : workDefinitionStringProvider.getWorkDefIdToWorkDef().entrySet()) {
String name = entry.getKey();
String workDefStr = entry.getValue();
processWorkDef(resultData, workDefs, name, workDefStr);
}
} else {
for (Pair<String, String> entry : workDefStore.getWorkDefinitionStrings()) {
String name = entry.getFirst();
String workDefStr = entry.getSecond();
processWorkDef(resultData, workDefs, name, workDefStr);
}
}
return workDefs;
}
private void processWorkDef(XResultData resultData, List<IAtsWorkDefinition> workDefs, String name, String workDefStr) {
try {
AtsDsl atsDsl = ModelUtil.loadModel(name + ".ats", workDefStr);
ConvertAtsDslToWorkDefinition convert =
new ConvertAtsDslToWorkDefinition(name, atsDsl, resultData, attrResolver, userService);
for (IAtsWorkDefinition workDef : convert.convert()) {
workDefs.add(workDef);
}
} catch (Exception ex) {
throw new OseeCoreException(ex);
}
}
@Override
public Collection<String> getAllValidStateNames(XResultData resultData) {
Set<String> allValidStateNames = new HashSet<>();
for (IAtsWorkDefinition workDef : getAllWorkDefinitions(resultData)) {
for (String stateName : getStateNames(workDef)) {
if (!allValidStateNames.contains(stateName)) {
allValidStateNames.add(stateName);
}
}
}
return allValidStateNames;
}
@Override
public void setWorkDefinitionStringProvider(IWorkDefinitionStringProvider workDefinitionStringProvider) {
this.workDefinitionStringProvider = workDefinitionStringProvider;
}
}