summaryrefslogtreecommitdiffstats
path: root/applications/common/src/main/java/org
diff options
context:
space:
mode:
authorPamela Dragosh <pdragosh@research.att.com>2020-03-19 19:58:13 -0400
committerPamela Dragosh <pdragosh@research.att.com>2020-03-20 10:01:13 -0400
commit3ec22673e335793e54314e640fa95315554bcb8f (patch)
tree8cddaf9f5b27b17da74d80c6711837e6892d9ff8 /applications/common/src/main/java/org
parent3008ca45fb70a4694ba6b9ff69f278ab9484f3e3 (diff)
use shutdown to clear handle leak
The XACML github was released with a new method to allow context factories and PIP engines to release any handles before releasing the PDP engine. This review includes that artifact and adds tests to support it. In addition, added more tests to get code coverage over 90% for both PIPs in ONAP. Some cleanup in the Matchable types based on last review. Issue-ID: POLICY-2242 Change-Id: I312f06380ff4d2e16bcfd25b6d1f36ce5dd030e6 Signed-off-by: Pamela Dragosh <pdragosh@research.att.com>
Diffstat (limited to 'applications/common/src/main/java/org')
-rw-r--r--applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePolicyType.java4
-rw-r--r--applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePropertyTypeList.java3
-rw-r--r--applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/CountRecentOperationsPip.java3
-rw-r--r--applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/GetOperationOutcomePip.java3
-rw-r--r--applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdOnapPip.java19
-rw-r--r--applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java19
6 files changed, 47 insertions, 4 deletions
diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePolicyType.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePolicyType.java
index 3bbc6ea5..cf9d7a94 100644
--- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePolicyType.java
+++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePolicyType.java
@@ -48,6 +48,7 @@ public class MatchablePolicyType {
public static final String TOSCA_TYPE_LIST = "list";
public static final String TOSCA_TYPE_MAP = "map";
+ //@formatter:off
private static final Map<String, Function<ToscaProperty, MatchablePropertyTypeBase<?>>>
mapPrimitivesProperty = Map.of(
TOSCA_PRIMITIVE_STRING, MatchablePropertyTypeString::new,
@@ -65,6 +66,7 @@ public class MatchablePolicyType {
TOSCA_PRIMITIVE_BOOLEAN, MatchablePropertyTypeBoolean::new,
TOSCA_PRIMITIVE_TIMESTAMP, MatchablePropertyTypeTimestamp::new
);
+ //@formatter:on
ToscaPolicyIdentifier policyId;
Map<String, MatchableProperty> matchables = new HashMap<>();
@@ -170,7 +172,7 @@ public class MatchablePolicyType {
Function<ToscaEntrySchema, MatchablePropertyTypeBase<?>> function =
mapPrimitivesSchema.get(toscaSchema.getType());
if (function != null) {
- return new MatchableProperty(property, function.apply(toscaSchema)); // compilation err wants ToscaProperty
+ return new MatchableProperty(property, function.apply(toscaSchema));
}
throw new IllegalArgumentException("Not a primitive " + toscaSchema.getType());
}
diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePropertyTypeList.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePropertyTypeList.java
index 55fea540..7b19ad47 100644
--- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePropertyTypeList.java
+++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/matchable/MatchablePropertyTypeList.java
@@ -23,7 +23,6 @@
package org.onap.policy.pdp.xacml.application.common.matchable;
import com.att.research.xacml.api.Identifier;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
@@ -50,7 +49,7 @@ public class MatchablePropertyTypeList extends MatchablePropertyTypeBase<List<Ma
@SuppressWarnings("unchecked")
@Override
public List<MatchablePropertyType<?>> validate(Object value) throws ToscaPolicyConversionException {
- if (value instanceof Collection) {
+ if (value instanceof List) {
return (List<MatchablePropertyType<?>>) value;
}
return Collections.emptyList();
diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/CountRecentOperationsPip.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/CountRecentOperationsPip.java
index 4bf87779..f2d79804 100644
--- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/CountRecentOperationsPip.java
+++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/CountRecentOperationsPip.java
@@ -62,6 +62,9 @@ public class CountRecentOperationsPip extends StdOnapPip {
*/
@Override
public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
+ if (this.shutdown) {
+ throw new PIPException("Engine is shutdown");
+ }
logger.debug("getAttributes requesting attribute {} of type {} for issuer {}",
pipRequest.getAttributeId(), pipRequest.getDataTypeId(), pipRequest.getIssuer());
//
diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/GetOperationOutcomePip.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/GetOperationOutcomePip.java
index 0f970f7e..b269e25a 100644
--- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/GetOperationOutcomePip.java
+++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/GetOperationOutcomePip.java
@@ -58,6 +58,9 @@ public class GetOperationOutcomePip extends StdOnapPip {
*/
@Override
public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
+ if (this.shutdown) {
+ throw new PIPException("Engine is shutdown");
+ }
logger.debug("getAttributes requesting attribute {} of type {} for issuer {}",
pipRequest.getAttributeId(), pipRequest.getDataTypeId(), pipRequest.getIssuer());
//
diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdOnapPip.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdOnapPip.java
index ca07f22f..5c99932e 100644
--- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdOnapPip.java
+++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdOnapPip.java
@@ -70,6 +70,7 @@ public abstract class StdOnapPip extends StdConfigurableEngine {
protected Properties properties;
protected EntityManager em;
protected String issuer;
+ protected boolean shutdown = false;
public StdOnapPip() {
super();
@@ -81,7 +82,14 @@ public abstract class StdOnapPip extends StdConfigurableEngine {
}
@Override
- public void configure(String id, Properties properties) throws PIPException {
+ public synchronized void configure(String id, Properties properties) throws PIPException {
+ //
+ // This most likely will never get called since configure is called
+ // upon startup.
+ //
+ if (this.shutdown) {
+ throw new PIPException("Engine is shutdown.");
+ }
super.configure(id, properties);
logger.info("Configuring historyDb PIP {}", properties);
this.properties = properties;
@@ -114,6 +122,15 @@ public abstract class StdOnapPip extends StdConfigurableEngine {
}
}
+ @Override
+ public synchronized void shutdown() {
+ if (this.em != null) {
+ this.em.close();
+ this.em = null;
+ }
+ this.shutdown = true;
+ }
+
protected String getAttribute(PIPFinder pipFinder, PIPRequest pipRequest) {
//
// Get the actor value
diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java
index 9a8b63fb..ba562b83 100644
--- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java
+++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java
@@ -283,6 +283,13 @@ public abstract class StdXacmlApplicationServiceProvider implements XacmlApplica
PDPEngineFactory factory = getPdpEngineFactory();
PDPEngine engine = factory.newEngine(properties);
if (engine != null) {
+ //
+ // If there is a previous engine have it shutdown.
+ //
+ this.destroyEngine();
+ //
+ // Save it off
+ //
this.pdpEngine = engine;
}
} catch (FactoryException e) {
@@ -290,6 +297,18 @@ public abstract class StdXacmlApplicationServiceProvider implements XacmlApplica
}
}
+ protected synchronized void destroyEngine() {
+ if (this.pdpEngine == null) {
+ return;
+ }
+ try {
+ this.pdpEngine.shutdown();
+ } catch (Exception e) {
+ LOGGER.warn("Exception thrown when destroying XACML PDP engine.", e);
+ }
+ this.pdpEngine = null;
+ }
+
/**
* Make a decision call.
*