content: /*
   *  Copyright (C) 2015, 2020 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.gae.remoteapi;
  
  import java.util.List;
  
  import com.google.appengine.api.datastore.DatastoreService;
  import com.google.appengine.api.datastore.Entity;
  import com.google.appengine.api.datastore.FetchOptions;
  import com.google.appengine.api.datastore.Query;
  import com.google.appengine.api.datastore.Query.Filter;
  
  public class ProjectMigration implements Process {
  
      @Override
      public void execute(DatastoreService ds, String[] args) throws Exception {
  
          for (Entity surveyGroup : ds.prepare(new Query("SurveyGroup")).asIterable()) {
  
              // If the surveyGroup already has projectType set, don't touch it.
              if (surveyGroup.getProperty("projectType") != null) {
                  continue;
              }
  
              long surveyGroupId = surveyGroup.getKey().getId();
              String surveyGroupPath = "/" + surveyGroup.getProperty("name");
  
              Filter surveyGroupFilter = new Query.FilterPredicate(
                      "surveyGroupId", Query.FilterOperator.EQUAL, surveyGroupId);
              Query surveyQuery = new Query("Survey")
                      .setFilter(surveyGroupFilter);
              List<Entity> surveys = ds.prepare(surveyQuery).asList(
                      FetchOptions.Builder.withDefaults());
  
              boolean isMonitoring = Boolean.TRUE.equals(surveyGroup
                      .getProperty("monitoringGroup"));
  
              if (isMonitoring || surveys.size() <= 1) {
                  surveyGroup.setProperty("projectType", "PROJECT");
                  String defaultLanguageCode = "en";
                  for (Entity survey : surveys) {
                      survey.setProperty("path",
                              surveyGroupPath + "/" + survey.getProperty("name"));
                  }
  
                  if (surveys.size() >= 1) {
                      defaultLanguageCode = (String) surveys.get(0).getProperty(
                              "defaultLanguageCode");
                  }
  
                  surveyGroup.setProperty("parentId", null);
                  surveyGroup.setProperty("defaultLanguageCode", defaultLanguageCode);
                  surveyGroup.setProperty("path", surveyGroupPath);
  
                  ds.put(surveys);
                  ds.put(surveyGroup);
  
              } else {
                  surveyGroup.setProperty("projectType", "PROJECT_FOLDER");
                  for (Entity survey : surveys) {
                      Entity newSurveyGroup = new Entity("SurveyGroup");
                      Object surveyName = survey.getProperty("name");
                      String newSurveyGroupPath = surveyGroupPath + "/" + surveyName;
  
                      newSurveyGroup.setProperty("name", surveyName);
                      newSurveyGroup.setProperty("code", surveyName);
                      newSurveyGroup.setProperty("parentId", surveyGroupId);
                      newSurveyGroup.setProperty("monitoringGroup", false);
                      newSurveyGroup.setProperty("projectType", "PROJECT");
                      newSurveyGroup.setProperty("defaultLanguageCode",
                              survey.getProperty("defaultLanguageCode"));
                      newSurveyGroup.setProperty("path", newSurveyGroupPath);
  
                      long newSurveyGroupId = ds.put(newSurveyGroup).getId();
  
                      survey.setProperty("surveyGroupId", newSurveyGroupId);
                      survey.setProperty("path", newSurveyGroupPath + "/" + surveyName);
                  }
                  ds.put(surveys);
              }
          }
      }
  }