package com.door43.translationstudio.core;
import com.door43.tools.reporting.Logger;
import com.door43.util.StringUtilities;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Handles the importing of tstudio archives.
* The importing is placed here to keep the Translator clean and organized.
*/
public class ArchiveImporter {
private ArchiveImporter() {
}
/**
* Prepares an archive for import with backwards compatible support.
* @param expandedArchiveDir
* @return an array of target translation directories that are ready and valid for import
* @throws Exception
*/
public static File[] importArchive(File expandedArchiveDir) throws Exception {
// retrieve target translations from archive
File manifestFile = new File(expandedArchiveDir, "manifest.json");
File[] targetTranslationDirs;
if(manifestFile.exists()) {
JSONObject manifestJson = new JSONObject(FileUtils.readFileToString(manifestFile));
if(manifestJson.has("package_version")) {
int packageVersion = manifestJson.getInt("package_version");
switch (packageVersion) {
case 1:
targetTranslationDirs = v1(manifestJson, expandedArchiveDir); // just to keep the switch pretty
break;
case 2:
targetTranslationDirs = v2(manifestJson, expandedArchiveDir);
break;
default:
targetTranslationDirs = new File[0];
}
} else {
targetTranslationDirs = v1(manifestJson, expandedArchiveDir);
}
} else {
targetTranslationDirs = legacy(expandedArchiveDir);
}
// migrate target translations
List<File> validTargetTranslations = new ArrayList<>();
for(File dir:targetTranslationDirs) {
File migratedDir = TargetTranslationMigrator.migrate(dir);
if(migratedDir != null) {
validTargetTranslations.add(migratedDir);
}
}
return validTargetTranslations.toArray(new File[validTargetTranslations.size()]);
}
/**
* translation dirs in the archive are named after their id
* so we only need to return the path.
* @param packageManifest
* @param dir
* @return
* @throws JSONException
*/
private static File[] v2(JSONObject packageManifest, File dir) throws JSONException {
List<File> files = new ArrayList<>();
JSONArray translationsJson = packageManifest.getJSONArray("target_translations");
for(int i = 0; i < translationsJson.length(); i ++) {
JSONObject translation = translationsJson.getJSONObject(i);
files.add(new File(dir, translation.getString("path")));
}
return files.toArray(new File[files.size()]);
}
/**
* targetTranslations are in directories labled by id
* @param manifest
* @param dir
* @return
* @throws JSONException
*/
private static File[] v1(JSONObject manifest, File dir) throws JSONException {
List<File> files = new ArrayList<>();
JSONArray translationsJson = manifest.getJSONArray("projects");
for(int i = 0; i < translationsJson.length(); i ++) {
JSONObject translation = translationsJson.getJSONObject(i);
files.add(new File(dir, translation.getString("path")));
}
return files.toArray(new File[files.size()]);
}
/**
* todo: provide support for legacy archives.. if needed
* @return
*/
private static File[] legacy(File dir) {
// String[] translationDirs = dir.list();
// for(String targetTranslationId:translationDirs) {
// targetTranslationId = StringUtilities.ltrim(targetTranslationId, '\\');
// try {
// String projectSlug = TargetTranslation.getProjectSlugFromId(targetTranslationId);
// String targetLanguageSlug = TargetTranslation.getTargetLanguageSlugFromId(targetTranslationId);
// } catch (Exception e) {
// e.printStackTrace();
// continue;
// }
// }
return new File[0];
}
}