diff --git a/geode-pulse/src/integrationTest/java/org/apache/geode/tools/pulse/controllers/PulseControllerJUnitTest.java b/geode-pulse/src/integrationTest/java/org/apache/geode/tools/pulse/controllers/PulseControllerJUnitTest.java index dcb1a153a7c8..82b98f22993d 100644 --- a/geode-pulse/src/integrationTest/java/org/apache/geode/tools/pulse/controllers/PulseControllerJUnitTest.java +++ b/geode-pulse/src/integrationTest/java/org/apache/geode/tools/pulse/controllers/PulseControllerJUnitTest.java @@ -19,10 +19,14 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.verify; import static org.powermock.api.mockito.PowerMockito.spy; import static org.powermock.api.mockito.PowerMockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -806,11 +810,105 @@ public void dataBrowserQuery() throws Exception { doReturn(mapper.createObjectNode().put("foo", "bar")).when(cluster).executeQuery(anyString(), anyString(), anyInt()); + String query = "SELECT * FROM " + REGION_PATH; this.mockMvc - .perform(get("/dataBrowserQuery").param("query", "SELECT * FROM " + REGION_PATH) + .perform(get("/dataBrowserQuery").param("query", query) .param("members", MEMBER_NAME).principal(principal) .accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE))) .andExpect(status().isOk()).andExpect(jsonPath("$.foo").value("bar")); + + // Verify cluster addQueryInHistory is invoked + verify(this.cluster).addQueryInHistory(query, principal.getName()); + } + + @Test + public void dataBrowserQueryWithMessageResult() throws Exception { + String message = "Query is invalid due to error : Region mentioned in query probably missing /"; + doReturn(mapper.createObjectNode().put("message", message)).when(cluster).executeQuery( + anyString(), + anyString(), anyInt()); + + String query = "SELECT * FROM " + REGION_PATH; + this.mockMvc + .perform(get("/dataBrowserQuery").param("query", query) + .param("members", MEMBER_NAME).principal(principal) + .accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE))) + .andExpect(status().isOk()).andExpect(jsonPath("$.message").value(message)); + + // Verify cluster addQueryInHistory is invoked + verify(this.cluster).addQueryInHistory(query, principal.getName()); + } + + @Test + public void dataBrowserQueryWithExceptionResult() throws Exception { + doThrow(new IllegalStateException()).when(cluster).executeQuery(anyString(), + anyString(), anyInt()); + + String query = "SELECT * FROM " + REGION_PATH; + this.mockMvc + .perform(get("/dataBrowserQuery").param("query", query) + .param("members", MEMBER_NAME).principal(principal) + .accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE))) + .andExpect(status().isOk()).andExpect(content().string("{}")); + + // Verify cluster addQueryInHistory is invoked + verify(this.cluster).addQueryInHistory(query, principal.getName()); + } + + @Test + public void dataBrowserExport() throws Exception { + doReturn(mapper.createObjectNode().put("foo", "bar")).when(cluster).executeQuery(anyString(), + anyString(), anyInt()); + + String query = "SELECT * FROM " + REGION_PATH; + this.mockMvc + .perform(get("/dataBrowserExport").param("query", query) + .param("members", MEMBER_NAME).principal(principal) + .accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE))) + .andExpect(status().isOk()) + .andExpect(header().string("Content-Disposition", "attachment; filename=results.json")) + .andExpect(jsonPath("$.foo").value("bar")); + + // Verify cluster addQueryInHistory is invoked + verify(this.cluster).addQueryInHistory(query, principal.getName()); + } + + @Test + public void dataBrowserExportWithMessageResult() throws Exception { + String message = "Query is invalid due to error : Region mentioned in query probably missing /"; + doReturn(mapper.createObjectNode().put("message", message)).when(cluster).executeQuery( + anyString(), + anyString(), anyInt()); + + String query = "SELECT * FROM " + REGION_PATH; + this.mockMvc + .perform(get("/dataBrowserExport").param("query", query) + .param("members", MEMBER_NAME).principal(principal) + .accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE))) + .andExpect(status().isOk()) + .andExpect(header().string("Content-Disposition", "attachment; filename=results.json")) + .andExpect(jsonPath("$.message").value(message)); + + // Verify cluster addQueryInHistory is invoked + verify(this.cluster).addQueryInHistory(query, principal.getName()); + } + + @Test + public void dataBrowserExportWithExceptionResult() throws Exception { + doThrow(new IllegalStateException()).when(cluster).executeQuery(anyString(), + anyString(), anyInt()); + + String query = "SELECT * FROM " + REGION_PATH; + this.mockMvc + .perform(get("/dataBrowserExport").param("query", query) + .param("members", MEMBER_NAME).principal(principal) + .accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE))) + .andExpect(status().isOk()) + .andExpect(header().string("Content-Disposition", "attachment; filename=results.json")) + .andExpect(content().string("{}")); + + // Verify cluster addQueryInHistory is invoked + verify(this.cluster).addQueryInHistory(query, principal.getName()); } @Test 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 index b74c243fece9..4ba3a5edfd0d 100644 --- 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 @@ -319,27 +319,7 @@ public void dataBrowserQuery(HttpServletRequest request, HttpServletResponse res logger.debug(e); } - ObjectNode queryResult = mapper.createObjectNode(); - try { - - if (StringUtils.isNotBlank(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) { - logger.debug("Exception Occurred : ", e); - } + ObjectNode queryResult = executeQuery(request, query, members, limit); response.getOutputStream().write(queryResult.toString().getBytes()); } @@ -406,27 +386,7 @@ public void dataBrowserExport(HttpServletRequest request, HttpServletResponse re logger.debug(e); } - ObjectNode queryResult = mapper.createObjectNode(); - try { - - if (StringUtils.isNotBlank(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) { - logger.debug("Exception Occurred : ", e); - } + ObjectNode queryResult = executeQuery(request, query, members, limit); response.setContentType("application/json"); response.setHeader("Content-Disposition", "attachment; filename=results.json"); @@ -474,4 +434,27 @@ public void getQueryStatisticsGridModel(HttpServletRequest request, HttpServletR logger.debug("Exception Occurred : ", e); } } + + private ObjectNode executeQuery(HttpServletRequest request, String query, String members, + int limit) { + ObjectNode queryResult = mapper.createObjectNode(); + try { + + if (StringUtils.isNotBlank(query)) { + // get cluster object + Cluster cluster = Repository.get().getCluster(); + String userName = request.getUserPrincipal().getName(); + + // Add html escaped query to history + String escapedQuery = StringEscapeUtils.escapeHtml(query); + cluster.addQueryInHistory(escapedQuery, userName); + + // Call execute query method + queryResult = cluster.executeQuery(query, members, limit); + } + } catch (Exception e) { + logger.debug("Exception Occurred : ", e); + } + return queryResult; + } } diff --git a/geode-pulse/src/main/webapp/scripts/pulsescript/pages/DataBrowserQuery.js b/geode-pulse/src/main/webapp/scripts/pulsescript/pages/DataBrowserQuery.js index 9ef656ae1da8..2a593828926d 100644 --- a/geode-pulse/src/main/webapp/scripts/pulsescript/pages/DataBrowserQuery.js +++ b/geode-pulse/src/main/webapp/scripts/pulsescript/pages/DataBrowserQuery.js @@ -154,11 +154,11 @@ function executeDBQuery(){ if(!isEmpty($('#memberAccordion').html())){ populateResultGrids(); } - // Update queries list in history panel - updateQueryHistory("view",""); //$('.queryHistoryScroll-pane').jScrollPane();/*Custome scroll*/ } + // Update queries list in history panel + updateQueryHistory("view",""); } // Hide Loading/Busy symbol