bug[ats_TW5390]: Task generation results in missing attributes

Change-Id: I32064836216a712b3a35820de20d78d1b7c1bee7
diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/util/IAtsStoreService.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/util/IAtsStoreService.java
index 6d2dc98..2daf715 100644
--- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/util/IAtsStoreService.java
+++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/util/IAtsStoreService.java
@@ -22,6 +22,7 @@
 import org.eclipse.osee.framework.core.data.AttributeTypeId;
 import org.eclipse.osee.framework.core.data.AttributeTypeToken;
 import org.eclipse.osee.framework.core.data.IArtifactType;
+import org.eclipse.osee.framework.core.data.TransactionId;
 
 public interface IAtsStoreService {
 
@@ -71,4 +72,5 @@
 
    boolean isArtifactTypeInheritsFrom(IArtifactType artifactType, IArtifactType baseArtifactType);
 
+   TransactionId getTransactionId(IAtsWorkItem workItem);
 }
diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workflow/state/IAtsStateFactory.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workflow/state/IAtsStateFactory.java
index 30a794e..53ada64 100644
--- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workflow/state/IAtsStateFactory.java
+++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workflow/state/IAtsStateFactory.java
@@ -13,19 +13,21 @@
 import org.eclipse.osee.ats.api.IAtsWorkItem;
 import org.eclipse.osee.ats.api.user.IAtsUser;
 import org.eclipse.osee.ats.api.util.IAtsChangeSet;
-import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.Id;
 
 /**
  * @author Donald G Dunne
  */
 public interface IAtsStateFactory {
 
-   IAtsStateManager getStateManager(IAtsWorkItem workItem) throws OseeCoreException;
+   IAtsStateManager getStateManager(IAtsWorkItem workItem);
 
-   IAtsStateManager getStateManager(IAtsWorkItem workItem, boolean load);
-
-   void writeToStore(IAtsUser atsUser, IAtsWorkItem workItem, IAtsChangeSet changes) throws OseeCoreException;
+   void writeToStore(IAtsUser atsUser, IAtsWorkItem workItem, IAtsChangeSet changes);
 
    void load(IAtsWorkItem workItem, IAtsStateManager stateMgr);
 
+   void clearStateManager(Id id);
+
+   void setStateMgr(IAtsWorkItem workItem, IAtsStateManager stateMgr);
+
 }
diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientImpl.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientImpl.java
index 2c237fc..4dcd4c2 100644
--- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientImpl.java
+++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientImpl.java
@@ -132,7 +132,7 @@
 
       logFactory = AtsCoreFactory.newLogFactory();
       stateFactory = AtsCoreFactory.newStateFactory(getServices(), logFactory);
-      storeService = new AtsStoreService(workItemFactory, getUserServiceClient(), jdbcService);
+      storeService = new AtsStoreService(workItemFactory, getUserServiceClient(), jdbcService, this);
 
       queryService = new AtsQueryServiceImpl(this, jdbcService);
       actionableItemManager = new ActionableItemManager(attributeResolverService, storeService, this);
diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsStoreService.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsStoreService.java
index 3eec45f..b685951 100644
--- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsStoreService.java
+++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsStoreService.java
@@ -20,6 +20,7 @@
 import java.util.Map;
 import java.util.Set;
 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.data.AtsArtifactTypes;
 import org.eclipse.osee.ats.api.team.IAtsWorkItemFactory;
@@ -33,6 +34,7 @@
 import org.eclipse.osee.framework.core.data.AttributeTypeId;
 import org.eclipse.osee.framework.core.data.AttributeTypeToken;
 import org.eclipse.osee.framework.core.data.IArtifactType;
+import org.eclipse.osee.framework.core.data.TransactionId;
 import org.eclipse.osee.framework.core.model.type.ArtifactType;
 import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
 import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
@@ -49,11 +51,13 @@
    private final IAtsWorkItemFactory workItemFactory;
    private final IAtsUserService userService;
    private final JdbcService jdbcService;
+   private final IAtsServices services;
 
-   public AtsStoreService(IAtsWorkItemFactory workItemFactory, IAtsUserService userService, JdbcService jdbcService) {
+   public AtsStoreService(IAtsWorkItemFactory workItemFactory, IAtsUserService userService, JdbcService jdbcService, IAtsServices services) {
       this.workItemFactory = workItemFactory;
       this.userService = userService;
       this.jdbcService = jdbcService;
+      this.services = services;
    }
 
    @Override
@@ -195,4 +199,14 @@
       return ArtifactTypeManager.inheritsFrom(artifactType, baseArtifactType);
    }
 
+   @Override
+   public TransactionId getTransactionId(IAtsWorkItem workItem) {
+      TransactionId transId = TransactionId.SENTINEL;
+      ArtifactId artifact = services.getArtifact(workItem.getStoreObject());
+      if (artifact instanceof Artifact) {
+         transId = ((Artifact) artifact).getTransaction();
+      }
+      return transId;
+   }
+
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/AbstractWorkflowArtifact.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/AbstractWorkflowArtifact.java
index 3d96e1a..9f74a1f 100644
--- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/AbstractWorkflowArtifact.java
+++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/AbstractWorkflowArtifact.java
@@ -36,7 +36,6 @@
 import org.eclipse.osee.ats.api.workflow.log.IAtsLog;
 import org.eclipse.osee.ats.api.workflow.log.IAtsLogItem;
 import org.eclipse.osee.ats.api.workflow.log.LogType;
-import org.eclipse.osee.ats.api.workflow.note.IAtsWorkItemNotes;
 import org.eclipse.osee.ats.api.workflow.state.IAtsStateManager;
 import org.eclipse.osee.ats.core.client.action.ActionArtifact;
 import org.eclipse.osee.ats.core.client.artifact.AbstractAtsArtifact;
@@ -88,9 +87,6 @@
    protected ActionArtifact parentAction;
    private IAtsLog atsLog;
    private TransactionId atsLogTx;
-   private TransactionId stateMgrTransactionNumber;
-   private IAtsWorkItemNotes atsNote;
-   private IAtsStateManager stateMgr;
 
    public AbstractWorkflowArtifact(String guid, BranchId branch, ArtifactTypeId artifactType) {
       super(guid, branch, artifactType);
@@ -159,7 +155,6 @@
       parentAction = null;
       parentAwa = null;
       parentTeamArt = null;
-      stateMgr = null;
       atsLog = null;
    }
 
@@ -685,15 +680,7 @@
 
    @Override
    public IAtsStateManager getStateMgr() {
-      if (stateMgr == null || getTransaction().notEqual(stateMgrTransactionNumber)) {
-         try {
-            stateMgr = AtsClientService.get().getStateFactory().getStateManager(this, isInDb());
-            stateMgrTransactionNumber = getTransaction();
-         } catch (OseeCoreException ex) {
-            OseeLog.log(Activator.class, Level.SEVERE, ex);
-         }
-      }
-      return stateMgr;
+      return AtsClientService.get().getStateFactory().getStateManager(this);
    }
 
    @Override
@@ -786,8 +773,9 @@
    }
 
    @Override
-   public void setStateManager(IAtsStateManager stateManager) {
-      this.stateMgr = stateManager;
+   public void setStateManager(IAtsStateManager stateMgr) {
+      Conditions.assertNotNull(stateMgr, "StateManager");
+      AtsClientService.get().getStateFactory().setStateMgr(this, stateMgr);
    }
 
    /**
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/internal/state/AtsStateFactory.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/internal/state/AtsStateFactory.java
index 862d967..c35c3ac 100644
--- a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/internal/state/AtsStateFactory.java
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/internal/state/AtsStateFactory.java
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.osee.ats.core.internal.state;
 
+import java.util.HashMap;
+import java.util.Map;
 import org.eclipse.osee.ats.api.IAtsServices;
 import org.eclipse.osee.ats.api.IAtsWorkItem;
 import org.eclipse.osee.ats.api.user.IAtsUser;
@@ -18,7 +20,8 @@
 import org.eclipse.osee.ats.api.workflow.state.IAtsStateFactory;
 import org.eclipse.osee.ats.api.workflow.state.IAtsStateManager;
 import org.eclipse.osee.ats.api.workflow.state.IAtsWorkStateFactory;
-import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.core.data.TransactionId;
+import org.eclipse.osee.framework.jdk.core.type.Id;
 
 /**
  * @author Donald G. Dunne
@@ -28,6 +31,8 @@
    private final IAtsWorkStateFactory workStateFactory;
    private final IAtsLogFactory logFactory;
    private final IAtsServices services;
+   Map<Id, IAtsStateManager> idToStateManager = new HashMap<>();
+   Map<Id, TransactionId> idToTransactionId = new HashMap<>();
 
    public AtsStateFactory(IAtsServices services, IAtsWorkStateFactory workStateFactory, IAtsLogFactory logFactory) {
       this.services = services;
@@ -37,21 +42,20 @@
 
    @Override
    public IAtsStateManager getStateManager(IAtsWorkItem workItem) {
-      StateManager stateMgr = new StateManager(workItem, logFactory, services);
-      return stateMgr;
-   }
-
-   @Override
-   public IAtsStateManager getStateManager(IAtsWorkItem workItem, boolean load) throws OseeCoreException {
-      IAtsStateManager stateMgr = getStateManager(workItem);
-      if (load) {
+      IAtsStateManager stateMgr = idToStateManager.get(workItem);
+      TransactionId transId = idToTransactionId.get(workItem);
+      TransactionId workItemTransaction = services.getStoreService().getTransactionId(workItem);
+      if (stateMgr == null || (workItemTransaction.isValid() && workItemTransaction.notEqual(transId))) {
+         stateMgr = new StateManager(workItem, logFactory, services);
+         idToStateManager.put(workItem, stateMgr);
+         idToTransactionId.put(workItem, services.getStoreService().getTransactionId(workItem));
          StateManagerStore.load(workItem, stateMgr, services.getAttributeResolver(), workStateFactory);
       }
       return stateMgr;
    }
 
    @Override
-   public void writeToStore(IAtsUser asUser, IAtsWorkItem workItem, IAtsChangeSet changes) throws OseeCoreException {
+   public void writeToStore(IAtsUser asUser, IAtsWorkItem workItem, IAtsChangeSet changes) {
       StateManagerStore.writeToStore(asUser, workItem, (StateManager) workItem.getStateMgr(),
          services.getAttributeResolver(), changes, workStateFactory);
    }
@@ -61,4 +65,15 @@
       StateManagerStore.load(workItem, stateMgr, services.getAttributeResolver(), workStateFactory);
    }
 
+   @Override
+   public void clearStateManager(Id id) {
+      idToStateManager.put(id, null);
+   }
+
+   @Override
+   public void setStateMgr(IAtsWorkItem workItem, IAtsStateManager stateMgr) {
+      idToStateManager.put(workItem, stateMgr);
+      idToTransactionId.put(workItem, services.getStoreService().getTransactionId(workItem));
+   }
+
 }
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workflow/WorkItem.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workflow/WorkItem.java
index 4908220..8d9b7e0 100644
--- a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workflow/WorkItem.java
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workflow/WorkItem.java
@@ -37,7 +37,6 @@
 import org.eclipse.osee.framework.core.data.ArtifactToken;
 import org.eclipse.osee.framework.core.data.ArtifactTypeId;
 import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
-import org.eclipse.osee.framework.jdk.core.util.Conditions;
 import org.eclipse.osee.logger.Log;
 
 /**
@@ -46,7 +45,6 @@
 public class WorkItem extends AtsObject implements IAtsWorkItem {
 
    protected final ArtifactToken artifact;
-   private IAtsStateManager stateMgr;
    private IAtsLog atsLog;
    private IWorkDefinitionMatch match;
    protected final IAtsServices services;
@@ -137,20 +135,12 @@
 
    @Override
    public IAtsStateManager getStateMgr() {
-      if (stateMgr == null) {
-         try {
-            stateMgr = services.getStateFactory().getStateManager(this, true);
-         } catch (OseeCoreException ex) {
-            logger.error(ex, "Error getting stateManager for artifact[%s]", artifact);
-         }
-      }
-      return stateMgr;
+      return services.getStateFactory().getStateManager(this);
    }
 
    @Override
    public void setStateManager(IAtsStateManager stateMgr) {
-      Conditions.assertNotNull(stateMgr, "stateMgr");
-      this.stateMgr = stateMgr;
+      services.getStateFactory().setStateMgr(this, stateMgr);
    }
 
    @Override
diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsStoreServiceImpl.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsStoreServiceImpl.java
index dba4c28..6fb6aef 100644
--- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsStoreServiceImpl.java
+++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsStoreServiceImpl.java
@@ -36,6 +36,7 @@
 import org.eclipse.osee.framework.core.data.AttributeTypeId;
 import org.eclipse.osee.framework.core.data.AttributeTypeToken;
 import org.eclipse.osee.framework.core.data.IArtifactType;
+import org.eclipse.osee.framework.core.data.TransactionId;
 import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
 import org.eclipse.osee.jdbc.JdbcService;
 import org.eclipse.osee.orcs.data.ArtifactReadable;
@@ -187,4 +188,14 @@
       return atsServer.getOrcsApi().getOrcsTypes().getArtifactTypes().inheritsFrom(artifactType, baseArtifactType);
    }
 
+   @Override
+   public TransactionId getTransactionId(IAtsWorkItem workItem) {
+      TransactionId transId = TransactionId.SENTINEL;
+      ArtifactId artifact = atsServer.getArtifact(workItem.getStoreObject());
+      if (artifact instanceof ArtifactReadable) {
+         transId = ((ArtifactReadable) artifact).getTransaction();
+      }
+      return transId;
+   }
+
 }