/*
* 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 org.waterforpeople.mapping.dataexport;
import java.io.File;
import java.io.FileOutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.swing.JFileChooser;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.waterforpeople.mapping.app.gwt.client.survey.QuestionDto;
import org.waterforpeople.mapping.app.gwt.client.survey.QuestionGroupDto;
import org.waterforpeople.mapping.app.web.dto.SurveyRestRequest;
/**
* This utility will produce a RawDateReport using data contained a set of data.txt files from the
* phone. The input is a directory housing 1 or more zip files obtained from the FieldSurvey
* application. This utility will merge the data file from all of the zips into a single file and
* will then iterate over the merged text, writing the responses to an excel raw data report. This
* utility needs connectivity to the server to run ONLY to get the list of questions and their IDs.
* The data will NOT be loaded into the server. This utility will only work with data files
* generated via version 1.7 or later of the FieldSurvey application
*
* @author Christopher Fagiani
*/
public class OfflineExport extends GraphicalSurveySummaryExporter {
private static final ThreadLocal<DateFormat> DF = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("MM-dd-yyyy HH:mm:ss z");
};
};
@SuppressWarnings("unchecked")
public void export(Map<String, String> criteria, File outputFile,
String serverBase, Map<String, String> options) {
try {
boolean useQuestionId = "true".equals(criteria.get("useQuestionId"));
SurveyBulkUploader up = new SurveyBulkUploader();
criteria.put(SurveyBulkUploader.MODE_KEY,
SurveyBulkUploader.MERGE_ONLY_MODE);
up.executeImport(getSelectedInputDir(), "", criteria);
List<File> inputFiles = up.getFilesToUpload();
if (inputFiles != null && inputFiles.size() > 0) {
Map<QuestionGroupDto, List<QuestionDto>> questionMap = loadAllQuestions(
criteria.get(SurveyRestRequest.SURVEY_ID_PARAM), false,
serverBase, criteria.get("apiKey"));
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet();
processOptions(options);
List<String> questionIds = (List<String>) createRawDataHeader(
wb, sheet, questionMap, useQuestionId)[0];
// now read in the files
for (File f : inputFiles) {
if (f.getName().toLowerCase().endsWith(".zip")) {
String content = SurveyBulkUploader
.getContentFromZip(f);
int row = 1;
String line = null;
String lastUUID = "";
Row r = null;
StringTokenizer strTok = new StringTokenizer(content,
"\n");
while (strTok.hasMoreTokens()) {
line = strTok.nextToken();
String[] parts = line.split("\t");
boolean isForThisSurvey = (parts.length > 2 && questionIds
.contains(parts[2]));
if (isForThisSurvey) {
if (!lastUUID.equals(parts[parts.length - 1])) {
// this is the first row of new instance so
// write the response row
r = sheet.createRow(row++);
lastUUID = parts[parts.length - 1];
createCell(r, 0, lastUUID, null);
createCell(
r,
1,
DF.get()
.format(new Date(
Long.parseLong(parts[7]))),
null);
createCell(r, 2, parts[5], null);
}
int idx = questionIds.indexOf(parts[2]) + 3;
if (idx >= 3) {
String val = parts[4];
if (val != null) {
if ("IMAGE".equals(parts[3])) {
val = val.replace("/mnt/sdcard",
getImagePrefix());
}
createCell(r, idx, val, null);
}
}
}
}
}
}
FileOutputStream fileOut = new FileOutputStream(outputFile);
wb.write(fileOut);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private File getSelectedInputDir() {
try {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.showOpenDialog(null);
if (chooser.getSelectedFile() != null) {
return chooser.getSelectedFile();
} else {
return getSelectedInputDir();
}
} catch (Exception e) {
e.printStackTrace();
return getSelectedInputDir();
}
}
}