You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by hi...@apache.org on 2016/09/09 21:44:08 UTC
[71/83] [abbrv] incubator-geode git commit: GEODE-37 renamed pulse
package
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<Cluster.Region> 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<String> 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