/**
  * Get completed process instances which were finished after the given date and time
  *
  * @return BPMNProcessInstance array if the historic process instance list is not null
  */
 public BPMNProcessInstance[] getCompletedProcessInstances() {
   HistoryService historyService = BPMNServerHolder.getInstance().getEngine().getHistoryService();
   HistoricProcessInstanceQuery instanceQuery =
       historyService.createHistoricProcessInstanceQuery();
   List<HistoricProcessInstance> historicProcessInstanceList = null;
   String time =
       readPublishTimeFromRegistry(
           AnalyticsPublisherConstants.PROCESS_RESOURCE_PATH,
           AnalyticsPublisherConstants.LAST_PROCESS_INSTANCE_PUBLISH_TIME);
   if (time == null) {
     if (instanceQuery.finished().list().size() != 0) {
       // if the stored time is null in the registry file then send all completed process
       // instances.
       historicProcessInstanceList =
           instanceQuery.finished().orderByProcessInstanceStartTime().asc().list();
     }
   } else {
     Date timeInDateFormat = DateConverter.convertStringToDate(time);
     int listSize = instanceQuery.finished().startedAfter(timeInDateFormat).list().size();
     if (listSize != 0) {
       /*When using the startedAfter() method it returns the finished objects according to the time stored of
       last completed instance. But if the list length is one then it always return the same object in the
       list twice from the last updated time which stored in the carbon registry.
       (avoid to return same object repeatedly if the list has only one object)*/
       if (listSize == 1) {
         return null;
       }
       // send the process instances which were finished after the given date/time in registry
       historicProcessInstanceList =
           instanceQuery
               .finished()
               .startedAfter(timeInDateFormat)
               .orderByProcessInstanceStartTime()
               .asc()
               .listPage(1, listSize);
     }
   }
   if (historicProcessInstanceList != null) {
     if (log.isDebugEnabled()) {
       log.debug(
           "Write the published time of the last BPMN process instance to the carbon registry..."
               + historicProcessInstanceList.toString());
     }
     /*write the last published time to the registry because lets say as an example when a new process is completed,
     then the attributes belong to that process instance should be published to the DAS and if we are not stored
     the last published time, then all the completed processes which were previously published are also re-published
     to the DAS.*/
     writePublishTimeToRegistry(historicProcessInstanceList);
     // return ProcessInstances set as BPMNProcessInstance array
     return getBPMNProcessInstances(historicProcessInstanceList);
   }
   return null;
 }
 /**
  * Get completed task instances which were finished after the given date and time
  *
  * @return BPMNTaskInstance array if the historic task instance list is not null
  */
 public BPMNTaskInstance[] getCompletedTaskInstances() {
   HistoryService historyService = BPMNServerHolder.getInstance().getEngine().getHistoryService();
   HistoricTaskInstanceQuery instanceQuery = historyService.createHistoricTaskInstanceQuery();
   List<HistoricTaskInstance> historicTaskInstanceList = null;
   String time =
       readPublishTimeFromRegistry(
           AnalyticsPublisherConstants.TASK_RESOURCE_PATH,
           AnalyticsPublisherConstants.LAST_TASK_INSTANCE_END_TIME);
   if (time == null) {
     if (instanceQuery.finished().list().size() != 0) {
       historicTaskInstanceList =
           instanceQuery.finished().orderByHistoricTaskInstanceEndTime().asc().list();
     }
   } else {
     Date dateFormat = DateConverter.convertStringToDate(time);
     int listSize = instanceQuery.finished().taskCompletedAfter(dateFormat).list().size();
     if (listSize != 0) {
       /*When using the startedAfter() method it returns the finished objects according to the time stored of
       last completed instance. But if the list length is one then it always return the same object in the
       list twice from the last updated time which stored in the carbon registry.
       (avoid to return same object repeatedly if the list has only one object)*/
       if (listSize == 1) {
         return null;
       }
       historicTaskInstanceList =
           instanceQuery
               .finished()
               .taskCompletedAfter(dateFormat)
               .orderByHistoricTaskInstanceEndTime()
               .asc()
               .listPage(1, listSize);
     }
   }
   if (historicTaskInstanceList != null) {
     if (log.isDebugEnabled()) {
       log.debug(
           "Write BPMN task instance to the carbon registry..."
               + historicTaskInstanceList.toString());
     }
     writeTaskEndTimeToRegistry(historicTaskInstanceList);
     return getBPMNTaskInstances(historicTaskInstanceList);
   }
   return null;
 }