diff options
author | Wang,Frank(gw1218) <gw1218@att.com> | 2018-08-22 13:44:09 -0500 |
---|---|---|
committer | Wang,Frank(gw1218) <gw1218@att.com> | 2018-08-23 11:30:21 -0500 |
commit | 44bae6729336dfc47f1aaaa2c4e88f4e32e207ce (patch) | |
tree | 308c674baca1d2ce9ff378964d6392b58b941928 /POLICY-SDK-APP/src/main/java | |
parent | c25e4d412eb573de020ba4e5da48f48451217f52 (diff) |
Enhancement on Dashboard
Enhancement on dashboard by including more info related to CRUD actions
on policies and also providing an advanced search feature.
Issue-ID: POLICY-1042
Change-Id: I987e0ca13824413f90299a366fb4464fca7de06a
Signed-off-by: Wang,Frank(gw1218) <gw1218@att.com>
Diffstat (limited to 'POLICY-SDK-APP/src/main/java')
-rw-r--r-- | POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java | 1011 |
1 files changed, 649 insertions, 362 deletions
diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java index d1483a223..d3af75dfd 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP Policy Engine * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,9 +20,20 @@ package org.onap.policy.controller; - +import com.att.research.xacml.api.pap.PAPException; +import com.att.research.xacml.api.pap.PDP; +import com.att.research.xacml.api.pap.PDPGroup; +import com.att.research.xacml.api.pap.PDPPolicy; +import com.att.research.xacml.util.XACMLProperties; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; +import java.io.PrintWriter; import java.net.MalformedURLException; +import java.sql.Timestamp; +import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -30,7 +41,6 @@ import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; - import javax.management.AttributeNotFoundException; import javax.management.InstanceNotFoundException; import javax.management.MBeanException; @@ -43,7 +53,6 @@ import javax.management.remote.JMXServiceURL; import javax.script.SimpleBindings; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import org.json.JSONObject; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; @@ -51,6 +60,8 @@ import org.onap.policy.dao.SystemLogDbDao; import org.onap.policy.model.PDPGroupContainer; import org.onap.policy.rest.XACMLRestProperties; import org.onap.policy.rest.dao.CommonClassDao; +import org.onap.policy.rest.jpa.PolicyEntity; +import org.onap.policy.utils.PolicyUtils; import org.onap.policy.xacml.api.XACMLErrorConstants; import org.onap.policy.xacml.api.pap.OnapPDP; import org.onap.policy.xacml.api.pap.OnapPDPGroup; @@ -61,365 +72,641 @@ import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -import com.att.research.xacml.api.pap.PAPException; -import com.att.research.xacml.api.pap.PDP; -import com.att.research.xacml.api.pap.PDPGroup; -import com.att.research.xacml.api.pap.PDPPolicy; -import com.att.research.xacml.util.XACMLProperties; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.ObjectMapper; - @Controller @RequestMapping({"/"}) -public class DashboardController extends RestrictedBaseController{ - private static final Logger policyLogger = FlexLogger.getLogger(DashboardController.class); - @Autowired - CommonClassDao commonClassDao; - - @Autowired - SystemLogDbDao systemDAO; - - public void setCommonClassDao(CommonClassDao commonClassDao) { - this.commonClassDao = commonClassDao; - } - public void setSystemLogDbDao(SystemLogDbDao systemDAO){ - this.systemDAO = systemDAO; - } - - private int pdpCount; - private PDPGroupContainer pdpConatiner; - private ArrayList<Object> pdpStatusData; - private ArrayList<Object> papStatusData; - private ArrayList<Object> policyActivityData; - - private PolicyController policyController; - public PolicyController getPolicyController() { - return policyController; - } - - public void setPolicyController(PolicyController policyController) { - this.policyController = policyController; - } - - private PolicyController getPolicyControllerInstance(){ - return policyController != null ? getPolicyController() : new PolicyController(); - } - - @RequestMapping(value={"/get_DashboardLoggingData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE) - public void getData(HttpServletRequest request, HttpServletResponse response){ - try{ - Map<String, Object> model = new HashMap<>(); - ObjectMapper mapper = new ObjectMapper(); - model.put("availableLoggingDatas", mapper.writeValueAsString(systemDAO.getLoggingData())); - JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); - JSONObject j = new JSONObject(msg); - response.getWriter().write(j.toString()); - } - catch (Exception e){ - policyLogger.error("Exception Occured"+e); - } - } - - @RequestMapping(value={"/get_DashboardSystemAlertData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE) - public void getSystemAlertData(HttpServletRequest request, HttpServletResponse response){ - try{ - Map<String, Object> model = new HashMap<>(); - ObjectMapper mapper = new ObjectMapper(); - model.put("systemAlertsTableDatas", mapper.writeValueAsString(systemDAO.getSystemAlertData())); - JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); - JSONObject j = new JSONObject(msg); - response.getWriter().write(j.toString()); - } - catch (Exception e){ - policyLogger.error("Exception Occured"+e); - } - } - - @RequestMapping(value={"/get_DashboardPAPStatusData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE) - public void getPAPStatusData(HttpServletRequest request, HttpServletResponse response){ - try{ - Map<String, Object> model = new HashMap<>(); - ObjectMapper mapper = new ObjectMapper(); - mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); - addPAPToTable(); - model.put("papTableDatas", mapper.writeValueAsString(papStatusData)); - JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); - JSONObject j = new JSONObject(msg); - response.getWriter().write(j.toString()); - } - catch (Exception e){ - policyLogger.error("Exception Occured"+e); - } - } - - @RequestMapping(value={"/get_DashboardPDPStatusData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE) - public void getPDPStatusData(HttpServletRequest request, HttpServletResponse response){ - try{ - Map<String, Object> model = new HashMap<>(); - ObjectMapper mapper = new ObjectMapper(); - mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); - PolicyController controller = getPolicyControllerInstance(); - this.pdpConatiner = new PDPGroupContainer(controller.getPapEngine()); - addPDPToTable(); - model.put("pdpTableDatas", mapper.writeValueAsString(pdpStatusData)); - JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); - JSONObject j = new JSONObject(msg); - response.getWriter().write(j.toString()); - } - catch (Exception e){ - policyLogger.error("Exception Occured"+e); - } - } - - @RequestMapping(value={"/get_DashboardPolicyActivityData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE) - public void getPolicyActivityData(HttpServletRequest request, HttpServletResponse response){ - try{ - Map<String, Object> model = new HashMap<>(); - ObjectMapper mapper = new ObjectMapper(); - mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); - PolicyController controller = getPolicyControllerInstance(); - this.pdpConatiner = new PDPGroupContainer(controller.getPapEngine()); - addPolicyToTable(); - model.put("policyActivityTableDatas", mapper.writeValueAsString(policyActivityData)); - JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); - JSONObject j = new JSONObject(msg); - response.getWriter().write(j.toString()); - } - catch (Exception e){ - policyLogger.error("Exception Occured"+e); - } - } - - /* - * Add the PAP information to the PAP Table - */ - public void addPAPToTable(){ - papStatusData = new ArrayList<>(); - String papStatus = null; - try { - PolicyController controller = getPolicyControllerInstance(); - Set<OnapPDPGroup> groups = controller.getPapEngine().getOnapPDPGroups(); - if (groups == null) { - throw new PAPException("PAP not running"); - }else { - papStatus = "IS_OK"; - } - } catch (PAPException | NullPointerException e1) { - papStatus = "CANNOT_CONNECT"; - policyLogger.error("Error getting PAP status, PAP not responding to requests", e1); - } - String papURL = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_URL); - JSONObject object = new JSONObject(); - object.put("system", papURL); - object.put("status", papStatus); - List<Object> data = commonClassDao.getDataByQuery("from PolicyEntity", new SimpleBindings()); - object.put("noOfPolicy", data.size()); - object.put("noOfConnectedTrap", pdpCount); - papStatusData.add(0, object); - } - - /** - * Add PDP Information to the PDP Table - * - */ - public void addPDPToTable(){ - pdpCount = 0; - pdpStatusData = new ArrayList<>(); - long naCount; - long denyCount = 0; - long permitCount = 0; - for (PDPGroup group : this.pdpConatiner.getGroups()){ - for (PDP pdp : group.getPdps()){ - naCount = -1; - if ("UP_TO_DATE".equals(pdp.getStatus().getStatus().toString()) && ((OnapPDP) pdp).getJmxPort() != 0){ - String pdpIpAddress = parseIPSystem(pdp.getId()); - int port = ((OnapPDP) pdp).getJmxPort(); - if (port != 0){ - policyLogger.debug("Getting JMX Response Counts from " + pdpIpAddress + " at JMX port " + port); - naCount = getRequestCounts(pdpIpAddress, port, "pdpEvaluationNA"); - permitCount = getRequestCounts(pdpIpAddress, port, "PdpEvaluationPermit"); - denyCount = getRequestCounts(pdpIpAddress, port, "PdpEvaluationDeny"); - } - } - if (naCount == -1){ - JSONObject object = new JSONObject(); - object.put("id", pdp.getId()); - object.put("name", pdp.getName()); - object.put("groupname", group.getName()); - object.put("status", pdp.getStatus().getStatus().toString()); - object.put("description", pdp.getDescription()); - object.put("permitCount", "NA"); - object.put("denyCount", "NA"); - object.put("naCount", "NA"); - pdpStatusData.add(object); - }else{ - JSONObject object = new JSONObject(); - object.put("id", pdp.getId()); - object.put("name", pdp.getName()); - object.put("groupname", group.getName()); - object.put("status", pdp.getStatus().getStatus().toString()); - object.put("description", pdp.getDescription()); - object.put("permitCount", permitCount); - object.put("denyCount", denyCount); - object.put("naCount", naCount); - pdpStatusData.add(object); - } - pdpCount++; - } - } - } - - private static String parseIPSystem(String line) { - Pattern pattern = Pattern.compile("://(.+?):"); - Matcher ip = pattern.matcher(line); - if (ip.find()) - { - return ip.group(1); - } - return null; - } - - /* - * Contact JMX Connector Sever and return the value of the given jmxAttribute - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - private long getRequestCounts(String host, int port, String jmxAttribute) { - - policyLogger.debug("Create an RMI connector client and connect it to the JMX connector server"); - HashMap map = null; - try (JMXConnector jmxConnection = JMXConnectorFactory.newJMXConnector(createConnectionURL(host, port), map)){ - jmxConnection.connect(); - Object o = jmxConnection.getMBeanServerConnection().getAttribute(new ObjectName("PdpRest:type=PdpRestMonitor"), jmxAttribute); - policyLogger.debug("pdpEvaluationNA value retreived: " + o); - return (long) o; - } catch (MalformedURLException e) { - policyLogger.error("MalformedURLException for JMX connection" , e); - } catch (IOException e) { - policyLogger.error("Error in reteriving" + jmxAttribute + " from JMX connection", e); - } catch (AttributeNotFoundException e) { - policyLogger.error("AttributeNotFoundException " + jmxAttribute + " for JMX connection", e); - } catch (InstanceNotFoundException e) { - policyLogger.error("InstanceNotFoundException " + host + " for JMX connection", e); - } catch (MalformedObjectNameException e) { - policyLogger.error("MalformedObjectNameException for JMX connection", e); - } catch (MBeanException e) { - policyLogger.error("MBeanException for JMX connection"); - policyLogger.error("Exception Occured"+e); - } catch (ReflectionException e) { - policyLogger.error("ReflectionException for JMX connection", e); - } - - return -1; - } - - private static JMXServiceURL createConnectionURL(String host, int port) throws MalformedURLException{ - return new JMXServiceURL("rmi", "", 0, "/jndi/rmi://" + host + ":" + port + "/jmxrmi"); - } - - - /* - * Add the information to the Policy Table - */ - private void addPolicyToTable() { - policyActivityData = new ArrayList<>(); - String policyID; - int policyFireCount; - Map<String, String> policyMap = new HashMap<>(); - Object policyList; - //get list of policy - - for (PDPGroup group : this.pdpConatiner.getGroups()){ - for (PDPPolicy policy : group.getPolicies()){ - try{ - policyMap.put(policy.getPolicyId().replace(" ", ""), policy.getId()); - }catch(Exception e){ - policyLogger.error(XACMLErrorConstants.ERROR_SCHEMA_INVALID+policy.getName() +e); - } - } - - for (PDP pdp : group.getPdps()){ - // Add rows to the Policy Table - policyList = null; - if ("UP_TO_DATE".equals(pdp.getStatus().getStatus().toString()) && ((OnapPDP) pdp).getJmxPort() != 0){ - String pdpIpAddress = parseIPSystem(pdp.getId()); - policyList = getPolicy(pdpIpAddress, ((OnapPDP) pdp).getJmxPort(), "policyCount"); - } - if (policyList != null && policyList.toString().length() > 3){ - String[] splitPolicy = policyList.toString().split(","); - for (String policyKeyValue : splitPolicy){ - policyID = urnPolicyID(policyKeyValue); - policyFireCount = countPolicyID(policyKeyValue); - if (policyID != null && policyMap.containsKey(policyID)){ - JSONObject object = new JSONObject(); - object.put("policyId", policyMap.get(policyID)); - object.put("fireCount", policyFireCount); - object.put("system", pdp.getId()); - policyActivityData.add(object); - } - } - }else { - if (policyList != null){ - JSONObject object = new JSONObject(); - object.put("policyId", "Unable to retrieve policy information"); - object.put("fireCount", "NA"); - object.put("system", pdp.getId()); - policyActivityData.add(object); - }else{ - JSONObject object = new JSONObject(); - object.put("policyId", "Unable to access PDP JMX Server"); - object.put("fireCount", "NA"); - object.put("system", pdp.getId()); - policyActivityData.add(object); - } - } - } - } - } - - /* - * Contact JMX Connector Sever and return the list of {policy id , count} - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - private Object getPolicy(String host, int port, String jmxAttribute){ - policyLogger.debug("Create an RMI connector client and connect it to the JMX connector server for Policy: " + host); - HashMap map = null; - try (JMXConnector jmxConnection = JMXConnectorFactory.newJMXConnector(createConnectionURL(host, port), map)) { - jmxConnection.connect(); - Object o = jmxConnection.getMBeanServerConnection().getAttribute(new ObjectName("PdpRest:type=PdpRestMonitor"), "policyMap"); - policyLogger.debug("policyMap value retreived: " + o); - return o; - } catch (MalformedURLException e) { - policyLogger.error("MalformedURLException for JMX connection" , e); - } catch (IOException e) { - policyLogger.error("AttributeNotFoundException for policyMap" , e); - } catch (AttributeNotFoundException e) { - policyLogger.error("AttributeNotFoundException for JMX connection", e); - } catch (InstanceNotFoundException e) { - policyLogger.error("InstanceNotFoundException " + host + " for JMX connection", e); - } catch (MalformedObjectNameException e) { - policyLogger.error("MalformedObjectNameException for JMX connection", e); - } catch (MBeanException e) { - policyLogger.error("MBeanException for JMX connection", e); - policyLogger.error("Exception Occured"+e); - } catch (ReflectionException e) { - policyLogger.error("ReflectionException for JMX connection", e); - } - - return null; - - } - - private static String urnPolicyID(String line){ - String[] splitLine = line.split("="); - String removeSpaces = splitLine[0].replaceAll("\\s+", ""); - return removeSpaces.replace("{", ""); - } - - private static Integer countPolicyID(String line){ - String[] splitLine = line.split("="); - String sCount = splitLine[1].replace("}", ""); - return Integer.parseInt(sCount); - } +public class DashboardController extends RestrictedBaseController { + private static final Logger policyLogger = FlexLogger.getLogger(DashboardController.class); + @Autowired + CommonClassDao commonClassDao; + + @Autowired + SystemLogDbDao systemDAO; + + public void setCommonClassDao(CommonClassDao commonClassDao) { + this.commonClassDao = commonClassDao; + } + + public void setSystemLogDbDao(SystemLogDbDao systemDAO) { + this.systemDAO = systemDAO; + } + + private int pdpCount; + private PDPGroupContainer pdpConatiner; + private ArrayList<Object> pdpStatusData; + private ArrayList<Object> papStatusData; + private ArrayList<Object> policyStatusCrudData; + private ArrayList<Object> pdpStatusCrudData; + private ArrayList<Object> policyActivityData; + private PolicyController policyController; + private static String defaultTime = "0000-00-00"; + private static String createDate = "createdDate"; + private static String modifiedDate = "modifiedDate"; + private static String scope = "scope"; + private static String stage = "stage"; + private static String exceptionOccured = "Exception Occured"; + + public PolicyController getPolicyController() { + return policyController; + } + + public void setPolicyController(PolicyController policyController) { + this.policyController = policyController; + } + + private PolicyController getPolicyControllerInstance() { + return policyController != null ? getPolicyController() : new PolicyController(); + } + + + + /** + * This method is to retrieve all the data of last 30 days from PolicyEntity table as default. + * + * @param request object + * @param response object contains retrieved data + */ + @RequestMapping(value = {"/get_DashboardPolicyCRUDData"}, + method = {org.springframework.web.bind.annotation.RequestMethod.GET}, + produces = MediaType.APPLICATION_JSON_VALUE) + public void get_DashboardPolicyCrudData(HttpServletRequest request, HttpServletResponse response) { + try { + Map<String, Object> model = new HashMap<>(); + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + addPolicyCrudInfoToTable(); + model.put("papStatusCRUDData", mapper.writeValueAsString(policyStatusCrudData)); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + } catch (Exception e) { + policyLogger.error(exceptionOccured, e); + } + } + + /** + * This method retrieves data based on input criteria. + * + * @param request object + * @param response object contains retrieved data + */ + @RequestMapping(value = {"/dashboardController/dashboardAdvancedSearch.htm"}, + method = {org.springframework.web.bind.annotation.RequestMethod.POST}) + public void dashboardAdvancedSearch(HttpServletRequest request, HttpServletResponse response) throws IOException { + String lscope = null; + String lstage = "both"; + String isDelected = "both"; + String ttlDateAfter = null; + String ttlDateBefore = null; + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + JsonNode root = mapper.readTree(request.getReader()); + JsonNode inputData = root.get("policyData"); + JsonNode jscope = inputData.path(scope); + if (jscope != null) { + lscope = jscope.textValue(); + } + JsonNode jstage = inputData.path(stage); + if (jstage != null) { + lstage = jstage.textValue(); + } + JsonNode jisDelected = inputData.path("isDelected"); + if (jisDelected != null) { + isDelected = jisDelected.textValue(); + } + JsonNode jttlDateAfter = inputData.path("ttlDate_after"); + if (jttlDateAfter != null) { + ttlDateAfter = jttlDateAfter.textValue(); + } + JsonNode jttlDateBefore = inputData.path("ttlDate_before"); + if (jttlDateBefore != null) { + ttlDateBefore = jttlDateBefore.textValue(); + } + getPolicyData(lscope, lstage, isDelected, ttlDateAfter, ttlDateBefore); + Map<String, Object> model = new HashMap<>(); + model.put("policyStatusCRUDData", mapper.writeValueAsString(policyStatusCrudData)); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + } catch (Exception e) { + response.setCharacterEncoding("UTF-8"); + PrintWriter out = response.getWriter(); + out.write(PolicyUtils.CATCH_EXCEPTION); + } + + } + + /** + * This method is to retrieve data from PolicyEntity table. + * + * @param request object + * @param response object contains retrieved data + */ + @RequestMapping(value = {"/get_DashboardPdpPolicyCRUDData"}, + method = {org.springframework.web.bind.annotation.RequestMethod.GET}, + produces = MediaType.APPLICATION_JSON_VALUE) + public void get_DashboardPdpPolicyCrudData(HttpServletRequest request, HttpServletResponse response) { + try { + Map<String, Object> model = new HashMap<>(); + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + model.put("pdpStatusCRUDData", mapper.writeValueAsString(pdpStatusCrudData)); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + } catch (Exception e) { + policyLogger.error(exceptionOccured, e); + } + } + + @RequestMapping(value = {"/get_DashboardLoggingData"}, + method = {org.springframework.web.bind.annotation.RequestMethod.GET}, + produces = MediaType.APPLICATION_JSON_VALUE) + public void getData(HttpServletRequest request, HttpServletResponse response) { + try { + Map<String, Object> model = new HashMap<>(); + ObjectMapper mapper = new ObjectMapper(); + model.put("availableLoggingDatas", mapper.writeValueAsString(systemDAO.getLoggingData())); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + } catch (Exception e) { + policyLogger.error(exceptionOccured + e); + } + } + + @RequestMapping(value = {"/get_DashboardSystemAlertData"}, + method = {org.springframework.web.bind.annotation.RequestMethod.GET}, + produces = MediaType.APPLICATION_JSON_VALUE) + public void getSystemAlertData(HttpServletRequest request, HttpServletResponse response) { + try { + Map<String, Object> model = new HashMap<>(); + ObjectMapper mapper = new ObjectMapper(); + model.put("systemAlertsTableDatas", mapper.writeValueAsString(systemDAO.getSystemAlertData())); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + } catch (Exception e) { + policyLogger.error(exceptionOccured + e); + } + } + + @RequestMapping(value = {"/get_DashboardPAPStatusData"}, + method = {org.springframework.web.bind.annotation.RequestMethod.GET}, + produces = MediaType.APPLICATION_JSON_VALUE) + public void getPAPStatusData(HttpServletRequest request, HttpServletResponse response) { + try { + Map<String, Object> model = new HashMap<>(); + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + addPAPToTable(); + model.put("papTableDatas", mapper.writeValueAsString(papStatusData)); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + } catch (Exception e) { + policyLogger.error(exceptionOccured + e); + } + } + + @RequestMapping(value = {"/get_DashboardPDPStatusData"}, + method = {org.springframework.web.bind.annotation.RequestMethod.GET}, + produces = MediaType.APPLICATION_JSON_VALUE) + public void getPDPStatusData(HttpServletRequest request, HttpServletResponse response) { + try { + Map<String, Object> model = new HashMap<>(); + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + PolicyController controller = getPolicyControllerInstance(); + this.pdpConatiner = new PDPGroupContainer(controller.getPapEngine()); + addPDPToTable(); + model.put("pdpTableDatas", mapper.writeValueAsString(pdpStatusData)); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + } catch (Exception e) { + policyLogger.error(exceptionOccured + e); + } + } + + @RequestMapping(value = {"/get_DashboardPolicyActivityData"}, + method = {org.springframework.web.bind.annotation.RequestMethod.GET}, + produces = MediaType.APPLICATION_JSON_VALUE) + public void getPolicyActivityData(HttpServletRequest request, HttpServletResponse response) { + try { + Map<String, Object> model = new HashMap<>(); + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + PolicyController controller = getPolicyControllerInstance(); + this.pdpConatiner = new PDPGroupContainer(controller.getPapEngine()); + addPolicyToTable(); + model.put("policyActivityTableDatas", mapper.writeValueAsString(policyActivityData)); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + } catch (Exception e) { + policyLogger.error(exceptionOccured + e); + } + } + + /* + * Add the PAP information to the PAP Table + */ + public void addPAPToTable() { + papStatusData = new ArrayList<>(); + String papStatus = null; + try { + PolicyController controller = getPolicyControllerInstance(); + Set<OnapPDPGroup> groups = controller.getPapEngine().getOnapPDPGroups(); + if (groups == null) { + throw new PAPException("PAP not running"); + } else { + papStatus = "IS_OK"; + } + } catch (PAPException | NullPointerException e1) { + papStatus = "CANNOT_CONNECT"; + policyLogger.error("Error getting PAP status, PAP not responding to requests", e1); + } + String papURL = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_URL); + JSONObject object = new JSONObject(); + object.put("system", papURL); + object.put("status", papStatus); + List<Object> data = commonClassDao.getDataByQuery("from PolicyEntity", new SimpleBindings()); + object.put("noOfPolicy", data.size()); + object.put("noOfConnectedTrap", pdpCount); + papStatusData.add(0, object); + } + + + /* + * Add the PAP Policy information to the PAP Table + */ + public void addPolicyCrudInfoToTable() { + policyStatusCrudData = new ArrayList<>(); + LocalDate now = LocalDate.now(); + LocalDate lastThirtyDate = now.minusDays(30); + policyLogger.info("now: " + now); + policyLogger.info("thirty: " + lastThirtyDate); + String entityquery = "from PolicyEntity where created_date >= :createdDate"; + SimpleBindings geParams = new SimpleBindings(); + geParams.put(createDate, lastThirtyDate.toString()); + List<Object> datas = commonClassDao.getDataByQuery(entityquery, geParams); + + if (datas == null) { + return; + } + + datas.stream().forEach((data) -> { + JSONObject object = new JSONObject(); + object.put("id", ((PolicyEntity) data).getPolicyId()); + object.put(scope, ((PolicyEntity) data).getScope()); + object.put("policyName", ((PolicyEntity) data).getPolicyName()); + object.put("version", ((PolicyEntity) data).getVersion()); + if (isPushedToPDP(((PolicyEntity) data).getPolicyId())) { + object.put(stage, "PDP"); + } else { + object.put(stage, "PAP"); + } + object.put("createdBy", ((PolicyEntity) data).getCreatedBy()); + object.put("deleted", ((PolicyEntity) data).isDeleted()); + object.put("deleteReasonCode", ((PolicyEntity) data).getDeleteReasonCode()); + object.put("deletedBy", ((PolicyEntity) data).getDeletedBy()); + object.put("modifiedBy", ((PolicyEntity) data).getModifiedBy()); + if (((PolicyEntity) data).getModifiedDate() != null) { + Timestamp ts = new Timestamp(((PolicyEntity) data).getModifiedDate().getTime()); + Timestamp cts = new Timestamp(((PolicyEntity) data).getCreatedDate().getTime()); + object.put(modifiedDate, ts.toString()); + object.put(createDate, cts.toString()); + } else { + object.put(modifiedDate, defaultTime); + object.put(createDate, defaultTime); + } + policyStatusCrudData.add(object); + }); + } + + /* + * Add the PDP Policy information to the PDP Table + */ + private boolean isPushedToPDP(long policyId) { + try { + String groupEntityquery = "from PolicyGroupEntity where policyid = :policyEntityId"; + SimpleBindings geParams = new SimpleBindings(); + geParams.put("policyEntityId", policyId); + List<Object> groupobject = commonClassDao.getDataByQuery(groupEntityquery, geParams); + if (groupobject != null && groupobject.size() > 0) { + return true; + } + } catch (Exception e) { + policyLogger.error(exceptionOccured + e); + } + + return false; + } + + /* + * Add the Policy information to the policyStatusCRUDDataTable + */ + private void getPolicyData(String inputScope, String inputStage, String isDeleted, String createdAfter, String createdBefore) { + policyStatusCrudData = new ArrayList<>(); + List<Object> policyData = null; + SimpleBindings geParams = new SimpleBindings(); + try { + StringBuilder entityquery = buildSqlQuery(inputScope, isDeleted, createdAfter, createdBefore); + if (entityquery == null) { + return; + } + policyLogger.info("entityquery: " + entityquery.toString()); + policyLogger.info("geParams: " + geParams.toString()); + + policyData = commonClassDao.getDataByQuery(entityquery.toString(), geParams); + if (policyData == null) { + return; + } + policyData.stream().forEach((data) -> { + JSONObject object = populatePolicyData((PolicyEntity) data); + + if (object.get(stage).equals("PDP") && "PDP".equalsIgnoreCase(inputStage)) { + policyStatusCrudData.add(object); + } + if (object.get(stage).equals("PAP") && "PAP".equalsIgnoreCase(inputStage)) { + policyStatusCrudData.add(object); + } + if ("both".equalsIgnoreCase(inputStage)) { + policyStatusCrudData.add(object); + } + }); + } catch (Exception e) { + policyLogger.error(exceptionOccured, e); + } + } + + /* + * Build SQL query + */ + private StringBuilder buildSqlQuery(String scope, String isDeleted, String createdAfter, String createdBefore) { + SimpleBindings geParams = new SimpleBindings(); + + // since scope is required + if (scope == null || scope.isEmpty()) { + return null; + } else { + geParams.put(scope, "%" + scope + "%"); + } + StringBuilder entityquery = new StringBuilder("from PolicyEntity where scope like :scope "); + if (!"both".equalsIgnoreCase(isDeleted)) { + entityquery.append(" and deleted = :isDeleted"); + if ("Yes".equalsIgnoreCase(isDeleted)) { + geParams.put("isDeleted", true); + } else { + geParams.put("isDeleted", false); + } + } + if (createdAfter != null && !createdAfter.isEmpty()) { + entityquery.append(" and created_date >= :createdAfter"); + geParams.put("createdAfter", createdAfter); + } + if (createdBefore != null && !createdBefore.isEmpty()) { + entityquery.append(" and created_date <= :createdBefore"); + geParams.put("createdBefore", createdBefore); + } + return entityquery; + } + + private JSONObject populatePolicyData(PolicyEntity data) { + JSONObject object = new JSONObject(); + object.put("id", data.getPolicyId()); + object.put(scope, data.getScope()); + object.put("policyName", data.getPolicyName()); + object.put("version", data.getVersion()); + if (isPushedToPDP(data.getPolicyId())) { + object.put(stage, "PDP"); + } else { + object.put(stage, "PAP"); + } + object.put("createdBy", data.getCreatedBy()); + object.put("deleted", data.isDeleted()); + object.put("deleteReasonCode", data.getDeleteReasonCode()); + object.put("deletedBy", data.getDeletedBy()); + object.put("modifiedBy", data.getModifiedBy()); + if (data.getModifiedDate() != null) { + Timestamp ts = new Timestamp(data.getModifiedDate().getTime()); + Timestamp cts = new Timestamp(data.getCreatedDate().getTime()); + object.put(modifiedDate, ts.toString()); + object.put(createDate, cts.toString()); + } else { + object.put(modifiedDate, defaultTime); + object.put(createDate, defaultTime); + } + + return object; + } + + /** + * Add PDP Information to the PDP Table + * + */ + public void addPDPToTable() { + pdpCount = 0; + pdpStatusData = new ArrayList<>(); + long naCount; + long denyCount = 0; + long permitCount = 0; + for (PDPGroup group : this.pdpConatiner.getGroups()) { + for (PDP pdp : group.getPdps()) { + naCount = -1; + if ("UP_TO_DATE".equals(pdp.getStatus().getStatus().toString()) && ((OnapPDP) pdp).getJmxPort() != 0) { + String pdpIpAddress = parseIPSystem(pdp.getId()); + int port = ((OnapPDP) pdp).getJmxPort(); + if (port != 0) { + policyLogger.debug("Getting JMX Response Counts from " + pdpIpAddress + " at JMX port " + port); + naCount = getRequestCounts(pdpIpAddress, port, "pdpEvaluationNA"); + permitCount = getRequestCounts(pdpIpAddress, port, "PdpEvaluationPermit"); + denyCount = getRequestCounts(pdpIpAddress, port, "PdpEvaluationDeny"); + } + } + if (naCount == -1) { + JSONObject object = new JSONObject(); + object.put("id", pdp.getId()); + object.put("name", pdp.getName()); + object.put("groupname", group.getName()); + object.put("status", pdp.getStatus().getStatus().toString()); + object.put("description", pdp.getDescription()); + object.put("permitCount", "NA"); + object.put("denyCount", "NA"); + object.put("naCount", "NA"); + pdpStatusData.add(object); + } else { + JSONObject object = new JSONObject(); + object.put("id", pdp.getId()); + object.put("name", pdp.getName()); + object.put("groupname", group.getName()); + object.put("status", pdp.getStatus().getStatus().toString()); + object.put("description", pdp.getDescription()); + object.put("permitCount", permitCount); + object.put("denyCount", denyCount); + object.put("naCount", naCount); + pdpStatusData.add(object); + } + pdpCount++; + } + } + } + + private static String parseIPSystem(String line) { + Pattern pattern = Pattern.compile("://(.+?):"); + Matcher ip = pattern.matcher(line); + if (ip.find()) { + return ip.group(1); + } + return null; + } + + /* + * Contact JMX Connector Sever and return the value of the given jmxAttribute + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + private long getRequestCounts(String host, int port, String jmxAttribute) { + + policyLogger.debug("Create an RMI connector client and connect it to the JMX connector server"); + HashMap map = null; + try (JMXConnector jmxConnection = JMXConnectorFactory.newJMXConnector(createConnectionURL(host, port), map)) { + jmxConnection.connect(); + Object o = + jmxConnection.getMBeanServerConnection().getAttribute( + new ObjectName("PdpRest:type=PdpRestMonitor"), jmxAttribute); + policyLogger.debug("pdpEvaluationNA value retreived: " + o); + return (long) o; + } catch (MalformedURLException e) { + policyLogger.error("MalformedURLException for JMX connection", e); + } catch (IOException e) { + policyLogger.error("Error in reteriving" + jmxAttribute + " from JMX connection", e); + } catch (AttributeNotFoundException e) { + policyLogger.error("AttributeNotFoundException " + jmxAttribute + " for JMX connection", e); + } catch (InstanceNotFoundException e) { + policyLogger.error("InstanceNotFoundException " + host + " for JMX connection", e); + } catch (MalformedObjectNameException e) { + policyLogger.error("MalformedObjectNameException for JMX connection", e); + } catch (MBeanException e) { + policyLogger.error("MBeanException for JMX connection"); + policyLogger.error(exceptionOccured + e); + } catch (ReflectionException e) { + policyLogger.error("ReflectionException for JMX connection", e); + } + + return -1; + } + + private static JMXServiceURL createConnectionURL(String host, int port) throws MalformedURLException { + return new JMXServiceURL("rmi", "", 0, "/jndi/rmi://" + host + ":" + port + "/jmxrmi"); + } + + + /* + * Add the information to the Policy Table + */ + private void addPolicyToTable() { + policyActivityData = new ArrayList<>(); + String policyID; + int policyFireCount; + Map<String, String> policyMap = new HashMap<>(); + Object policyList; + // get list of policy + + for (PDPGroup group : this.pdpConatiner.getGroups()) { + for (PDPPolicy policy : group.getPolicies()) { + try { + policyMap.put(policy.getPolicyId().replace(" ", ""), policy.getId()); + } catch (Exception e) { + policyLogger.error(XACMLErrorConstants.ERROR_SCHEMA_INVALID + policy.getName() + e); + } + } + + for (PDP pdp : group.getPdps()) { + // Add rows to the Policy Table + policyList = null; + if ("UP_TO_DATE".equals(pdp.getStatus().getStatus().toString()) && ((OnapPDP) pdp).getJmxPort() != 0) { + String pdpIpAddress = parseIPSystem(pdp.getId()); + policyList = getPolicy(pdpIpAddress, ((OnapPDP) pdp).getJmxPort(), "policyCount"); + } + if (policyList != null && policyList.toString().length() > 3) { + String[] splitPolicy = policyList.toString().split(","); + for (String policyKeyValue : splitPolicy) { + policyID = urnPolicyID(policyKeyValue); + policyFireCount = countPolicyID(policyKeyValue); + if (policyID != null && policyMap.containsKey(policyID)) { + JSONObject object = new JSONObject(); + object.put("policyId", policyMap.get(policyID)); + object.put("fireCount", policyFireCount); + object.put("system", pdp.getId()); + policyActivityData.add(object); + } + } + } else { + if (policyList != null) { + JSONObject object = new JSONObject(); + object.put("policyId", "Unable to retrieve policy information"); + object.put("fireCount", "NA"); + object.put("system", pdp.getId()); + policyActivityData.add(object); + } else { + JSONObject object = new JSONObject(); + object.put("policyId", "Unable to access PDP JMX Server"); + object.put("fireCount", "NA"); + object.put("system", pdp.getId()); + policyActivityData.add(object); + } + } + } + } + } + + /* + * Contact JMX Connector Sever and return the list of {policy id , count} + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + private Object getPolicy(String host, int port, String jmxAttribute) { + policyLogger.debug("Create an RMI connector client and connect it to the JMX connector server for Policy: " + + host); + HashMap map = null; + try (JMXConnector jmxConnection = JMXConnectorFactory.newJMXConnector(createConnectionURL(host, port), map)) { + jmxConnection.connect(); + Object o = + jmxConnection.getMBeanServerConnection().getAttribute( + new ObjectName("PdpRest:type=PdpRestMonitor"), "policyMap"); + policyLogger.debug("policyMap value retreived: " + o); + return o; + } catch (MalformedURLException e) { + policyLogger.error("MalformedURLException for JMX connection", e); + } catch (IOException e) { + policyLogger.error("AttributeNotFoundException for policyMap", e); + } catch (AttributeNotFoundException e) { + policyLogger.error("AttributeNotFoundException for JMX connection", e); + } catch (InstanceNotFoundException e) { + policyLogger.error("InstanceNotFoundException " + host + " for JMX connection", e); + } catch (MalformedObjectNameException e) { + policyLogger.error("MalformedObjectNameException for JMX connection", e); + } catch (MBeanException e) { + policyLogger.error("MBeanException for JMX connection", e); + policyLogger.error(exceptionOccured + e); + } catch (ReflectionException e) { + policyLogger.error("ReflectionException for JMX connection", e); + } + + return null; + + } + + private static String urnPolicyID(String line) { + String[] splitLine = line.split("="); + String removeSpaces = splitLine[0].replaceAll("\\s+", ""); + return removeSpaces.replace("{", ""); + } + + private static Integer countPolicyID(String line) { + String[] splitLine = line.split("="); + String sCount = splitLine[1].replace("}", ""); + return Integer.parseInt(sCount); + } } |