Java tutorial
/* * Copyright (C) 2013 TagServlet Ltd * * This file is part of Open BlueDragon (OpenBD) CFML Server Engine. * * OpenBD is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * Free Software Foundation,version 3. * * OpenBD is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenBD. If not, see http://www.gnu.org/licenses/ * * Additional permission under GNU GPL version 3 section 7 * * If you modify this Program, or any covered work, by linking or combining * it with any of the JARS listed in the README.txt (or a modified version of * (that library), containing parts covered by the terms of that JAR, the * licensors of this Program grant you additional permission to convey the * resulting work. * README.txt @ http://www.openbluedragon.org/license/README.txt * * http://openbd.org/ * $Id: ProfileSession.java 2378 2013-06-10 23:08:14Z alan $ */ package com.bluedragon.profiler; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.bson.Document; import com.mongodb.client.MongoCollection; import com.naryx.tagfusion.cfm.engine.cfCatchData; import com.naryx.tagfusion.cfm.engine.cfData; import com.naryx.tagfusion.cfm.engine.cfEngine; import com.naryx.tagfusion.cfm.engine.cfFormData; import com.naryx.tagfusion.cfm.engine.cfSession; import com.naryx.tagfusion.cfm.engine.cfUrlData; import com.naryx.tagfusion.cfm.engine.cfmRunTimeException; import com.naryx.tagfusion.cfm.engine.variableStore; import com.naryx.tagfusion.cfm.file.cfFile; import com.naryx.tagfusion.cfm.sql.cfSQLQueryData; import com.naryx.tagfusion.cfm.sql.preparedData; import com.naryx.tagfusion.cfm.sql.resultSetHolder; import com.naryx.tagfusion.cfm.tag.cfTag; import com.naryx.tagfusion.cfm.tag.tagUtils; import com.naryx.tagfusion.util.debugRecorder; public class ProfileSession extends Object implements debugRecorder { public static String SESSION_DATA_BIN_PROFILE = "profile-data"; private cfSession session; private long startTime; private int countQuery = 0, countMongo = 0, countException = 0; @SuppressWarnings("rawtypes") private List<Map> listMap; @SuppressWarnings("rawtypes") public ProfileSession(cfSession session) { this.session = session; this.startTime = System.currentTimeMillis(); this.listMap = new ArrayList<Map>(); this.session.registerDebugRecorder(this); } public void startRequest() { } public void startFile(cfFile thisFile) { } public void setShow(boolean _show) { } public boolean getShow() { return false; } public boolean getShowDBActivity() { return false; } public void recordTracepoint(String tracePoint) { } public void recordTimer(String timing) { } public debugRecorder copy() { return this; } public void dump(cfSession session) { } public void execOnStart(cfData sqlData) { } public void endFile(cfFile thisFile) { } public void storedProcRan(String _template, String _datasrc, String _procName, long _execTime, List<preparedData> _params, List<resultSetHolder> _results) { } public void queryRan(String template, String qname, cfSQLQueryData query, List<preparedData> _qp) { } public void updateRan(String template, String datasrc, String sql) { } public void insertRan(String template, String datasrc, String sql) { } @Override public void exceptionThrown(cfmRunTimeException exception, cfFile f, cfTag t) { Map<String, Object> m = new HashMap<String, Object>(); cfCatchData catchdata = exception.getCatchData(); m.put("exception", catchdata.getMessage() + "; " + catchdata.getDetail()); m.put("file", f.getURI()); listMap.add(m); countException++; } public void execOnEnd(cfData sqlData) { countQuery++; Map<String, Object> m = new HashMap<String, Object>(); if (sqlData instanceof cfSQLQueryData) { cfSQLQueryData sqd = (cfSQLQueryData) sqlData; m.put("ds", sqd.getDataSourceName()); m.put("sql", sqd.queryString); m.put("ms", sqd.executeTime); if (sqd.getNoRows() > 0) m.put("rows", sqd.getNoRows()); listMap.add(m); } } @SuppressWarnings("rawtypes") @Override public void endRequest() { Map<String, Object> requestM = new HashMap<String, Object>(); cfFormData form = (cfFormData) session.getQualifiedData(variableStore.FORM_SCOPE); if (form.size() > 0) { Map frm = (Map) tagUtils.getNatural(form, true); frm.remove("FIELDNAMES"); requestM.put("form", frm); } if (!cfEngine.isFormUrlScopeCombined()) { cfUrlData url = (cfUrlData) session.getQualifiedData(variableStore.URL_SCOPE); if (url.size() > 0) requestM.put("url", tagUtils.getNatural(url, true)); } // Is there an extra data cfData extraData = (cfData) session.getDataBin(SESSION_DATA_BIN_PROFILE); if (extraData != null) requestM.put("_extra", tagUtils.getNatural(extraData, true)); requestM.put("ms", (System.currentTimeMillis() - startTime)); requestM.put("bytes", session.getBytesSent()); requestM.put("uri", session.REQ.getContextPath() + session.REQ.getServletPath()); // ip address requestM.put("ip", session.REQ.getRemoteAddr()); String xforwardedfor = session.REQ.getHeader("x-forwarded-for"); if (xforwardedfor != null && !xforwardedfor.isEmpty()) requestM.put("xip", xforwardedfor); // query data if (session.getMetricQueryTotalTime() > 0) requestM.put("msquery", session.getMetricQueryTotalTime()); if (countQuery > 0) requestM.put("noquery", countQuery); if (countMongo > 0) requestM.put("nomongo", countMongo); if (countException > 0) requestM.put("noexc", countException); String query = cfUrlData.getQueryString(session); if (query != null) requestM.put("query", query); if (listMap.size() > 0) requestM.put("io", listMap); ProfilerExtension.log(requestM); } @Override public void execStoredProc(String datasourceName, String callString, String procName, long execTime) { Map<String, Object> m = new HashMap<String, Object>(); m.put("ms", execTime); m.put("call", callString); m.put("proc", procName); m.put("ds", datasourceName); listMap.add(m); } @Override public void execMongo(MongoCollection<Document> col, String action, Document qry, long execTime) { Map<String, Object> m = new HashMap<String, Object>(); m.put("ms", execTime); m.put("action", action); m.put("col", col.getNamespace().getCollectionName()); m.put("db", col.getNamespace().getDatabaseName()); if (qry != null) m.put("qry", qry.toString()); listMap.add(m); } }