/* * Copyright (C) 2015 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.akvo.flow.domain; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; /** * Utilities class for performing transformations on survey data, i.e. response values */ public class DataUtils { private static final Logger log = Logger.getLogger(DataUtils.class); public static final ObjectMapper JSON_OBJECT_MAPPER = new ObjectMapper(); public static String[] optionResponsesTextArray(String optionResponse) { String[] responseArray = null; if (optionResponse == null || optionResponse.trim().equals("")) { return new String[0]; } List<Map<String, String>> optionNodes = jsonStringToList(optionResponse); if (optionNodes != null) { responseArray = new String[optionNodes.size()]; for (int i = 0; i < responseArray.length; i++) { String text = optionNodes.get(i).get("text"); if (text != null && text.trim() != "") { responseArray[i] = text.trim(); } } } else { responseArray = optionResponse.split("\\|"); } return responseArray; } public static String[] cascadeResponseValues(String data) { String[] values = null; if (data == null || data.trim().equals("")) { return new String[0]; } List<Map<String, String>> nodes = jsonStringToList(data); if (nodes != null) { values = new String[nodes.size()]; for (int i = 0; i < values.length; i++) { String text = nodes.get(i).get("name"); if (text != null && text.trim() != "") { values[i] = text.trim(); } } } else { values = data.split("\\|", -1); } return values; } /** * Convert a JSON string response for OPTION type questions to the legacy pipe separated format * * @param jsonResponse * @return */ public static String jsonResponsesToPipeSeparated(String optionResponses) { StringBuilder pipeSeparated = new StringBuilder(); List<Map<String, String>> options = jsonStringToList(optionResponses); if (options != null) { for (Map<String, String> option : options) { if (option.get("text") != null) { pipeSeparated.append("|").append(option.get("text")); } } } if (pipeSeparated.length() > 0) { pipeSeparated.deleteCharAt(0); } return pipeSeparated.toString(); } /** * Convert a JSON string response to a list containing corresponding maps * * @param data String containing the JSON-formatted response * @return List of maps with response properties */ public static List<Map<String, String>> jsonStringToList(String data) { try { return JSON_OBJECT_MAPPER.readValue(data, new TypeReference<List<Map<String, String>>>() {}); } catch (IOException e) { // Data is not JSON-formatted } return null; } /** * Process the JSON formatted string value of a signature question and return the string * representing the signatory. A blank string is returned * * @param value * @return */ public static String parseSignatory(String value) { String signatory = null; Map<String, String> signatureResponse = null; try { signatureResponse = JSON_OBJECT_MAPPER.readValue(value, new TypeReference<Map<String, String>>() { }); signatory = signatureResponse.get("name"); } catch (IOException e) { // ignore } return signatory; } /** * Parse a caddisfly response string and return a corresponding map * * @param caddisflyValue * @return */ @SuppressWarnings("unchecked") public static Map<String, Object> parseCaddisflyResponseValue(String caddisflyValue) { Map<String, Object> caddisflyResponseMap = new HashMap<>(); try { caddisflyResponseMap = JSON_OBJECT_MAPPER.readValue(caddisflyValue, Map.class); } catch (IOException e) { log.error("Failed to parse the caddisfly response"); } if (caddisflyResponseMap != null) { return caddisflyResponseMap; } else { return Collections.emptyMap(); } } }