X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=policy-agent%2Fsrc%2Fmain%2Fjava%2Forg%2Foransc%2Fpolicyagent%2Frepository%2FPolicies.java;h=62dd140792b5c4cdb7d9b2b5be05b419e72dd253;hb=dede1d28c8f37bb21fae806f00f8315b923670c1;hp=359cd22758baff61b22ef1d024e8a48aa4f026eb;hpb=def3c3e28fb8616a444ad3caaf2f789292402a02;p=nonrtric.git diff --git a/policy-agent/src/main/java/org/oransc/policyagent/repository/Policies.java b/policy-agent/src/main/java/org/oransc/policyagent/repository/Policies.java index 359cd227..62dd1407 100644 --- a/policy-agent/src/main/java/org/oransc/policyagent/repository/Policies.java +++ b/policy-agent/src/main/java/org/oransc/policyagent/repository/Policies.java @@ -20,27 +20,111 @@ package org.oransc.policyagent.repository; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Set; -import org.oransc.policyagent.configuration.RicConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.oransc.policyagent.exceptions.ServiceException; -@Component public class Policies { - private static final Logger logger = LoggerFactory.getLogger(Policies.class); + private Map policiesId = new HashMap<>(); + private Map> policiesRic = new HashMap<>(); + private Map> policiesService = new HashMap<>(); + private Map> policiesType = new HashMap<>(); - private Map policies = new HashMap(); + public synchronized void put(Policy policy) { + policiesId.put(policy.id(), policy); + multiMapPut(policiesRic, policy.ric().name(), policy); + multiMapPut(policiesService, policy.ownerServiceName(), policy); + multiMapPut(policiesType, policy.type().name(), policy); + } + + private void multiMapPut(Map> multiMap, String key, Policy value) { + multiMap.computeIfAbsent(key, k -> new HashMap<>()).put(value.id(), value); + } + + private void multiMapRemove(Map> multiMap, String key, Policy value) { + Map map = multiMap.get(key); + if (map != null) { + map.remove(value.id()); + if (map.isEmpty()) { + multiMap.remove(key); + } + } + } + + private Collection multiMapGet(Map> multiMap, String key) { + Map map = multiMap.get(key); + if (map == null) { + return Collections.emptyList(); + } + return Collections.unmodifiableCollection(map.values()); + } + + public synchronized boolean containsPolicy(String id) { + return policiesId.containsKey(id); + } + + public synchronized Policy get(String id) { + return policiesId.get(id); + } + + public synchronized Policy getPolicy(String id) throws ServiceException { + Policy p = policiesId.get(id); + if (p == null) { + throw new ServiceException("Could not find policy: " + id); + } + return p; + } - @Autowired - public Policies() { + public synchronized Collection getAll() { + return Collections.unmodifiableCollection(policiesId.values()); } - public synchronized void put(String id, Policy policy) { - policies.put(id, policy); + public synchronized Collection getForService(String service) { + return multiMapGet(policiesService, service); } + public synchronized Collection getForRic(String ric) { + return multiMapGet(policiesRic, ric); + } + + public synchronized Collection getForType(String type) { + return multiMapGet(policiesType, type); + } + + public synchronized Policy removeId(String id) { + Policy p = policiesId.get(id); + if (p != null) { + remove(p); + } + return p; + } + + public synchronized void remove(Policy policy) { + policiesId.remove(policy.id()); + multiMapRemove(policiesRic, policy.ric().name(), policy); + multiMapRemove(policiesService, policy.ownerServiceName(), policy); + multiMapRemove(policiesType, policy.type().name(), policy); + } + + public synchronized void removePoliciesForRic(String ricName) { + Collection policiesForRic = getForRic(ricName); + for (Policy policy : policiesForRic) { + remove(policy); + } + } + + public synchronized int size() { + return policiesId.size(); + } + + public synchronized void clear() { + while (policiesId.size() > 0) { + Set keys = policiesId.keySet(); + removeId(keys.iterator().next()); + } + } }