Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorddunne2010-12-01 15:10:53 +0000
committerRyan D. Brooks2010-12-01 15:10:53 +0000
commit6d249330ce5fe678ce097702f9e04c31eacaf1f6 (patch)
tree9e38f015cdae8ea73a19a436fe84e314df19c651 /plugins
parent7790892dc8af46531baa9960ebe9a8654c03cb3f (diff)
downloadorg.eclipse.osee-6d249330ce5fe678ce097702f9e04c31eacaf1f6.tar.gz
org.eclipse.osee-6d249330ce5fe678ce097702f9e04c31eacaf1f6.tar.xz
org.eclipse.osee-6d249330ce5fe678ce097702f9e04c31eacaf1f6.zip
feature[ats_0DVN6]: New Actionable Items for UK8 MASR Update
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.osee.ats/plugin.xml8
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage3.java2
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/CopyAtsConfigurationBlam.java267
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/AtsWidgetProvider.java2
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XTeamDefinitionCombo.java61
-rw-r--r--plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQuery.java16
6 files changed, 355 insertions, 1 deletions
diff --git a/plugins/org.eclipse.osee.ats/plugin.xml b/plugins/org.eclipse.osee.ats/plugin.xml
index 3f698bf2faf..3ec6d3635b4 100644
--- a/plugins/org.eclipse.osee.ats/plugin.xml
+++ b/plugins/org.eclipse.osee.ats/plugin.xml
@@ -427,4 +427,12 @@
classname="org.eclipse.osee.ats.util.widgets.AtsAttributeXWidgetProvider">
</AttributeXWidgetProvider>
</extension>
+ <extension
+ id="CopyAtsConfigurationBlam"
+ name="CopyAtsConfigurationBlam"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.ats.navigate.CopyAtsConfigurationBlam">
+ </Operation>
+ </extension>
</plugin>
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage3.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage3.java
index 8881fc29b82..040405016a6 100644
--- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage3.java
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage3.java
@@ -153,7 +153,7 @@ public class NewActionPage3 extends WizardPage {
}
private static void getWizardXWidgetExtensions() {
- if (wizardExtensionItems.isEmpty()) {
+ if (!wizardExtensionItems.isEmpty()) {
return;
}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/CopyAtsConfigurationBlam.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/CopyAtsConfigurationBlam.java
new file mode 100644
index 00000000000..46e22ec4e32
--- /dev/null
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/CopyAtsConfigurationBlam.java
@@ -0,0 +1,267 @@
+/*
+ * Created on Mar 4, 2008
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ats.navigate;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.AtsAttributeTypes;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.util.AtsArtifactTypes;
+import org.eclipse.osee.ats.util.AtsRelationTypes;
+import org.eclipse.osee.ats.util.AtsUtil;
+import org.eclipse.osee.ats.util.widgets.XTeamDefinitionCombo;
+import org.eclipse.osee.framework.core.enums.CoreRelationTypes;
+import org.eclipse.osee.framework.core.exception.OseeArgumentException;
+import org.eclipse.osee.framework.core.exception.OseeCoreException;
+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.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+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.results.XResultData;
+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.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CopyAtsConfigurationBlam extends AbstractBlam {
+
+ private org.eclipse.osee.ats.util.widgets.XTeamDefinitionCombo xTeamDefinitionCombo;
+
+ @Override
+ public String getName() {
+ return "Copy ATS Configuration";
+ }
+
+ @Override
+ public String getXWidgetsXml() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets>");
+ builder.append("<XWidget xwidgetType=\"XTeamDefinitionCombo\" displayName=\"Top Team Definition to Copy From (most like new config)\" />");
+ builder.append("<XWidget xwidgetType=\"XText\" displayName=\"Name Search String\" />");
+ builder.append("<XWidget xwidgetType=\"XText\" displayName=\"Name Replace String\" />");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"Retain Team Leads/Members\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"Persist Changes\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ private TeamDefinitionArtifact getSelectedTeamDefinition() {
+ return (TeamDefinitionArtifact) xTeamDefinitionCombo.getSelectedTeamDef();
+ }
+
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ try {
+ if (ArtifactCache.getDirtyArtifacts().size() > 0) {
+ AWorkbench.popup("Dirty artifacts found in cache, save all artifacts before running this operation (may need to restart)");
+ return;
+ }
+ String searchStr = (String) variableMap.getValue("Name Search String");
+ String replaceStr = (String) variableMap.getValue("Name Replace String");
+ TeamDefinitionArtifact teamDef = getSelectedTeamDefinition();
+ boolean persistChanges = variableMap.getBoolean("Persist Changes");
+ boolean retainTeamLeads = variableMap.getBoolean("Retain Team Leads/Members");
+
+ if (teamDef == null) {
+ AWorkbench.popup("ERROR", "Must Select Team Definition");
+ return;
+ }
+ if (!Strings.isValid(searchStr)) {
+ AWorkbench.popup("ERROR", "Must Enter Search String");
+ return;
+ }
+ if (!Strings.isValid(replaceStr)) {
+ AWorkbench.popup("ERROR", "Must Enter Replace String");
+ return;
+ }
+ XResultData resultData = new XResultData();
+ if (persistChanges) {
+ resultData.log("Persisting Changes");
+ } else {
+ resultData.log("Report-Only, Changes are not persisted");
+ }
+
+ Set<Artifact> newArtsToPersist = new HashSet<Artifact>(50);
+ TeamDefinitionArtifact parentTeamDef = null;
+ if (teamDef.getParent() instanceof TeamDefinitionArtifact) {
+ parentTeamDef = (TeamDefinitionArtifact) teamDef.getParent();
+ } else {
+ parentTeamDef = TeamDefinitionArtifact.getTopTeamDefinition();
+ }
+ confirmOrCreateTeamDefAndAIs(newArtsToPersist, searchStr, replaceStr, resultData, retainTeamLeads, teamDef,
+ parentTeamDef, null);
+ if (persistChanges) {
+ SkynetTransaction transaction = new SkynetTransaction(AtsUtil.getAtsBranch(), "Copy ATS Configuration");
+ for (Artifact art : newArtsToPersist) {
+ art.persist(transaction);
+ }
+ transaction.execute();
+ } else {
+ for (Artifact artifact : newArtsToPersist) {
+ if (!artifact.isInDb()) {
+ System.out.println("purging " + artifact.toStringWithId());
+ artifact.purgeFromBranch();
+ } else {
+ System.out.println("reverting " + artifact.toStringWithId());
+ artifact.revert();
+ }
+ }
+ }
+ resultData.report(getName());
+ } finally {
+ monitor.subTask("Done");
+ }
+ }
+
+ private void confirmOrCreateTeamDefAndAIs(Set<Artifact> newArts, String searchStr, String replaceStr, XResultData resultData, boolean retainTeamLeads, TeamDefinitionArtifact fromTeamDef, TeamDefinitionArtifact parentTeamDef, ActionableItemArtifact parentActionableItem) throws OseeCoreException {
+
+ // Determine parent actionable item if possible, otherwise use top actionable item
+ if (parentActionableItem == null) {
+ List<Artifact> fromAias = fromTeamDef.getRelatedArtifacts(AtsRelationTypes.TeamActionableItem_ActionableItem);
+ if (fromAias.size() == 1) {
+ parentActionableItem = (ActionableItemArtifact) fromAias.iterator().next();
+ } else {
+ parentActionableItem = ActionableItemArtifact.getTopActionableItem();
+ }
+ }
+
+ // Get or create new team definition
+ TeamDefinitionArtifact newTeamDef =
+ (TeamDefinitionArtifact) ArtifactQuery.getArtifactFromTypeAndNameNoException(AtsArtifactTypes.TeamDefinition,
+ getConvertedName(fromTeamDef.getName(), searchStr, replaceStr), AtsUtil.getAtsBranch());
+ if (newTeamDef == null) {
+ newTeamDef =
+ (TeamDefinitionArtifact) duplicateTeamDefinitionOrActionableItem(newArts, searchStr, replaceStr,
+ resultData, fromTeamDef);
+ parentTeamDef.addChild(newTeamDef);
+ newArts.add(newTeamDef);
+ }
+ if (retainTeamLeads) {
+ duplicateTeamLeadsAndMembers(newArts, resultData, fromTeamDef, newTeamDef);
+ }
+ duplicateWorkItems(newArts, resultData, fromTeamDef, newTeamDef);
+
+ List<ActionableItemArtifact> newAias = new ArrayList<ActionableItemArtifact>();
+ for (ActionableItemArtifact fromAi : fromTeamDef.getRelatedArtifacts(
+ AtsRelationTypes.TeamActionableItem_ActionableItem, ActionableItemArtifact.class)) {
+ ActionableItemArtifact newAia =
+ (ActionableItemArtifact) ArtifactQuery.getArtifactFromTypeAndNameNoException(
+ AtsArtifactTypes.ActionableItem, getConvertedName(fromAi.getName(), searchStr, replaceStr),
+ AtsUtil.getAtsBranch());
+ // Check for actionable item in relationship
+ if (newAia == null) {
+ newAia =
+ (ActionableItemArtifact) duplicateTeamDefinitionOrActionableItem(newArts, searchStr, replaceStr,
+ resultData, fromAi);
+ newTeamDef.addRelation(AtsRelationTypes.TeamActionableItem_ActionableItem, newAia);
+ parentActionableItem.addChild(newAia);
+ newArts.add(parentActionableItem);
+ }
+ newAias.add(newAia);
+ }
+
+ // Create all children team definitions and their related AIs
+ for (Artifact childTeamDef : fromTeamDef.getChildren()) {
+ if (childTeamDef instanceof TeamDefinitionArtifact) {
+ ActionableItemArtifact parentAi = (newAias.size() == 1 ? newAias.iterator().next() : null);
+ confirmOrCreateTeamDefAndAIs(newArts, searchStr, replaceStr, resultData, retainTeamLeads,
+ (TeamDefinitionArtifact) childTeamDef, newTeamDef, parentAi);
+ }
+ }
+ }
+
+ private void duplicateTeamLeadsAndMembers(Set<Artifact> newArts, XResultData resultData, TeamDefinitionArtifact fromTeamDef, TeamDefinitionArtifact newTeamDef) throws OseeCoreException {
+ Collection<Artifact> leads = newTeamDef.getRelatedArtifacts(AtsRelationTypes.TeamLead_Lead);
+ for (Artifact user : fromTeamDef.getRelatedArtifacts(AtsRelationTypes.TeamLead_Lead)) {
+ if (!leads.contains(user)) {
+ newArts.add(user);
+ newArts.add(newTeamDef);
+ newTeamDef.addRelation(AtsRelationTypes.TeamLead_Lead, user);
+ resultData.log(" - Relating team lead " + user);
+ }
+ }
+ Collection<Artifact> members = newTeamDef.getRelatedArtifacts(AtsRelationTypes.TeamMember_Member);
+ for (Artifact user : fromTeamDef.getRelatedArtifacts(AtsRelationTypes.TeamMember_Member)) {
+ if (!members.contains(user)) {
+ newArts.add(user);
+ newArts.add(newTeamDef);
+ newTeamDef.addRelation(AtsRelationTypes.TeamMember_Member, user);
+ resultData.log(" - Relating team member " + user);
+ }
+ }
+ }
+
+ private void duplicateWorkItems(Set<Artifact> newArts, XResultData resultData, TeamDefinitionArtifact fromTeamDef, TeamDefinitionArtifact newTeamDef) throws OseeCoreException {
+ Collection<Artifact> workItems = newTeamDef.getRelatedArtifacts(CoreRelationTypes.WorkItem__Child);
+ for (Artifact workChild : fromTeamDef.getRelatedArtifacts(CoreRelationTypes.WorkItem__Child)) {
+ if (!workItems.contains(workChild)) {
+ newArts.add(workChild);
+ newTeamDef.addRelation(CoreRelationTypes.WorkItem__Child, workChild);
+ resultData.log(" - Adding work child " + workChild);
+ }
+ }
+ }
+
+ private Artifact duplicateTeamDefinitionOrActionableItem(Set<Artifact> newArts, String searchStr, String replaceStr, XResultData resultData, Artifact fromArtifact) throws OseeCoreException {
+ String newName = getConvertedName(fromArtifact.getName(), searchStr, replaceStr);
+ if (newName.equals(fromArtifact.getName())) {
+ throw new OseeArgumentException("Could not get new name from name conversion.");
+ }
+ // duplicate all but baseline branch guid
+ Artifact newTeamDef =
+ fromArtifact.duplicate(AtsUtil.getAtsBranch(), Arrays.asList(AtsAttributeTypes.BaselineBranchGuid));
+ newTeamDef.setName(newName);
+ resultData.log("Creating new " + newTeamDef.getArtifactTypeName() + ": " + newTeamDef);
+ String fullName = newTeamDef.getSoleAttributeValue(AtsAttributeTypes.FullName, null);
+ if (fullName != null) {
+ String newFullName = getConvertedName(fullName, searchStr, replaceStr);
+ if (!newFullName.equals(fullName)) {
+ newTeamDef.setSoleAttributeFromString(AtsAttributeTypes.FullName, newFullName);
+ resultData.log(" - Converted \"ats.Full Name\" to " + newFullName);
+ }
+ }
+ newArts.add(newTeamDef);
+ return newTeamDef;
+ }
+
+ private String getConvertedName(String name, String searchStr, String replaceStr) {
+ return name.replaceFirst(searchStr, replaceStr);
+ }
+
+ @Override
+ public String getDescriptionUsage() {
+ return "This BLAM will use existing configuration of a top Team Definition to create a new configuration..\n" +
+ //
+ "This includes making team defs, actionable items, setting all team leads/team members and changing name using search string and replace string.";
+ }
+
+ @Override
+ public Collection<String> getCategories() {
+ return Arrays.asList("ATS.ADMIN");
+ }
+
+ @Override
+ public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ super.widgetCreated(xWidget, toolkit, art, dynamicXWidgetLayout, modListener, isEditable);
+ if (xWidget.getLabel().equals("Top Team Definition to Copy From (most like new config)")) {
+ xTeamDefinitionCombo = (XTeamDefinitionCombo) xWidget;
+ }
+ }
+
+}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/AtsWidgetProvider.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/AtsWidgetProvider.java
index b23eb7f9157..8d758b6c494 100644
--- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/AtsWidgetProvider.java
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/AtsWidgetProvider.java
@@ -43,6 +43,8 @@ public class AtsWidgetProvider implements IXWidgetProvider {
toReturn = new XWorkingBranch();
} else if (widgetName.equals(OperationalImpactXWidget.WIDGET_NAME)) {
toReturn = new OperationalImpactXWidget();
+ } else if (widgetName.equals(XTeamDefinitionCombo.WIDGET_ID)) {
+ toReturn = new XTeamDefinitionCombo();
} else if (widgetName.equals(OperationalImpactWithWorkaroundXWidget.WIDGET_NAME)) {
toReturn = new OperationalImpactWithWorkaroundXWidget();
}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XTeamDefinitionCombo.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XTeamDefinitionCombo.java
new file mode 100644
index 00000000000..4783a960dec
--- /dev/null
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XTeamDefinitionCombo.java
@@ -0,0 +1,61 @@
+/*
+ * Created on Nov 29, 2010
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ats.util.widgets;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.internal.AtsPlugin;
+import org.eclipse.osee.framework.core.enums.Active;
+import org.eclipse.osee.framework.core.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.swt.widgets.Composite;
+
+public class XTeamDefinitionCombo extends XComboViewer {
+ public static final String WIDGET_ID = XTeamDefinitionCombo.class.getSimpleName();
+ private Artifact selectedTeamDef = null;
+
+ public XTeamDefinitionCombo() {
+ super("Team Definition");
+ }
+
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ super.createControls(parent, horizontalSpan);
+
+ try {
+ Collection<TeamDefinitionArtifact> teamDefs = TeamDefinitionArtifact.getTeamDefinitions(Active.Active);
+ List<TeamDefinitionArtifact> sortedTeamDefs = new ArrayList<TeamDefinitionArtifact>();
+ sortedTeamDefs.addAll(teamDefs);
+ Collections.sort(sortedTeamDefs);
+ getComboViewer().setInput(sortedTeamDefs);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ ArrayList<Object> defaultSelection = new ArrayList<Object>();
+ defaultSelection.add("--select--");
+ setSelected(defaultSelection);
+ addXModifiedListener(new XModifiedListener() {
+
+ @Override
+ public void widgetModified(XWidget widget) {
+ selectedTeamDef = (Artifact) getSelected();
+ }
+ });
+ }
+
+ public Artifact getSelectedTeamDef() {
+ return selectedTeamDef;
+ }
+
+}
diff --git a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQuery.java b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQuery.java
index d8b9b67738f..5add6cac949 100644
--- a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQuery.java
+++ b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQuery.java
@@ -173,6 +173,22 @@ public class ArtifactQuery {
QueryType.GET);
}
+ /**
+ * search for exactly one artifact based on its type and name - otherwise throw an exception
+ *
+ * @return exactly one artifact based on its type and name, otherwise null
+ * @throws MultipleArtifactsExist if more than one artifact is found
+ */
+ public static Artifact getArtifactFromTypeAndNameNoException(IArtifactType artifactType, String artifactName, IOseeBranch branch) throws OseeCoreException {
+ try {
+ return queryFromTypeAndAttribute(artifactType, CoreAttributeTypes.Name, artifactName, branch).getOrCheckArtifact(
+ QueryType.GET);
+ } catch (ArtifactDoesNotExist ex) {
+ // do nothing
+ }
+ return null;
+ }
+
public static List<Integer> selectArtifactIdsFromTypeAndName(IArtifactType artifactType, String artifactName, IOseeBranch branch) throws OseeCoreException {
return queryFromTypeAndAttribute(artifactType, CoreAttributeTypes.Name, artifactName, branch).selectArtifacts(2);
}

Back to the top