aboutsummaryrefslogtreecommitdiffstats
path: root/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDbDao.java
diff options
context:
space:
mode:
Diffstat (limited to 'ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDbDao.java')
-rw-r--r--ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDbDao.java993
1 files changed, 993 insertions, 0 deletions
diff --git a/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDbDao.java b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDbDao.java
new file mode 100644
index 000000000..9af380b05
--- /dev/null
+++ b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDbDao.java
@@ -0,0 +1,993 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Modified Copyright (C) 2018 Samsung Electronics Co., Ltd.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pap.xacml.rest.components;
+
+import com.att.research.xacml.api.pap.PAPException;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import com.att.research.xacml.util.XACMLProperties;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.io.FilenameUtils;
+import org.hibernate.Criteria;
+import org.hibernate.LockMode;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.criterion.Restrictions;
+import org.onap.policy.common.logging.eelf.MessageCodes;
+import org.onap.policy.common.logging.eelf.PolicyLogger;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.rest.XacmlRestProperties;
+import org.onap.policy.rest.adapter.PolicyRestAdapter;
+import org.onap.policy.rest.dao.PolicyDbException;
+import org.onap.policy.rest.jpa.ActionBodyEntity;
+import org.onap.policy.rest.jpa.ConfigurationDataEntity;
+import org.onap.policy.rest.jpa.DatabaseLockEntity;
+import org.onap.policy.rest.jpa.GroupEntity;
+import org.onap.policy.rest.jpa.PdpEntity;
+import org.onap.policy.rest.jpa.PolicyDbDaoEntity;
+import org.onap.policy.rest.jpa.PolicyEntity;
+import org.onap.policy.utils.PeCryptoUtils;
+import org.onap.policy.xacml.api.XACMLErrorConstants;
+import org.onap.policy.xacml.api.pap.OnapPDP;
+import org.onap.policy.xacml.api.pap.OnapPDPGroup;
+import org.onap.policy.xacml.api.pap.PAPPolicyEngine;
+import org.onap.policy.xacml.std.pap.StdPDPGroup;
+import org.onap.policy.xacml.std.pap.StdPDPPolicy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class PolicyDbDao.
+ */
+@Component
+public class PolicyDbDao {
+ private static final Logger logger = FlexLogger.getLogger(PolicyDbDao.class);
+ public static final String JSON_CONFIG = "JSON";
+ public static final String XML_CONFIG = "XML";
+ public static final String PROPERTIES_CONFIG = "PROPERTIES";
+ public static final String OTHER_CONFIG = "OTHER";
+ public static final String AUDIT_USER = "audit";
+
+ public static final String CONFIG = "Config";
+ public static final String ACTION = "Action";
+ public static final String GROUP_ID = "groupId";
+ public static final String DELETED = "deleted";
+ public static final String GROUPENTITY_SELECT =
+ "SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted";
+ public static final String PDPENTITY_SELECT =
+ "SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted";
+ public static final String GROUP_NOT_FOUND = "The group could not be found with id ";
+ public static final String FOUND_IN_DB_NOT_DEL = " were found in the database that are not deleted";
+ public static final String MORE_THAN_ONE_PDP = "Somehow, more than one pdp with the same id ";
+ public static final String DELETED_STATUS_FOUND = " and deleted status were found in the database";
+ public static final String DUPLICATE_GROUPID = "Somehow, more than one group with the same id ";
+ public static final String PDP_ID = "pdpId";
+ public static final String QUERY_FAILED_FOR_GROUP = "Query failed trying to check for existing group";
+ public static final String QUERY_FAILED_GET_GROUP = "Query failed trying to get group ";
+ public static final String SCOPE = "scope";
+ public static final String POLICYDBDAO_VAR = "PolicyDBDao";
+ public static final String DUP_POLICYID = "Somehow, more than one policy with the id ";
+ public static final String FOUND_IN_DB = " were found in the database";
+
+ private static final String AUDIT_STR = "Audit";
+
+ private static PolicyDbDao currentInstance = null;
+ private static boolean isJunit = false;
+ private static SessionFactory sessionfactory;
+ private List<?> otherServers;
+ private PAPPolicyEngine papEngine;
+
+ /**
+ * Gets the current instance of PolicyDBDao.
+ *
+ * @return The instance of PolicyDBDao or throws exception if the given instance is null.
+ * @throws IllegalStateException if a PolicyDBDao instance is null. Call createPolicyDBDaoInstance
+ * (EntityManagerFactory emf) to get this.
+ */
+ public static PolicyDbDao getPolicyDbDaoInstance() {
+ logger.debug("getPolicyDBDaoInstance() as getPolicyDBDaoInstance() called");
+ if (currentInstance != null) {
+ return currentInstance;
+ } else {
+ currentInstance = new PolicyDbDao("init");
+ }
+ return currentInstance;
+ }
+
+ /**
+ * Sets the pap engine.
+ *
+ * @param papEngine2 the new pap engine
+ */
+ public void setPapEngine(PAPPolicyEngine papEngine2) {
+ this.papEngine = papEngine2;
+ }
+
+ /**
+ * Instantiates a new policy db dao.
+ *
+ * @param sessionFactory the session factory
+ */
+ @Autowired
+ public PolicyDbDao(SessionFactory sessionFactory) {
+ PolicyDbDao.sessionfactory = sessionFactory;
+ }
+
+ /**
+ * Instantiates a new policy db dao.
+ */
+ public PolicyDbDao() {
+ // Default Constructor
+ }
+
+ /**
+ * Initialize the DAO.
+ *
+ * @param init initiation parameters
+ */
+ public PolicyDbDao(String init) {
+ // not needed in this release
+ if (!register()) {
+ PolicyLogger
+ .error("This server's PolicyDBDao instance could not be registered and may not reveive updates");
+ }
+
+ otherServers = getRemotePolicyDbDaoList();
+ if (logger.isDebugEnabled()) {
+ logger.debug("Number of remote PolicyDBDao instances: " + otherServers.size());
+ }
+ if (otherServers.isEmpty()) {
+ logger.warn("List of PolicyDBDao servers is empty or could not be retrieved");
+ }
+ }
+
+ /**
+ * Start a synchronized transaction.
+ *
+ * <p>Not static because we are going to be using the instance's emf waitTime in ms to wait for lock, or -1 to wait
+ * forever (no)
+ *
+ * @param session the session
+ * @param waitTime the wait time
+ */
+ @SuppressWarnings("deprecation")
+ public void startTransactionSynced(Session session, int waitTime) {
+ logger.debug("\n\nstartTransactionSynced(Hibernate Session,int waitTime) as " + "\n startTransactionSynced("
+ + session + "," + waitTime + ") called\n\n");
+ DatabaseLockEntity lock = null;
+ session.beginTransaction();
+ try {
+ if (logger.isDebugEnabled()) {
+ logger.debug("\n\nstartTransactionSynced():" + "\n ATTEMPT to get the DB lock" + "\n\n");
+ }
+ lock = (DatabaseLockEntity) session.get(DatabaseLockEntity.class, 1, LockMode.PESSIMISTIC_WRITE);
+ if (logger.isDebugEnabled()) {
+ logger.debug("\n\nstartTransactionSynced():" + "\n GOT the DB lock" + "\n\n");
+ }
+ } catch (Exception e) {
+ logger.error("Exception Occured" + e);
+ }
+ if (lock == null) {
+ throw new IllegalStateException(
+ "The lock row does not exist in the table. Please create a primary key with value = 1.");
+ }
+
+ }
+
+ /**
+ * Gets the list of other registered PolicyDBDaos from the database.
+ *
+ * @return List (type PolicyDbDaoEntity) of other PolicyDBDaos
+ */
+ private List<?> getRemotePolicyDbDaoList() {
+ logger.debug("getRemotePolicyDBDaoList() as getRemotePolicyDBDaoList() called");
+ List<?> policyDbDaoEntityList = new LinkedList<>();
+ Session session = sessionfactory.openSession();
+ try {
+ Criteria cr = session.createCriteria(PolicyDbDaoEntity.class);
+ policyDbDaoEntityList = cr.list();
+ } catch (Exception e) {
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, POLICYDBDAO_VAR,
+ "Exception querying for other registered PolicyDBDaos");
+ logger.warn("List of remote PolicyDBDaos will be empty", e);
+ } finally {
+ try {
+ session.close();
+ } catch (Exception e) {
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement" + e);
+ }
+ }
+ return policyDbDaoEntityList;
+ }
+
+ /**
+ * Gets the new transaction.
+ *
+ * @return the new transaction
+ */
+ public PolicyDbDaoTransaction getNewTransaction() {
+ logger.debug("getNewTransaction() as getNewTransaction() called");
+ return new PolicyDbDaoTransactionInstance("init");
+ }
+
+ /**
+ * Get a new audit transaction.
+ *
+ * <p>Because the normal transactions are not used in audits, we can use the same transaction mechanism to get a
+ * transaction and obtain the emlock and the DB lock. We just need to provide different transaction timeout values
+ * in ms because the audit will run longer than normal transactions.
+ *
+ * @return the new audit transaction
+ */
+ public PolicyDbDaoTransaction getNewAuditTransaction() {
+ logger.debug("getNewAuditTransaction() as getNewAuditTransaction() called");
+ // Use the standard transaction wait time in ms
+ int auditWaitMs = Integer.parseInt(XACMLProperties.getProperty(XacmlRestProperties.PROP_PAP_TRANS_WAIT));
+ // Use the (extended) audit timeout time in ms
+ int auditTimeoutMs = Integer.parseInt(XACMLProperties.getProperty(XacmlRestProperties.PROP_PAP_AUDIT_TIMEOUT));
+ return new PolicyDbDaoTransactionInstance(auditTimeoutMs, auditWaitMs);
+ }
+
+ /**
+ * Checks if two strings are equal. Null strings ARE allowed.
+ *
+ * @param one A String or null to compare
+ * @param two A String or null to compare
+ * @return true, if successful
+ */
+ public static boolean stringEquals(String one, String two) {
+ logger.debug("stringEquals(String one, String two) as stringEquals(" + one + ", " + two + ") called");
+ if (one == null && two == null) {
+ return true;
+ }
+ if (one == null || two == null) {
+ return false;
+ }
+ return one.equals(two);
+ }
+
+ /**
+ * Returns the url of this local pap server, removing the username and password, if they are present.
+ *
+ * @return The url of this local pap server
+ */
+ public String[] getPapUrlUserPass() {
+ logger.debug("getPapUrl() as getPapUrl() called");
+ String url = XACMLProperties.getProperty(XacmlRestProperties.PROP_PAP_URL);
+ if (url == null) {
+ return null;
+ }
+ return splitPapUrlUserPass(url);
+ }
+
+ /**
+ * Split the user and password of a PAP URL.
+ *
+ * @param url the URL
+ * @return the user and password
+ */
+ public String[] splitPapUrlUserPass(String url) {
+ String[] urlUserPass = new String[3];
+ String[] commaSplit = url.split(",");
+ urlUserPass[0] = commaSplit[0];
+ if (commaSplit.length > 2) {
+ urlUserPass[1] = commaSplit[1];
+ urlUserPass[2] = commaSplit[2];
+ }
+ if (urlUserPass[1] == null || "".equals(urlUserPass[1])) {
+ String usernamePropertyValue = XACMLProperties.getProperty(XacmlRestProperties.PROP_PAP_USERID);
+ if (usernamePropertyValue != null) {
+ urlUserPass[1] = usernamePropertyValue;
+ }
+ }
+ if (urlUserPass[2] == null || "".equals(urlUserPass[2])) {
+ String passwordPropertyValue =
+ PeCryptoUtils.decrypt(XACMLProperties.getProperty(XacmlRestProperties.PROP_PAP_PASS));
+ if (passwordPropertyValue != null) {
+ urlUserPass[2] = passwordPropertyValue;
+ }
+ }
+ // if there is no comma, for some reason there is no user name and
+ // password, so don't try to cut them off
+ return urlUserPass;
+ }
+
+ /**
+ * Register the PolicyDBDao instance in the PolicyDbDaoEntity table.
+ *
+ * @return Boolean, were we able to register?
+ */
+ private boolean register() {
+ logger.debug("register() as register() called");
+ String[] url = getPapUrlUserPass();
+ // --- check URL length
+ if (url == null || url.length < 3) {
+ return false;
+ }
+ Session session = sessionfactory.openSession();
+ try {
+ startTransactionSynced(session, 1000);
+ } catch (IllegalStateException e) {
+ logger.debug("\nPolicyDBDao.register() caught an IllegalStateException: \n" + e + "\n");
+ DatabaseLockEntity lock;
+ lock = (DatabaseLockEntity) session.get(DatabaseLockEntity.class, 1);
+ if (lock == null) {
+ lock = new DatabaseLockEntity();
+ lock.setKey(1);
+ try {
+ session.persist(lock);
+ session.flush();
+ session.getTransaction().commit();
+ session.close();
+ } catch (Exception e2) {
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, POLICYDBDAO_VAR,
+ "COULD NOT CREATE DATABASELOCK ROW. WILL TRY ONE MORE TIME");
+ }
+
+ session = sessionfactory.openSession();
+ try {
+ startTransactionSynced(session, 1000);
+ } catch (Exception e3) {
+ String msg = "DATABASE LOCKING NOT WORKING. CONCURRENCY CONTROL NOT WORKING";
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e3, POLICYDBDAO_VAR, msg);
+ throw new IllegalStateException("msg" + "\n" + e3);
+ }
+ }
+ }
+ logger.debug("\nPolicyDBDao.register. Database locking and concurrency control is initialized\n");
+ PolicyDbDaoEntity foundPolicyDbDaoEntity = null;
+ Criteria cr = session.createCriteria(PolicyDbDaoEntity.class);
+ cr.add(Restrictions.eq("policyDbDaoUrl", url[0]));
+ List<?> data = cr.list();
+ if (!data.isEmpty()) {
+ foundPolicyDbDaoEntity = (PolicyDbDaoEntity) data.get(0);
+ }
+
+ // encrypt the password
+ String txt = PeCryptoUtils.encrypt(url[2]);
+ if (foundPolicyDbDaoEntity == null) {
+ PolicyDbDaoEntity newPolicyDbDaoEntity = new PolicyDbDaoEntity();
+ newPolicyDbDaoEntity.setPolicyDbDaoUrl(url[0]);
+ newPolicyDbDaoEntity.setDescription("PAP server at " + url[0]);
+ newPolicyDbDaoEntity.setUsername(url[1]);
+ newPolicyDbDaoEntity.setPassword(txt);
+ try {
+ session.persist(newPolicyDbDaoEntity);
+ session.getTransaction().commit();
+ } catch (Exception e) {
+ logger.debug(e);
+ try {
+ session.getTransaction().rollback();
+ } catch (Exception e2) {
+ logger.debug(e2);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, POLICYDBDAO_VAR,
+ "Could not add new PolicyDBDao to the database");
+ }
+ }
+ } else {
+ // just want to update in order to change modified date
+ if (url[1] != null && !stringEquals(url[1], foundPolicyDbDaoEntity.getUsername())) {
+ foundPolicyDbDaoEntity.setUsername(url[1]);
+ }
+ if (txt != null && !stringEquals(txt, foundPolicyDbDaoEntity.getPassword())) {
+ foundPolicyDbDaoEntity.setPassword(txt);
+ }
+ foundPolicyDbDaoEntity.preUpdate();
+ try {
+ session.getTransaction().commit();
+ } catch (Exception e) {
+ logger.debug(e);
+ try {
+ session.getTransaction().rollback();
+ } catch (Exception e2) {
+ logger.debug(e2);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, POLICYDBDAO_VAR,
+ "Could not update PolicyDBDao in the database");
+ }
+ }
+ }
+ session.close();
+ logger.debug("\nPolicyDBDao.register(). Success!!\n");
+ return true;
+ }
+
+ /**
+ * Synchronize group policies in the fuile system.
+ *
+ * <p>This method is called during all pushPolicy transactions and makes sure the file system group is in sync with
+ * the database group entity
+ *
+ * @param pdpGroup the pdp group
+ * @param groupentity the groupentity
+ * @return the std PDP group
+ * @throws PAPException the PAP exception
+ * @throws PolicyDbException the policy db exception
+ */
+ public StdPDPGroup synchronizeGroupPoliciesInFileSystem(StdPDPGroup pdpGroup, GroupEntity groupentity)
+ throws PAPException, PolicyDbException {
+
+ HashMap<String, PDPPolicy> currentPolicyMap = new HashMap<>();
+ HashSet<String> newPolicyIdSet = new HashSet<>();
+ HashSet<PDPPolicy> newPolicySet = new HashSet<>();
+
+ for (PDPPolicy pdpPolicy : pdpGroup.getPolicies()) {
+ currentPolicyMap.put(pdpPolicy.getId(), pdpPolicy);
+ }
+
+ for (PolicyEntity policy : groupentity.getPolicies()) {
+ String pdpPolicyId = getPdpPolicyName(policy.getPolicyName(), policy.getScope());
+ newPolicyIdSet.add(pdpPolicyId);
+
+ if (currentPolicyMap.containsKey(pdpPolicyId)) {
+ newPolicySet.add(currentPolicyMap.get(pdpPolicyId));
+ } else {
+ // convert PolicyEntity object to PDPPolicy
+ String name = pdpPolicyId.replace(".xml", "");
+ name = name.substring(0, name.lastIndexOf('.'));
+ InputStream policyStream = new ByteArrayInputStream(policy.getPolicyData().getBytes());
+ pdpGroup.copyPolicyToFile(pdpPolicyId, name, policyStream);
+ URI location = Paths.get(pdpGroup.getDirectory().toAbsolutePath().toString(), pdpPolicyId).toUri();
+ StdPDPPolicy newPolicy = null;
+ try {
+ newPolicy = new StdPDPPolicy(pdpPolicyId, true,
+ removeExtensionAndVersionFromPolicyName(pdpPolicyId), location);
+ newPolicySet.add(newPolicy);
+ logger.info("Adding new policy to PDPGroup - " + newPolicy.getId() + ", Location - " + location);
+ } catch (Exception e) {
+ logger.debug(e);
+ PolicyLogger
+ .error("PolicyDBDao: Exception occurred while creating the StdPDPPolicy newPolicy object "
+ + e.getMessage());
+ }
+ }
+ }
+
+ for (String id : currentPolicyMap.keySet()) {
+ if (!newPolicyIdSet.contains(id)) {
+ try {
+ Files.delete(Paths.get(currentPolicyMap.get(id).getLocation()));
+ } catch (Exception e) {
+ logger.debug(e);
+ PolicyLogger.error(
+ "PolicyDBDao: Exception occurred while attempting to delete the old version of the policy"
+ + " file from the group. " + e.getMessage());
+ }
+ }
+ }
+
+ logger.info("PolicyDBDao: Adding new policy set to group to keep filesystem and DB in sync");
+ pdpGroup.setPolicies(newPolicySet);
+
+ return pdpGroup;
+ }
+
+ /**
+ * Removes the extension and version from policy name.
+ *
+ * @param originalPolicyName the original policy name
+ * @return the string
+ * @throws PolicyDbException the policy db exception
+ */
+ public String removeExtensionAndVersionFromPolicyName(String originalPolicyName) throws PolicyDbException {
+ return getPolicyNameAndVersionFromPolicyFileName(originalPolicyName)[0];
+ }
+
+ /**
+ * Splits apart the policy name and version from a policy file path.
+ *
+ * @param originalPolicyName the original policy name
+ * @return An array [0]: The policy name, [1]: the policy version, as a string
+ * @throws PolicyDbException the policy db exception
+ */
+ public String[] getPolicyNameAndVersionFromPolicyFileName(String originalPolicyName) throws PolicyDbException {
+ String policyName = originalPolicyName;
+ String[] nameAndVersion = new String[2];
+ try {
+ policyName = removeFileExtension(policyName);
+ nameAndVersion[0] = policyName.substring(0, policyName.lastIndexOf('.'));
+ if (isNullOrEmpty(nameAndVersion[0])) {
+ throw new PolicyDbException();
+ }
+ } catch (Exception e) {
+ nameAndVersion[0] = originalPolicyName;
+ logger.debug(e);
+ }
+ try {
+ nameAndVersion[1] = policyName.substring(policyName.lastIndexOf('.') + 1);
+ if (isNullOrEmpty(nameAndVersion[1])) {
+ throw new PolicyDbException();
+ }
+ } catch (Exception e) {
+ nameAndVersion[1] = "1";
+ logger.debug(e);
+ }
+ return nameAndVersion;
+ }
+
+ /**
+ * Get the PDP policy by name.
+ *
+ * @param name The name to get
+ * @param scope The scope to use
+ * @return the policy.
+ */
+ public String getPdpPolicyName(String name, String scope) {
+ String finalName = "";
+ finalName += scope;
+ finalName += ".";
+ finalName += removeFileExtension(name);
+ finalName += ".xml";
+ return finalName;
+ }
+
+ private String removeFileExtension(String fileName) {
+ return fileName.substring(0, fileName.lastIndexOf('.'));
+ }
+
+ /**
+ * Audit local database.
+ *
+ * @param papEngine2 the pap engine 2
+ */
+ public void auditLocalDatabase(PAPPolicyEngine papEngine2) {
+ logger.debug("PolicyDBDao.auditLocalDatabase() is called");
+ try {
+ deleteAllGroupTables();
+ auditGroups(papEngine2);
+ } catch (Exception e) {
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, POLICYDBDAO_VAR, "auditLocalDatabase() error");
+ logger.error("Exception Occured" + e);
+ }
+ }
+
+ /**
+ * Audit local file system.
+ *
+ * @param group the group
+ * @return the std PDP group
+ */
+ public StdPDPGroup auditLocalFileSystem(StdPDPGroup group) {
+
+ logger.info("Starting Local File System group audit");
+ Session session = sessionfactory.openSession();
+ session.getTransaction().begin();
+
+ StdPDPGroup updatedGroup = null;
+ try {
+ Query groupQuery = session.createQuery(GROUPENTITY_SELECT);
+ groupQuery.setParameter(GROUP_ID, group.getId());
+ groupQuery.setParameter(DELETED, false);
+ List<?> groupQueryList = groupQuery.list();
+ if (groupQueryList != null && !groupQueryList.isEmpty()) {
+ GroupEntity dbgroup = (GroupEntity) groupQueryList.get(0);
+ updatedGroup = synchronizeGroupPoliciesInFileSystem(group, dbgroup);
+ logger.info("Group was updated during file system audit: " + updatedGroup.toString());
+ }
+ } catch (PAPException | PolicyDbException e) {
+ logger.error(e);
+ } catch (Exception e) {
+ logger.error(e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, POLICYDBDAO_VAR,
+ "Caught Exception trying to check if group exists groupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check if group " + group.getId() + " exists");
+ }
+
+ session.getTransaction().commit();
+ session.close();
+
+ return updatedGroup;
+ }
+
+ /**
+ * Synchronize config data in file system.
+ */
+ public void synchronizeConfigDataInFileSystem() {
+
+ logger.info("Starting Local File System Config data Sync");
+ // sync both web apps Config and Action
+ syncConfigData(ConfigurationDataEntity.class, CONFIG);
+ syncConfigData(ActionBodyEntity.class, ACTION);
+ }
+
+ private <T> void syncConfigData(Class<T> cl, String type) {
+ Session session = sessionfactory.openSession();
+ try {
+ final Criteria configDataQuery = session.createCriteria(cl.getName());
+ @SuppressWarnings("unchecked")
+ final List<T> configDataResult = configDataQuery.list();
+ Path webappsPath = Paths.get(XACMLProperties.getProperty(XacmlRestProperties.PROP_PAP_WEBAPPS), type);
+
+ for (final T configData : configDataResult) {
+ String configName = null;
+ byte[] configBody;
+ try {
+ if (CONFIG.equalsIgnoreCase(type)) {
+ configName = ((ConfigurationDataEntity) configData).getConfigurationName();
+ configBody =
+ (((ConfigurationDataEntity) configData).getConfigBody() != null)
+ ? ((ConfigurationDataEntity) configData).getConfigBody()
+ .getBytes(StandardCharsets.UTF_8)
+ : "".getBytes();
+ } else {
+ configName = ((ActionBodyEntity) configData).getActionBodyName();
+ configBody = (((ActionBodyEntity) configData).getActionBody() != null)
+ ? ((ActionBodyEntity) configData).getActionBody().getBytes(StandardCharsets.UTF_8)
+ : "".getBytes();
+ }
+ Path filePath = Paths.get(webappsPath.toString(), configName);
+ if (!filePath.toFile().exists()) {
+ Files.write(filePath, configBody);
+ logger.info("Created Config File from DB - " + filePath.toString());
+ }
+ } catch (Exception e) {
+ // log and keep going
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, POLICYDBDAO_VAR,
+ "Exception occured while creating Configuration File - " + configName);
+ }
+ }
+ } catch (final Exception exception) {
+ logger.error("Unable to synchronizeConfigDataInFileSystem", exception);
+ }
+ session.close();
+ }
+
+ /**
+ * Delete all group tables.
+ */
+ public void deleteAllGroupTables() {
+ logger.debug("PolicyDBDao.deleteAllGroupTables() called");
+ Session session = sessionfactory.openSession();
+ session.getTransaction().begin();
+
+ Query deletePdpEntityEntityTableUpdate = session.getNamedQuery("PdpEntity.deleteAll");
+ deletePdpEntityEntityTableUpdate.executeUpdate();
+
+ Query deleteGroupEntityTableUpdate = session.getNamedQuery("GroupEntity.deleteAll");
+ deleteGroupEntityTableUpdate.executeUpdate();
+
+ session.getTransaction().commit();
+ session.close();
+ }
+
+ /**
+ * Audit groups.
+ *
+ * @param papEngine2 the pap engine 2
+ */
+ @SuppressWarnings("unchecked")
+ public void auditGroups(PAPPolicyEngine papEngine2) {
+ logger.debug("PolicyDBDao.auditGroups() called");
+
+ Session session = sessionfactory.openSession();
+ session.getTransaction().begin();
+ try {
+
+ Set<OnapPDPGroup> groups = papEngine2.getOnapPDPGroups();
+
+ for (OnapPDPGroup grp : groups) {
+ try {
+ GroupEntity groupEntity = new GroupEntity();
+ groupEntity.setGroupName(grp.getName());
+ groupEntity.setDescription(grp.getDescription());
+ groupEntity.setDefaultGroup(grp.isDefaultGroup());
+ groupEntity.setCreatedBy(AUDIT_STR);
+ groupEntity.setGroupId(createNewPdpGroupId(grp.getId()));
+ groupEntity.setModifiedBy(AUDIT_STR);
+ session.persist(groupEntity);
+ Set<OnapPDP> pdps = grp.getOnapPdps();
+
+ for (OnapPDP pdp : pdps) {
+ PdpEntity pdpEntity = new PdpEntity();
+ pdpEntity.setGroup(groupEntity);
+ pdpEntity.setJmxPort(pdp.getJmxPort());
+ pdpEntity.setPdpId(pdp.getId());
+ pdpEntity.setPdpName(pdp.getName());
+ pdpEntity.setModifiedBy(AUDIT_STR);
+ pdpEntity.setCreatedBy(AUDIT_STR);
+ session.persist(pdpEntity);
+ }
+
+ Set<PDPPolicy> policies = grp.getPolicies();
+
+ for (PDPPolicy policy : policies) {
+ try {
+ String[] stringArray = getNameScopeAndVersionFromPdpPolicy(policy.getId());
+ if (stringArray == null) {
+ throw new IllegalArgumentException(
+ "Invalid input - policyID must contain name, scope and version");
+ }
+ List<PolicyEntity> policyEntityList;
+ Query getPolicyEntitiesQuery = session.getNamedQuery("PolicyEntity.findByNameAndScope");
+ getPolicyEntitiesQuery.setParameter("name", stringArray[0]);
+ getPolicyEntitiesQuery.setParameter(SCOPE, stringArray[1]);
+
+ policyEntityList = getPolicyEntitiesQuery.list();
+ PolicyEntity policyEntity = null;
+ if (!policyEntityList.isEmpty()) {
+ policyEntity = policyEntityList.get(0);
+ }
+ if (policyEntity != null) {
+ groupEntity.addPolicyToGroup(policyEntity);
+ }
+ } catch (Exception e2) {
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, POLICYDBDAO_VAR,
+ "Exception auditGroups inner catch");
+ }
+ }
+ } catch (Exception e1) {
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, POLICYDBDAO_VAR,
+ "Exception auditGroups middle catch");
+ }
+ }
+ } catch (Exception e) {
+ session.getTransaction().rollback();
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, POLICYDBDAO_VAR, "Exception auditGroups outer catch");
+ session.close();
+ return;
+ }
+
+ session.getTransaction().commit();
+ session.close();
+
+ }
+
+ /**
+ * Gets the config file.
+ *
+ * @param filename the filename
+ * @param policy the policy
+ * @return the config file
+ */
+ public String getConfigFile(String filename, PolicyRestAdapter policy) {
+ if (policy == null) {
+ return getConfigFile(filename, (String) null);
+ }
+ return getConfigFile(filename, policy.getConfigType());
+ }
+
+ // copied from ConfigPolicy.java and modified
+ // Here we are adding the extension for the configurations file based on the
+ /**
+ * Gets the config file.
+ *
+ * @param inputFilename the input filename
+ * @param configType the config type
+ * @return the config file
+ */
+ // config type selection for saving.
+ public String getConfigFile(String inputFilename, String configType) {
+ String filename = inputFilename;
+ logger.debug("getConfigFile(String filename, String scope, String configType) as getConfigFile(" + filename
+ + ", " + configType + ") called");
+ filename = FilenameUtils.removeExtension(filename);
+ String id = configType;
+
+ if (id != null) {
+ if (id.equals(ConfigPolicy.JSON_CONFIG) || id.contains("Firewall")) {
+ filename = filename + ".json";
+ }
+ if (id.equals(ConfigPolicy.XML_CONFIG)) {
+ filename = filename + ".xml";
+ }
+ if (id.equals(ConfigPolicy.PROPERTIES_CONFIG)) {
+ filename = filename + ".properties";
+ }
+ if (id.equals(ConfigPolicy.OTHER_CONFIG)) {
+ filename = filename + ".txt";
+ }
+ }
+ return filename;
+ }
+
+ /**
+ * Gets the name scope and version from pdp policy.
+ *
+ * @param fileName the file name
+ * @return the name scope and version from pdp policy
+ */
+ public String[] getNameScopeAndVersionFromPdpPolicy(String fileName) {
+ String[] splitByDots = fileName.split("\\.");
+ if (splitByDots.length < 3) {
+ return null;
+ }
+ String policyName = splitByDots[splitByDots.length - 3];
+ String version = splitByDots[splitByDots.length - 2];
+ // policy names now include version
+ String scope = "";
+ for (int i = 0; i < splitByDots.length - 3; i++) {
+ scope += ".".concat(splitByDots[i]);
+ }
+ // remove the first dot
+ if (scope.length() > 0) {
+ scope = scope.substring(1);
+ }
+ String[] returnArray = new String[3];
+ returnArray[0] = policyName + "." + version + ".xml";
+ returnArray[2] = version;
+ returnArray[1] = scope;
+ return returnArray;
+ }
+
+ /**
+ * Creates the new PDP group id.
+ *
+ * @param name the name
+ * @return the string
+ */
+ public static String createNewPdpGroupId(String name) {
+ String id = name;
+ // replace "bad" characters with sequences that will be ok for file
+ // names and properties keys.
+ id = id.replace(" ", "_sp_");
+ id = id.replace("\t", "_tab_");
+ id = id.replace("\\", "_bksl_");
+ id = id.replace("/", "_sl_");
+ id = id.replace(":", "_col_");
+ id = id.replace("*", "_ast_");
+ id = id.replace("?", "_q_");
+ id = id.replace("\"", "_quo_");
+ id = id.replace("<", "_lt_");
+ id = id.replace(">", "_gt_");
+ id = id.replace("|", "_bar_");
+ id = id.replace("=", "_eq_");
+ id = id.replace(",", "_com_");
+ id = id.replace(";", "_scom_");
+
+ return id;
+ }
+
+ /**
+ * Checks if any of the given strings are empty or null.
+ *
+ * @param strings One or more Strings (or nulls) to check if they are null or empty
+ * @return true if one or more of the given strings are empty or null
+ */
+ public static boolean isNullOrEmpty(String... strings) {
+ for (String s : strings) {
+ if (s == null || "".equals(s)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Gets the other servers.
+ *
+ * @return the other servers
+ */
+ public List<?> getOtherServers() {
+ return otherServers;
+ }
+
+ /**
+ * Sets the other servers.
+ *
+ * @param otherServers the new other servers
+ */
+ public void setOtherServers(List<?> otherServers) {
+ this.otherServers = otherServers;
+ }
+
+ /**
+ * Gets the pap engine.
+ *
+ * @return the pap engine
+ */
+ public PAPPolicyEngine getPapEngine() {
+ return papEngine;
+ }
+
+ /**
+ * Checks if is junit.
+ *
+ * @return true, if is junit
+ */
+ public static boolean isJunit() {
+ return isJunit;
+ }
+
+ /**
+ * Sets the junit.
+ *
+ * @param isJunit the new junit
+ */
+ public static void setJunit(boolean isJunit) {
+ PolicyDbDao.isJunit = isJunit;
+ }
+
+ /**
+ * Gets the policy DB dao test class.
+ *
+ * @return the policy DB dao test class
+ */
+ public static PolicyDbDaoTestClass getPolicyDbDaoTestClass() {
+ return new PolicyDbDao().new PolicyDbDaoTestClass();
+ }
+
+ /**
+ * The Class PolicyDBDaoTestClass.
+ */
+ final class PolicyDbDaoTestClass {
+
+ /**
+ * Gets the config file.
+ *
+ * @param filename the filename
+ * @param scope the scope
+ * @param policy the policy
+ * @return the config file
+ */
+ String getConfigFile(String filename, String scope, PolicyRestAdapter policy) {
+ return scope + "." + PolicyDbDao.this.getConfigFile(filename, policy);
+ }
+
+ /**
+ * Gets the policy name and version from policy file name.
+ *
+ * @param originalPolicyName the original policy name
+ * @return the policy name and version from policy file name
+ * @throws PolicyDbException the policy db exception
+ */
+ String[] getPolicyNameAndVersionFromPolicyFileName(String originalPolicyName) throws PolicyDbException {
+ return PolicyDbDao.this.getPolicyNameAndVersionFromPolicyFileName(originalPolicyName);
+ }
+
+ /**
+ * Gets the name scope and version from pdp policy.
+ *
+ * @param fileName the file name
+ * @return the name scope and version from pdp policy
+ */
+ String[] getNameScopeAndVersionFromPdpPolicy(String fileName) {
+ return PolicyDbDao.this.getNameScopeAndVersionFromPdpPolicy(fileName);
+ }
+
+ /**
+ * Gets the pdp policy name.
+ *
+ * @param name the name
+ * @param scope the scope
+ * @return the pdp policy name
+ */
+ String getPdpPolicyName(String name, String scope) {
+ return PolicyDbDao.this.getPdpPolicyName(name, scope);
+ }
+ }
+
+}