/*
* ******************************************************************************
* * Copyright 2015 See AUTHORS file.
* *
* * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* * You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
* *****************************************************************************
*/
package com.uwsoft.editor.data.migrations.migrators;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonReader;
import com.badlogic.gdx.utils.JsonValue;
import com.badlogic.gdx.utils.JsonWriter;
import com.uwsoft.editor.Overlap2DFacade;
import com.uwsoft.editor.data.migrations.IVersionMigrator;
import com.uwsoft.editor.proxy.ProjectManager;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
/**
* Created by azakhary on 6/29/2015.
*/
public class VersionMigTo009 implements IVersionMigrator {
private String projectPath;
private Json json = new Json();
private JsonReader jsonReader = new JsonReader();
private Overlap2DFacade facade;
private ProjectManager projectManager;
@Override
public void setProject(String path) {
facade = Overlap2DFacade.getInstance();
projectManager = facade.retrieveProxy(ProjectManager.NAME);
projectPath = path;
json.setOutputType(JsonWriter.OutputType.json);
}
@Override
public boolean doMigration() {
// run through scene files and modify their content to new one
// this is list of libraryItems for later
HashMap<String, JsonValue> libraryItems = new HashMap<>();
// fixing animations format (frameRange) and moving library items
File scenesDir = new File(projectPath + File.separator + "scenes");
for (File entry : scenesDir.listFiles()) {
if (!entry.isDirectory()) {
try {
String content = FileUtils.readFileToString(new FileHandle(entry).file());
JsonValue value = jsonReader.parse(content);
fixAnimations(value.get("composite"));
if(value.get("libraryItems") != null) {
JsonValue.JsonIterator libraryArr = value.get("libraryItems").iterator();
while (libraryArr.hasNext()) {
JsonValue libItem = libraryArr.next();
fixAnimations(libItem.get("composite"));
libraryItems.put(libItem.name, libItem);
}
value.remove("libraryItems");
}
content = value.prettyPrint(JsonWriter.OutputType.json, 1);
FileUtils.writeStringToFile(new File(entry.getAbsolutePath()), content, "utf-8");
} catch (IOException e) {
e.printStackTrace();
}
}
}
fixLibraryItemsLocation(libraryItems);
return true;
}
private void fixLibraryItemsLocation(HashMap<String, JsonValue> libraryItems) {
if(libraryItems.size() == 0) return;
//creating libraryArrayJsonString
String libraryArrayJsonString = "{";
for (JsonValue entry : libraryItems.values()) {
libraryArrayJsonString += "\""+entry.name+"\": " + entry.prettyPrint(JsonWriter.OutputType.json, 1) + ", ";
}
libraryArrayJsonString = libraryArrayJsonString.substring(0,libraryArrayJsonString.length()-2) + "}";
//ProjectInfo data
String prjInfoFilePath = projectPath + "/project.dt";
FileHandle projectInfoFile = Gdx.files.internal(prjInfoFilePath);
try {
String projectInfoContents = FileUtils.readFileToString(projectInfoFile.file());
JsonValue value = jsonReader.parse(projectInfoContents);
JsonValue newVal = jsonReader.parse(libraryArrayJsonString);
newVal.name = "libraryItems";
newVal.prev = value.get("scenes");
newVal.next = newVal.prev.next;
newVal.prev.next = newVal;
String content = value.prettyPrint(JsonWriter.OutputType.json, 1);
FileUtils.writeStringToFile(new File(prjInfoFilePath), content, "utf-8");
} catch (IOException e) {
e.printStackTrace();
}
}
private void fixAnimations(JsonValue value) {
if(value.get("sComposites") == null) return;
if(value.get("sComposites") != null) {
JsonValue.JsonIterator compositeArray = value.get("sComposites").iterator();
while (compositeArray.hasNext()) {
JsonValue composite = compositeArray.next();
if (composite != null) {
fixAnimations(composite.get("composite"));
}
}
}
if(value.get("sSpriteAnimations") != null) {
JsonValue.JsonIterator spriteArray = value.get("sSpriteAnimations").iterator();
while (spriteArray.hasNext()) {
JsonValue valAnim = spriteArray.next();
if (valAnim.get("animations") != null) {
String val = valAnim.get("animations").asString();
JsonValue animationsInnerJson = jsonReader.parse(val);
JsonValue.JsonIterator innerArray = animationsInnerJson.iterator();
String cnt = "[";
while (innerArray.hasNext()) {
JsonValue innerVal = innerArray.next();
int startFrame = innerVal.get("startFrame").asInt();
int endFrame = innerVal.get("endFrame").asInt();
String currName = innerVal.get("name").asString();
cnt += "{\"name\":\""+currName+"\", \"startFrame\":"+startFrame+", \"endFrame\":"+endFrame+"}, ";
}
if(cnt.length() == 1) {
cnt = "[]";
} else {
cnt = cnt.substring(0, cnt.length() - 2) + "]";
}
JsonValue newVal = jsonReader.parse(cnt);
setNewKeyToJson(valAnim, "frameRangeMap", "animations", newVal);
}
}
}
}
private void setNewKeyToJson(JsonValue container, String newKey, String oldKey, JsonValue newVal) {
JsonValue oldVal = container.get(oldKey);
if(oldVal.prev != null) oldVal.prev.setNext(newVal);
if(oldVal.next != null) oldVal.next.setPrev(newVal);
newVal.setPrev(oldVal.prev);
newVal.setNext(oldVal.next);
newVal.name = newKey;
}
}