diff options
Diffstat (limited to 'policy-management/src/main')
6 files changed, 147 insertions, 17 deletions
diff --git a/policy-management/src/main/java/org/onap/policy/drools/controller/DroolsControllerFactory.java b/policy-management/src/main/java/org/onap/policy/drools/controller/DroolsControllerFactory.java index 7652a671..a355f6f7 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/controller/DroolsControllerFactory.java +++ b/policy-management/src/main/java/org/onap/policy/drools/controller/DroolsControllerFactory.java @@ -1,8 +1,8 @@ /* * ============LICENSE_START======================================================= - * policy-management + * ONAP * ================================================================================ - * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2020 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. @@ -49,6 +49,7 @@ public interface DroolsControllerFactory { /** * Explicit construction of a Drools Controller. * + * @param properties properties containing initialization parameters * @param groupId maven group id of drools artifact * @param artifactId maven artifact id of drools artifact * @param version maven version id of drools artifact @@ -59,7 +60,7 @@ public interface DroolsControllerFactory { * @throws IllegalArgumentException with invalid parameters * @throws LinkageError Failure to link rules and models in Drools Libraries */ - DroolsController build(String groupId, String artifactId, String version, + DroolsController build(Properties properties, String groupId, String artifactId, String version, List<TopicCoderFilterConfiguration> decoderConfigurations, List<TopicCoderFilterConfiguration> encoderConfigurations) throws LinkageError; diff --git a/policy-management/src/main/java/org/onap/policy/drools/controller/IndexedDroolsControllerFactory.java b/policy-management/src/main/java/org/onap/policy/drools/controller/IndexedDroolsControllerFactory.java index 6d42ba53..e8234a46 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/controller/IndexedDroolsControllerFactory.java +++ b/policy-management/src/main/java/org/onap/policy/drools/controller/IndexedDroolsControllerFactory.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; import org.onap.policy.common.endpoints.event.comm.Topic; import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; @@ -32,6 +33,8 @@ import org.onap.policy.common.endpoints.event.comm.TopicSource; import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties; import org.onap.policy.drools.controller.internal.MavenDroolsController; import org.onap.policy.drools.controller.internal.NullDroolsController; +import org.onap.policy.drools.features.DroolsControllerFeatureApi; +import org.onap.policy.drools.features.DroolsControllerFeatureApiConstants; import org.onap.policy.drools.properties.DroolsPropertyConstants; import org.onap.policy.drools.protocol.coders.JsonProtocolFilter; import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration; @@ -48,12 +51,12 @@ class IndexedDroolsControllerFactory implements DroolsControllerFactory { /** * logger. */ - private static Logger logger = LoggerFactory.getLogger(IndexedDroolsControllerFactory.class); + private static final Logger logger = LoggerFactory.getLogger(IndexedDroolsControllerFactory.class); /** * Policy Controller Name Index. */ - protected HashMap<String, DroolsController> droolsControllers = new HashMap<>(); + protected Map<String, DroolsController> droolsControllers = new HashMap<>(); /** * Null Drools Controller. @@ -97,11 +100,12 @@ class IndexedDroolsControllerFactory implements DroolsControllerFactory { List<TopicCoderFilterConfiguration> topics2DecodedClasses2Filters = codersAndFilters(properties, eventSources); List<TopicCoderFilterConfiguration> topics2EncodedClasses2Filters = codersAndFilters(properties, eventSinks); - return this.build(groupId, artifactId, version, topics2DecodedClasses2Filters, topics2EncodedClasses2Filters); + return this.build(properties, groupId, artifactId, version, + topics2DecodedClasses2Filters, topics2EncodedClasses2Filters); } @Override - public DroolsController build(String newGroupId, String newArtifactId, String newVersion, + public DroolsController build(Properties properties, String newGroupId, String newArtifactId, String newVersion, List<TopicCoderFilterConfiguration> decoderConfigurations, List<TopicCoderFilterConfiguration> encoderConfigurations) throws LinkageError { @@ -148,16 +152,51 @@ class IndexedDroolsControllerFactory implements DroolsControllerFactory { /* new drools controller */ - DroolsController controller = new MavenDroolsController(newGroupId, newArtifactId, newVersion, - decoderConfigurations, encoderConfigurations); + DroolsController controller = null; + for (DroolsControllerFeatureApi feature: getProviders()) { + try { + controller = feature.beforeInstance(properties, + newGroupId, newArtifactId, newVersion, + decoderConfigurations, encoderConfigurations); + if (controller != null) { + logger.info("feature {} ({}) beforeInstance() has intercepted drools controller {}:{}:{}", + feature.getName(), feature.getSequenceNumber(), + newGroupId, newArtifactId, newVersion); + break; + } + } catch (RuntimeException r) { + logger.error("feature {} ({}) beforeInstance() of drools controller {}:{}:{} failed", + feature.getName(), feature.getSequenceNumber(), + newGroupId, newArtifactId, newVersion, r); + } + } + + if (controller == null) { + controller = new MavenDroolsController(newGroupId, newArtifactId, newVersion, decoderConfigurations, + encoderConfigurations); + } synchronized (this) { droolsControllers.put(controllerId, controller); } + for (DroolsControllerFeatureApi feature: getProviders()) { + try { + feature.afterInstance(controller, properties); + } catch (RuntimeException r) { + logger.error("feature {} ({}) afterInstance() of drools controller {}:{}:{} failed", + feature.getName(), feature.getSequenceNumber(), + newGroupId, newArtifactId, newVersion, r); + } + } + return controller; } + protected List<DroolsControllerFeatureApi> getProviders() { + return DroolsControllerFeatureApiConstants.getProviders().getList(); + } + /** * find out decoder classes and filters. * diff --git a/policy-management/src/main/java/org/onap/policy/drools/features/DroolsControllerFeatureApi.java b/policy-management/src/main/java/org/onap/policy/drools/features/DroolsControllerFeatureApi.java index abf524e4..bb11bb64 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/features/DroolsControllerFeatureApi.java +++ b/policy-management/src/main/java/org/onap/policy/drools/features/DroolsControllerFeatureApi.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2018-2020 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. @@ -20,9 +20,12 @@ package org.onap.policy.drools.features; +import java.util.List; +import java.util.Properties; import org.onap.policy.common.endpoints.event.comm.TopicSink; import org.onap.policy.common.utils.services.OrderedService; import org.onap.policy.drools.controller.DroolsController; +import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration; /** * Drools Controller Feature API. Hooks into the Drools Controller operations. @@ -30,6 +33,38 @@ import org.onap.policy.drools.controller.DroolsController; public interface DroolsControllerFeatureApi extends OrderedService { /** + * intercepts the instantiation of a DroolsController. + * + * @param properties controller properties + * @param groupId group id coordinate + * @param artifactId artifact id coordinate + * @param version version coordinate + * @param decoderConfigurations decoder configurations + * @param encoderConfigurations encoder configurations + * + * @return a Drools Controller or 'null' for no intercept + */ + default DroolsController beforeInstance(Properties properties, + String groupId, String artifactId, String version, + List<TopicCoderFilterConfiguration> decoderConfigurations, + List<TopicCoderFilterConfiguration> encoderConfigurations) { + return null; + } + + /** + * called after a DroolsController is instantiated. + * + * @param droolsController drools controller + * @param properties controller properties + * + * @return True if this feature intercepts and takes ownership of the operation + * preventing the invocation of lower priority features. False, otherwise + */ + default boolean afterInstance(DroolsController droolsController, Properties properties) { + return false; + } + + /** * intercepts before the Drools Controller gives the Policy Container a fact to * insert into its Policy Sessions. * diff --git a/policy-management/src/main/java/org/onap/policy/drools/features/PolicyControllerFeatureApi.java b/policy-management/src/main/java/org/onap/policy/drools/features/PolicyControllerFeatureApi.java index d11863f0..f022bf1d 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/features/PolicyControllerFeatureApi.java +++ b/policy-management/src/main/java/org/onap/policy/drools/features/PolicyControllerFeatureApi.java @@ -58,6 +58,32 @@ public interface PolicyControllerFeatureApi extends OrderedService { } /** + * called before the actual instantiation of a Policy Controller. + * + * @param name name of the controller + * @param properties configuration parameters in the form of properties + * + * @return a Policy Controller or 'null for no intercept. + */ + default PolicyController beforeInstance(String name, Properties properties) { + return null; + } + + /** + * called after the Policy Controller is instantiated. + * + * @param controller policy controller + * @param properties configuration parameters in the form of properties + * + * @return true if this feature intercepts and takes ownership + * of the operation preventing the invocation of + * lower priority features. False, otherwise. + */ + default boolean afterInstance(PolicyController controller, Properties properties) { + return false; + } + + /** * intercept before the Policy Controller is started. * * @return true if this feature intercepts and takes ownership diff --git a/policy-management/src/main/java/org/onap/policy/drools/system/IndexedPolicyControllerFactory.java b/policy-management/src/main/java/org/onap/policy/drools/system/IndexedPolicyControllerFactory.java index 75fb600d..84247efe 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/system/IndexedPolicyControllerFactory.java +++ b/policy-management/src/main/java/org/onap/policy/drools/system/IndexedPolicyControllerFactory.java @@ -23,6 +23,7 @@ package org.onap.policy.drools.system; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; import org.onap.policy.common.gson.annotation.GsonJsonIgnore; import org.onap.policy.drools.controller.DroolsController; @@ -43,13 +44,13 @@ class IndexedPolicyControllerFactory implements PolicyControllerFactory { /** * Policy Controller Name Index. */ - private final HashMap<String, PolicyController> policyControllers = + private final Map<String, PolicyController> policyControllers = new HashMap<>(); /** * Group/Artifact Ids Index. */ - private final HashMap<String, PolicyController> coordinates2Controller = + private final Map<String, PolicyController> coordinates2Controller = new HashMap<>(); /** @@ -378,7 +379,35 @@ class IndexedPolicyControllerFactory implements PolicyControllerFactory { // these methods can be overridden by junit tests protected PolicyController newPolicyController(String name, Properties properties) { - return new AggregatedPolicyController(name, properties); + PolicyController controller = null; + for (PolicyControllerFeatureApi feature: getProviders()) { + try { + controller = feature.beforeInstance(name, properties); + if (controller != null) { + logger.info("feature {} ({}) beforeInstance() has intercepted controller {}", + feature.getName(), feature.getSequenceNumber(), name); + break; + } + } catch (RuntimeException r) { + logger.error("feature {} ({}) beforeInstance() of controller {} failed", + feature.getName(), feature.getSequenceNumber(), name, r); + } + } + + if (controller == null) { + controller = new AggregatedPolicyController(name, properties); + } + + for (PolicyControllerFeatureApi feature: getProviders()) { + try { + feature.afterInstance(controller, properties); + } catch (RuntimeException r) { + logger.error("feature {} ({}) afterInstance() of controller {} failed ", + feature.getName(), feature.getSequenceNumber(), name, r); + } + } + + return controller; } protected List<PolicyControllerFeatureApi> getProviders() { diff --git a/policy-management/src/main/java/org/onap/policy/drools/system/internal/AggregatedPolicyController.java b/policy-management/src/main/java/org/onap/policy/drools/system/internal/AggregatedPolicyController.java index 6e883a03..3f744024 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/system/internal/AggregatedPolicyController.java +++ b/policy-management/src/main/java/org/onap/policy/drools/system/internal/AggregatedPolicyController.java @@ -72,12 +72,12 @@ public class AggregatedPolicyController implements PolicyController, TopicListen /** * Abstracted Event Sources List regardless communication technology. */ - private final List<TopicSource> sources; + protected final List<TopicSource> sources; /** * Abstracted Event Sinks List regardless communication technology. */ - private final List<TopicSink> sinks; + protected final List<TopicSink> sinks; /** * Mapping topics to sinks. @@ -100,7 +100,7 @@ public class AggregatedPolicyController implements PolicyController, TopicListen /** * Policy Drools Controller. */ - private final AtomicReference<DroolsController> droolsController = new AtomicReference<>(); + protected final AtomicReference<DroolsController> droolsController = new AtomicReference<>(); /** * Properties used to initialize controller. @@ -188,7 +188,7 @@ public class AggregatedPolicyController implements PolicyController, TopicListen * * @throws IllegalArgumentException if invalid parameters are passed in */ - private void initDrools(Properties properties) { + protected void initDrools(Properties properties) { try { // Register with drools infrastructure this.droolsController.set(getDroolsFactory().build(properties, sources, sinks)); |