diff options
Diffstat (limited to 'policy-management/src/main/java/org/onap/policy/drools/system/IndexedPolicyControllerFactory.java')
-rw-r--r-- | policy-management/src/main/java/org/onap/policy/drools/system/IndexedPolicyControllerFactory.java | 387 |
1 files changed, 387 insertions, 0 deletions
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 new file mode 100644 index 00000000..38085101 --- /dev/null +++ b/policy-management/src/main/java/org/onap/policy/drools/system/IndexedPolicyControllerFactory.java @@ -0,0 +1,387 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.system; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Properties; +import org.onap.policy.common.gson.annotation.GsonJsonIgnore; +import org.onap.policy.drools.controller.DroolsController; +import org.onap.policy.drools.features.PolicyControllerFeatureApi; +import org.onap.policy.drools.protocol.configuration.DroolsConfiguration; +import org.onap.policy.drools.system.internal.AggregatedPolicyController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Factory of Policy Controllers indexed by the name of the Policy Controller. + */ +class IndexedPolicyControllerFactory implements PolicyControllerFactory { + // get an instance of logger + private static final Logger logger = LoggerFactory.getLogger(PolicyControllerFactory.class); + + /** + * Policy Controller Name Index. + */ + private final HashMap<String,PolicyController> policyControllers = + new HashMap<>(); + + /** + * Group/Artifact Ids Index. + */ + private final HashMap<String,PolicyController> coordinates2Controller = + new HashMap<>(); + + /** + * produces key for indexing controller names. + * + * @param groupId group id + * @param artifactId artifact id + * @return index key + */ + private String toKey(String groupId, String artifactId) { + return groupId + ":" + artifactId; + } + + /** + * {@inheritDoc}. + */ + @Override + public synchronized PolicyController build(String name, Properties properties) { + + if (this.policyControllers.containsKey(name)) { + return this.policyControllers.get(name); + } + + /* A PolicyController does not exist */ + + PolicyController controller = newPolicyController(name, properties); + + String coordinates = toKey(controller.getDrools().getGroupId(), + controller.getDrools().getArtifactId()); + + this.policyControllers.put(name, controller); + + + if (controller.getDrools().isBrained()) { + this.coordinates2Controller.put(coordinates, controller); + } + + return controller; + } + + /** + * {@inheritDoc}. + */ + @Override + public synchronized PolicyController patch(String name, DroolsConfiguration droolsConfig) { + + if (name == null || name.isEmpty() || !this.policyControllers.containsKey(name)) { + throw makeArgEx(name); + } + + PolicyController controller = this.get(name); + + if (controller == null) { + logger.warn("A POLICY CONTROLLER of name {} does not exist for patch operation: {}", name, droolsConfig); + + throw new IllegalArgumentException("Not a valid controller of name " + name); + } + + this.patch(controller, droolsConfig); + + logger.info("UPDATED drools configuration: {} on {}", droolsConfig, this); + + return controller; + } + + + /** + * {@inheritDoc}. + */ + @Override + public void patch(PolicyController controller, DroolsConfiguration droolsConfig) { + + if (controller == null) { + throw new IllegalArgumentException("Not a valid controller: null"); + } + + if (droolsConfig == null) { + throw new IllegalArgumentException("Invalid Drools Configuration"); + } + + if (!controller.updateDrools(droolsConfig)) { + logger.warn("Cannot update drools configuration: {} on {}", droolsConfig, this); + throw new IllegalArgumentException("Cannot update drools configuration Drools Configuration"); + } + + logger.info("UPDATED drools configuration: {} on {}", droolsConfig, this); + + String coordinates = toKey(controller.getDrools().getGroupId(), + controller.getDrools().getArtifactId()); + + if (controller.getDrools().isBrained()) { + this.coordinates2Controller.put(coordinates, controller); + } + + } + + /** + * {@inheritDoc}. + */ + @Override + public void shutdown(String controllerName) { + + if (controllerName == null || controllerName.isEmpty()) { + throw makeArgEx(controllerName); + } + + synchronized (this) { + if (!this.policyControllers.containsKey(controllerName)) { + return; + } + + PolicyController controller = this.policyControllers.get(controllerName); + this.shutdown(controller); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public void shutdown(PolicyController controller) { + this.unmanage(controller); + controller.shutdown(); + } + + /** + * {@inheritDoc}. + */ + @Override + public void shutdown() { + List<PolicyController> controllers = this.inventory(); + for (PolicyController controller: controllers) { + controller.shutdown(); + } + + synchronized (this) { + this.policyControllers.clear(); + this.coordinates2Controller.clear(); + } + } + + /** + * unmanage the controller. + * + * @param controller controller + * @throws IllegalArgumentException exception + */ + private void unmanage(PolicyController controller) { + PolicyController tempController = controller; + if (tempController == null) { + throw new IllegalArgumentException("Invalid Controller"); + } + + synchronized (this) { + if (!this.policyControllers.containsKey(tempController.getName())) { + return; + } + tempController = this.policyControllers.remove(tempController.getName()); + + String coordinates = toKey(tempController.getDrools().getGroupId(), + tempController.getDrools().getArtifactId()); + this.coordinates2Controller.remove(coordinates); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public void destroy(String controllerName) { + + if (controllerName == null || controllerName.isEmpty()) { + throw makeArgEx(controllerName); + } + + synchronized (this) { + if (!this.policyControllers.containsKey(controllerName)) { + return; + } + + PolicyController controller = this.policyControllers.get(controllerName); + this.destroy(controller); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public void destroy(PolicyController controller) { + this.unmanage(controller); + controller.halt(); + } + + /** + * {@inheritDoc}. + */ + @Override + public void destroy() { + List<PolicyController> controllers = this.inventory(); + for (PolicyController controller: controllers) { + controller.halt(); + } + + synchronized (this) { + this.policyControllers.clear(); + this.coordinates2Controller.clear(); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public PolicyController get(String name) { + + if (name == null || name.isEmpty()) { + throw makeArgEx(name); + } + + synchronized (this) { + if (this.policyControllers.containsKey(name)) { + return this.policyControllers.get(name); + } else { + throw makeArgEx(name); + } + } + } + + /** + * {@inheritDoc}. + */ + @Override + public PolicyController get(String groupId, String artifactId) { + + if (groupId == null || groupId.isEmpty() + || artifactId == null || artifactId.isEmpty()) { + throw new IllegalArgumentException("Invalid group/artifact ids"); + } + + synchronized (this) { + String key = toKey(groupId,artifactId); + if (this.coordinates2Controller.containsKey(key)) { + return this.coordinates2Controller.get(key); + } else { + throw makeArgEx(key); + } + } + } + + /** + * {@inheritDoc}. + */ + @Override + public PolicyController get(DroolsController droolsController) { + + if (droolsController == null) { + throw new IllegalArgumentException("No Drools Controller provided"); + } + + synchronized (this) { + String key = toKey(droolsController.getGroupId(), droolsController.getArtifactId()); + if (this.coordinates2Controller.containsKey(key)) { + return this.coordinates2Controller.get(key); + } else { + logger.error("Drools Controller not associated with Policy Controller {}:{}", droolsController, this); + throw new IllegalStateException("Drools Controller not associated with Policy Controller " + + droolsController + ":" + this); + } + } + } + + /** + * {@inheritDoc}. + */ + @Override + public List<PolicyController> inventory() { + return new ArrayList<>(this.policyControllers.values()); + } + + /** + * {@inheritDoc}. + */ + @Override + public List<String> getFeatures() { + List<String> features = new ArrayList<>(); + for (PolicyControllerFeatureApi feature : getProviders()) { + features.add(feature.getName()); + } + return features; + } + + /** + * {@inheritDoc}. + */ + @JsonIgnore + @GsonJsonIgnore + @Override + public List<PolicyControllerFeatureApi> getFeatureProviders() { + return getProviders(); + } + + /** + * {@inheritDoc}. + */ + @Override + public PolicyControllerFeatureApi getFeatureProvider(String featureName) { + if (featureName == null || featureName.isEmpty()) { + throw new IllegalArgumentException("A feature name must be provided"); + } + + for (PolicyControllerFeatureApi feature : getProviders()) { + if (feature.getName().equals(featureName)) { + return feature; + } + } + + throw new IllegalArgumentException("Invalid Feature Name: " + featureName); + } + + private IllegalArgumentException makeArgEx(String argName) { + return new IllegalArgumentException("Invalid " + argName); + } + + // these methods can be overridden by junit tests + + protected PolicyController newPolicyController(String name, Properties properties) { + return new AggregatedPolicyController(name, properties); + } + + protected List<PolicyControllerFeatureApi> getProviders() { + return PolicyControllerFeatureApi.providers.getList(); + } +} |