/*
   * Replaces all the participants in this action with their equivalent objects
   * in the current state. Calling this function solves the problem that happens
   * when you clone actions -- their hashtables point to participant objects
   * that were part of the previous, non-cloned state. Hence, this function
   * should be called after this object is cloned.
   */
  public void refetchParticipants(
      ArtifactStateRepository artifactRep,
      CustomerStateRepository customerRep,
      EmployeeStateRepository employeeRep,
      ProjectStateRepository projectRep,
      ToolStateRepository toolRep) {
    // proj participants:
    Hashtable<Project, Boolean> newProjs = new Hashtable<Project, Boolean>();
    Iterator<Map.Entry<Project, Boolean>> projsIterator = projs.entrySet().iterator();
    while (projsIterator.hasNext()) {
      Map.Entry<Project, Boolean> entry = projsIterator.next();
      Project oldProj = entry.getKey();
      if (oldProj instanceof TheProject) {
        Project newProj =
            projectRep.getTheProjectStateRepository().get(((TheProject) oldProj).getName());
        Boolean activeStatus = projs.get(oldProj);
        newProjs.put(newProj, activeStatus);
      }
    }
    projs.clear();
    projs.putAll(newProjs);

    // emp participants:
    Hashtable<Employee, Boolean> newEmps = new Hashtable<Employee, Boolean>();
    Iterator<Map.Entry<Employee, Boolean>> empsIterator = emps.entrySet().iterator();
    while (empsIterator.hasNext()) {
      Map.Entry<Employee, Boolean> entry = empsIterator.next();
      Employee oldEmp = entry.getKey();
      if (oldEmp instanceof SoftwareDeveloper) {
        Employee newEmp =
            employeeRep
                .getSoftwareDeveloperStateRepository()
                .get(((SoftwareDeveloper) oldEmp).getName());
        Boolean activeStatus = emps.get(oldEmp);
        newEmps.put(newEmp, activeStatus);
      }
    }
    emps.clear();
    emps.putAll(newEmps);
  }
  /*
   * Replaces all the participants in this action with their equivalent objects
   * in the current state. Calling this function solves the problem that happens
   * when you clone actions -- their hashtables point to participant objects
   * that were part of the previous, non-cloned state. Hence, this function
   * should be called after this object is cloned.
   */
  public void refetchParticipants(
      ArtifactStateRepository artifactRep,
      CustomerStateRepository customerRep,
      EmployeeStateRepository employeeRep,
      ProjectStateRepository projectRep,
      ToolStateRepository toolRep) {
    // timothy participants:
    Hashtable<Employee, Boolean> newTimothys = new Hashtable<Employee, Boolean>();
    Iterator<Map.Entry<Employee, Boolean>> timothysIterator = timothys.entrySet().iterator();
    while (timothysIterator.hasNext()) {
      Map.Entry<Employee, Boolean> entry = timothysIterator.next();
      Employee oldTimothy = entry.getKey();
      if (oldTimothy instanceof SoftwareDeveloper) {
        Employee newTimothy =
            employeeRep
                .getSoftwareDeveloperStateRepository()
                .get(((SoftwareDeveloper) oldTimothy).getName());
        Boolean activeStatus = timothys.get(oldTimothy);
        newTimothys.put(newTimothy, activeStatus);
      }
    }
    timothys.clear();
    timothys.putAll(newTimothys);

    // reda participants:
    Hashtable<Employee, Boolean> newRedas = new Hashtable<Employee, Boolean>();
    Iterator<Map.Entry<Employee, Boolean>> redasIterator = redas.entrySet().iterator();
    while (redasIterator.hasNext()) {
      Map.Entry<Employee, Boolean> entry = redasIterator.next();
      Employee oldReda = entry.getKey();
      if (oldReda instanceof SoftwareDeveloper) {
        Employee newReda =
            employeeRep
                .getSoftwareDeveloperStateRepository()
                .get(((SoftwareDeveloper) oldReda).getName());
        Boolean activeStatus = redas.get(oldReda);
        newRedas.put(newReda, activeStatus);
      }
    }
    redas.clear();
    redas.putAll(newRedas);

    // code participants:
    Hashtable<Artifact, Boolean> newCodes = new Hashtable<Artifact, Boolean>();
    Iterator<Map.Entry<Artifact, Boolean>> codesIterator = codes.entrySet().iterator();
    while (codesIterator.hasNext()) {
      Map.Entry<Artifact, Boolean> entry = codesIterator.next();
      Artifact oldCode = entry.getKey();
      if (oldCode instanceof Code) {
        Artifact newCode =
            artifactRep.getCodeStateRepository().get(((Code) oldCode).getDescription());
        Boolean activeStatus = codes.get(oldCode);
        newCodes.put(newCode, activeStatus);
      }
    }
    codes.clear();
    codes.putAll(newCodes);

    // proj participants:
    Hashtable<Project, Boolean> newProjs = new Hashtable<Project, Boolean>();
    Iterator<Map.Entry<Project, Boolean>> projsIterator = projs.entrySet().iterator();
    while (projsIterator.hasNext()) {
      Map.Entry<Project, Boolean> entry = projsIterator.next();
      Project oldProj = entry.getKey();
      if (oldProj instanceof TheProject) {
        Project newProj =
            projectRep.getTheProjectStateRepository().get(((TheProject) oldProj).getName());
        Boolean activeStatus = projs.get(oldProj);
        newProjs.put(newProj, activeStatus);
      }
    }
    projs.clear();
    projs.putAll(newProjs);

    // associateduserstories participants:
    Hashtable<Artifact, Boolean> newAssociatedUserStoriess = new Hashtable<Artifact, Boolean>();
    Iterator<Map.Entry<Artifact, Boolean>> associateduserstoriessIterator =
        associateduserstoriess.entrySet().iterator();
    while (associateduserstoriessIterator.hasNext()) {
      Map.Entry<Artifact, Boolean> entry = associateduserstoriessIterator.next();
      Artifact oldAssociatedUserStories = entry.getKey();
      if (oldAssociatedUserStories instanceof UserStories) {
        Artifact newAssociatedUserStories =
            artifactRep
                .getUserStoriesStateRepository()
                .get(((UserStories) oldAssociatedUserStories).getName());
        Boolean activeStatus = associateduserstoriess.get(oldAssociatedUserStories);
        newAssociatedUserStoriess.put(newAssociatedUserStories, activeStatus);
      }
    }
    associateduserstoriess.clear();
    associateduserstoriess.putAll(newAssociatedUserStoriess);

    // releaseplan participants:
    Hashtable<Artifact, Boolean> newReleasePlans = new Hashtable<Artifact, Boolean>();
    Iterator<Map.Entry<Artifact, Boolean>> releaseplansIterator =
        releaseplans.entrySet().iterator();
    while (releaseplansIterator.hasNext()) {
      Map.Entry<Artifact, Boolean> entry = releaseplansIterator.next();
      Artifact oldReleasePlan = entry.getKey();
      if (oldReleasePlan instanceof ReleasePlan) {
        Artifact newReleasePlan =
            artifactRep
                .getReleasePlanStateRepository()
                .get(((ReleasePlan) oldReleasePlan).getName());
        Boolean activeStatus = releaseplans.get(oldReleasePlan);
        newReleasePlans.put(newReleasePlan, activeStatus);
      }
    }
    releaseplans.clear();
    releaseplans.putAll(newReleasePlans);
  }