X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=PolicyEngineAPI%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fpolicy%2Fstd%2FMatchStore.java;h=fa80299084058efcfddd3de3ac6184b136f2b1d2;hb=5450bdbfb94fb5217617da6c41971fd26f7e81b5;hp=e5204d8946fe809827f9dc1e31d6f19e1f104122;hpb=a9710cb3b80c73c98d257c676ba6ecf9e30ef758;p=policy%2Fengine.git diff --git a/PolicyEngineAPI/src/main/java/org/onap/policy/std/MatchStore.java b/PolicyEngineAPI/src/main/java/org/onap/policy/std/MatchStore.java index e5204d894..fa8029908 100644 --- a/PolicyEngineAPI/src/main/java/org/onap/policy/std/MatchStore.java +++ b/PolicyEngineAPI/src/main/java/org/onap/policy/std/MatchStore.java @@ -21,7 +21,9 @@ package org.onap.policy.std; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import org.onap.policy.api.LoadedPolicy; @@ -29,220 +31,132 @@ import org.onap.policy.api.NotificationType; import org.onap.policy.api.PDPNotification; import org.onap.policy.api.RemovedPolicy; import org.onap.policy.common.logging.flexlogger.FlexLogger; -import org.onap.policy.common.logging.flexlogger.Logger; +import org.onap.policy.common.logging.flexlogger.Logger; public class MatchStore { - private static HashSet matchStore = new HashSet<>(); - private static Logger logger = FlexLogger.getLogger(MatchStore.class.getName()); - - private MatchStore() { - // Empty Constructor - } - - public static Set getMatchStore() { - return matchStore; - } - - public static void storeMatch(Matches newMatch){ - // Initialization.. - if(newMatch!=null){ - if(matchStore.isEmpty()){ - matchStore.add(newMatch); - }else{ - // Check if it is a new Match - Boolean match = false; - for(Matches oldMatch: matchStore){ - // Compare ONAPName - if(oldMatch.getOnapName().equals(newMatch.getOnapName())){ - // Compare ConfigName if it exists. - if(newMatch.getConfigName()!=null && oldMatch.getConfigName()!=null){ - if(oldMatch.getConfigName().equals(newMatch.getConfigName())){ - // Compare the Config Attributes if they exist. - if(newMatch.getConfigAttributes()!= null && oldMatch.getConfigAttributes()!=null) { - //Simple thing would be comparing their size. - if(newMatch.getConfigAttributes().size()==oldMatch.getConfigAttributes().size()){ - // Now need to compare each of them.. - int count= 0; - for(String oldkey: oldMatch.getConfigAttributes().keySet()){ - boolean check = false; - for(String newKey: newMatch.getConfigAttributes().keySet()){ - if(oldkey.equals(newKey)){ - if(oldMatch.getConfigAttributes().get(oldkey).equals(newMatch.getConfigAttributes().get(newKey))){ - check = true; - } - } - } - if(check){ - count++; - }else{ - break; - } - } - if(count==oldMatch.getConfigAttributes().size()){ - match = true; - break; - } - } - }else if(newMatch.getConfigAttributes()== null && oldMatch.getConfigAttributes()==null){ - match = true; - break; - } - } - }else if(newMatch.getConfigName()==null && oldMatch.getConfigName()==null){ - match = true; - break; - } - } - - } - // IF not a match then add it to the MatchStore - if(! match){ - matchStore.add(newMatch); - } - } - } - } - - //Logic changes for Requested Policies notifications.. - public static PDPNotification checkMatch(PDPNotification oldNotification) { - boolean removed = false; - boolean updated = false; - if(oldNotification==null){ - return null; - } - StdPDPNotification newNotification = new StdPDPNotification(); - if(matchStore.isEmpty()) { - logger.debug("No Success Config Calls made yet.. "); - return null; - } - if(oldNotification.getRemovedPolicies()!=null && !oldNotification.getRemovedPolicies().isEmpty()){ - // send all removed policies to client. - Collection removedPolicies = new HashSet<>(); - StdRemovedPolicy newRemovedPolicy; - for(RemovedPolicy removedPolicy: oldNotification.getRemovedPolicies()){ - newRemovedPolicy = new StdRemovedPolicy(); - newRemovedPolicy.setPolicyName(removedPolicy.getPolicyName()); - newRemovedPolicy.setVersionNo(removedPolicy.getVersionNo()); - removedPolicies.add(newRemovedPolicy); - } - newNotification.setRemovedPolicies(removedPolicies); - removed = true; - } - if(oldNotification.getLoadedPolicies()!=null && !oldNotification.getLoadedPolicies().isEmpty()){ - Collection updatedPolicies = new HashSet<>(); - StdLoadedPolicy newUpdatedPolicy; - for(LoadedPolicy updatedPolicy: oldNotification.getLoadedPolicies()){ - // if it is config policies check their matches.. - if(updatedPolicy.getMatches()!=null && !updatedPolicy.getMatches().isEmpty()){ - boolean matched; - for(Matches match : matchStore){ - matched = false; - // Again Better way would be comparing sizes first. - // Matches are different need to check if has configAttributes - if(match.getConfigAttributes()!=null && !match.getConfigAttributes().isEmpty()){ - // adding onap and config to config-attributes. - int compValues = match.getConfigAttributes().size() + 2; - if(updatedPolicy.getMatches().size()== compValues){ - // Comparing both the values.. - boolean matchAttributes = false; - for(String newKey: updatedPolicy.getMatches().keySet()){ - if("ONAPName".equals(newKey)){ - if(updatedPolicy.getMatches().get(newKey).equals(match.getOnapName())){ - matchAttributes = true; - }else { - matchAttributes = false; - break; - } - }else if("ConfigName".equals(newKey)) { - if(updatedPolicy.getMatches().get(newKey).equals(match.getConfigName())){ - matchAttributes = true; - }else{ - matchAttributes = false; - break; - } - }else { - if(match.getConfigAttributes().containsKey(newKey)){ - if(updatedPolicy.getMatches().get(newKey).equals(match.getConfigAttributes().get(newKey))){ - matchAttributes = true; - }else{ - matchAttributes = false; - break; - } - }else{ - matchAttributes = false; - break; - } - } - } - if(matchAttributes){ - // Match.. - matched = true; - }else{ - break; - } - }else { - break; - } - }else if(match.getConfigName()!=null){ - // If there are no config Attributes then check if it has Config Name - if(updatedPolicy.getMatches().size()== 2){ - if(updatedPolicy.getMatches().get("ONAPName").equals(match.getOnapName())){ - if(updatedPolicy.getMatches().get("ConfigName").equals(match.getConfigName())){ - // Match.. - matched = true; - }else{ - break; - } - }else { - break; - } - }else{ - break; - } - }else { - // If non exist then assuming the ONAP Name to be there. - if(updatedPolicy.getMatches().size()== 1){ - if(updatedPolicy.getMatches().get("ONAPName").equals(match.getOnapName())){ - // Match.. - matched = true; - }else { - break; - } - }else{ - break; - } - } - // Add logic to add the policy. - if(matched){ - newUpdatedPolicy = new StdLoadedPolicy(); - newUpdatedPolicy.setPolicyName(updatedPolicy.getPolicyName()); - newUpdatedPolicy.setVersionNo(updatedPolicy.getVersionNo()); - newUpdatedPolicy.setMatches(updatedPolicy.getMatches()); - updatedPolicies.add(newUpdatedPolicy); - updated = true; - } - } - - }else { - //send all non config notifications to client. - newUpdatedPolicy = new StdLoadedPolicy(); - newUpdatedPolicy.setPolicyName(updatedPolicy.getPolicyName()); - newUpdatedPolicy.setVersionNo(updatedPolicy.getVersionNo()); - updatedPolicies.add(newUpdatedPolicy); - updated = true; - } - } - newNotification.setLoadedPolicies(updatedPolicies); - } - // Need to set the type of Update.. - if(removed && updated) { - newNotification.setNotificationType(NotificationType.BOTH); - }else if(removed){ - newNotification.setNotificationType(NotificationType.REMOVE); - }else if(updated){ - newNotification.setNotificationType(NotificationType.UPDATE); - } - return newNotification; - } - + private static final String CONFIG_NAME = "ConfigName"; + + private static final String ONAP_NAME = "ONAPName"; + + private static final Set MATCH_STORE = new HashSet<>(); + + private static final Logger LOGGER = FlexLogger.getLogger(MatchStore.class.getName()); + + private MatchStore() { + // Empty Constructor + } + + public static Set getMatchStore() { + return MATCH_STORE; + } + + public static void storeMatch(final Matches newMatch) { + if (newMatch != null && !MATCH_STORE.contains(newMatch)) { + MATCH_STORE.add(newMatch); + } + } + + // Logic changes for Requested Policies notifications.. + public static PDPNotification checkMatch(final PDPNotification oldNotification) { + if (oldNotification == null) { + return null; + } + if (MATCH_STORE.isEmpty()) { + LOGGER.debug("No Success Config Calls made yet.. "); + return null; + } + return getPDPNotification(oldNotification); + } + + private static PDPNotification getPDPNotification(final PDPNotification oldNotification) { + boolean removed = false; + boolean updated = false; + final StdPDPNotification newNotification = new StdPDPNotification(); + if (isValid(oldNotification.getRemovedPolicies())) { + // send all removed policies to client. + newNotification.setRemovedPolicies(getStdRemovedPolicies(oldNotification.getRemovedPolicies())); + removed = true; + } + if (isValid(oldNotification.getLoadedPolicies())) { + final Collection updatedPolicies = new HashSet<>(); + for (final LoadedPolicy updatedPolicy : oldNotification.getLoadedPolicies()) { + updated = updateStdLoadedPolicy(updated, updatedPolicies, updatedPolicy); + } + newNotification.setLoadedPolicies(updatedPolicies); + } + // Need to set the type of Update.. + if (removed && updated) { + newNotification.setNotificationType(NotificationType.BOTH); + } else if (removed) { + newNotification.setNotificationType(NotificationType.REMOVE); + } else if (updated) { + newNotification.setNotificationType(NotificationType.UPDATE); + } + return newNotification; + } + + private static boolean updateStdLoadedPolicy(boolean updated, final Collection updatedPolicies, + final LoadedPolicy updatedPolicy) { + // if it is config policies check their matches + if (isValid(updatedPolicy.getMatches())) { + final Map matchesMap = updatedPolicy.getMatches(); + final Matches policyMatches = getMatches(matchesMap); + for (final Matches match : MATCH_STORE) { + if (match.equals(policyMatches)) { + final StdLoadedPolicy newUpdatedPolicy = new StdLoadedPolicy(); + newUpdatedPolicy.setPolicyName(updatedPolicy.getPolicyName()); + newUpdatedPolicy.setVersionNo(updatedPolicy.getVersionNo()); + newUpdatedPolicy.setMatches(updatedPolicy.getMatches()); + updatedPolicies.add(newUpdatedPolicy); + updated = true; + } else { + break; + } + } + + } else { + // send all non config notifications to client. + final StdLoadedPolicy newUpdatedPolicy = new StdLoadedPolicy(); + newUpdatedPolicy.setPolicyName(updatedPolicy.getPolicyName()); + newUpdatedPolicy.setVersionNo(updatedPolicy.getVersionNo()); + updatedPolicies.add(newUpdatedPolicy); + updated = true; + } + return updated; + } + + private static Matches getMatches(final Map attributes) { + final Matches matches = new Matches(); + matches.setOnapName(attributes.get(ONAP_NAME)); + matches.setConfigName(attributes.get(CONFIG_NAME)); + + final Map configAttributes = new HashMap<>(attributes); + // remove onap and config to config-attributes. + configAttributes.remove(ONAP_NAME); + configAttributes.remove(CONFIG_NAME); + + matches.setConfigAttributes(configAttributes); + + return matches; + } + + private static boolean isValid(final Map map) { + return map != null && !map.isEmpty(); + } + + private static Collection getStdRemovedPolicies(final Collection policies) { + final Set removedPolicies = new HashSet<>(); + for (final RemovedPolicy removedPolicy : policies) { + final StdRemovedPolicy newRemovedPolicy = new StdRemovedPolicy(); + newRemovedPolicy.setPolicyName(removedPolicy.getPolicyName()); + newRemovedPolicy.setVersionNo(removedPolicy.getVersionNo()); + removedPolicies.add(newRemovedPolicy); + } + return removedPolicies; + } + + private static boolean isValid(final Collection collection) { + return collection != null && !collection.isEmpty(); + } + }