/* * 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); } }