/**
*
*/
package webctdbexport.tools;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Iterator;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import webctdbexport.test.TestRepository;
import webctdbexport.utils.DbUtils;
import webctdbexport.utils.MoodleRepository;
/**
* @author cmg
*
*/
public class DumpUtils {
public static final String DONE = "done";
static Logger logger = Logger.getLogger(DumpUtils.class.getName());
/** write a get_listing-type response to dist, also HTML version
* @param writePermissions */
public static void writeResponse(JSONObject listing, File dir, boolean writePermissions) throws JSONException, IOException {
File file = new File(dir, "get_listing.json");
Writer fw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
listing.write(fw);
fw.close();
logger.log(Level.FINE, "Wrote "+file);
file = new File(dir, "index.html");
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")));
pw.println("<html><head>");
pw.println("<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
String name = "undefined";
String relativePath = ".";
JSONArray path = listing.getJSONArray(MoodleRepository.PATH);
if (path.length()>0) {
StringBuffer namebuf = new StringBuffer();
for (int pi=0; pi<path.length(); pi++) {
JSONObject pathel = path.getJSONObject(pi);
name = pathel.getString(MoodleRepository.NAME);
if (namebuf.length()>0)
namebuf.append(" : ");
namebuf.append(name);
}
name = namebuf.toString();
// final path
JSONObject pathel = path.getJSONObject(path.length()-1);
String filepath = pathel.getString(MoodleRepository.PATH);
StringBuffer rpbuf = new StringBuffer();
for (int ci=0; ci<filepath.length()-1; ci++) {
if (filepath.charAt(ci)=='/') {
if (rpbuf.length()>0)
rpbuf.append("/");
rpbuf.append("..");
}
}
if (rpbuf.length()==0)
rpbuf.append(".");
relativePath = rpbuf.toString();
}
pw.println("<title>"+name+"</title>");
pw.println("</head><body>");
pw.println("<h1>"+name+"</h1>");
if (listing.has(MoodleRepository.WEBCT_TYPE))
pw.println("<p>("+listing.getString(MoodleRepository.WEBCT_TYPE)+")</p>");
if (writePermissions)
pw.println("<p><a href=\"permissions.html\">permissions</a></p>");
pw.println("<ul>");
JSONArray list = listing.getJSONArray(MoodleRepository.LIST);
for (int li=0; li<list.length(); li++) {
JSONObject item = list.getJSONObject(li);
String title = item.getString(MoodleRepository.TITLE);
String description = null;
if (item.has(MoodleRepository.DESCRIPTION))
description = item.getString(MoodleRepository.DESCRIPTION);
String webcttype = null;
if (item.has(MoodleRepository.WEBCT_TYPE))
webcttype = item.getString(MoodleRepository.WEBCT_TYPE);
if (item.has(MoodleRepository.PATH)) {
pw.println("<li><a href=\""+relativePath+item.getString(MoodleRepository.PATH)+"index.html\">"+title+"</a> (folder, "+webcttype+")"+(description!=null ? "<br>"+description : "")+"</li>");
}
else if (item.has(MoodleRepository.SOURCE)) {
long size = -1;
if (item.has(MoodleRepository.SIZE)) {
size = item.getLong(MoodleRepository.SIZE);
}
String url = item.getString(MoodleRepository.SOURCE);
if ((webcttype!=null && DbUtils.URL_TYPE.equals(webcttype)) || url.startsWith("http"))
// link
pw.println("<li><a href=\""+url+"\">"+title+"</a> (link, "+webcttype+")"+(description!=null ? "<br>"+description : "")+"</li>");
else
pw.println("<li><a href=\""+relativePath+url+"/file.html\">"+title+"</a> (file"+(size>=0 ? ", "+size+" bytes" : "")+", "+webcttype+")"+(description!=null ? "<br>"+description : "")+"</li>");
}
// else if (item.has(MoodleRepository.URL)) {
// String url = item.getString(MoodleRepository.URL);
// // link
// pw.println("<li><a href=\""+url+"\">"+title+"</a> (link, "+webcttype+")"+(description!=null ? "<br>"+description : "")+"</li>");
// }
else {
pw.println("<li>"+title+" ("+webcttype+")"+(description!=null ? "<br>"+description : "")+"</li>");
}
}
pw.println("</ul>");
pw.println("</body></html>");
pw.close();
}
public static void addItems(List<JSONObject> items, JSONObject listing, String path2) throws JSONException {
JSONArray list = listing.getJSONArray(MoodleRepository.LIST);
if (list!=null) {
for (int li=0; li<list.length(); li++)
items.add(li, list.getJSONObject(li));
}
// "done" marker
if (path2!=null) {
JSONObject done = new JSONObject();
done.put(DONE, path2);
items.add(items.size(), done);
}
}
public static void addPersonItems(List<JSONObject> items, JSONObject listing, String path2) throws JSONException {
JSONArray list = listing.getJSONArray(MoodleRepository.LIST);
String personPath = null;
if (list!=null) {
for (int li=0; li<list.length(); li++) {
JSONObject item = list.getJSONObject(li);
if (item.has(MoodleRepository.PATH) && item.getString(MoodleRepository.PATH).startsWith("/user")) {
items.add(li, item);
personPath = item.getString(MoodleRepository.PATH);
}
}
}
// no! "done" marker for person
}
public static String getDone(JSONObject object) throws JSONException {
if (object.has(DONE))
return object.getString(DONE);
return null;
}
/** write a get_permissions-type response to dist, also HTML version */
public static void writePermissions(JSONObject permissions, File dir) throws JSONException, IOException {
File file = new File(dir, "permissions.json");
Writer fw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
permissions.write(fw);
fw.close();
logger.log(Level.FINE, "Wrote "+file);
file = new File(dir, "permissions.html");
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")));
pw.println("<html><head>");
pw.println("<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
String name = "Permissions";
pw.println("<title>"+name+"</title>");
pw.println("</head><body>");
pw.println("<h1>"+name+"</h1>");
pw.println("<ul>");
Iterator keys = permissions.sortedKeys();
while(keys.hasNext()) {
String key = (String)keys.next();
JSONArray roles = permissions.getJSONArray(key);
pw.print("<li>"+key+": ");
for (int i=0; i<roles.length(); i++) {
if (i>0)
pw.print(", ");
pw.print(roles.getString(i));
}
pw.println("</li>");
}
pw.println("</ul>");
pw.println("</body></html>");
pw.close();
}
public static void writeFileInfo(JSONObject fileInfo, File itemdir,
File filedir) throws JSONException, IOException {
File file = new File(itemdir, "file.json");
Writer fw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
fileInfo.write(fw);
fw.close();
logger.log(Level.FINE, "Wrote "+file);
file = new File(itemdir, "file.html");
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")));
pw.println("<html><head>");
pw.println("<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
String name = fileInfo.getString("filename");
pw.println("<title>"+name+"</title>");
pw.println("</head><body>");
pw.println("<h1>"+name+"</h1>");
pw.println("<p>Filename: "+fileInfo.getString("filename")+"</p>");
if (fileInfo.has("length"))
pw.println("<p>Length: "+fileInfo.getLong("length")+" bytes</p>");
if (fileInfo.has("mimetype"))
pw.println("<p>Mimetype: "+fileInfo.getString("mimetype")+"</p>");
if (fileInfo.has("sha1hash"))
pw.println("<p>sha1hash: "+fileInfo.getString("sha1hash")+"</p>");
if (fileInfo.has("path")) {
File p = new File(filedir, fileInfo.getString("path"));
pw.println("<p>path: <a href=\""+p.getCanonicalPath()+"\">"+fileInfo.getString("path")+"</a></p>");
}
if (fileInfo.has("encoding"))
pw.println("<p>Encoding: "+fileInfo.getString("encoding")+"</p>");
if (fileInfo.has("webcttype"))
pw.println("<p>webcttype: "+fileInfo.getString("webcttype")+"</p>");
if (fileInfo.has("hasrelativerefs"))
pw.println("<p>hasrelativerefs: "+fileInfo.getBoolean("hasrelativerefs")+"</p>");
if (fileInfo.has("hasnocontent"))
pw.println("<p>hasnocontent: "+fileInfo.getBoolean("hasnocontent")+"</p>");
if (fileInfo.has("hrefs"))
pw.println("<p>hrefs: "+fileInfo.getJSONArray("hrefs")+"</p>");
if (fileInfo.has("linkto"))
pw.println("<p>Link to: "+fileInfo.getString("linkto")+"</p>");
if (fileInfo.has("lastmodifiedts"))
pw.println("<p>Last modified timestamp: "+fileInfo.getLong("lastmodifiedts")+"</p>");
if (fileInfo.has("cachets"))
pw.println("<p>Cache timestamp: "+fileInfo.getLong("cachets")+"</p>");
if (fileInfo.has("filecontentid"))
pw.println("<p>CmsFileContent ID: "+fileInfo.getLong("filecontentid")+"</p>");
pw.close();
}
}