Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 8E4F6200B6B for ; Fri, 9 Sep 2016 23:43:32 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 8CFDC160AA3; Fri, 9 Sep 2016 21:43:32 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 6A16B160ACE for ; Fri, 9 Sep 2016 23:43:31 +0200 (CEST) Received: (qmail 41207 invoked by uid 500); 9 Sep 2016 21:43:30 -0000 Mailing-List: contact commits-help@geode.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.incubator.apache.org Delivered-To: mailing list commits@geode.incubator.apache.org Received: (qmail 41198 invoked by uid 99); 9 Sep 2016 21:43:30 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 09 Sep 2016 21:43:30 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 26EF9C0B4A for ; Fri, 9 Sep 2016 21:43:30 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -5.446 X-Spam-Level: X-Spam-Status: No, score=-5.446 tagged_above=-999 required=6.31 tests=[KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-1.426] autolearn=disabled Received: from mx2-lw-us.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id JvEA4_ZOtFDJ for ; Fri, 9 Sep 2016 21:43:22 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx2-lw-us.apache.org (ASF Mail Server at mx2-lw-us.apache.org) with SMTP id F1A175FC83 for ; Fri, 9 Sep 2016 21:43:02 +0000 (UTC) Received: (qmail 37429 invoked by uid 99); 9 Sep 2016 21:43:00 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 09 Sep 2016 21:43:00 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 97BE2EF99D; Fri, 9 Sep 2016 21:43:00 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: hiteshkhamesra@apache.org To: commits@geode.incubator.apache.org Date: Fri, 09 Sep 2016 21:44:08 -0000 Message-Id: <841177c866d94d5e90232684839d3583@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [71/83] [abbrv] incubator-geode git commit: GEODE-37 renamed pulse package archived-at: Fri, 09 Sep 2016 21:43:32 -0000 http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/controllers/PulseController.java ---------------------------------------------------------------------- diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/controllers/PulseController.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/controllers/PulseController.java new file mode 100644 index 0000000..4eb069e --- /dev/null +++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/controllers/PulseController.java @@ -0,0 +1,524 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.geode.tools.pulse.internal.controllers; + +import java.io.IOException; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.apache.geode.tools.pulse.internal.data.Cluster; +import org.apache.geode.tools.pulse.internal.data.PulseConstants; +import org.apache.geode.tools.pulse.internal.data.PulseVersion; +import org.apache.geode.tools.pulse.internal.data.Repository; +import org.apache.geode.tools.pulse.internal.log.PulseLogWriter; +import org.apache.geode.tools.pulse.internal.service.PulseService; +import org.apache.geode.tools.pulse.internal.service.PulseServiceFactory; +import org.apache.geode.tools.pulse.internal.service.SystemAlertsService; +import org.apache.geode.tools.pulse.internal.util.StringUtils; + +import org.apache.commons.lang.StringEscapeUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +/** + * Class PulseController + * + * This class contains the implementations for all http Ajax requests needs to + * be served in Pulse. + * + * @since GemFire version 7.5 + */ +@Controller +public class PulseController { + + private static final PulseLogWriter LOGGER = PulseLogWriter.getLogger(); + + // CONSTANTS + private final String DEFAULT_EXPORT_FILENAME = "DataBrowserQueryResult.json"; + private final String QUERYSTRING_PARAM_ACTION = "action"; + private final String QUERYSTRING_PARAM_QUERYID = "queryId"; + private final String ACTION_VIEW = "view"; + private final String ACTION_DELETE = "delete"; + + private String STATUS_REPSONSE_SUCCESS = "success"; + private String STATUS_REPSONSE_FAIL = "fail"; + + private String ERROR_REPSONSE_QUERYNOTFOUND = "No queries found"; + private String ERROR_REPSONSE_QUERYIDMISSING = "Query id is missing"; + + private static final String EMPTY_JSON = "{}"; + + // Shared object to hold pulse version details + public static PulseVersion pulseVersion = new PulseVersion(); + + //default is gemfire + private static String pulseProductSupport = PulseConstants.PRODUCT_NAME_GEMFIRE; + + private final ObjectMapper mapper = new ObjectMapper(); + + @Autowired + PulseServiceFactory pulseServiceFactory; + + @RequestMapping(value = "/pulseUpdate", method = RequestMethod.POST) + public void getPulseUpdate(HttpServletRequest request, + HttpServletResponse response) throws IOException { + String pulseData = request.getParameter("pulseData"); + + ObjectNode responseMap = mapper.createObjectNode(); + + JsonNode requestMap = null; + + try { + requestMap = mapper.readTree(pulseData); + Iterator keys = requestMap.fieldNames(); + + // Execute Services + while (keys.hasNext()) { + String serviceName = keys.next().toString(); + try { + PulseService pulseService = pulseServiceFactory + .getPulseServiceInstance(serviceName); + responseMap.put(serviceName, pulseService.execute(request)); + } catch (Exception serviceException) { + LOGGER.warning("serviceException [for service "+serviceName+"] = " + serviceException.getMessage()); + responseMap.put(serviceName, EMPTY_JSON); + } + } + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occurred : " + e.getMessage()); + } + } + + // Create Response + response.getOutputStream().write(responseMap.toString().getBytes()); + } + + @RequestMapping(value = "/authenticateUser", method = RequestMethod.GET) + public void authenticateUser(HttpServletRequest request, + HttpServletResponse response) throws IOException { + // json object to be sent as response + ObjectNode responseJSON = mapper.createObjectNode(); + + try { + responseJSON.put("isUserLoggedIn", this.isUserLoggedIn(request)); + // Send json response + response.getOutputStream().write(responseJSON.toString().getBytes()); + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occurred : " + e.getMessage()); + } + } + } + + /** + * Method isUserLoggedIn Check whether user is logged in or not. + * + * @param request + * @return boolean + */ + protected boolean isUserLoggedIn(HttpServletRequest request) { + return null != request.getUserPrincipal(); + } + + @RequestMapping(value = "/pulseVersion", method = RequestMethod.GET) + public void pulseVersion(HttpServletRequest request, + HttpServletResponse response) throws IOException { + + // json object to be sent as response + ObjectNode responseJSON = mapper.createObjectNode(); + + try { + // Reference to repository + Repository repository = Repository.get(); + // set pulse web app url + String pulseWebAppUrl = request.getScheme() + "://" + + request.getServerName() + ":" + request.getServerPort() + + request.getContextPath(); + + repository.setPulseWebAppUrl(pulseWebAppUrl); + + // Response + responseJSON.put("pulseVersion", PulseController.pulseVersion.getPulseVersion()); + responseJSON.put("buildId", PulseController.pulseVersion.getPulseBuildId()); + responseJSON.put("buildDate", PulseController.pulseVersion.getPulseBuildDate()); + responseJSON.put("sourceDate", PulseController.pulseVersion.getPulseSourceDate()); + responseJSON.put("sourceRevision", PulseController.pulseVersion.getPulseSourceRevision()); + responseJSON.put("sourceRepository", PulseController.pulseVersion.getPulseSourceRepository()); + + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occured : " + e.getMessage()); + } + } + + // Send json response + response.getOutputStream().write(responseJSON.toString().getBytes()); + } + + @RequestMapping(value = "/clearAlerts", method = RequestMethod.GET) + public void clearAlerts(HttpServletRequest request, HttpServletResponse response) throws IOException { + int alertType; + ObjectNode responseJSON = mapper.createObjectNode(); + + try { + alertType = Integer.valueOf(request.getParameter("alertType")); + } catch (NumberFormatException e) { + // Empty json response + response.getOutputStream().write(responseJSON.toString().getBytes()); + if (LOGGER.finerEnabled()) { + LOGGER.finer(e.getMessage()); + } + return; + } + + try { + boolean isClearAll = Boolean.valueOf(request.getParameter("clearAll")); + // get cluster object + Cluster cluster = Repository.get().getCluster(); + cluster.clearAlerts(alertType, isClearAll); + responseJSON.put("status", "deleted"); + responseJSON.put( + "systemAlerts", SystemAlertsService.getAlertsJson(cluster, + cluster.getNotificationPageNumber())); + responseJSON.put("pageNumber", cluster.getNotificationPageNumber()); + + boolean isGFConnected = cluster.isConnectedFlag(); + if(isGFConnected){ + responseJSON.put("connectedFlag", isGFConnected); + }else{ + responseJSON.put("connectedFlag", isGFConnected); + responseJSON.put("connectedErrorMsg", cluster.getConnectionErrorMsg()); + } + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occurred : " + e.getMessage()); + } + } + + // Send json response + response.getOutputStream().write(responseJSON.toString().getBytes()); + } + + @RequestMapping(value = "/acknowledgeAlert", method = RequestMethod.GET) + public void acknowledgeAlert(HttpServletRequest request, + HttpServletResponse response) throws IOException { + int alertId; + ObjectNode responseJSON = mapper.createObjectNode(); + + try { + alertId = Integer.valueOf(request.getParameter("alertId")); + } catch (NumberFormatException e) { + // Empty json response + response.getOutputStream().write(responseJSON.toString().getBytes()); + if (LOGGER.finerEnabled()) { + LOGGER.finer(e.getMessage()); + } + return; + } + + try { + // get cluster object + Cluster cluster = Repository.get().getCluster(); + + // set alert is acknowledged + cluster.acknowledgeAlert(alertId); + responseJSON.put("status", "deleted"); + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occured : " + e.getMessage()); + } + } + + // Send json response + response.getOutputStream().write(responseJSON.toString().getBytes()); + } + + @RequestMapping(value = "/dataBrowserRegions", method = RequestMethod.GET) + public void dataBrowserRegions(HttpServletRequest request, + HttpServletResponse response) throws IOException { + // get cluster object + Cluster cluster = Repository.get().getCluster(); + + // json object to be sent as response + ObjectNode responseJSON = mapper.createObjectNode(); + ArrayNode regionsData = mapper.createArrayNode(); + + try { + // getting cluster's Regions + responseJSON.put("clusterName", cluster.getServerName()); + regionsData = getRegionsJson(cluster); + responseJSON.put("clusterRegions", regionsData); + responseJSON.put("connectedFlag", cluster.isConnectedFlag()); + responseJSON.put("connectedErrorMsg", cluster.getConnectionErrorMsg()); + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occured : " + e.getMessage()); + } + } + + // Send json response + response.getOutputStream().write(responseJSON.toString().getBytes()); + } + + /** + * This method creates json for list of cluster regions + * + * @param cluster + * @return ArrayNode JSON array + */ + private ArrayNode getRegionsJson(Cluster cluster) { + + Collection clusterRegions = cluster.getClusterRegions().values(); + ArrayNode regionsListJson = mapper.createArrayNode(); + + if (!clusterRegions.isEmpty()) { + for (Cluster.Region region : clusterRegions) { + ObjectNode regionJSON = mapper.createObjectNode(); + regionJSON.put("name", region.getName()); + regionJSON.put("fullPath", region.getFullPath()); + regionJSON.put("regionType", region.getRegionType()); + + if (region.getRegionType().contains("PARTITION")) { + regionJSON.put("isPartition", true); + } else { + regionJSON.put("isPartition", false); + } + + regionJSON.put("memberCount", region.getMemberCount()); + List regionsMembers = region.getMemberName(); + ArrayNode jsonRegionMembers = mapper.createArrayNode(); + + for (int i = 0; i < regionsMembers.size(); i++) { + Cluster.Member member = cluster.getMembersHMap().get( + regionsMembers.get(i)); + ObjectNode jsonMember = mapper.createObjectNode(); + jsonMember.put("key", regionsMembers.get(i)); + jsonMember.put("id", member.getId()); + jsonMember.put("name", member.getName()); + + jsonRegionMembers.add(jsonMember); + } + + regionJSON.put("members", jsonRegionMembers); + regionsListJson.add(regionJSON); + } + } + return regionsListJson; + } + + @RequestMapping(value = "/dataBrowserQuery", method = RequestMethod.GET) + public void dataBrowserQuery(HttpServletRequest request, + HttpServletResponse response) throws IOException { + // get query string + String query = request.getParameter("query"); + String members = request.getParameter("members"); + int limit = 0; + + try { + limit = Integer.valueOf(request.getParameter("limit")); + } catch (NumberFormatException e) { + limit = 0; + if (LOGGER.finerEnabled()) { + LOGGER.finer(e.getMessage()); + } + } + + ObjectNode queryResult = mapper.createObjectNode(); + try { + + if (StringUtils.isNotNullNotEmptyNotWhiteSpace(query)) { + // get cluster object + Cluster cluster = Repository.get().getCluster(); + String userName = request.getUserPrincipal().getName(); + + // Call execute query method + queryResult = cluster.executeQuery(query, members, limit); + + // Add query in history if query is executed successfully + if (!queryResult.has("error")) { + // Add html escaped query to history + String escapedQuery = StringEscapeUtils.escapeHtml(query); + cluster.addQueryInHistory(escapedQuery, userName); + } + } + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occured : " + e.getMessage()); + } + } + + response.getOutputStream().write(queryResult.toString().getBytes()); + } + + @RequestMapping(value = "/dataBrowserQueryHistory", method = RequestMethod.GET) + public void dataBrowserQueryHistory(HttpServletRequest request, + HttpServletResponse response) throws IOException { + ObjectNode responseJSON = mapper.createObjectNode(); + ArrayNode queryResult = null; + String action = ""; + + try { + // get cluster object + Cluster cluster = Repository.get().getCluster(); + String userName = request.getUserPrincipal().getName(); + + // get query string + action = request.getParameter(QUERYSTRING_PARAM_ACTION); + if (!StringUtils.isNotNullNotEmptyNotWhiteSpace(action)) { + action = ACTION_VIEW; + } + + if (action.toLowerCase().equalsIgnoreCase(ACTION_DELETE)) { + String queryId = request.getParameter(QUERYSTRING_PARAM_QUERYID); + if (StringUtils.isNotNullNotEmptyNotWhiteSpace(queryId)) { + + boolean deleteStatus = cluster.deleteQueryById(userName, queryId); + if (deleteStatus) { + responseJSON.put("status", STATUS_REPSONSE_SUCCESS); + } else { + responseJSON.put("status", STATUS_REPSONSE_FAIL); + responseJSON.put("error", ERROR_REPSONSE_QUERYNOTFOUND); + } + } else { + responseJSON.put("status", STATUS_REPSONSE_FAIL); + responseJSON.put("error", ERROR_REPSONSE_QUERYIDMISSING); + } + } + + // Get list of past executed queries + queryResult = cluster.getQueryHistoryByUserId(userName); + responseJSON.put("queryHistory", queryResult); + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occured : " + e.getMessage()); + } + } + response.getOutputStream().write(responseJSON.toString().getBytes()); + } + + @RequestMapping(value = "/dataBrowserExport", method = RequestMethod.POST) + public void dataBrowserExport(HttpServletRequest request, + HttpServletResponse response) throws IOException { + + // get query string + String filename = request.getParameter("filename"); + String resultContent = request.getParameter("content"); + + response.setHeader("Cache-Control", ""); + response.setHeader("Content-type", "text/plain"); + if (StringUtils.isNotNullNotEmptyNotWhiteSpace(filename)) { + response.setHeader("Content-Disposition", "attachment; filename=" + filename); + } else { + response.setHeader("Content-Disposition", "attachment; filename=" + DEFAULT_EXPORT_FILENAME); + } + + if (!StringUtils.isNotNullNotEmptyNotWhiteSpace(resultContent)) { + resultContent = ""; + } + + response.getOutputStream().write(resultContent.getBytes()); + } + + @RequestMapping(value = "/pulseProductSupport", method = RequestMethod.GET) + public void getConfiguredPulseProduct(HttpServletRequest request, + HttpServletResponse response) throws IOException { + ObjectNode responseJSON = mapper.createObjectNode(); + + try { + responseJSON.put("product", pulseProductSupport); + + // Send json response + response.getOutputStream().write(responseJSON.toString().getBytes()); + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occurred : " + e.getMessage()); + } + } + } + + @RequestMapping(value = "/getQueryStatisticsGridModel", method = RequestMethod.GET) + public void getQueryStatisticsGridModel(HttpServletRequest request, + HttpServletResponse response) throws IOException { + + ObjectNode responseJSON = mapper.createObjectNode(); + // get cluster object + Cluster cluster = Repository.get().getCluster(); + String userName = request.getUserPrincipal().getName(); + + try { + String[] arrColNames = Cluster.Statement.getGridColumnNames(); + String[] arrColAttribs = Cluster.Statement.getGridColumnAttributes(); + int[] arrColWidths = Cluster.Statement.getGridColumnWidths(); + + ArrayNode colNamesList = mapper.createArrayNode(); + for (int i = 0; i < arrColNames.length; ++i) { + colNamesList.add(arrColNames[i]); + } + + ArrayNode colModelList = mapper.createArrayNode(); + for (int i = 0; i < arrColAttribs.length; ++i) { + ObjectNode columnJSON = mapper.createObjectNode(); + columnJSON.put("name", arrColAttribs[i]); + columnJSON.put("index", arrColAttribs[i]); + columnJSON.put("width", arrColWidths[i]); + columnJSON.put("sortable", "true"); + columnJSON.put("sorttype", ((i == 0) ? "String" : "integer")); + colModelList.add(columnJSON); + } + + responseJSON.put("columnNames", colNamesList); + responseJSON.put("columnModels", colModelList); + responseJSON.put("clusterName", cluster.getServerName()); + responseJSON.put("userName", userName); + + // Send json response + response.getOutputStream().write(responseJSON.toString().getBytes()); + } catch (Exception e) { + if (LOGGER.fineEnabled()) { + LOGGER.fine("Exception Occured : " + e.getMessage()); + } + } + } + + /** + * @return the pulseProductSupport + */ + public static String getPulseProductSupport() { + return pulseProductSupport; + } + + /** + * @param pulseProductSupport + * the pulseProductSupport to set + */ + public static void setPulseProductSupport(String pulseProductSupport) { + PulseController.pulseProductSupport = pulseProductSupport; + } +} \ No newline at end of file