package org.emdev.common.backup;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.emdev.utils.CompareUtils;
import org.emdev.utils.LengthUtils;
import org.emdev.utils.enums.EnumUtils;
import org.json.JSONException;
import org.json.JSONObject;
public class BackupInfo implements Comparable<BackupInfo> {
private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyyMMdd.HHmmss");
public final Type type;
public final String name;
Date timestamp;
File file;
BackupInfo() {
this.type = Type.AUTO;
this.timestamp = null;
this.name = null;
}
public BackupInfo(final String name) {
this.type = Type.USER;
this.name = name;
this.timestamp = null;
}
public BackupInfo(final File f) throws JSONException, ParseException {
final JSONObject obj = fromJSON(f);
if (obj == null) {
throw new JSONException("Backup file cannot be loadedd");
}
this.type = EnumUtils.getByName(Type.class, obj.getString("type"), Type.USER);
this.name = obj.getString("name");
this.timestamp = SDF.parse(obj.getString("timestamp"));
}
public Date getTimestamp() {
return timestamp;
}
public String getFileName() {
return getFileName(type, timestamp);
}
public JSONObject toJSON() throws JSONException {
final JSONObject root = new JSONObject();
root.put("type", type.name());
root.put("name", LengthUtils.safeString(name, "auto"));
root.put("timestamp", SDF.format(timestamp));
return root;
}
@Override
public String toString() {
final StringBuilder buf = new StringBuilder(this.getClass().getSimpleName());
buf.append("[");
buf.append("timestamp").append("=").append(timestamp != null ? SDF.format(timestamp) : null);
buf.append(", ");
buf.append("name").append("=").append(name);
buf.append("]");
return buf.toString();
}
@Override
public int compareTo(final BackupInfo that) {
if (that == null) {
return 1;
}
int res = CompareUtils.compare(this.type, that.type);
if (res == 0) {
res = - CompareUtils.compare(this.timestamp, that.timestamp);
}
if (res == 0) {
res = CompareUtils.compare(this.name, that.name);
}
return res;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof BackupInfo) {
return 0 == compareTo((BackupInfo) obj);
}
return false;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((timestamp == null) ? 0 : timestamp.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
public static String getFileName(final Type type, final Date timestamp) {
return type.name() + "." + SDF.format(timestamp) + ".jso";
}
public static JSONObject fromJSON(final File file) {
final StringBuilder buf = new StringBuilder();
try {
final BufferedReader in = new BufferedReader(new FileReader(file));
try {
for (String s = in.readLine(); s != null; s = in.readLine()) {
buf.append(s).append("\n");
}
return new JSONObject(buf.toString());
} catch (final Exception ex) {
BackupManager.LCTX.e("Reading backup file failed: " + ex.getMessage());
} finally {
try {
in.close();
} catch (final IOException ex) {
}
}
} catch (final FileNotFoundException ex) {
BackupManager.LCTX.e("Reading backup file failed: " + ex.getMessage());
}
return null;
}
public static enum Type {
AUTO, USER;
}
}