content: /*
   *  Copyright (C) 2010-2012 Stichting Akvo (Akvo Foundation)
   *
   *  This file is part of Akvo FLOW.
   *
   *  Akvo FLOW is free software: you can redistribute it and modify it under the terms of
   *  the GNU Affero General Public License (AGPL) as published by the Free Software Foundation,
   *  either version 3 of the License or any later version.
   *
   *  Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
   *  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
   *  See the GNU Affero General Public License included below for more details.
   *
   *  The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.
   */
  
  package com.gallatinsystems.device;
  
  import java.util.ArrayList;
  import java.util.List;
  import java.util.logging.Logger;
  
  import com.gallatinsystems.device.domain.DeviceSurveyJobQueue;
  import com.gallatinsystems.framework.analytics.summarization.DataSummarizer;
  import com.gallatinsystems.framework.domain.DataChangeRecord;
  import com.gallatinsystems.survey.dao.DeviceSurveyJobQueueDAO;
  
  /**
   * deletes unneeded DeviceSurveyJobQueue records based on an update to SurveyAssignment
   * 
   * @author Christopher Fagiani
   */
  public class DeviceSurveyJobQueueUpdater implements DataSummarizer {
  
      private DeviceSurveyJobQueueDAO deviceSurveyJobQueueDao;
      @SuppressWarnings("unused")
      private static Logger logger = Logger
              .getLogger(DeviceSurveyJobQueueUpdater.class.getName());
  
      public DeviceSurveyJobQueueUpdater() {
          deviceSurveyJobQueueDao = new DeviceSurveyJobQueueDAO();
      }
  
      @Override
      public String getCursor() {
          // no-op
          return null;
      }
  
      @Override
      public boolean performSummarization(String key, String type, String value,
              Integer offset, String cursor) {
          DataChangeRecord change = new DataChangeRecord(value);
          deleteRecords(change.getOldVal(), change.getId());
          return true;
      }
  
      /**
       * unpacks the packed string an deletes the necessary records from the DeviceSurveyJobQueue
       * table
       * 
       * @param packedString
       * @param assignmentId
       */
      private void deleteRecords(String packedString, String assignmentId) {
          if (packedString != null) {
              List<DeviceSurveyJobQueue> queueItems = deviceSurveyJobQueueDao
                      .listJobByAssignment(new Long(assignmentId));
              List<DeviceSurveyJobQueue> itemsToDelete = new ArrayList<DeviceSurveyJobQueue>();
              if (packedString.contains("d")) {
                  String deviceIds = packedString.substring(packedString
                          .indexOf("d") + 1, packedString.indexOf("s"));
                  String[] nums = {
                      deviceIds
                  };
                  if (deviceIds.contains("xx")) {
                      nums = deviceIds.split("xx");
                  }
                  for (int i = 0; i < nums.length; i++) {
                      if (nums[i].trim().length() > 0) {
                          for (DeviceSurveyJobQueue job : queueItems) {
                              if (job.getDevicePhoneNumber().equals(nums[i])) {
                                  itemsToDelete.add(job);
                              }
                          }
                      }
                  }
              }
              if (packedString.contains("s")) {
                  String surveyIds = packedString.substring(packedString
                          .indexOf("s") + 1);
                  String[] ids = {
                      surveyIds
                  };
                  if (surveyIds.contains("xx")) {
                      ids = surveyIds.split("xx");
                  }
                  for (int i = 0; i < ids.length; i++) {
                      if (ids[i].trim().length() > 0) {
                          for (DeviceSurveyJobQueue job : queueItems) {
                              if (job.getSurveyID().toString().equals(ids[i])) {
                                  itemsToDelete.add(job);
                              }
                          }
                      }
                  }
              }
              if (itemsToDelete != null && itemsToDelete.size() > 0) {
                  deviceSurveyJobQueueDao.delete(itemsToDelete);
              }
          }
      }
  }
  