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 org.waterforpeople.mapping.analytics;
  
  import java.util.List;
  
  import org.waterforpeople.mapping.dao.SurveyInstanceDAO;
  import org.waterforpeople.mapping.domain.QuestionAnswerStore;
  
  import com.gallatinsystems.common.util.StringUtil;
  import com.gallatinsystems.framework.analytics.summarization.DataSummarizationRequest;
  import com.gallatinsystems.framework.analytics.summarization.DataSummarizer;
  import com.gallatinsystems.framework.domain.DataChangeRecord;
  import com.google.appengine.api.taskqueue.Queue;
  import com.google.appengine.api.taskqueue.QueueFactory;
  import com.google.appengine.api.taskqueue.TaskOptions;
  
  /**
   * cleans data by fixing capitalization of Name field values. Though not really a summarization, it
   * is declared to implement DataSummarizer to piggyback on the summarization task infrastructure.
   * 
   * @author Christopher Fagiani
   */
  public class NameQuestionDataCleanser implements DataSummarizer {
  
      private String currentCursor;
      private SurveyInstanceDAO dao;
  
      public NameQuestionDataCleanser() {
          dao = new SurveyInstanceDAO();
      }
  
      /**
       * rather than summarizing, this will iterate over all "Name" questions and clean the data by
       * changing the case of the response to have capital letters for the initial character in each
       * word. If the value changed, it will fire a LCR message to the change listener queue.
       */
      @Override
      public boolean performSummarization(String key, String type, String value,
              Integer offset, String cursor) {
          List<QuestionAnswerStore> answers = dao
                  .listQuestionAnswerStoreForQuestion(key, cursor);
          if (answers != null && answers.size() > 0) {
              currentCursor = SurveyInstanceDAO.getCursor(answers);
          } else {
              currentCursor = null;
          }
          if (answers != null && answers.size() > 0) {
              for (QuestionAnswerStore answer : answers) {
                  if (answer.getValue() != null) {
                      String newValue = StringUtil.capitalizeString(answer
                              .getValue());
                      if (!answer.getValue().equals(newValue)) {
                          sendChangeMessage(new DataChangeRecord(
                                  QuestionAnswerStore.class.getName(), key,
                                  answer.getValue(), newValue));
                          answer.setValue(newValue);
                      }
                  }
              }
              // now persist the changes
              dao.save(answers);
          }
          if (currentCursor != null) {
              return false;
          } else {
              return true;
          }
      }
  
      @Override
      public String getCursor() {
          return currentCursor;
      }
  
      /**
       * sends a logical change record over the change task queue for the question given
       * 
       * @param value
       */
      private void sendChangeMessage(DataChangeRecord value) {
          Queue queue = QueueFactory.getQueue("dataUpdate");
          queue.add(TaskOptions.Builder.withUrl("/app_worker/dataupdate")
                  .param(DataSummarizationRequest.OBJECT_KEY, value.getId())
                  .param(DataSummarizationRequest.OBJECT_TYPE,
                          "QuestionDataChange")
                  .param(DataSummarizationRequest.VALUE_KEY, value.packString()));
      }
  
  }
  