/*
* Copyright (C) 2014-2016 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 org.waterforpeople.mapping.app.web;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.json.JSONArray;
import org.json.JSONObject;
import org.waterforpeople.mapping.app.web.dto.DeviceNotificationRequest;
import org.waterforpeople.mapping.app.web.dto.DeviceNotificationResponse;
import com.gallatinsystems.device.dao.DeviceDAO;
import com.gallatinsystems.device.dao.DeviceFileJobQueueDAO;
import com.gallatinsystems.device.domain.Device;
import com.gallatinsystems.device.domain.DeviceFileJobQueue;
import com.gallatinsystems.framework.rest.AbstractRestApiServlet;
import com.gallatinsystems.framework.rest.RestRequest;
import com.gallatinsystems.framework.rest.RestResponse;
import com.gallatinsystems.survey.dao.SurveyDAO;
import com.gallatinsystems.survey.domain.Survey;
public class DeviceNotificationRestServlet extends AbstractRestApiServlet {
private static final long serialVersionUID = -2243167279214074216L;
public DeviceNotificationRestServlet() {
super();
setMode(JSON_MODE);
}
@Override
protected RestRequest convertRequest() throws Exception {
HttpServletRequest req = getRequest();
RestRequest restRequest = new DeviceNotificationRequest();
restRequest.populateFromHttpRequest(req);
return restRequest;
}
@Override
protected RestResponse handleRequest(RestRequest req) throws Exception {
DeviceNotificationRequest dnReq = (DeviceNotificationRequest) req;
DeviceNotificationResponse resp = new DeviceNotificationResponse();
Device d = getDevice(dnReq);
if (d != null) {
DeviceFileJobQueueDAO jobDao = new DeviceFileJobQueueDAO();
List<DeviceFileJobQueue> missingByDevice = jobDao.listByDeviceId(d.getKey().getId());
List<DeviceFileJobQueue> missingUnknown = jobDao.listByUnknownDevice();
resp.setMissingFiles(missingByDevice);
resp.setMissingUnknown(missingUnknown);
new DeviceDAO().updateDevice(dnReq.getPhoneNumber(), dnReq.getLat(), dnReq.getLon(),
dnReq.getAccuracy(), dnReq.getAppVersion(), dnReq.getDeviceIdentifier(),
dnReq.getImei(), dnReq.getOsVersion(), dnReq.getAndroidId());
}
resp.setDeletedSurvey(getDeletedSurveys(dnReq));
return resp;
}
@Override
protected void writeOkResponse(RestResponse resp) throws Exception {
getResponse().setStatus(200);
DeviceNotificationResponse r = (DeviceNotificationResponse) resp;
// manually building the JSON response as the current version of the
// JSON library can't handle the resp object
JSONObject json = new JSONObject();
JSONArray missingFiles = new JSONArray();
JSONArray missingUnknown = new JSONArray();
JSONArray deletedSurveys = new JSONArray();
for (String mf : r.getMissingFiles()) {
missingFiles.put(mf);
}
for (String mu : r.getMissingUnknown()) {
missingUnknown.put(mu);
}
for (Long id : r.getDeletedSurveys()) {
deletedSurveys.put(String.valueOf(id));
}
json.put("missingFiles", missingFiles);
json.put("missingUnknown", missingUnknown);
json.put("deletedForms", deletedSurveys);
getResponse().getWriter().println(json.toString());
}
private Set<Long> getDeletedSurveys(DeviceNotificationRequest req) {
Set<Long> surveyIds = req.getSurveyIds();
if (surveyIds.isEmpty()) {
return surveyIds;
}
Set<Long> foundIds = new HashSet<Long>();
Long[] surveyIdsArray = surveyIds.toArray(new Long[surveyIds.size()]);
for (Survey s : new SurveyDAO().listByKeys(surveyIdsArray)) {
foundIds.add(s.getKey().getId());
}
surveyIds.removeAll(foundIds);
return surveyIds;
}
private Device getDevice(DeviceNotificationRequest req) {
DeviceDAO deviceDao = new DeviceDAO();
return deviceDao.getDevice(req.getAndroidId(), req.getImei(), req.getPhoneNumber());
}
}