/* * * 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.data; 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.log.PulseLogWriter; import org.apache.geode.tools.pulse.internal.util.StringUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Iterator; import java.util.ResourceBundle; import java.util.Scanner; /** * Class DataBrowser This class contains Data browser functionalities for managing queries and * histories. * * @since GemFire version 7.5.Beta 2013-03-25 */ public class DataBrowser { private final PulseLogWriter LOGGER = PulseLogWriter.getLogger(); private final ResourceBundle resourceBundle = Repository.get().getResourceBundle(); private SimpleDateFormat simpleDateFormat = new SimpleDateFormat(PulseConstants.PULSE_QUERY_HISTORY_DATE_PATTERN); private final ObjectMapper mapper = new ObjectMapper(); /** * addQueryInHistory method adds user's query into query history file * * @param userId Logged in User's Id * @param queryText Query text to execute */ public boolean addQueryInHistory(String queryText, String userId) { boolean operationStatus = false; if (StringUtils.isNotNullNotEmptyNotWhiteSpace(queryText) && StringUtils.isNotNullNotEmptyNotWhiteSpace(userId)) { // Fetch all queries from query log file ObjectNode queries = fetchAllQueriesFromFile(); // Get user's query history list ObjectNode userQueries = (ObjectNode) queries.get(userId); if (userQueries == null) { userQueries = mapper.createObjectNode(); } // Add query in user's query history list userQueries.put(Long.toString(System.currentTimeMillis()), queryText); queries.put(userId, userQueries); // Store queries in file back operationStatus = storeQueriesInFile(queries); } return operationStatus; } /** * deleteQueryById method deletes query from query history file * * @param userId Logged in user's Unique Id * @param queryId Unique Id of Query to be deleted * @return boolean */ public boolean deleteQueryById(String userId, String queryId) { boolean operationStatus = false; if (StringUtils.isNotNullNotEmptyNotWhiteSpace(queryId) && StringUtils.isNotNullNotEmptyNotWhiteSpace(userId)) { // Fetch all queries from query log file ObjectNode queries = fetchAllQueriesFromFile(); // Get user's query history list ObjectNode userQueries = (ObjectNode) queries.get(userId); if (userQueries != null) { // Remove user's query userQueries.remove(queryId); queries.put(userId, userQueries); // Store queries in file back operationStatus = storeQueriesInFile(queries); } } return operationStatus; } /** * getQueryHistoryByUserId method reads and lists out the queries from history file * * @param userId Logged in User's Id */ public ArrayNode getQueryHistoryByUserId(String userId) { ArrayNode queryList = mapper.createArrayNode(); if (StringUtils.isNotNullNotEmptyNotWhiteSpace(userId)) { // Fetch all queries from query log file ObjectNode queries = fetchAllQueriesFromFile(); // Get user's query history list ObjectNode userQueries = (ObjectNode) queries.get(userId); if (userQueries != null) { Iterator<String> it = userQueries.fieldNames(); while (it.hasNext()) { String key = it.next(); ObjectNode queryItem = mapper.createObjectNode(); queryItem.put("queryId", key); queryItem.put("queryText", userQueries.get(key).toString()); queryItem.put("queryDateTime", simpleDateFormat.format(Long.valueOf(key))); queryList.add(queryItem); } } } return queryList; } /** * generateQueryKey method fetches queries from query history file * * @return Properties A collection queries in form of key and values */ private ObjectNode fetchAllQueriesFromFile() { InputStream inputStream = null; JsonNode queriesJSON = mapper.createObjectNode(); try { inputStream = new FileInputStream(Repository.get().getPulseConfig().getQueryHistoryFileName()); String inputStreamString = new Scanner(inputStream, "UTF-8").useDelimiter("\\A").next(); queriesJSON = mapper.readTree(inputStreamString); } catch (FileNotFoundException e) { if (LOGGER.fineEnabled()) { LOGGER.fine(resourceBundle.getString("LOG_MSG_DATA_BROWSER_QUERY_HISTORY_FILE_NOT_FOUND") + " : " + e.getMessage()); } } catch (Exception e) { if (LOGGER.infoEnabled()) { LOGGER.info(e.getMessage()); } } finally { // Close input stream if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { if (LOGGER.infoEnabled()) { LOGGER.info(e.getMessage()); } } } } return (ObjectNode) queriesJSON; } /** * generateQueryKey method stores queries in query history file. * * @return Boolean true is operation is successful, false otherwise */ private boolean storeQueriesInFile(ObjectNode queries) { boolean operationStatus = false; FileOutputStream fileOut = null; File file = new File(Repository.get().getPulseConfig().getQueryHistoryFileName()); try { fileOut = new FileOutputStream(file); // if file does not exists, then create it if (!file.exists()) { file.createNewFile(); } // get the content in bytes byte[] contentInBytes = queries.toString().getBytes(); fileOut.write(contentInBytes); fileOut.flush(); operationStatus = true; } catch (FileNotFoundException e) { if (LOGGER.fineEnabled()) { LOGGER.fine(resourceBundle.getString("LOG_MSG_DATA_BROWSER_QUERY_HISTORY_FILE_NOT_FOUND") + " : " + e.getMessage()); } } catch (IOException e) { if (LOGGER.infoEnabled()) { LOGGER.info(e.getMessage()); } } finally { if (fileOut != null) { try { fileOut.close(); } catch (IOException e) { if (LOGGER.infoEnabled()) { LOGGER.info(e.getMessage()); } } } } return operationStatus; } }