/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.helps.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.helps.*;
import gplx.xowa.specials.*; import gplx.core.net.*; import gplx.core.net.qargs.*; import gplx.xowa.wikis.pages.*;
import gplx.core.net.emails.*;
public class Xolog_special implements Xow_special_page {
public void Special__gen(Xow_wiki wiki, Xoa_page page, Xoa_url url, Xoa_ttl ttl) {
// init
Gfo_qarg_mgr url_args = new Gfo_qarg_mgr().Init(url.Qargs_ary());
Xoa_app app = wiki.App();
Gfo_log_.Instance.Flush(); // flush log to write all memory itms to disk
// get file
String file = url_args.Read_str_or_null("file");
Io_url log_dir = app.Fsys_mgr().Root_dir().GenSubDir_nest("user", "anonymous", "app", "tmp", "xolog");
Xolog_doc log_doc = Xolog_doc_.New(log_dir, file);
if (log_doc.Log_file() == null) return; // occurs when all logs are deleted
// get cmd
int cmd_tid = url_args.Read_enm_as_int_or(Enm_cmd.Itm, Enm_cmd.Tid__view);
boolean redirect = true, redirect_to_same_file = false;;
switch (cmd_tid) {
case Enm_cmd.Tid__view: redirect = false; break;
case Enm_cmd.Tid__email: redirect_to_same_file = true; Gfo_email_mgr_.Instance.Send("gnosygnu+xowa_xologs@gmail.com", "XOWA Log", String_.new_u8(log_doc.Log_data())); break;
case Enm_cmd.Tid__delete_one: Io_mgr.Instance.DeleteFil(Xolog_file_utl.To_url_by_file(log_dir, log_doc.Log_file())); break;
case Enm_cmd.Tid__delete_all: Io_mgr.Instance.DeleteDirDeep(log_dir); break;
}
if (redirect) {
Xoa_url_args_bldr args_bldr = new Xoa_url_args_bldr();
args_bldr.Add("cmd", "view");
if (redirect_to_same_file && file != null)
args_bldr.Add("file", file);
page.Redirect_trail().Itms__add__special(wiki, Prototype.Special__meta(), args_bldr.To_ary());
return;
}
else
new Xolog_html(log_doc).Bld_page_by_mustache(app, page, this);
}
static class Enm_cmd {//#*nested
public static final int Tid__view = 0, Tid__email = 1, Tid__delete_one = 2, Tid__delete_all = 3;
public static final Gfo_qarg_enum_itm Itm = new Gfo_qarg_enum_itm("cmd")
.Add("view" , Tid__view)
.Add("email" , Tid__email)
.Add("delete_one" , Tid__delete_one)
.Add("delete_all" , Tid__delete_all)
;
}
Xolog_special(Xow_special_meta special__meta) {this.special__meta = special__meta;}
public Xow_special_meta Special__meta() {return special__meta;} private final Xow_special_meta special__meta;
public Xow_special_page Special__clone() {return this;}
public static final Xow_special_page Prototype = new Xolog_special(Xow_special_meta.New_xo("XowaLog", "Logs"));
}
class Xoa_url_args_bldr {
private final List_adp list = List_adp_.New();
public Xoa_url_args_bldr Add(String key, Object val) {
list.Add(Keyval_.new_(key, val));
return this;
}
public Keyval[] To_ary() {return (Keyval[])list.To_ary_and_clear(Keyval.class);}
}
class Xolog_file_utl {// yyyyMMdd_HHmmss.log
private static final String Gui__date_fmt = "yyyy-MM-dd HH:mm:ss";
public static String To_name(Io_url url) {return To_name(url.NameOnly());}
public static String To_name(String file) {
DateAdp date = DateAdp_.parse_fmt(file, Gfo_log_.File__fmt);
return date.XtoStr_fmt(Gui__date_fmt);
}
public static Io_url To_url_by_file(Io_url dir, String file) {
return dir.GenSubFil(file + Gfo_log_.File__ext);
}
}