From 6d94c4ec33520776971c781c6ea6e80e6d0070b5 Mon Sep 17 00:00:00 2001 From: jhh Date: Wed, 13 Jan 2021 16:34:13 -0600 Subject: add methods to check if a fact exists. Issue-ID: POLICY-2762 Signed-off-by: jhh Change-Id: Ic00d2a548dbc904e044d2310c7d5439a1cb708a5 Signed-off-by: jhh --- .../policy/drools/controller/DroolsController.java | 13 ++++- .../controller/internal/MavenDroolsController.java | 59 +++++++++++++++++----- .../controller/internal/NullDroolsController.java | 12 ++++- 3 files changed, 68 insertions(+), 16 deletions(-) (limited to 'policy-management/src/main/java/org') diff --git a/policy-management/src/main/java/org/onap/policy/drools/controller/DroolsController.java b/policy-management/src/main/java/org/onap/policy/drools/controller/DroolsController.java index 8e78b077..36a4d5bd 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/controller/DroolsController.java +++ b/policy-management/src/main/java/org/onap/policy/drools/controller/DroolsController.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2019, 2021 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. @@ -232,6 +232,17 @@ public interface DroolsController extends Startable, Lockable { */ boolean delete(@NonNull Class fact); + /** + * Checks is a fact exists in a given session. + */ + boolean exists(@NonNull String sessionName, @NonNull T fact); + + /** + * Checks if a fact exists in any session. + */ + boolean exists(@NonNull T fact); + + /** * halts and permanently releases all resources. * diff --git a/policy-management/src/main/java/org/onap/policy/drools/controller/internal/MavenDroolsController.java b/policy-management/src/main/java/org/onap/policy/drools/controller/internal/MavenDroolsController.java index b8edb55e..c1eb9f37 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/controller/internal/MavenDroolsController.java +++ b/policy-management/src/main/java/org/onap/policy/drools/controller/internal/MavenDroolsController.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2021 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. @@ -870,24 +870,31 @@ public class MavenDroolsController implements DroolsController { } @Override - public boolean delete(@NonNull String sessionName, @NonNull T fact) { - String factClassName = fact.getClass().getName(); + public boolean delete(@NonNull String sessionName, @NonNull T objFact) { + KieSession kieSession = getSession(sessionName).getKieSession(); - PolicySession session = getSession(sessionName); - KieSession kieSession = session.getKieSession(); + // try first to get the object to delete first by reference + + FactHandle quickFact = kieSession.getFactHandle(objFact); + if (quickFact != null) { + logger.info("Fast delete of {} from {}", objFact, sessionName); + kieSession.delete(quickFact); + return true; + } + + // otherwise, try to the delete the fact associated with the object by scanning all + // facts from the same type and performing object equality. The set of facts + // is restricted to those of the same type - Collection factHandles = kieSession.getFactHandles(new ClassObjectFilter(fact.getClass())); + Collection factHandles = kieSession.getFactHandles(new ClassObjectFilter(objFact.getClass())); for (FactHandle factHandle : factHandles) { - try { - if (Objects.equals(fact, kieSession.getObject(factHandle))) { - logger.info("Deleting {} from {}", factClassName, sessionName); - kieSession.delete(factHandle); - return true; - } - } catch (Exception e) { - logger.warn(FACT_RETRIEVE_ERROR, factHandle, e); + if (Objects.equals(objFact, kieSession.getObject(factHandle))) { + logger.info("Slow delete of {} of type {} from {}", objFact, sessionName); + kieSession.delete(factHandle); + return true; } } + return false; } @@ -919,6 +926,30 @@ public class MavenDroolsController implements DroolsController { return this.getSessionNames().stream().map(ss -> delete(ss, fact)).reduce(false, Boolean::logicalOr); } + @Override + public boolean exists(@NonNull String sessionName, @NonNull T objFact) { + KieSession kieSession = getSession(sessionName).getKieSession(); + if (kieSession.getFactHandle(objFact) != null) { + return true; + } + + // try to find the object by equality comparison instead if it could not be + // found by reference + + Collection factHandles = kieSession.getFactHandles(new ClassObjectFilter(objFact.getClass())); + for (FactHandle factHandle : factHandles) { + if (Objects.equals(objFact, kieSession.getObject(factHandle))) { + return true; + } + } + + return false; + } + + @Override + public boolean exists(@NonNull T fact) { + return this.getSessionNames().stream().anyMatch(ss -> exists(ss, fact)); + } @Override public Class fetchModelClass(String className) { diff --git a/policy-management/src/main/java/org/onap/policy/drools/controller/internal/NullDroolsController.java b/policy-management/src/main/java/org/onap/policy/drools/controller/internal/NullDroolsController.java index 4373b35e..e20d1777 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/controller/internal/NullDroolsController.java +++ b/policy-management/src/main/java/org/onap/policy/drools/controller/internal/NullDroolsController.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2021 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. @@ -214,6 +214,16 @@ public class NullDroolsController implements DroolsController { return false; } + @Override + public boolean exists(@NonNull String sessionName, @NonNull T fact) { + return false; + } + + @Override + public boolean exists(@NonNull T fact) { + return false; + } + private String makeInvokeMsg() { return this.getClass().getName() + " invoked"; } -- cgit 1.2.3-korg