com.bluedragon.profiler.ProfilerExtension.java Source code

Java tutorial

Introduction

Here is the source code for com.bluedragon.profiler.ProfilerExtension.java

Source

/* 
 *  Copyright (C) 2000 - 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: ProfilerExtension.java 2392 2013-07-01 14:09:12Z alan $
 */
package com.bluedragon.profiler;

import java.io.File;
import java.util.Map;

import org.aw20.collections.ProducerConsumer;

import com.bluedragon.plugin.Plugin;
import com.bluedragon.plugin.PluginManagerInterface;
import com.bluedragon.plugin.RequestListener;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.WriteConcern;
import com.naryx.tagfusion.cfm.engine.cfEngine;
import com.naryx.tagfusion.cfm.engine.cfSession;
import com.naryx.tagfusion.cfm.engine.cfmBadFileException;
import com.naryx.tagfusion.cfm.engine.cfmRunTimeException;
import com.naryx.tagfusion.xmlConfig.xmlCFML;

public class ProfilerExtension implements Plugin, RequestListener, Runnable {
    public static ProfilerExtension thisInst;

    private ProducerConsumer producerConsumer;
    private String mongourl;
    private boolean bRunning = true;
    private MongoClient mongo;
    private DBCollection coll;

    public ProfilerExtension() {
        thisInst = this;
    }

    public String getPluginDescription() {
        return "Profiler";
    }

    public String getPluginName() {
        return "Profiler";
    }

    public String getPluginVersion() {
        String r = "$Revision: 2392 $";
        return "1." + r.substring(10, r.length() - 1).trim();
    }

    @Override
    public void pluginStart(PluginManagerInterface manager, xmlCFML systemParameters) {
        manager.registerFunction("profileron", "com.bluedragon.profiler.functions.On");
        manager.registerFunction("profileroff", "com.bluedragon.profiler.functions.Off");
        manager.registerFunction("profileradd", "com.bluedragon.profiler.functions.Add");

        File pluginFolder = new File(cfEngine.thisPlatform.getFileIO().getWorkingDirectory(), "plugin-profiler");
        producerConsumer = new ProducerConsumer(pluginFolder, 2000);
    }

    public void pluginStop(PluginManagerInterface manager) {
        bRunning = false;
        thisInst.producerConsumer.onClose();
    }

    @Override
    public void requestStart(cfSession session) {
        new ProfileSession(session);
    }

    public void requestEnd(cfSession session) {
    }

    public void requestBadFileException(cfmBadFileException bfException, cfSession session) {
    }

    public void requestRuntimeException(cfmRunTimeException cfException, cfSession session) {
    }

    public static void log(Map m) {
        m.put("dt", new java.util.Date());
        thisInst.producerConsumer.onProduce(m);
    }

    public static void setMongo(String mongourl, String database, String collection) throws Exception {
        if (thisInst.mongourl != null && !thisInst.mongourl.equals(mongourl))
            return;

        thisInst.mongourl = mongourl;
        MongoClientURI m = new MongoClientURI(thisInst.mongourl);

        thisInst.mongo = new MongoClient(m);
        thisInst.coll = thisInst.mongo.getDB(database).getCollection(collection);

        Thread t = new Thread(thisInst);
        t.setName("ProfilerExtension:MongoThread");
        t.setPriority(Thread.MIN_PRIORITY);
        t.start();
    }

    @Override
    public void run() {
        cfEngine.log("ProfileExtension started logging to " + thisInst.mongourl);

        while (bRunning) {

            Map m = (Map) thisInst.producerConsumer.onConsume();
            if (m == null) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                }
                continue;
            }

            BasicDBObject dbo = new BasicDBObject(m);

            try {
                coll.save(dbo, WriteConcern.JOURNAL_SAFE);
            } catch (Exception e) {
                thisInst.producerConsumer.unConsume(m);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException te) {
                }
            }

            Thread.yield();
        }

    }
}