Java tutorial
/* * Copyright (c) 2011 Imaginea Technologies Private Ltd. * Hyderabad, India * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.imaginea.mongodb.requestdispatchers; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.imaginea.mongodb.common.exceptions.ErrorCodes; import com.imaginea.mongodb.requestdispatchers.BaseRequestDispatcher.ResponseCallback; import com.imaginea.mongodb.requestdispatchers.BaseRequestDispatcher.ResponseTemplate; import com.mongodb.BasicDBObject; import com.mongodb.CommandResult; import com.mongodb.DB; import com.mongodb.Mongo; /** * Return values of queries,updates,inserts and deletes being performed on Mongo * Db per sec. * * @author Aditya Gaur, Rachit Mittal */ public class Graphs extends HttpServlet { private static final long serialVersionUID = -1539358875210511143L; private static JSONArray array; private static int num = 0; // TODO For multiple users - static variable do not work. So static variable // per mongoHost /** * Keep the record of last values. */ private static int lastNoOfQueries = 0; private static int lastNoOfInserts = 0; private static int lastNoOfUpdates = 0; private static int lastNoOfDeletes = 0; int maxLen = 20; int jump = 1; private static Logger logger = Logger.getLogger(Graphs.class); /** * Constructor for Servlet and also configures Logger. * * @throws IOException * If Log file cannot be written */ public Graphs() throws IOException { super(); } /** * Handles the HTTP <code>GET</code> method. * * @param request * servlet request * @param response * servlet response * @throws ServletException * if a servlet-specific error occurs * @throws IOException * if an I/O error occurs */ @Override protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { // Declare Response Objects and PrintWriter response.setContentType("application/x-json"); PrintWriter out = response.getWriter(); final String dbInfo = request.getParameter("dbInfo"); String result = new ResponseTemplate().execute(logger, dbInfo, request, new ResponseCallback() { public Object execute() throws Exception { Mongo mongoInstance = UserLogin.mongoConfigToInstanceMapping.get(dbInfo); // Need a Db to get ServerStats DB db = mongoInstance.getDB("admin"); String uri = request.getRequestURI(); Object result = null; if (uri != null) { if (uri.substring(uri.lastIndexOf('/')).equals("/query")) { result = processQuery(db); } else if (uri.substring(uri.lastIndexOf('/')).equals("/initiate")) { if (request.getParameter("pollingTime") != null) { jump = Integer.parseInt(request.getParameter("pollingTime")); } result = processInitiate(db); } } return result; } }); out.write(result); } /** * Process <opcounters> query request made after each second by Front end * * @param db * : Db Name to egt Server Stats <admin> * @return Server stats of <opcounters> key * @throws IOException * @throws JSONException */ private JSONArray processQuery(DB db) throws IOException, JSONException { CommandResult cr = db.command("serverStatus"); BasicDBObject obj = (BasicDBObject) cr.get("opcounters"); int currentValue; JSONObject temp = new JSONObject(); num = num + jump; temp.put("TimeStamp", num); currentValue = (Integer) obj.get("query"); temp.put("QueryValue", currentValue - lastNoOfQueries); lastNoOfQueries = currentValue; currentValue = (Integer) obj.get("insert"); temp.put("InsertValue", currentValue - lastNoOfInserts); lastNoOfInserts = currentValue; currentValue = (Integer) obj.get("update"); temp.put("UpdateValue", currentValue - lastNoOfUpdates); lastNoOfUpdates = currentValue; currentValue = (Integer) obj.get("delete"); temp.put("DeleteValue", currentValue - lastNoOfDeletes); lastNoOfDeletes = currentValue; if (array.length() == maxLen) { JSONArray tempArray = new JSONArray(); for (int i = 1; i < maxLen; i++) { tempArray.put(array.get(i)); } array = tempArray; } array.put(temp); return array; } /** * * Initialize by previous <opcounter> value. * * @param db * : Name of Database * @return : Status of Initialization * @throws RuntimeException */ private JSONObject processInitiate(DB db) throws RuntimeException, JSONException { JSONObject respObj = new JSONObject(); array = new JSONArray(); num = 0; try { CommandResult cr = db.command("serverStatus"); BasicDBObject obj = (BasicDBObject) cr.get("opcounters"); lastNoOfQueries = (Integer) obj.get("query"); lastNoOfInserts = (Integer) obj.get("insert"); lastNoOfUpdates = (Integer) obj.get("update"); lastNoOfDeletes = (Integer) obj.get("delete"); respObj.put("result", "Initiated"); } catch (Exception e) { // Invalid User JSONObject error = new JSONObject(); error.put("message", e.getMessage()); error.put("code", ErrorCodes.ERROR_INITIATING_GRAPH); respObj.put("error", error); logger.info(respObj); } return respObj; } }