package floobits.common;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import floobits.utilities.Flog;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import java.io.File;
import java.lang.reflect.Type;
import java.net.URI;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
public class PersistentJson {
public HashMap<String, Map<String, Workspace>> workspaces = new HashMap<String, Map<String,Workspace>>();
public Boolean auto_generated_account = false;
public Boolean disable_account_creation = false;
public LinkedList<Workspace> recent_workspaces = new LinkedList<Workspace>();
public static void removeWorkspace(FlooUrl flooUrl) {
PersistentJson persistentJson = getInstance();
Map<String, Workspace> workspaces = persistentJson.workspaces.get(flooUrl.owner);
if (workspaces != null) {
workspaces.remove(flooUrl.workspace);
}
URI uri = URI.create(flooUrl.toString());
LinkedList<Workspace> recent_workspaces = persistentJson.recent_workspaces;
for (int i= recent_workspaces.size()-1; i >=0; i--) {
Workspace workspace = recent_workspaces.get(i);
URI normalizedURL = URI.create(workspace.url);
if (uri.getPath().equals(normalizedURL.getPath()) && uri.getHost().equals(normalizedURL.getHost())) {
recent_workspaces.remove(i);
}
}
persistentJson.save();
}
public void addWorkspace(FlooUrl flooUrl, String path) {
Map<String, Workspace> workspaces = this.workspaces.get(flooUrl.owner);
if (workspaces == null) {
workspaces = new HashMap<String, Workspace>();
this.workspaces.put(flooUrl.owner, workspaces);
}
Workspace workspace = workspaces.get(flooUrl.workspace);
if (workspace == null) {
workspace = new Workspace(flooUrl.toString(), path);
workspaces.put(flooUrl.workspace, workspace);
} else {
workspace.path = path;
workspace.url = flooUrl.toString();
}
this.recent_workspaces.add(0, workspace);
HashSet<String> seen = new HashSet<String>();
LinkedList<Workspace> unique = new LinkedList<Workspace>();
for (Workspace w : this.recent_workspaces) {
w.clean();
if (seen.contains(w.url)) {
continue;
}
seen.add(w.url);
unique.add(w);
}
this.recent_workspaces = unique;
}
public void save () {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
try {
FileUtils.write(getFile(), gson.toJson(this), "UTF-8");
} catch (Throwable e) {
Flog.error(e);
}
}
public static File getFile() {
return new File(FilenameUtils.concat(Constants.baseDir, "persistent.json"));
}
public static PersistentJson getInstance() {
String s;
String defaultJSON = "{}";
try {
s = FileUtils.readFileToString(getFile(), "UTF-8");
} catch (Throwable e) {
Flog.info("Couldn't find persistent.json");
s = defaultJSON;
}
PersistentJson pj;
try {
pj = new Gson().fromJson(s, (Type) PersistentJson.class);
} catch (com.google.gson.JsonSyntaxException e) {
Flog.warn("Bad JSON in persistent json");
pj = new Gson().fromJson(defaultJSON, (Type) PersistentJson.class);
}
return pj;
}
}