/* * 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.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 privacyLevel = "PUBLIC"; String defaultLanguageCode = "en"; for (Entity survey : surveys) { if ("Household".equals(survey.getProperty("pointType"))) { privacyLevel = "PRIVATE"; } survey.setProperty("path", surveyGroupPath + "/" + survey.getProperty("name")); } if (surveys.size() >= 1) { defaultLanguageCode = (String) surveys.get(0).getProperty( "defaultLanguageCode"); } surveyGroup.setProperty("parentId", null); surveyGroup.setProperty("privacyLevel", privacyLevel); 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); newSurveyGroup .setProperty( "privacyLevel", "Household".equals(survey .getProperty("pointType")) ? "PRIVATE" : "PUBLIC"); long newSurveyGroupId = ds.put(newSurveyGroup).getId(); survey.setProperty("surveyGroupId", newSurveyGroupId); survey.setProperty("path", newSurveyGroupPath + "/" + surveyName); } ds.put(surveys); } } } }