/**
   * Performs a projectCPDiff on this Integrity CM Project
   *
   * @param serverConf Authenticated Integrity API Session
   * @param past Past date
   * @return Set of closed CPIDs
   * @throws APIException
   * @throws AbortException
   */
  public Set<String> projectCPDiff(IntegrityConfigurable serverConf, Date past)
      throws APIException, AbortException {

    final SimpleDateFormat dateFormat = new SimpleDateFormat("MMM d, yyyy h:mm:ss aa");

    // Construct the command
    IAPICommand command =
        CommandFactory.createCommand(IAPICommand.PROJECT_CPDIFF_COMMAND, serverConf);
    command.addOption(new APIOption(IAPIOption.PROJECT, fullConfigSyntax));
    command.addOption(new APIOption(IAPIOption.RECURSE));
    MultiValue mv = APIUtils.createMultiValueField(",", "id", "user");
    command.addOption(new APIOption(IAPIOption.FIELDS, mv));
    command.addOption(new APIOption(IAPIOption.REV, "asof:" + dateFormat.format(past)));

    Set<String> projectCPIDs = new HashSet<String>();

    Response res = command.execute();

    if (null != res) {
      if (res.getExitCode() == 0) {
        WorkItem wi = res.getWorkItem(getConfigurationPath());
        Field cpField = wi.getField("CPEntries");
        for (Iterator<Item> it = cpField.getList().iterator(); it.hasNext(); ) {
          Item cpInfo = it.next();

          Field idField = cpInfo.getField("id");
          String id = idField.getValueAsString();
          projectCPIDs.add(id);

          Field userField = cpInfo.getField("user");
          String user = userField.getValueAsString();
        }
      } else {
        LOGGER.severe("An error occured projectCPDiff!");
      }
    } else {
      LOGGER.severe("An error occured projectCPDiff!");
    }

    return projectCPIDs;
  }
 public void initializeProject(WorkItem wi) {
   // Parse the current project information
   try {
     // Get the metadata information about the project
     Field pjNameFld = wi.getField("projectName");
     Field pjTypeFld = wi.getField("projectType");
     Field pjCfgPathFld = wi.getField("fullConfigSyntax");
     Field pjChkptFld = wi.getField("lastCheckpoint");
     // Convert to our class fields
     // First obtain the project name field
     if (null != pjNameFld && null != pjNameFld.getValueAsString()) {
       projectName = pjNameFld.getValueAsString();
     } else {
       LOGGER.warning("Project info did not provide a value for the 'projectName' field!");
       projectName = "";
     }
     // Next, we'll need to know the project type
     if (null != pjTypeFld && null != pjTypeFld.getValueAsString()) {
       projectType = pjTypeFld.getValueAsString();
       if (isBuild()) {
         // Next, we'll need to know the current build checkpoint for this configuration
         Field pjRevFld = wi.getField("revision");
         if (null != pjRevFld && null != pjRevFld.getItem()) {
           projectRevision = pjRevFld.getItem().getId();
         } else {
           projectRevision = "";
           LOGGER.warning("Project info did not provide a vale for the 'revision' field!");
         }
       }
     } else {
       LOGGER.warning("Project info did not provide a value for the 'projectType' field!");
       projectType = "";
     }
     // Most important is the configuration path
     if (null != pjCfgPathFld && null != pjCfgPathFld.getValueAsString()) {
       fullConfigSyntax = pjCfgPathFld.getValueAsString();
     } else {
       LOGGER.severe("Project info did not provide a value for the 'fullConfigSyntax' field!");
       fullConfigSyntax = "";
     }
     // Finally, we'll need to store the last checkpoint to figure out differences, etc.
     if (null != pjChkptFld && null != pjChkptFld.getDateTime()) {
       lastCheckpoint = pjChkptFld.getDateTime();
     } else {
       LOGGER.warning("Project info did not provide a value for the 'lastCheckpoint' field!");
       lastCheckpoint = Calendar.getInstance().getTime();
     }
   } catch (NoSuchElementException nsee) {
     LOGGER.severe("Project info did not provide a value for field " + nsee.getMessage());
   }
 }