/*
* 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.ArrayList;
import java.util.LinkedList;
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;
public class CorrectFolderSurveyPath implements Process {
private static final String SURVEY_GROUP = "SurveyGroup";
private static final String SURVEY = "Survey";
private List<Entity> updatedEntities = new ArrayList<Entity>();
@Override
public void execute(DatastoreService ds, String[] args) throws Exception {
System.out.println("Fetching survey groups and surveys.");
final List<Entity> surveyGroups = ds.prepare(new Query(SURVEY_GROUP)).asList(
FetchOptions.Builder.withDefaults());
final List<Entity> surveys = ds.prepare(new Query(SURVEY)).asList(
FetchOptions.Builder.withDefaults());
// combine entities to one list
LinkedList<Entity> completeList = new LinkedList<Entity>();
completeList.addAll(surveyGroups);
completeList.addAll(surveys);
for (Entity rootLevelEntity : completeList) {
if (rootLevelEntity.getKind().equals(SURVEY_GROUP)
&& rootLevelEntity.getProperty("parentId") == null) {
updateFolderSurveyPaths(rootLevelEntity, "", completeList);
}
}
if (args.length == 1 && args[0].equals("--dry-run")) {
System.out.println("This was a dry run. No changes saved to datastore");
} else {
ds.put(updatedEntities);
}
}
private void updateFolderSurveyPaths(Entity entity, String pathPrefix, List<Entity> entities) {
// set folder/survey path
String currentPath = (String) entity.getProperty("path");
String newEntityPath = String.format("%s/%s", pathPrefix, entity.getProperty("name"));
if (!newEntityPath.equals(currentPath)) {
entity.setProperty("path", newEntityPath);
updatedEntities.add(entity);
System.out.println("Setting path for: " + entity.getKey() + "; " + currentPath + " => "
+ newEntityPath);
}
// set all child folders/surveys paths
for (Entity childEntity : entities) {
Long parentId = getParentId(childEntity);
if (parentId != null && parentId.equals(entity.getKey().getId())) {
updateFolderSurveyPaths(childEntity, newEntityPath, entities);
}
}
}
private Long getParentId(Entity childEntity) {
if (childEntity.getKind().equals(SURVEY_GROUP)) {
return (Long) childEntity.getProperty("parentId");
} else {
return (Long) childEntity.getProperty("surveyGroupId");
}
}
}