import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.List;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
/*
* Data Storage Specification (stored as ID.json)
* FileName: "filename" []
* Original input URL: "origin" [String]
* Resolved URL after all redirects: "url" [String]
* Destination folder: "folder" [String]
* Total Size (in bytes): "size" [Integer]
* Number of segments: "segments" [Integer]
* Resumable: "resume" [Yes/No]
* Queue entry time: "start" [Timestamp]
* Time elapsed from first downloaded byte: "elapsed" [Timestamp]
* Finished Time: "finish" [Timestamp]
* Scheduled Time: "scheduled" [Timestamp]
* Status: "status" ["resumable", "non-resumable", "complete", "failed", "waiting"]
* Completed Chunks: "chunks" [Range String List: "start-end"]
*/
public class JSON {
public static String dumpPath = System.getProperty("user.home")+File.separator+".downloadPlusPlus"+File.separator+"data";
static{
File dump = new File(dumpPath);
if(!dump.isDirectory())
dump.mkdirs();
}
@SuppressWarnings("unchecked")
public static void dumpDownload(DownloadUnit dUnit){
JSONObject jsonData = new JSONObject();
/* populate static (one-time set) download related info */
jsonData.put("uid", dUnit.getUID());
jsonData.put("size", dUnit.sizeLong);
jsonData.put("resume", dUnit.resumable);
jsonData.put("filename", dUnit.getProperty(DownloadUnit.TableField.FILENAME));
jsonData.put("origin", dUnit.getProperty(DownloadUnit.TableField.ORIGIN));
jsonData.put("url", dUnit.getProperty(DownloadUnit.TableField.URL));
jsonData.put("folder", dUnit.getProperty(DownloadUnit.TableField.FOLDER));
jsonData.put("type", dUnit.getProperty(DownloadUnit.TableField.TYPE));
jsonData.put("segments", dUnit.getProperty(DownloadUnit.TableField.SEGMENTS));
/* poulate dynamic download properties */
jsonData.put("status", dUnit.getProperty(DownloadUnit.TableField.STATUS));
jsonData.put("statusEnum", dUnit.statusEnum.toString());
jsonData.put("chunks", dUnit.chunks);
try{
File dataDump = new File(dumpPath+File.separator+dUnit.getUID()+".data");
if(!dataDump.exists()){
dataDump.createNewFile();
}
FileWriter fw = new FileWriter(dataDump.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
/* convert data into JSON string */
bw.write(jsonData.toJSONString());
bw.close();
fw.close();
Logger.debug("Dumped into "+dataDump.getAbsolutePath());
}catch(Exception e){
Logger.log(Logger.Status.ERR_DUMP, e.getMessage());
}
}
@SuppressWarnings("unchecked")
public static DownloadUnit loadDumpDownload(String path){
JSONParser parser = new JSONParser();
try{
JSONObject jsonData = (JSONObject)parser.parse(new FileReader(path));
DownloadUnit dUnit= new DownloadUnit(null);
/* static download properties */
dUnit.setUID((long)jsonData.get("uid"));
dUnit.sizeLong = (long)jsonData.get("size");
dUnit.resumable = (boolean)jsonData.get("resume");
dUnit.setProperty(DownloadUnit.TableField.FILENAME, jsonData.get("filename"));
dUnit.setProperty(DownloadUnit.TableField.ORIGIN, jsonData.get("origin"));
dUnit.setProperty(DownloadUnit.TableField.URL, jsonData.get("url"));
dUnit.setProperty(DownloadUnit.TableField.FOLDER, jsonData.get("folder"));
dUnit.setProperty(DownloadUnit.TableField.SIZE, polishSize(dUnit.sizeLong));
dUnit.setProperty(DownloadUnit.TableField.TYPE, jsonData.get("type"));
dUnit.setProperty(DownloadUnit.TableField.SEGMENTS, jsonData.get("segments"));
String resumeCap = "No";
if(dUnit.resumable)
resumeCap = "Yes";
dUnit.setProperty(DownloadUnit.TableField.RESUME, resumeCap);
/* set dynamic properties */
dUnit.setProperty(DownloadUnit.TableField.STATUS, jsonData.get("status"));
dUnit.statusEnum = DownloadUnit.Status.valueOf((String)jsonData.get("statusEnum"));
dUnit.chunks = (List<Long>) jsonData.get("chunks");
long downloaded = 0;
for(int i=0; i<dUnit.chunks.size(); ++i)
downloaded += dUnit.chunks.get(i);
dUnit.setProperty(DownloadUnit.TableField.DOWNLOADED, polishSize(downloaded));
double percent = (double)downloaded/dUnit.sizeLong;
dUnit.setProperty(DownloadUnit.TableField.PROGRESS, percent);
dUnit.setProperty(DownloadUnit.TableField.PERCENTAGE, (Math.round(percent*10000)/100.0d)+" %");
/*
dUnit.setProperty(DownloadUnit.TableField.START, jsonData.get("start"));
dUnit.setProperty(DownloadUnit.TableField.SCHEDULED, jsonData.get("scheduled"));
dUnit.setProperty(DownloadUnit.TableField.FINISH, jsonData.get("finish"));
*/
return dUnit;
}catch(Exception e){
e.printStackTrace();
Logger.log(Logger.Status.ERR_READ, e.getMessage());
return null;
}
}
/* returns a string with suitable units, precision = 2 */
private static String polishSize(long sizeBytes){
double polishedSize = sizeBytes;
String unit = "B";
if(polishedSize>1024){
polishedSize /= 1024;
unit = "KB";
}
if(polishedSize>1024){
polishedSize /= 1024;
unit = "MB";
}
if(polishedSize>1024){
polishedSize /= 1024;
unit = "GB";
}
if(polishedSize>1024){
polishedSize /= 1024;
unit = "TB";
}
polishedSize = Math.round(polishedSize*100)/100.0d;
return polishedSize+" "+unit;
}
}