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.survey.dao;
  
  import java.util.ArrayList;
  import java.util.Date;
  import java.util.HashSet;
  import java.util.List;
  import java.util.Set;
  
  import javax.jdo.PersistenceManager;
  
  import com.gallatinsystems.device.domain.Device;
  import com.gallatinsystems.device.domain.DeviceSurveyJobQueue;
  import com.gallatinsystems.framework.servlet.PersistenceFilter;
  
  /**
   * dao for saving deviceSurveyJobQueue objects.
   */
  public class DeviceSurveyJobQueueDAO {
  
      /**
       * lists all objects for a given device
       */
      @SuppressWarnings("unchecked")
      public List<DeviceSurveyJobQueue> get(String devicePhoneNumber, String imei, String androidId) {
          PersistenceManager pm = PersistenceFilter.getManager();
  
          Set<DeviceSurveyJobQueue> set = new HashSet<>();
          javax.jdo.Query query;
  
          // Query entities based on Android ID. This is the most reliable ID
          // and should be used whenever possible
          if (androidId != null) {
              query = pm.newQuery(DeviceSurveyJobQueue.class);
              query.setFilter("androidId == androidIdParam");
              query.declareParameters("String androidIdParam");
              set.addAll((List<DeviceSurveyJobQueue>) query.execute(androidId));
          }
  
          // For legacy reasons, some assignments may only be identified by
          // IMEI or phone number
          List<DeviceSurveyJobQueue> legacy = null;
          if (imei != null && !Device.NO_IMEI.equals(imei)) {
              query = pm.newQuery(DeviceSurveyJobQueue.class);
              query.setFilter("imei == imeiParam");
              query.declareParameters("String imeiParam");
              legacy = (List<DeviceSurveyJobQueue>) query.execute(imei);
          }
          if ((legacy == null || legacy.isEmpty())
                  && devicePhoneNumber != null && !devicePhoneNumber.isEmpty()) {
              // Fall back to phone number
              query = pm.newQuery(DeviceSurveyJobQueue.class);
              query.setFilter("devicePhoneNumber == devicePhoneNumberParam");
              query.declareParameters("String devicePhoneNumberParam");
              legacy = (List<DeviceSurveyJobQueue>) query.execute(devicePhoneNumber);
          }
          if (legacy != null) {
              set.addAll(legacy);
          }
  
          return new ArrayList<>(set);
      }
  
      /**
       * saves or updates and instance
       *
       * @param deviceSurveyJobQueue
       * @return
       */
      public Long save(DeviceSurveyJobQueue deviceSurveyJobQueue) {
          PersistenceManager pm = PersistenceFilter.getManager();
          pm.makePersistent(deviceSurveyJobQueue);
          return deviceSurveyJobQueue.getId();
      }
  
      /**
       * saves or updates a collection of instances
       *
       * @param itemList
       */
      public void save(List<DeviceSurveyJobQueue> itemList) {
          PersistenceManager pm = PersistenceFilter.getManager();
          pm.makePersistentAll(itemList);
      }
  
      /**
       * lists all instances
       *
       * @return
       */
      @SuppressWarnings("unchecked")
      public List<DeviceSurveyJobQueue> listAllJobsInQueue() {
          PersistenceManager pm = PersistenceFilter.getManager();
          javax.jdo.Query query = pm.newQuery(DeviceSurveyJobQueue.class);
          List<DeviceSurveyJobQueue> results = (List<DeviceSurveyJobQueue>) query
                  .execute();
          return results;
      }
  
      /**
       * deletes all jobs for a given assignment
       *
       * @param assignmentId
       */
      public void deleteJob(Long assignmentId) {
          if (assignmentId != null) {
              List<DeviceSurveyJobQueue> results = listJobByAssignment(assignmentId);
              if (results != null) {
                  delete(results);
              }
          }
      }
  
      /**
       * deletes all items in the list
       *
       * @param items
       */
      public void delete(List<DeviceSurveyJobQueue> items) {
          PersistenceManager pm = PersistenceFilter.getManager();
          pm.deletePersistentAll(items);
      }
  
      /**
       * lists all device job queue objects by assignment id
       *
       * @param assignmentId
       * @return
       */
      @SuppressWarnings("unchecked")
      public List<DeviceSurveyJobQueue> listJobByAssignment(Long assignmentId) {
          PersistenceManager pm = PersistenceFilter.getManager();
          javax.jdo.Query query = pm.newQuery(DeviceSurveyJobQueue.class);
          String filterString = "assignmentId == assignmentIdParam";
          String paramString = "Long assignmentIdParam";
  
          query.setFilter(filterString);
          query.declareParameters(paramString);
          return (List<DeviceSurveyJobQueue>) query.execute(assignmentId);
      }
  
      /**
       * populates the assignment id for all items with the survey id specified THIS SHOULD NOT BE
       * USED IN NORMAL OPERATION
       *
       * @param surveyId
       * @param assignmentId
       */
      @SuppressWarnings("unchecked")
      public void updateAssignmentIdForSurvey(Long surveyId, Long assignmentId) {
          PersistenceManager pm = PersistenceFilter.getManager();
  
          javax.jdo.Query query = pm.newQuery(DeviceSurveyJobQueue.class);
          String filterString = "surveyID == surveyIdParam";
          String paramString = "Long surveyIdParam";
  
          query.setFilter(filterString);
          query.declareParameters(paramString);
          List<DeviceSurveyJobQueue> results = (List<DeviceSurveyJobQueue>) query
                  .execute(surveyId);
          if (results != null) {
              for (DeviceSurveyJobQueue job : results) {
                  job.setAssignmentId(assignmentId);
              }
              pm.makePersistentAll(results);
          }
      }
  
      /**
       * lists all instances that have expired prior to the time passed in
       *
       * @param expirationDate
       * @return
       */
      @SuppressWarnings("unchecked")
      public List<DeviceSurveyJobQueue> listAssignmentsWithEarlierExpirationDate(
              Date expirationDate) {
          PersistenceManager pm = PersistenceFilter.getManager();
  
          javax.jdo.Query query = pm.newQuery(DeviceSurveyJobQueue.class);
          String filterString = "effectiveEndDate < expirationDateParam";
          String paramString = "java.util.Date expirationDateParam";
          query.declareImports("import java.util.Date");
          query.setFilter(filterString);
          query.declareParameters(paramString);
          return (List<DeviceSurveyJobQueue>) query.execute(expirationDate);
      }
  }
  