|
@@ -54,6 +54,24 @@ import id.co.hanoman.shared.Util;
|
|
|
* @author Hanoman Interaktif<BR>
|
|
* @author Hanoman Interaktif<BR>
|
|
|
* (C) <a href="http://www.hanoman.co.id">Hanoman Interaktif.</a>
|
|
* (C) <a href="http://www.hanoman.co.id">Hanoman Interaktif.</a>
|
|
|
* @version 1.0
|
|
* @version 1.0
|
|
|
|
|
+ *
|
|
|
|
|
+ * CR MWUI (terbaru):
|
|
|
|
|
+ * 1. Filter source/code/custom field (v_XX) tidak lagi selalu "like" - sekarang mendukung
|
|
|
|
|
+ * equal / not_equal / like / not_like, default "equal".
|
|
|
|
|
+ * 2. Initial load (belum ada aksi search/page/order/reset dari user) tidak query ke tabel DLOG,
|
|
|
|
|
+ * hanya menampilkan form filter. Ditandai lewat parameter hidden "doSearch".
|
|
|
|
|
+ * 3. Paging tidak lagi menghitung total record (getTotal()/COUNT). Diganti dengan strategi
|
|
|
|
|
+ * "ambil count+1 baris" untuk mendeteksi apakah ada halaman berikutnya, sehingga paging
|
|
|
|
|
+ * hanya menampilkan tombol Next (dan Prev/First). Karena ini tidak lagi memakai
|
|
|
|
|
+ * Pager.generatePagingNew()/generatePagingItemNew() (yang berbasis total record), HTML
|
|
|
|
|
+ * paging dibangun langsung di sini.
|
|
|
|
|
+ * 4. Filter waktu dibatasi maksimal 1 hari: user hanya memilih 1 tanggal (end date server-side
|
|
|
|
|
+ * selalu dipaksa = start date), tapi start time & end time (jam:menit) dalam tanggal itu
|
|
|
|
|
+ * tetap bisa diatur user.
|
|
|
|
|
+ * 5. Response header LOG MESSAGE - LIST diset no-cache/no-store supaya browser tidak
|
|
|
|
|
+ * menampilkan ulang hasil search lama dari cache saat halaman dibuka lagi.
|
|
|
|
|
+ * 6. Attribute request "searched" ditambahkan supaya dlog_list.jsp bisa membedakan pesan
|
|
|
|
|
+ * "belum melakukan search" vs "sudah search tapi hasilnya memang kosong".
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
public class DlogAction extends Action {
|
|
public class DlogAction extends Action {
|
|
@@ -61,6 +79,12 @@ public class DlogAction extends Action {
|
|
|
protected Log log = LogFactory.getLog(this.getClass());
|
|
protected Log log = LogFactory.getLog(this.getClass());
|
|
|
private SimpleDateFormat formatSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
|
private SimpleDateFormat formatSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
|
|
|
|
|
|
|
|
|
+ // nilai default operator filter (CR#1)
|
|
|
|
|
+ private static final String SMA_EQUAL = "equal";
|
|
|
|
|
+ private static final String SMA_NOT_EQUAL = "not_equal";
|
|
|
|
|
+ private static final String SMA_LIKE = "like";
|
|
|
|
|
+ private static final String SMA_NOT_LIKE = "not_like";
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Method execute mapping forward
|
|
* Method execute mapping forward
|
|
|
*<p>
|
|
*<p>
|
|
@@ -119,7 +143,9 @@ public class DlogAction extends Action {
|
|
|
public void clearSession(HttpServletRequest request) throws Exception {
|
|
public void clearSession(HttpServletRequest request) throws Exception {
|
|
|
request.getSession().removeAttribute("dlog_type_filter");
|
|
request.getSession().removeAttribute("dlog_type_filter");
|
|
|
request.getSession().removeAttribute("dlog_source_filter");
|
|
request.getSession().removeAttribute("dlog_source_filter");
|
|
|
|
|
+ request.getSession().removeAttribute("dlog_source_sma");
|
|
|
request.getSession().removeAttribute("dlog_code_filter");
|
|
request.getSession().removeAttribute("dlog_code_filter");
|
|
|
|
|
+ request.getSession().removeAttribute("dlog_code_sma");
|
|
|
// request.getSession().removeAttribute("dlog_timestamp_start_filter");
|
|
// request.getSession().removeAttribute("dlog_timestamp_start_filter");
|
|
|
// set default to Current Date
|
|
// set default to Current Date
|
|
|
request.getSession().setAttribute("dlog_timestamp_start_filter", Constant.SDFDS.format(new Date()));
|
|
request.getSession().setAttribute("dlog_timestamp_start_filter", Constant.SDFDS.format(new Date()));
|
|
@@ -130,6 +156,7 @@ public class DlogAction extends Action {
|
|
|
request.getSession().removeAttribute("dlog_timestamp_minute_end_filter");
|
|
request.getSession().removeAttribute("dlog_timestamp_minute_end_filter");
|
|
|
request.getSession().removeAttribute("dlogMd_sma");
|
|
request.getSession().removeAttribute("dlogMd_sma");
|
|
|
request.getSession().removeAttribute("dlog_value_filter");
|
|
request.getSession().removeAttribute("dlog_value_filter");
|
|
|
|
|
+ request.getSession().removeAttribute("dlogMd_label_filter");
|
|
|
request.getSession().removeAttribute("dlog_fieldOrder");
|
|
request.getSession().removeAttribute("dlog_fieldOrder");
|
|
|
request.getSession().removeAttribute("dlog_orderType");
|
|
request.getSession().removeAttribute("dlog_orderType");
|
|
|
request.getSession().removeAttribute("start");
|
|
request.getSession().removeAttribute("start");
|
|
@@ -153,12 +180,25 @@ public class DlogAction extends Action {
|
|
|
if (request.getParameter(Constant.CLEAR) != null && Constant.TRUE.equalsIgnoreCase(request.getParameter(Constant.CLEAR)))
|
|
if (request.getParameter(Constant.CLEAR) != null && Constant.TRUE.equalsIgnoreCase(request.getParameter(Constant.CLEAR)))
|
|
|
clearSession(request);
|
|
clearSession(request);
|
|
|
|
|
|
|
|
|
|
+ // ==== Cegah browser menampilkan ulang halaman hasil search lewat cache / back-forward
|
|
|
|
|
+ // cache (bfcache) saat user membuka lagi halaman LOG MESSAGE, supaya initial load
|
|
|
|
|
+ // selalu benar-benar hit server dan dievaluasi ulang lewat flag doSearch. ====
|
|
|
|
|
+ response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
|
|
|
|
+ response.setHeader("Expires", "0");
|
|
|
|
|
+
|
|
|
ServletContext ctx = getServlet().getServletContext();
|
|
ServletContext ctx = getServlet().getServletContext();
|
|
|
PersistanceServiceInterface psi = ServiceUtil.getDaoClient(ctx);
|
|
PersistanceServiceInterface psi = ServiceUtil.getDaoClient(ctx);
|
|
|
|
|
|
|
|
request.setAttribute("hourList", Constant.HOUR_LIST);
|
|
request.setAttribute("hourList", Constant.HOUR_LIST);
|
|
|
request.setAttribute("minuteList", Constant.MINUTE_LIST);
|
|
request.setAttribute("minuteList", Constant.MINUTE_LIST);
|
|
|
|
|
|
|
|
|
|
+ // CR#2: apakah request ini benar-benar aksi user (search/page/order/reset)
|
|
|
|
|
+ // atau cuma buka halaman pertama kali. Kalau bukan aksi user, jangan query ke DLOG.
|
|
|
|
|
+ String param_doSearch = request.getParameter("doSearch");
|
|
|
|
|
+ boolean isSearch = Constant.TRUE.equalsIgnoreCase(param_doSearch);
|
|
|
|
|
+ // dipakai di JSP untuk membedakan pesan "belum search" vs "sudah search tapi hasil kosong"
|
|
|
|
|
+ request.setAttribute("searched", isSearch ? "true" : "false");
|
|
|
|
|
+
|
|
|
// this for orderBy field ASC/DESC
|
|
// this for orderBy field ASC/DESC
|
|
|
String dlog_fieldOrder = request.getParameter("dlog_fieldOrder");
|
|
String dlog_fieldOrder = request.getParameter("dlog_fieldOrder");
|
|
|
String dlog_orderType = request.getParameter("dlog_orderType");
|
|
String dlog_orderType = request.getParameter("dlog_orderType");
|
|
@@ -166,7 +206,9 @@ public class DlogAction extends Action {
|
|
|
// this for filter
|
|
// this for filter
|
|
|
String param_dlog_type_filter = request.getParameter("dlog_type_filter");
|
|
String param_dlog_type_filter = request.getParameter("dlog_type_filter");
|
|
|
String param_dlog_source_filter = request.getParameter("dlog_source_filter");
|
|
String param_dlog_source_filter = request.getParameter("dlog_source_filter");
|
|
|
|
|
+ String param_dlog_source_sma = request.getParameter("dlog_source_sma");
|
|
|
String param_dlog_code_filter = request.getParameter("dlog_code_filter");
|
|
String param_dlog_code_filter = request.getParameter("dlog_code_filter");
|
|
|
|
|
+ String param_dlog_code_sma = request.getParameter("dlog_code_sma");
|
|
|
String param_dlogMd_label_filter = request.getParameter("dlogMd_label_filter");
|
|
String param_dlogMd_label_filter = request.getParameter("dlogMd_label_filter");
|
|
|
String param_dlog_value_filter = request.getParameter("dlog_value_filter");
|
|
String param_dlog_value_filter = request.getParameter("dlog_value_filter");
|
|
|
String param_dlog_timestamp_start_filter = request.getParameter("dlog_timestamp_start_filter");
|
|
String param_dlog_timestamp_start_filter = request.getParameter("dlog_timestamp_start_filter");
|
|
@@ -189,8 +231,16 @@ public class DlogAction extends Action {
|
|
|
param_dlog_type_filter = (String) request.getSession().getAttribute("dlog_type_filter");
|
|
param_dlog_type_filter = (String) request.getSession().getAttribute("dlog_type_filter");
|
|
|
if (param_dlog_source_filter == null)
|
|
if (param_dlog_source_filter == null)
|
|
|
param_dlog_source_filter = (String) request.getSession().getAttribute("dlog_source_filter");
|
|
param_dlog_source_filter = (String) request.getSession().getAttribute("dlog_source_filter");
|
|
|
|
|
+ if (param_dlog_source_sma == null)
|
|
|
|
|
+ param_dlog_source_sma = (String) request.getSession().getAttribute("dlog_source_sma");
|
|
|
|
|
+ if (Util.isNullOrEmpty(param_dlog_source_sma))
|
|
|
|
|
+ param_dlog_source_sma = SMA_EQUAL; // default CR#1
|
|
|
if (param_dlog_code_filter == null)
|
|
if (param_dlog_code_filter == null)
|
|
|
param_dlog_code_filter = (String) request.getSession().getAttribute("dlog_code_filter");
|
|
param_dlog_code_filter = (String) request.getSession().getAttribute("dlog_code_filter");
|
|
|
|
|
+ if (param_dlog_code_sma == null)
|
|
|
|
|
+ param_dlog_code_sma = (String) request.getSession().getAttribute("dlog_code_sma");
|
|
|
|
|
+ if (Util.isNullOrEmpty(param_dlog_code_sma))
|
|
|
|
|
+ param_dlog_code_sma = SMA_EQUAL; // default CR#1
|
|
|
if (param_dlogMd_label_filter == null)
|
|
if (param_dlogMd_label_filter == null)
|
|
|
param_dlogMd_label_filter = (String) request.getSession().getAttribute("dlogMd_label_filter");
|
|
param_dlogMd_label_filter = (String) request.getSession().getAttribute("dlogMd_label_filter");
|
|
|
if (param_dlog_value_filter == null)
|
|
if (param_dlog_value_filter == null)
|
|
@@ -220,6 +270,8 @@ public class DlogAction extends Action {
|
|
|
param_dlog_timestamp_minute_end_filter = (String) request.getSession().getAttribute("dlog_timestamp_minute_end_filter");
|
|
param_dlog_timestamp_minute_end_filter = (String) request.getSession().getAttribute("dlog_timestamp_minute_end_filter");
|
|
|
if (param_dlog_sma_filter == null)
|
|
if (param_dlog_sma_filter == null)
|
|
|
param_dlog_sma_filter = (String) request.getSession().getAttribute("dlogMd_sma");
|
|
param_dlog_sma_filter = (String) request.getSession().getAttribute("dlogMd_sma");
|
|
|
|
|
+ if (Util.isNullOrEmpty(param_dlog_sma_filter))
|
|
|
|
|
+ param_dlog_sma_filter = SMA_EQUAL; // default CR#1
|
|
|
|
|
|
|
|
// default untuk order by timestamp desc
|
|
// default untuk order by timestamp desc
|
|
|
if (Util.isNullOrEmpty(dlog_fieldOrder))
|
|
if (Util.isNullOrEmpty(dlog_fieldOrder))
|
|
@@ -247,93 +299,155 @@ public class DlogAction extends Action {
|
|
|
}
|
|
}
|
|
|
request.getSession().setAttribute("dlog_type_filter", param_dlog_type_filter);
|
|
request.getSession().setAttribute("dlog_type_filter", param_dlog_type_filter);
|
|
|
|
|
|
|
|
- // filter for timestamp
|
|
|
|
|
|
|
+ // ==== FILTER WAKTU: DIBATASI MAKSIMAL 1 HARI ====
|
|
|
|
|
+ // User hanya memilih SATU tanggal (dlog_timestamp_start_filter); end date selalu
|
|
|
|
|
+ // dipaksa sama dengan start date di server (parameter end date dari client diabaikan),
|
|
|
|
|
+ // jadi range tetap maksimal 1 hari walaupun ada yang mengoplos parameter lewat URL.
|
|
|
|
|
+ // Start time & end time (jam:menit) dalam tanggal itu tetap bisa diatur user.
|
|
|
|
|
+ if (Util.isNullOrEmpty(param_dlog_timestamp_hour_start_filter))
|
|
|
|
|
+ param_dlog_timestamp_hour_start_filter = "0";
|
|
|
|
|
+ if (Util.isNullOrEmpty(param_dlog_timestamp_minute_start_filter))
|
|
|
|
|
+ param_dlog_timestamp_minute_start_filter = "0";
|
|
|
|
|
+ if (Util.isNullOrEmpty(param_dlog_timestamp_hour_end_filter))
|
|
|
|
|
+ param_dlog_timestamp_hour_end_filter = "23";
|
|
|
|
|
+ if (Util.isNullOrEmpty(param_dlog_timestamp_minute_end_filter))
|
|
|
|
|
+ param_dlog_timestamp_minute_end_filter = "59";
|
|
|
|
|
+ // end date selalu ikut start date, apapun yang dikirim client
|
|
|
|
|
+ param_dlog_timestamp_end_filter = param_dlog_timestamp_start_filter;
|
|
|
|
|
+
|
|
|
Calendar param_dlog_timestamp_start_filter_cal = Calendar.getInstance();
|
|
Calendar param_dlog_timestamp_start_filter_cal = Calendar.getInstance();
|
|
|
|
|
+ Calendar param_dlog_timestamp_end_filter_cal = Calendar.getInstance();
|
|
|
if (!Util.isNullOrEmpty(param_dlog_timestamp_start_filter)) {
|
|
if (!Util.isNullOrEmpty(param_dlog_timestamp_start_filter)) {
|
|
|
- if (param_dlog_timestamp_start_filter.length() > 0 && !Util.isNullOrEmpty(param_dlog_timestamp_hour_start_filter) && !Util.isNullOrEmpty(param_dlog_timestamp_minute_start_filter)) {
|
|
|
|
|
- try {
|
|
|
|
|
- param_dlog_timestamp_start_filter_cal.setTime(new SimpleDateFormat(Constant.DATE_SHORT).parse(param_dlog_timestamp_start_filter));
|
|
|
|
|
- param_dlog_timestamp_start_filter_cal.set(Calendar.HOUR, Integer.parseInt(param_dlog_timestamp_hour_start_filter));
|
|
|
|
|
- param_dlog_timestamp_start_filter_cal.set(Calendar.MINUTE, Integer.parseInt(param_dlog_timestamp_minute_start_filter));
|
|
|
|
|
- // log.info("start getTime() :: "
|
|
|
|
|
- // +param_dlog_timestamp_start_filter_cal.getTime());
|
|
|
|
|
- filter = new NameValue();
|
|
|
|
|
- filter.setName("timestampStart");
|
|
|
|
|
- filter.setValue(param_dlog_timestamp_start_filter_cal.getTime());
|
|
|
|
|
- filterList.add(filter);
|
|
|
|
|
- dlog_filterSb.append(" AND dlog.reqtimestamp >= :timestampStart ");
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ param_dlog_timestamp_start_filter_cal.setTime(new SimpleDateFormat(Constant.DATE_SHORT).parse(param_dlog_timestamp_start_filter));
|
|
|
|
|
+ param_dlog_timestamp_start_filter_cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(param_dlog_timestamp_hour_start_filter));
|
|
|
|
|
+ param_dlog_timestamp_start_filter_cal.set(Calendar.MINUTE, Integer.parseInt(param_dlog_timestamp_minute_start_filter));
|
|
|
|
|
+ param_dlog_timestamp_start_filter_cal.set(Calendar.SECOND, 0);
|
|
|
|
|
+ param_dlog_timestamp_start_filter_cal.set(Calendar.MILLISECOND, 0);
|
|
|
|
|
+
|
|
|
|
|
+ // end pakai tanggal yang sama (bukan hasil parse ulang param_dlog_timestamp_end_filter,
|
|
|
|
|
+ // supaya walaupun ada yang usil kirim tanggal lain di parameter itu, tetap diabaikan)
|
|
|
|
|
+ param_dlog_timestamp_end_filter_cal.setTime(param_dlog_timestamp_start_filter_cal.getTime());
|
|
|
|
|
+ param_dlog_timestamp_end_filter_cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(param_dlog_timestamp_hour_end_filter));
|
|
|
|
|
+ param_dlog_timestamp_end_filter_cal.set(Calendar.MINUTE, Integer.parseInt(param_dlog_timestamp_minute_end_filter));
|
|
|
|
|
+ param_dlog_timestamp_end_filter_cal.set(Calendar.SECOND, 59);
|
|
|
|
|
+ param_dlog_timestamp_end_filter_cal.set(Calendar.MILLISECOND, 999);
|
|
|
|
|
+
|
|
|
|
|
+ // jaga-jaga kalau end time-of-day < start time-of-day (misal user pilih start 20:00, end 08:00) -> tukar
|
|
|
|
|
+ if (param_dlog_timestamp_end_filter_cal.before(param_dlog_timestamp_start_filter_cal)) {
|
|
|
|
|
+ Calendar tmp = (Calendar) param_dlog_timestamp_start_filter_cal.clone();
|
|
|
|
|
+ param_dlog_timestamp_start_filter_cal.set(Calendar.HOUR_OF_DAY, param_dlog_timestamp_end_filter_cal.get(Calendar.HOUR_OF_DAY));
|
|
|
|
|
+ param_dlog_timestamp_start_filter_cal.set(Calendar.MINUTE, param_dlog_timestamp_end_filter_cal.get(Calendar.MINUTE));
|
|
|
|
|
+ param_dlog_timestamp_start_filter_cal.set(Calendar.SECOND, 0);
|
|
|
|
|
+ param_dlog_timestamp_start_filter_cal.set(Calendar.MILLISECOND, 0);
|
|
|
|
|
+ param_dlog_timestamp_end_filter_cal.set(Calendar.HOUR_OF_DAY, tmp.get(Calendar.HOUR_OF_DAY));
|
|
|
|
|
+ param_dlog_timestamp_end_filter_cal.set(Calendar.MINUTE, tmp.get(Calendar.MINUTE));
|
|
|
|
|
+ param_dlog_timestamp_end_filter_cal.set(Calendar.SECOND, 59);
|
|
|
|
|
+ param_dlog_timestamp_end_filter_cal.set(Calendar.MILLISECOND, 999);
|
|
|
|
|
+ String tmpH = param_dlog_timestamp_hour_start_filter, tmpM = param_dlog_timestamp_minute_start_filter;
|
|
|
|
|
+ param_dlog_timestamp_hour_start_filter = param_dlog_timestamp_hour_end_filter;
|
|
|
|
|
+ param_dlog_timestamp_minute_start_filter = param_dlog_timestamp_minute_end_filter;
|
|
|
|
|
+ param_dlog_timestamp_hour_end_filter = tmpH;
|
|
|
|
|
+ param_dlog_timestamp_minute_end_filter = tmpM;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ filter = new NameValue();
|
|
|
|
|
+ filter.setName("timestampStart");
|
|
|
|
|
+ filter.setValue(param_dlog_timestamp_start_filter_cal.getTime());
|
|
|
|
|
+ filterList.add(filter);
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.reqtimestamp >= :timestampStart ");
|
|
|
|
|
+
|
|
|
|
|
+ filter = new NameValue();
|
|
|
|
|
+ filter.setName("timestampEnd");
|
|
|
|
|
+ filter.setValue(param_dlog_timestamp_end_filter_cal.getTime());
|
|
|
|
|
+ filterList.add(filter);
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.reqtimestamp <= :timestampEnd ");
|
|
|
|
|
+
|
|
|
|
|
+ log.info("FILTER TANGGAL (1 hari) :: " + formatSdf.format(param_dlog_timestamp_start_filter_cal.getTime()) + " s/d " + formatSdf.format(param_dlog_timestamp_end_filter_cal.getTime()));
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("Gagal parse tanggal/jam filter [" + param_dlog_timestamp_start_filter + " "
|
|
|
|
|
+ + param_dlog_timestamp_hour_start_filter + ":" + param_dlog_timestamp_minute_start_filter + " - "
|
|
|
|
|
+ + param_dlog_timestamp_hour_end_filter + ":" + param_dlog_timestamp_minute_end_filter + "]", e);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
request.getSession().setAttribute("dlog_timestamp_start_filter", param_dlog_timestamp_start_filter);
|
|
request.getSession().setAttribute("dlog_timestamp_start_filter", param_dlog_timestamp_start_filter);
|
|
|
request.getSession().setAttribute("dlog_timestamp_hour_start_filter", param_dlog_timestamp_hour_start_filter);
|
|
request.getSession().setAttribute("dlog_timestamp_hour_start_filter", param_dlog_timestamp_hour_start_filter);
|
|
|
request.getSession().setAttribute("dlog_timestamp_minute_start_filter", param_dlog_timestamp_minute_start_filter);
|
|
request.getSession().setAttribute("dlog_timestamp_minute_start_filter", param_dlog_timestamp_minute_start_filter);
|
|
|
-
|
|
|
|
|
- Calendar param_dlog_timestamp_end_filter_cal = Calendar.getInstance();
|
|
|
|
|
- if (!Util.isNullOrEmpty(param_dlog_timestamp_end_filter)) {
|
|
|
|
|
- if (param_dlog_timestamp_end_filter.length() > 0 && !Util.isNullOrEmpty(param_dlog_timestamp_hour_end_filter) && !Util.isNullOrEmpty(param_dlog_timestamp_minute_end_filter)) {
|
|
|
|
|
- try {
|
|
|
|
|
- param_dlog_timestamp_end_filter_cal.setTime(new SimpleDateFormat(Constant.DATE_SHORT).parse(param_dlog_timestamp_end_filter));
|
|
|
|
|
- param_dlog_timestamp_end_filter_cal.set(Calendar.HOUR, Integer.parseInt(param_dlog_timestamp_hour_end_filter));
|
|
|
|
|
- param_dlog_timestamp_end_filter_cal.set(Calendar.MINUTE, Integer.parseInt(param_dlog_timestamp_minute_end_filter));
|
|
|
|
|
- // log.info("end getTime() :: "
|
|
|
|
|
- // +param_dlog_timestamp_end_filter_cal.getTime());
|
|
|
|
|
- filter = new NameValue();
|
|
|
|
|
- filter.setName("timestampEnd");
|
|
|
|
|
- filter.setValue(param_dlog_timestamp_end_filter_cal.getTime());
|
|
|
|
|
- filterList.add(filter);
|
|
|
|
|
- dlog_filterSb.append(" AND dlog.reqtimestamp <= :timestampEnd ");
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
request.getSession().setAttribute("dlog_timestamp_end_filter", param_dlog_timestamp_end_filter);
|
|
request.getSession().setAttribute("dlog_timestamp_end_filter", param_dlog_timestamp_end_filter);
|
|
|
request.getSession().setAttribute("dlog_timestamp_hour_end_filter", param_dlog_timestamp_hour_end_filter);
|
|
request.getSession().setAttribute("dlog_timestamp_hour_end_filter", param_dlog_timestamp_hour_end_filter);
|
|
|
request.getSession().setAttribute("dlog_timestamp_minute_end_filter", param_dlog_timestamp_minute_end_filter);
|
|
request.getSession().setAttribute("dlog_timestamp_minute_end_filter", param_dlog_timestamp_minute_end_filter);
|
|
|
|
|
|
|
|
|
|
+ // ==== CR#1: SOURCE - equal / not_equal / like / not_like (default equal) ====
|
|
|
if (!Util.isNullOrEmpty(param_dlog_source_filter)) {
|
|
if (!Util.isNullOrEmpty(param_dlog_source_filter)) {
|
|
|
if (param_dlog_source_filter.length() > 0) {
|
|
if (param_dlog_source_filter.length() > 0) {
|
|
|
filter = new NameValue();
|
|
filter = new NameValue();
|
|
|
filter.setName("source");
|
|
filter.setName("source");
|
|
|
- filter.setValue("%" + param_dlog_source_filter.trim() + "%");
|
|
|
|
|
|
|
+ if (SMA_LIKE.equals(param_dlog_source_sma)) {
|
|
|
|
|
+ filter.setValue("%" + param_dlog_source_filter.trim() + "%");
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.source like :source ");
|
|
|
|
|
+ } else if (SMA_NOT_LIKE.equals(param_dlog_source_sma)) {
|
|
|
|
|
+ filter.setValue("%" + param_dlog_source_filter.trim() + "%");
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.source not like :source ");
|
|
|
|
|
+ } else if (SMA_NOT_EQUAL.equals(param_dlog_source_sma)) {
|
|
|
|
|
+ filter.setValue(param_dlog_source_filter.trim());
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.source != :source ");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ filter.setValue(param_dlog_source_filter.trim());
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.source = :source ");
|
|
|
|
|
+ }
|
|
|
filterList.add(filter);
|
|
filterList.add(filter);
|
|
|
- dlog_filterSb.append(" AND dlog.source like :source ");
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
request.getSession().setAttribute("dlog_source_filter", param_dlog_source_filter);
|
|
request.getSession().setAttribute("dlog_source_filter", param_dlog_source_filter);
|
|
|
|
|
+ request.getSession().setAttribute("dlog_source_sma", param_dlog_source_sma);
|
|
|
|
|
|
|
|
|
|
+ // ==== CR#1: CODE - equal / not_equal / like / not_like (default equal) ====
|
|
|
if (!Util.isNullOrEmpty(param_dlog_code_filter)) {
|
|
if (!Util.isNullOrEmpty(param_dlog_code_filter)) {
|
|
|
if (param_dlog_code_filter.length() > 0) {
|
|
if (param_dlog_code_filter.length() > 0) {
|
|
|
filter = new NameValue();
|
|
filter = new NameValue();
|
|
|
filter.setName("code");
|
|
filter.setName("code");
|
|
|
- filter.setValue("%" + param_dlog_code_filter.trim() + "%");
|
|
|
|
|
|
|
+ if (SMA_LIKE.equals(param_dlog_code_sma)) {
|
|
|
|
|
+ filter.setValue("%" + param_dlog_code_filter.trim() + "%");
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.code like :code ");
|
|
|
|
|
+ } else if (SMA_NOT_LIKE.equals(param_dlog_code_sma)) {
|
|
|
|
|
+ filter.setValue("%" + param_dlog_code_filter.trim() + "%");
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.code not like :code ");
|
|
|
|
|
+ } else if (SMA_NOT_EQUAL.equals(param_dlog_code_sma)) {
|
|
|
|
|
+ filter.setValue(param_dlog_code_filter.trim());
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.code != :code ");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ filter.setValue(param_dlog_code_filter.trim());
|
|
|
|
|
+ dlog_filterSb.append(" AND dlog.code = :code ");
|
|
|
|
|
+ }
|
|
|
filterList.add(filter);
|
|
filterList.add(filter);
|
|
|
- dlog_filterSb.append(" AND dlog.code like :code ");
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
request.getSession().setAttribute("dlog_code_filter", param_dlog_code_filter);
|
|
request.getSession().setAttribute("dlog_code_filter", param_dlog_code_filter);
|
|
|
|
|
+ request.getSession().setAttribute("dlog_code_sma", param_dlog_code_sma);
|
|
|
|
|
|
|
|
|
|
+ // ==== CR#1: CUSTOM FIELD (v_XX via dlogMd_label_filter) - equal / not_equal / like / not_like (default equal) ====
|
|
|
if (!Util.isNullOrEmpty(param_dlog_value_filter)) {
|
|
if (!Util.isNullOrEmpty(param_dlog_value_filter)) {
|
|
|
if (!Util.isNullOrEmpty(param_dlogMd_label_filter)) {
|
|
if (!Util.isNullOrEmpty(param_dlogMd_label_filter)) {
|
|
|
- if (!Util.isNullOrEmpty(param_dlog_sma_filter)) {
|
|
|
|
|
- if (param_dlog_value_filter.length() > 0) {
|
|
|
|
|
- // edited by ismawan
|
|
|
|
|
- if (param_dlog_sma_filter.equals("=")) {
|
|
|
|
|
- filter = new NameValue();
|
|
|
|
|
- filter.setName("id");
|
|
|
|
|
- filter.setValue("%" + param_dlog_value_filter.trim() + "%");
|
|
|
|
|
- filterList.add(filter);
|
|
|
|
|
- dlog_filterSb.append(" AND dlog." + param_dlogMd_label_filter + " like :id ");
|
|
|
|
|
- // log.info("dlog_filterSb ["+dlog_filterSb.toString()+"]"); //cek, udah nangkap parameternya lum
|
|
|
|
|
- } else if (param_dlog_sma_filter.equals("!=")) {
|
|
|
|
|
- filter = new NameValue();
|
|
|
|
|
- filter.setName("id");
|
|
|
|
|
- filter.setValue("%" + param_dlog_value_filter.trim() + "%");
|
|
|
|
|
- filterList.add(filter);
|
|
|
|
|
- dlog_filterSb.append(" AND dlog." + param_dlogMd_label_filter + " not like :id ");
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (param_dlog_value_filter.length() > 0) {
|
|
|
|
|
+ filter = new NameValue();
|
|
|
|
|
+ filter.setName("id");
|
|
|
|
|
+ String col = "dlog." + param_dlogMd_label_filter;
|
|
|
|
|
+ if (SMA_LIKE.equals(param_dlog_sma_filter)) {
|
|
|
|
|
+ filter.setValue("%" + param_dlog_value_filter.trim() + "%");
|
|
|
|
|
+ dlog_filterSb.append(" AND " + col + " like :id ");
|
|
|
|
|
+ } else if (SMA_NOT_LIKE.equals(param_dlog_sma_filter)) {
|
|
|
|
|
+ filter.setValue("%" + param_dlog_value_filter.trim() + "%");
|
|
|
|
|
+ dlog_filterSb.append(" AND " + col + " not like :id ");
|
|
|
|
|
+ } else if (SMA_NOT_EQUAL.equals(param_dlog_sma_filter)) {
|
|
|
|
|
+ filter.setValue(param_dlog_value_filter.trim());
|
|
|
|
|
+ dlog_filterSb.append(" AND " + col + " != :id ");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ filter.setValue(param_dlog_value_filter.trim());
|
|
|
|
|
+ dlog_filterSb.append(" AND " + col + " = :id ");
|
|
|
}
|
|
}
|
|
|
|
|
+ filterList.add(filter);
|
|
|
|
|
+ // log.info("dlog_filterSb ["+dlog_filterSb.toString()+"]"); //cek, udah nangkap parameternya lum
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -366,53 +480,75 @@ public class DlogAction extends Action {
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- NameValue[] filterArray = new NameValue[filterList.size()];
|
|
|
|
|
- for (int i = 0; i < filterList.size(); i++) {
|
|
|
|
|
- filterArray[i] = filterList.get(i);
|
|
|
|
|
|
|
+ // dlogMdList (dropdown Type) dan typeMap tetap perlu dimuat di initial load,
|
|
|
|
|
+ // karena ini query ke DlogMd (metadata), BUKAN ke tabel DLOG.
|
|
|
|
|
+ id.co.hanoman.service.List typeList = null;
|
|
|
|
|
+ if (typeMap == null) {
|
|
|
|
|
+ typeMap = getTypeList(psi, typeList);
|
|
|
}
|
|
}
|
|
|
|
|
+ request.setAttribute("dlogMdList", typeMap.keySet());
|
|
|
|
|
|
|
|
- log.info("WHERE CLAUSE = " + dlog_filterSb.toString());
|
|
|
|
|
- System.out.println("------------ DLOGLIST --------------- FROM DlogList dlog WHERE 1=1 " + dlog_filterSb +" order "+ order+" ??? "+filterArray);
|
|
|
|
|
- id.co.hanoman.service.List list = psi.query(Constant.MWLOG_DS, "FROM DlogList dlog WHERE 1=1 " + dlog_filterSb + (Util.isNullOrEmpty(order) ? "" : " ORDER BY " + order), filterArray, start, count);
|
|
|
|
|
|
|
+ if (isSearch) {
|
|
|
|
|
+ // ==== CR#2: hanya query ke tabel DLOG kalau ini benar-benar aksi user ====
|
|
|
|
|
|
|
|
|
|
+ NameValue[] filterArray = new NameValue[filterList.size()];
|
|
|
|
|
+ for (int i = 0; i < filterList.size(); i++) {
|
|
|
|
|
+ filterArray[i] = filterList.get(i);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- Object[] items = list.getItems();
|
|
|
|
|
- String paging = Pager.generatePagingNew(start, list.getTotal(), Constant.PAGE_SIZE_LOG);
|
|
|
|
|
- String pagingItem = Pager.generatePagingItemNew(start, list.getTotal(), Constant.PAGE_SIZE_LOG);
|
|
|
|
|
|
|
+ log.info("WHERE CLAUSE = " + dlog_filterSb.toString());
|
|
|
|
|
+ log.info("------------ DLOGLIST --------------- FROM DlogList dlog WHERE 1=1 " + dlog_filterSb +" order "+ order+" ??? "+filterArray);
|
|
|
|
|
|
|
|
- id.co.hanoman.service.List typeList = null;
|
|
|
|
|
- if (typeMap == null) {
|
|
|
|
|
- typeMap = getTypeList(psi, typeList);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // ==== CR#3: ambil count+1 baris untuk deteksi next page, tanpa hitung total ====
|
|
|
|
|
+ id.co.hanoman.service.List list = psi.query(Constant.MWLOG_DS, "FROM DlogList dlog WHERE 1=1 " + dlog_filterSb + (Util.isNullOrEmpty(order) ? "" : " ORDER BY " + order), filterArray, start, count + 1);
|
|
|
|
|
|
|
|
- // String type = request.getParameter("dlog_type_filter");
|
|
|
|
|
- // if(!Util.isNullOrEmpty(type)) {
|
|
|
|
|
- // List<Map> labelList = new LinkedList();
|
|
|
|
|
- // Iterator iterator = typeMap.keySet().iterator();
|
|
|
|
|
- // while(iterator.hasNext()) {
|
|
|
|
|
- // Object o = iterator.next();
|
|
|
|
|
- // if(o instanceof String) {
|
|
|
|
|
- // String typeStr = (String) o;
|
|
|
|
|
- // if(typeStr.equalsIgnoreCase(type)) {
|
|
|
|
|
- // labelList = (List<Map>)typeMap.get(typeStr);
|
|
|
|
|
- // }
|
|
|
|
|
- // }
|
|
|
|
|
- // }
|
|
|
|
|
- // log.info("LABEL_LIST::"+labelList);
|
|
|
|
|
- // request.setAttribute("labelList", labelList);
|
|
|
|
|
- // }
|
|
|
|
|
|
|
+ Object[] rawItems = list.getItems();
|
|
|
|
|
+ boolean hasNext = rawItems != null && rawItems.length > count;
|
|
|
|
|
+ int showCount = rawItems == null ? 0 : (hasNext ? count : rawItems.length);
|
|
|
|
|
+ Object[] items = new Object[showCount];
|
|
|
|
|
+ if (rawItems != null && showCount > 0) {
|
|
|
|
|
+ System.arraycopy(rawItems, 0, items, 0, showCount);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- request.setAttribute("dlogMdList", typeMap.keySet());
|
|
|
|
|
- request.setAttribute("paging", paging);
|
|
|
|
|
- request.setAttribute("pagingItem", pagingItem);
|
|
|
|
|
- request.setAttribute("dlogList", items);
|
|
|
|
|
- request.setAttribute("dlog_start", new Integer(start));
|
|
|
|
|
- for(int i = 0; i < items.length;i++) {
|
|
|
|
|
- DlogList dlogList = (DlogList)items[i];
|
|
|
|
|
- System.out.println("-dlogList.getCode()- "+dlogList.getCode());
|
|
|
|
|
- System.out.println("-dlogList.getSource()- "+dlogList.getSource());
|
|
|
|
|
- }
|
|
|
|
|
- System.out.println("------------ DLOGLIST --------------- "+list.getTotal()+" FROM DlogList dlog WHERE 1=1 " + dlog_filterSb +" order "+ order);
|
|
|
|
|
|
|
+ boolean hasPrev = start > 0;
|
|
|
|
|
+ int prevStart = Math.max(0, start - count);
|
|
|
|
|
+ int nextStart = start + count;
|
|
|
|
|
+ int pageNumber = (start / count) + 1;
|
|
|
|
|
+
|
|
|
|
|
+ StringBuffer pagingHtml = new StringBuffer();
|
|
|
|
|
+ pagingHtml.append("<a href=\"#\" onclick=\"page(0,").append(count).append(");\"><<</a> ");
|
|
|
|
|
+ if (hasPrev) {
|
|
|
|
|
+ pagingHtml.append("<a href=\"#\" onclick=\"page(").append(prevStart).append(",").append(count).append(");\"><</a> ");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ pagingHtml.append("< ");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (hasNext) {
|
|
|
|
|
+ pagingHtml.append("<a href=\"#\" onclick=\"page(").append(nextStart).append(",").append(count).append(");\">></a>");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ pagingHtml.append(">");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ StringBuffer pagingItemHtml = new StringBuffer();
|
|
|
|
|
+ pagingItemHtml.append("Page ").append(pageNumber);
|
|
|
|
|
+
|
|
|
|
|
+ request.setAttribute("paging", pagingHtml.toString());
|
|
|
|
|
+ request.setAttribute("pagingItem", pagingItemHtml.toString());
|
|
|
|
|
+ request.setAttribute("dlogList", items);
|
|
|
|
|
+ request.setAttribute("dlog_start", new Integer(start));
|
|
|
|
|
+
|
|
|
|
|
+ for (int i = 0; i < items.length; i++) {
|
|
|
|
|
+ DlogList dlogList = (DlogList) items[i];
|
|
|
|
|
+ log.info("-dlogList.getCode()- " + dlogList.getCode());
|
|
|
|
|
+ log.info("-dlogList.getSource()- " + dlogList.getSource());
|
|
|
|
|
+ }
|
|
|
|
|
+ log.info("------------ DLOGLIST --------------- (no total count) FROM DlogList dlog WHERE 1=1 " + dlog_filterSb + " order " + order);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // ==== CR#2: initial load - tidak query ke tabel DLOG sama sekali ====
|
|
|
|
|
+ request.setAttribute("dlogList", null);
|
|
|
|
|
+ request.setAttribute("paging", null);
|
|
|
|
|
+ request.setAttribute("pagingItem", null);
|
|
|
|
|
+ request.setAttribute("dlog_start", new Integer(0));
|
|
|
|
|
+ }
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
|
log.error(e.getMessage(), e);
|
|
log.error(e.getMessage(), e);
|
|
@@ -620,7 +756,7 @@ public class DlogAction extends Action {
|
|
|
if (buf.remaining() > 0) {
|
|
if (buf.remaining() > 0) {
|
|
|
msg.put("Broker Log", new String(buf.array(), buf.position(), buf.remaining()).trim());
|
|
msg.put("Broker Log", new String(buf.array(), buf.position(), buf.remaining()).trim());
|
|
|
}
|
|
}
|
|
|
- log.info("3[][][][]][][]");
|
|
|
|
|
|
|
+ log.info("3[][][]][][]");
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
log.info("4[][][][][][]");
|
|
log.info("4[][][][][][]");
|
|
@@ -742,7 +878,7 @@ public class DlogAction extends Action {
|
|
|
|
|
|
|
|
private synchronized static LinkedHashMap getTypeList(PersistanceServiceInterface psi, id.co.hanoman.service.List typeList) throws Exception {
|
|
private synchronized static LinkedHashMap getTypeList(PersistanceServiceInterface psi, id.co.hanoman.service.List typeList) throws Exception {
|
|
|
typeList = psi.query(Constant.MWLOG_DS, "FROM DlogMd WHERE 1=1 order by type ASC ", null, 0, 0);
|
|
typeList = psi.query(Constant.MWLOG_DS, "FROM DlogMd WHERE 1=1 order by type ASC ", null, 0, 0);
|
|
|
- System.out.println("-------------------------------------------------------- getTypeList(PersistanceServiceInterface psi, id.co.hanoman.service.List typeList) ----------------------------------------------------");
|
|
|
|
|
|
|
+ // log.info("-------------------------------------------------------- getTypeList(PersistanceServiceInterface psi, id.co.hanoman.service.List typeList) ----------------------------------------------------");
|
|
|
Object[] typeItems = typeList.getItems();
|
|
Object[] typeItems = typeList.getItems();
|
|
|
typeMap = new LinkedHashMap();
|
|
typeMap = new LinkedHashMap();
|
|
|
for (Object typeObj : typeItems) {
|
|
for (Object typeObj : typeItems) {
|
|
@@ -757,7 +893,7 @@ public class DlogAction extends Action {
|
|
|
// if(o instanceof String) {
|
|
// if(o instanceof String) {
|
|
|
// String key = (String) o;
|
|
// String key = (String) o;
|
|
|
// if(typeMap.containsKey(key)) {
|
|
// if(typeMap.containsKey(key)) {
|
|
|
- // System.out.println("duplicate");
|
|
|
|
|
|
|
+ // log.info("duplicate");
|
|
|
// typeMap = new LinkedHashMap();
|
|
// typeMap = new LinkedHashMap();
|
|
|
// typeMap.put(dlogMd.getType(), cList);
|
|
// typeMap.put(dlogMd.getType(), cList);
|
|
|
// }
|
|
// }
|
|
@@ -766,7 +902,7 @@ public class DlogAction extends Action {
|
|
|
// }
|
|
// }
|
|
|
map.put(dlogMd.getType(), cList);
|
|
map.put(dlogMd.getType(), cList);
|
|
|
typeMap.putAll(map);
|
|
typeMap.putAll(map);
|
|
|
- // System.out.println(("Key::"+typeMap.keySet()+"Value::"+typeMap.values()));
|
|
|
|
|
|
|
+ // log.info(("Key::"+typeMap.keySet()+"Value::"+typeMap.values()));
|
|
|
}
|
|
}
|
|
|
return typeMap;
|
|
return typeMap;
|
|
|
}
|
|
}
|