aboutsummaryrefslogtreecommitdiffstats
path: root/policy-management/src/main/java/org/openecomp
diff options
context:
space:
mode:
authorGuo Ruijing <ruijing.guo@intel.com>2017-07-28 08:23:01 +0000
committerGuo Ruijing <ruijing.guo@intel.com>2017-07-28 08:23:30 +0000
commit6abeb297254942c48722c2da0e7c355d523fe307 (patch)
treef2b006ec6ca8804633e2f74a6f1b40c90683f1ea /policy-management/src/main/java/org/openecomp
parentd1d749ae390c276fc10c4985d0080f0a9ff7ff35 (diff)
[POLICY-72] replace openecomp for drools-pdp
Change-Id: I8aa8e32d3ba10f7c655b50e97aaf6865514d4777 Signed-off-by: Guo Ruijing <ruijing.guo@intel.com>
Diffstat (limited to 'policy-management/src/main/java/org/openecomp')
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsController.java218
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsControllerFactory.java555
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java910
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/NullDroolsController.java262
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyControllerFeatureAPI.java222
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyEngineFeatureAPI.java202
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/persistence/SystemPersistence.java248
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java1393
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/JsonProtocolFilter.java308
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/ProtocolCoderToolset.java683
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/TopicCoderFilterConfiguration.java309
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/ControllerConfiguration.java280
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/DroolsConfiguration.java278
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/PdpdConfiguration.java283
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/server/restful/RestManager.java2335
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java135
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyController.java110
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyControllerFactory.java522
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java1461
-rw-r--r--policy-management/src/main/java/org/openecomp/policy/drools/system/internal/AggregatedPolicyController.java626
20 files changed, 0 insertions, 11340 deletions
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsController.java b/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsController.java
deleted file mode 100644
index 251cef11..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsController.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.controller;
-
-import java.util.List;
-import java.util.Map;
-
-import org.openecomp.policy.drools.core.PolicyContainer;
-import org.openecomp.policy.drools.event.comm.TopicSink;
-import org.openecomp.policy.drools.properties.Lockable;
-import org.openecomp.policy.drools.properties.Startable;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration;
-
-/**
- * Drools Controller is the abstractions that wraps the
- * drools layer (policy-core)
- */
-public interface DroolsController extends Startable, Lockable {
-
- /**
- * No Group ID identifier
- */
- public static final String NO_GROUP_ID = "NO-GROUP-ID";
-
- /**
- * No Artifact ID identifier
- */
- public static final String NO_ARTIFACT_ID = "NO-ARTIFACT-ID";
-
- /**
- * No version identifier
- */
- public static final String NO_VERSION = "NO-VERSION";
-
- /**
- * get group id
- * @return group id
- */
- public String getGroupId();
-
- /**
- * get artifact id
- * @return artifact id
- */
- public String getArtifactId();
-
- /**
- * get version
- * @return version
- */
- public String getVersion();
-
- /**
- * return the policy session names
- *
- * @return policy session
- */
- public List<String> getSessionNames();
-
- /**
- * return the policy full session names
- *
- * @return policy session
- */
- public List<String> getCanonicalSessionNames();
-
- /**
- * offers an event to this controller for processing
- *
- * @param topic topic associated with the event
- * @param event the event
- *
- * @return true if the operation was successful
- */
- public boolean offer(String topic, String event);
-
- /**
- * delivers "event" to "sink"
- *
- * @param sink destination
- * @param event
- * @return true if successful, false if a failure has occurred.
- * @throws IllegalArgumentException when invalid or insufficient
- * properties are provided
- * @throws IllegalStateException when the engine is in a state where
- * this operation is not permitted (ie. locked or stopped).
- * @throws UnsupportedOperationException when the engine cannot deliver due
- * to the functionality missing (ie. communication infrastructure
- * not supported.
- */
- public boolean deliver(TopicSink sink, Object event)
- throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException;
-
- /**
- *
- * @return the most recent received events
- */
- public Object[] getRecentSourceEvents();
-
- /**
- *
- * @return the most recent delivered events
- */
- public String[] getRecentSinkEvents();
-
- /**
- * @return the underlying policy container
- */
- public PolicyContainer getContainer();
-
- /**
- * Supports this encoder?
- *
- * @param encodedObject
- * @return
- */
- public boolean ownsCoder(Class<? extends Object> coderClass, int modelHash) throws IllegalStateException;
-
- /**
- * fetches a class from the model
- *
- * @param className the class to fetch
- * @return the actual class object, or null if not found
- */
- public Class<?> fetchModelClass(String className) throws IllegalArgumentException;
-
- /**
- * is this controller Smart?
- */
- public boolean isBrained();
-
- /**
- * update the new version of the maven jar rules file
- *
- * @param newGroupId - new group id
- * @param newArtifactId - new artifact id
- * @param newVersion - new version
- * @param decoderConfigurations - decoder configurations
- * @param encoderConfigurations - encoder configurations
- *
- * @throws Exception from within drools libraries
- * @throws LinkageError from within drools libraries
- * @throws ArgumentException bad parameter passed in
- */
- public void updateToVersion(String newGroupId, String newArtifactId, String newVersion,
- List<TopicCoderFilterConfiguration> decoderConfigurations,
- List<TopicCoderFilterConfiguration> encoderConfigurations)
- throws IllegalArgumentException, LinkageError, Exception;
-
- /**
- * gets the classnames of facts as well as the current count
- * @param sessionName the session name
- * @return map of class to count
- */
- public Map<String,Integer> factClassNames(String sessionName) throws IllegalArgumentException;
-
- /**
- * gets the count of facts for a given session
- * @param sessionName the session name
- * @return the fact count
- * @throws IllegalArgumentException
- */
- public long factCount(String sessionName) throws IllegalArgumentException;
-
- /**
- * gets all the facts of a given class for a given session
- *
- * @param sessionName the session identifier
- * @param className the class type
- * @param delete retract from drools the results of the query?
- * @return the list of facts returned by the query
- */
- public List<Object> facts(String sessionName, String className, boolean delete);
-
- /**
- * gets the facts associated with a query for a give session for a given queried entity
- *
- * @param sessionName the session
- * @param queryName the query identifier
- * @param queriedEntity the queried entity
- * @param delete retract from drools the results of the query?
- * @param queryParams query parameters
- * @return list of facts returned by the query
- */
- public List<Object> factQuery(String sessionName, String queryName, String queriedEntity,
- boolean delete, Object... queryParams);
-
- /**
- * halts and permanently releases all resources
- * @throws IllegalStateException
- */
- public void halt() throws IllegalStateException;
-
- /**
- * Factory to track and manage drools controllers
- */
- public static final DroolsControllerFactory factory =
- new IndexedDroolsControllerFactory();
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsControllerFactory.java b/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsControllerFactory.java
deleted file mode 100644
index 625eef56..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsControllerFactory.java
+++ /dev/null
@@ -1,555 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.controller;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Properties;
-
-import org.openecomp.policy.drools.controller.internal.MavenDroolsController;
-import org.openecomp.policy.drools.controller.internal.NullDroolsController;
-import org.openecomp.policy.drools.event.comm.Topic;
-import org.openecomp.policy.drools.event.comm.Topic.CommInfrastructure;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.openecomp.policy.drools.event.comm.TopicSource;
-import org.openecomp.policy.drools.event.comm.TopicSink;
-import org.openecomp.policy.drools.properties.PolicyProperties;
-import org.openecomp.policy.drools.protocol.coders.JsonProtocolFilter;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomJacksonCoder;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.PotentialCoderFilter;
-import org.openecomp.policy.drools.utils.Pair;
-
-/**
- * Drools Controller Factory to manage controller creation, destruction,
- * and retrieval for management interfaces
- */
-public interface DroolsControllerFactory {
-
- /**
- * Constructs a Drools Controller based on properties
- *
- * @param properties properties containing initialization parameters
- * @param eventSources list of event sources
- * @param eventSinks list of event sinks
- *
- * @return the instantiated Drools Controller
- * @throws IllegalArgumentException with invalid parameters
- * @throws LinkageError Failure to link rules and models in Drools Libraries
- * @throws Exception Exception from Drools Libraries
- */
- public DroolsController build(Properties properties,
- List<? extends TopicSource> eventSources,
- List<? extends TopicSink> eventSinks)
- throws IllegalArgumentException, LinkageError, Exception;
-
- /**
- * Explicit construction of a Drools Controller
- *
- * @param groupId maven group id of drools artifact
- * @param artifactId maven artifact id of drools artifact
- * @param version maven version id of drools artifact
- * @param decoderConfigurations list of decoder configurations
- * @param encoderConfigurations list of encoder configurations
- *
- * @return the instantiated Drools Controller
- * @throws IllegalArgumentException with invalid parameters
- * @throws LinkageError Failure to link rules and models in Drools Libraries
- * @throws Exception Exception from Drools Libraries
- */
- public DroolsController build(String groupId,
- String artifactId,
- String version,
- List<TopicCoderFilterConfiguration> decoderConfigurations,
- List<TopicCoderFilterConfiguration> encoderConfigurations)
- throws IllegalArgumentException, LinkageError, Exception;
-
- /**
- * Releases the Drools Controller from operation
- *
- * @param controller the Drools Controller to shut down
- */
- public void shutdown(DroolsController controller);
-
- /**
- * Disables all Drools Controllers from operation
- */
- public void shutdown();
-
- /**
- * Destroys and releases resources for a Drools Controller
- *
- * @param controller the Drools Controller to destroy
- */
- public void destroy(DroolsController controller);
-
- /**
- * Destroys all Drools Controllers
- */
- public void destroy();
-
- /**
- * Gets the Drools Controller associated with the maven group
- * and artifact id
- *
- * @param groupId maven group id of drools artifact
- * @param artifactId maven artifact id of drools artifact
- * @param version maven version id of drools artifact
- *
- * @return the Drools Controller
- * @throws IllegalArgumentException with invalid parameters
- */
- public DroolsController get(String groupId,
- String artifactId,
- String version)
- throws IllegalArgumentException;
-
- /**
- * returns the current inventory of Drools Controllers
- *
- * @return a list of Drools Controllers
- */
- public List<DroolsController> inventory();
-}
-
-/* ---------------- implementation -----------------*/
-
-/**
- * Factory of Drools Controllers indexed by the Maven coordinates
- */
-class IndexedDroolsControllerFactory implements DroolsControllerFactory {
-
- /**
- * logger
- */
- private static Logger logger = LoggerFactory.getLogger(MavenDroolsController.class);
-
- /**
- * Policy Controller Name Index
- */
- protected HashMap<String, DroolsController> droolsControllers =
- new HashMap<String, DroolsController>();
-
- /**
- * Null Drools Controller
- */
- protected NullDroolsController nullDroolsController = new NullDroolsController();
-
-
- public IndexedDroolsControllerFactory() {
-
- /* Add a NULL controller which will always be present in the hash */
-
- DroolsController controller = new NullDroolsController();
- String controllerId = controller.getGroupId() + ":" + controller.getArtifactId();
-
- synchronized(this) {
- droolsControllers.put(controllerId, controller);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public DroolsController build(Properties properties,
- List<? extends TopicSource> eventSources,
- List<? extends TopicSink> eventSinks)
- throws IllegalArgumentException, LinkageError, Exception {
-
- String groupId = properties.getProperty(PolicyProperties.RULES_GROUPID);
- if (groupId == null || groupId.isEmpty())
- groupId = DroolsController.NO_GROUP_ID;
-
- String artifactId = properties.getProperty(PolicyProperties.RULES_ARTIFACTID);
- if (artifactId == null || artifactId.isEmpty())
- artifactId = DroolsController.NO_ARTIFACT_ID;
-
- String version = properties.getProperty(PolicyProperties.RULES_VERSION);
- if (version == null || version.isEmpty())
- version = DroolsController.NO_VERSION;
-
- List<TopicCoderFilterConfiguration>
- topics2DecodedClasses2Filters = codersAndFilters(properties, eventSources);
-
- List<TopicCoderFilterConfiguration>
- topics2EncodedClasses2Filters = codersAndFilters(properties, eventSinks);
-
- return this.build(groupId, artifactId, version,
- topics2DecodedClasses2Filters,
- topics2EncodedClasses2Filters);
- }
-
- /**
- * find out decoder classes and filters
- *
- * @param properties properties with information about decoders
- * @param topicEntities topic sources
- * @return list of topics, each with associated decoder classes, each
- * with a list of associated filters
- * @throws IllegalArgumentException invalid input data
- */
- protected List<TopicCoderFilterConfiguration> codersAndFilters
- (Properties properties, List<? extends Topic> topicEntities)
- throws IllegalArgumentException {
-
- String PROPERTY_TOPIC_ENTITY_PREFIX;
-
- List<TopicCoderFilterConfiguration>
- topics2DecodedClasses2Filters =
- new ArrayList<TopicCoderFilterConfiguration>();
-
- if (topicEntities.isEmpty())
- return topics2DecodedClasses2Filters;
-
- for (Topic topic: topicEntities) {
-
- /* source or sink ? ueb or dmaap? */
- boolean isSource = (topic instanceof TopicSource);
- CommInfrastructure commInfra = topic.getTopicCommInfrastructure();
- if (commInfra == CommInfrastructure.UEB) {
- if (isSource) {
- PROPERTY_TOPIC_ENTITY_PREFIX = PolicyProperties.PROPERTY_UEB_SOURCE_TOPICS + ".";
- } else {
- PROPERTY_TOPIC_ENTITY_PREFIX = PolicyProperties.PROPERTY_UEB_SINK_TOPICS + ".";
- }
- } else if (commInfra == CommInfrastructure.DMAAP) {
- if (isSource) {
- PROPERTY_TOPIC_ENTITY_PREFIX = PolicyProperties.PROPERTY_DMAAP_SOURCE_TOPICS + ".";
- } else {
- PROPERTY_TOPIC_ENTITY_PREFIX = PolicyProperties.PROPERTY_DMAAP_SINK_TOPICS + ".";
- }
- } else if (commInfra == CommInfrastructure.NOOP) {
- if (!isSource)
- PROPERTY_TOPIC_ENTITY_PREFIX = PolicyProperties.PROPERTY_NOOP_SINK_TOPICS + ".";
- else
- continue;
- } else {
- throw new IllegalArgumentException("Invalid Communication Infrastructure: " + commInfra);
- }
-
- // 1. first the topic
-
- String aTopic = topic.getTopic();
-
- // 2. check if there is a custom decoder for this topic that the user prefers to use
- // instead of the ones provided in the platform
-
- String customGson = properties.getProperty
- (PROPERTY_TOPIC_ENTITY_PREFIX +
- aTopic +
- PolicyProperties.PROPERTY_TOPIC_EVENTS_CUSTOM_MODEL_CODER_GSON_SUFFIX);
-
- CustomGsonCoder customGsonCoder = null;
- if (customGson != null && !customGson.isEmpty()) {
- try {
- customGsonCoder = new CustomGsonCoder(customGson);
- } catch (IllegalArgumentException e) {
- logger.warn("{}: cannot create custom-gson-coder {} because of {}",
- this, customGson, e.getMessage(), e);
- }
- }
-
- String customJackson = properties.getProperty
- (PROPERTY_TOPIC_ENTITY_PREFIX +
- aTopic +
- PolicyProperties.PROPERTY_TOPIC_EVENTS_CUSTOM_MODEL_CODER_JACKSON_SUFFIX);
-
- CustomJacksonCoder customJacksonCoder = null;
- if (customJackson != null && !customJackson.isEmpty()) {
- try {
- customJacksonCoder = new CustomJacksonCoder(customJackson);
- } catch (IllegalArgumentException e) {
- logger.warn("{}: cannot create custom-jackson-coder {} because of {}",
- this, customJackson, e.getMessage(), e);
- }
- }
-
- // 3. second the list of classes associated with each topic
-
- String eventClasses =
- properties.getProperty(PROPERTY_TOPIC_ENTITY_PREFIX + aTopic + PolicyProperties.PROPERTY_TOPIC_EVENTS_SUFFIX);
-
- if (eventClasses == null || eventClasses.isEmpty()) {
- // TODO warn
- continue;
- }
-
- List<PotentialCoderFilter> classes2Filters = new ArrayList<PotentialCoderFilter>();
-
- List<String> aTopicClasses =
- new ArrayList<String>(Arrays.asList(eventClasses.split("\\s*,\\s*")));
-
- for (String aClass: aTopicClasses) {
-
-
- // 4. third, for each coder class, get the list of field filters
-
- String filter = properties.getProperty
- (PROPERTY_TOPIC_ENTITY_PREFIX +
- aTopic +
- PolicyProperties.PROPERTY_TOPIC_EVENTS_SUFFIX +
- "." + aClass +
- PolicyProperties.PROPERTY_TOPIC_EVENTS_FILTER_SUFFIX);
-
- List<Pair<String,String>> filters = new ArrayList<Pair<String,String>>();
-
- if (filter == null || filter.isEmpty()) {
- // 4. topic -> class -> with no filters
-
- JsonProtocolFilter protocolFilter = JsonProtocolFilter.fromRawFilters(filters);
- PotentialCoderFilter class2Filters =
- new PotentialCoderFilter(aClass, protocolFilter);
- classes2Filters.add(class2Filters);
- continue;
- }
-
- // There are filters associated with the applicability of
- // this class for decoding.
- List<String> listOfFilters =
- new ArrayList<String>(Arrays.asList(filter.split("\\s*,\\s*")));
-
- for (String nameValue: listOfFilters) {
- String fieldName;
- String regexValue;
-
- String[] nameValueSplit = nameValue.split("\\s*=\\s*");
- if (nameValueSplit.length <= 0 || nameValueSplit.length > 2) {
- // TODO warn
- // skip
- continue;
- }
-
- if (nameValueSplit.length == 2) {
- fieldName = nameValueSplit[0];
- regexValue = nameValueSplit[1];
- } else if (nameValueSplit.length == 1) {
- fieldName = nameValueSplit[0];
- regexValue = null;
- } else {
- // unreachable
- continue;
- }
-
- filters.add(new Pair<String,String>(fieldName, regexValue));
- }
-
- JsonProtocolFilter protocolFilter = JsonProtocolFilter.fromRawFilters(filters);
- PotentialCoderFilter class2Filters =
- new PotentialCoderFilter(aClass, protocolFilter);
- classes2Filters.add(class2Filters);
- }
-
- TopicCoderFilterConfiguration topic2Classes2Filters =
- new TopicCoderFilterConfiguration(aTopic,classes2Filters, customGsonCoder, customJacksonCoder);
- topics2DecodedClasses2Filters.add(topic2Classes2Filters);
- }
-
- return topics2DecodedClasses2Filters;
- }
-
- /**
- * {@inheritDoc}
- * @param decoderConfiguration
- */
- @Override
- public DroolsController build(String newGroupId,
- String newArtifactId,
- String newVersion,
- List<TopicCoderFilterConfiguration> decoderConfigurations,
- List<TopicCoderFilterConfiguration> encoderConfigurations)
- throws IllegalArgumentException, LinkageError, Exception {
-
- if (newGroupId == null || newArtifactId == null || newVersion == null ||
- newGroupId.isEmpty() || newArtifactId.isEmpty() || newVersion.isEmpty()) {
- throw new IllegalArgumentException("Missing maven coordinates: " +
- newGroupId + ":" + newArtifactId + ":" +
- newVersion);
- }
-
- String controllerId = newGroupId + ":" + newArtifactId;
- DroolsController controllerCopy = null;
- synchronized (this) {
- /*
- * The Null Drools Controller for no maven coordinates is always here
- * so when no coordinates present, this is the return point
- *
- * assert (controllerCopy instanceof NullDroolsController)
- */
- if (droolsControllers.containsKey(controllerId)) {
- controllerCopy = droolsControllers.get(controllerId);
- if (controllerCopy.getVersion().equalsIgnoreCase(newVersion)) {
- return controllerCopy;
- }
- }
- }
-
- if (controllerCopy != null) {
- /*
- * a controller keyed by group id + artifact id exists
- * but with different version => version upgrade/downgrade
- */
-
- controllerCopy.updateToVersion(newGroupId, newArtifactId, newVersion,
- decoderConfigurations, encoderConfigurations);
-
- return controllerCopy;
- }
-
- /* new drools controller */
-
- DroolsController controller = new MavenDroolsController
- (newGroupId, newArtifactId, newVersion,
- decoderConfigurations,
- encoderConfigurations);
-
- synchronized(this) {
- droolsControllers.put(controllerId, controller);
- }
-
- return controller;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void destroy(DroolsController controller) throws IllegalArgumentException {
- unmanage(controller);
- controller.halt();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void destroy() {
- List<DroolsController> controllers = this.inventory();
- for (DroolsController controller: controllers) {
- controller.halt();
- }
-
- synchronized(this) {
- this.droolsControllers.clear();
- }
- }
-
- /**
- * unmanage the drools controller
- *
- * @param controller
- * @return
- * @throws IllegalArgumentException
- */
- protected void unmanage(DroolsController controller) throws IllegalArgumentException {
- if (controller == null) {
- throw new IllegalArgumentException("No controller provided");
- }
-
- if (!controller.isBrained()) {
- logger.info("Drools Controller is NOT OPERATIONAL - nothing to destroy");
- return;
- }
-
- String controllerId = controller.getGroupId() + ":" + controller.getArtifactId();
- synchronized(this) {
- if (!this.droolsControllers.containsKey(controllerId)) {
- return;
- }
-
- droolsControllers.remove(controllerId);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void shutdown(DroolsController controller) throws IllegalArgumentException {
- this.unmanage(controller);
- controller.shutdown();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void shutdown() {
- List<DroolsController> controllers = this.inventory();
- for (DroolsController controller: controllers) {
- controller.shutdown();
- }
-
- synchronized(this) {
- this.droolsControllers.clear();
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public DroolsController get(String groupId,
- String artifactId,
- String version)
- throws IllegalArgumentException, IllegalStateException {
-
- if (groupId == null || artifactId == null ||
- groupId.isEmpty() || artifactId.isEmpty()) {
- throw new IllegalArgumentException("Missing maven coordinates: " +
- groupId + ":" + artifactId);
- }
-
- String controllerId = groupId + ":" + artifactId;
-
- synchronized(this) {
- if (this.droolsControllers.containsKey(controllerId)) {
- return droolsControllers.get(controllerId);
- } else {
- throw new IllegalStateException("DroolController for " +
- controllerId + " not found");
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<DroolsController> inventory() {
- List<DroolsController> controllers =
- new ArrayList<DroolsController>(this.droolsControllers.values());
- return controllers;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("IndexedDroolsControllerFactory [#droolsControllers=").append(droolsControllers.size())
- .append("]");
- return builder.toString();
- }
-
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java b/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java
deleted file mode 100644
index 4eacbd1c..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java
+++ /dev/null
@@ -1,910 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.controller.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.collections4.queue.CircularFifoQueue;
-import org.drools.core.ClassObjectFilter;
-import org.kie.api.definition.KiePackage;
-import org.kie.api.definition.rule.Query;
-import org.kie.api.runtime.KieSession;
-import org.kie.api.runtime.rule.FactHandle;
-import org.kie.api.runtime.rule.QueryResults;
-import org.kie.api.runtime.rule.QueryResultsRow;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.openecomp.policy.drools.controller.DroolsController;
-import org.openecomp.policy.drools.core.PolicyContainer;
-import org.openecomp.policy.drools.core.PolicySession;
-import org.openecomp.policy.drools.core.jmx.PdpJmx;
-import org.openecomp.policy.drools.event.comm.TopicSink;
-import org.openecomp.policy.drools.protocol.coders.EventProtocolCoder;
-import org.openecomp.policy.drools.protocol.coders.JsonProtocolFilter;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomJacksonCoder;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.PotentialCoderFilter;
-import org.openecomp.policy.drools.utils.ReflectionUtil;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * Maven-based Drools Controller that interacts with the
- * policy-core PolicyContainer and PolicySession to manage
- * Drools containers instantiated using Maven.
- */
-public class MavenDroolsController implements DroolsController {
-
- /**
- * logger
- */
- private static Logger logger = LoggerFactory.getLogger(MavenDroolsController.class);
-
- /**
- * Policy Container, the access object to the policy-core layer
- */
- @JsonIgnore
- protected final PolicyContainer policyContainer;
-
- /**
- * alive status of this drools controller,
- * reflects invocation of start()/stop() only
- */
- protected volatile boolean alive = false;
-
- /**
- * locked status of this drools controller,
- * reflects if i/o drools related operations are permitted,
- * more specifically: offer() and deliver().
- * It does not affect the ability to start and stop
- * underlying drools infrastructure
- */
- protected volatile boolean locked = false;
-
- /**
- * list of topics, each with associated decoder classes, each
- * with a list of associated filters.
- */
- protected List<TopicCoderFilterConfiguration> decoderConfigurations;
-
- /**
- * list of topics, each with associated encoder classes, each
- * with a list of associated filters.
- */
- protected List<TopicCoderFilterConfiguration> encoderConfigurations;
-
- /**
- * recent source events processed
- */
- protected final CircularFifoQueue<Object> recentSourceEvents = new CircularFifoQueue<Object>(10);
-
- /**
- * recent sink events processed
- */
- protected final CircularFifoQueue<String> recentSinkEvents = new CircularFifoQueue<String>(10);
-
- /**
- * original Drools Model/Rules classloader hash
- */
- protected int modelClassLoaderHash;
-
- /**
- * Expanded version of the constructor
- *
- * @param groupId maven group id
- * @param artifactId maven artifact id
- * @param version maven version
- * @param decoderConfiguration list of topic -> decoders -> filters mapping
- * @param encoderConfiguration list of topic -> encoders -> filters mapping
- *
- * @throws IllegalArgumentException invalid arguments passed in
- */
- public MavenDroolsController(String groupId,
- String artifactId,
- String version,
- List<TopicCoderFilterConfiguration> decoderConfigurations,
- List<TopicCoderFilterConfiguration> encoderConfigurations)
- throws IllegalArgumentException {
-
- if (logger.isInfoEnabled())
- logger.info("DROOLS CONTROLLER: instantiation " + this +
- " -> {" + groupId + ":" + artifactId + ":" + version + "}");
-
- if (groupId == null || artifactId == null || version == null ||
- groupId.isEmpty() || artifactId.isEmpty() || version.isEmpty()) {
- throw new IllegalArgumentException("Missing maven coordinates: " +
- groupId + ":" + artifactId + ":" +
- version);
- }
-
- this.policyContainer= new PolicyContainer(groupId, artifactId, version);
- this.init(decoderConfigurations, encoderConfigurations);
-
- if (logger.isInfoEnabled())
- logger.info("DROOLS CONTROLLER: instantiation completed " + this);
- }
-
- /**
- * init encoding/decoding configuration
- * @param decoderConfiguration list of topic -> decoders -> filters mapping
- * @param encoderConfiguration list of topic -> encoders -> filters mapping
- */
- protected void init(List<TopicCoderFilterConfiguration> decoderConfigurations,
- List<TopicCoderFilterConfiguration> encoderConfigurations) {
-
- this.decoderConfigurations = decoderConfigurations;
- this.encoderConfigurations = encoderConfigurations;
-
- this.initCoders(decoderConfigurations, true);
- this.initCoders(encoderConfigurations, false);
-
- this.modelClassLoaderHash = this.policyContainer.getClassLoader().hashCode();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void updateToVersion(String newGroupId, String newArtifactId, String newVersion,
- List<TopicCoderFilterConfiguration> decoderConfigurations,
- List<TopicCoderFilterConfiguration> encoderConfigurations)
- throws IllegalArgumentException, LinkageError, Exception {
-
- if (logger.isInfoEnabled())
- logger.info("UPDATE-TO-VERSION: " + this + " -> {" + newGroupId + ":" + newArtifactId + ":" + newVersion + "}");
-
- if (newGroupId == null || newArtifactId == null || newVersion == null ||
- newGroupId.isEmpty() || newArtifactId.isEmpty() || newVersion.isEmpty()) {
- throw new IllegalArgumentException("Missing maven coordinates: " +
- newGroupId + ":" + newArtifactId + ":" +
- newVersion);
- }
-
- if (newGroupId.equalsIgnoreCase(DroolsController.NO_GROUP_ID) ||
- newArtifactId.equalsIgnoreCase(DroolsController.NO_ARTIFACT_ID) ||
- newVersion.equalsIgnoreCase(DroolsController.NO_VERSION)) {
- throw new IllegalArgumentException("BRAINLESS maven coordinates provided: " +
- newGroupId + ":" + newArtifactId + ":" +
- newVersion);
- }
-
- if (newGroupId.equalsIgnoreCase(this.getGroupId()) &&
- newArtifactId.equalsIgnoreCase(this.getArtifactId()) &&
- newVersion.equalsIgnoreCase(this.getVersion())) {
- logger.warn("Al in the right version: " + newGroupId + ":" +
- newArtifactId + ":" + newVersion + " vs. " + this);
- return;
- }
-
- if (!newGroupId.equalsIgnoreCase(this.getGroupId()) ||
- !newArtifactId.equalsIgnoreCase(this.getArtifactId())) {
- throw new IllegalArgumentException("Group ID and Artifact ID maven coordinates must be identical for the upgrade: " +
- newGroupId + ":" + newArtifactId + ":" +
- newVersion + " vs. " + this);
- }
-
- /* upgrade */
- String messages = this.policyContainer.updateToVersion(newVersion);
- if (logger.isWarnEnabled())
- logger.warn(this + "UPGRADE results: " + messages);
-
- /*
- * If all sucessful (can load new container), now we can remove all coders from previous sessions
- */
- this.removeCoders();
-
- /*
- * add the new coders
- */
- this.init(decoderConfigurations, encoderConfigurations);
-
- if (logger.isInfoEnabled())
- logger.info("UPDATE-TO-VERSION: completed " + this);
- }
-
- /**
- * initialize decoders for all the topics supported by this controller
- * Note this is critical to be done after the Policy Container is
- * instantiated to be able to fetch the corresponding classes.
- *
- * @param decoderConfiguration list of topic -> decoders -> filters mapping
- */
- protected void initCoders(List<TopicCoderFilterConfiguration> coderConfigurations,
- boolean decoder)
- throws IllegalArgumentException {
-
- if (logger.isInfoEnabled())
- logger.info("INIT-CODERS: " + this);
-
- if (coderConfigurations == null) {
- return;
- }
-
-
- for (TopicCoderFilterConfiguration coderConfig: coderConfigurations) {
- String topic = coderConfig.getTopic();
-
- CustomGsonCoder customGsonCoder = coderConfig.getCustomGsonCoder();
- if (coderConfig.getCustomGsonCoder() != null &&
- coderConfig.getCustomGsonCoder().getClassContainer() != null &&
- !coderConfig.getCustomGsonCoder().getClassContainer().isEmpty()) {
-
- String customGsonCoderClass = coderConfig.getCustomGsonCoder().getClassContainer();
- if (!ReflectionUtil.isClass(this.policyContainer.getClassLoader(),
- customGsonCoderClass)) {
- logger.error(customGsonCoderClass + " cannot be retrieved");
- throw new IllegalArgumentException(customGsonCoderClass + " cannot be retrieved");
- } else {
- if (logger.isInfoEnabled())
- logger.info("CLASS FETCHED " + customGsonCoderClass);
- }
- }
-
- CustomJacksonCoder customJacksonCoder = coderConfig.getCustomJacksonCoder();
- if (coderConfig.getCustomJacksonCoder() != null &&
- coderConfig.getCustomJacksonCoder().getClassContainer() != null &&
- !coderConfig.getCustomJacksonCoder().getClassContainer().isEmpty()) {
-
- String customJacksonCoderClass = coderConfig.getCustomJacksonCoder().getClassContainer();
- if (!ReflectionUtil.isClass(this.policyContainer.getClassLoader(),
- customJacksonCoderClass)) {
- logger.error(customJacksonCoderClass + " cannot be retrieved");
- throw new IllegalArgumentException(customJacksonCoderClass + " cannot be retrieved");
- } else {
- if (logger.isInfoEnabled())
- logger.info("CLASS FETCHED " + customJacksonCoderClass);
- }
- }
-
- List<PotentialCoderFilter> coderFilters = coderConfig.getCoderFilters();
- if (coderFilters == null || coderFilters.isEmpty()) {
- continue;
- }
-
- for (PotentialCoderFilter coderFilter : coderFilters) {
- String potentialCodedClass = coderFilter.getCodedClass();
- JsonProtocolFilter protocolFilter = coderFilter.getFilter();
-
- if (!ReflectionUtil.isClass(this.policyContainer.getClassLoader(),
- potentialCodedClass)) {
- logger.error(potentialCodedClass + " cannot be retrieved");
- throw new IllegalArgumentException(potentialCodedClass + " cannot be retrieved");
- } else {
- if (logger.isInfoEnabled())
- logger.info("CLASS FETCHED " + potentialCodedClass);
- }
-
- if (decoder)
- EventProtocolCoder.manager.addDecoder(this.getGroupId(), this.getArtifactId(),
- topic, potentialCodedClass, protocolFilter,
- customGsonCoder,
- customJacksonCoder,
- this.policyContainer.getClassLoader().hashCode());
- else
- EventProtocolCoder.manager.addEncoder(this.getGroupId(), this.getArtifactId(),
- topic, potentialCodedClass, protocolFilter,
- customGsonCoder,
- customJacksonCoder,
- this.policyContainer.getClassLoader().hashCode());
- }
- }
- }
-
-
- /**
- * remove decoders.
- */
- protected void removeDecoders()
- throws IllegalArgumentException {
- if (logger.isInfoEnabled())
- logger.info("REMOVE-DECODERS: " + this);
-
- if (this.decoderConfigurations == null) {
- return;
- }
-
-
- for (TopicCoderFilterConfiguration coderConfig: decoderConfigurations) {
- String topic = coderConfig.getTopic();
- EventProtocolCoder.manager.removeDecoders
- (this.getGroupId(), this.getArtifactId(), topic);
- }
- }
-
- /**
- * remove decoders.
- */
- protected void removeEncoders()
- throws IllegalArgumentException {
-
- if (logger.isInfoEnabled())
- logger.info("REMOVE-ENCODERS: " + this);
-
- if (this.encoderConfigurations == null)
- return;
-
-
- for (TopicCoderFilterConfiguration coderConfig: encoderConfigurations) {
- String topic = coderConfig.getTopic();
- EventProtocolCoder.manager.removeEncoders
- (this.getGroupId(), this.getArtifactId(), topic);
- }
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean ownsCoder(Class<? extends Object> coderClass, int modelHash) throws IllegalStateException {
- if (!ReflectionUtil.isClass
- (this.policyContainer.getClassLoader(), coderClass.getCanonicalName())) {
- logger.error(this + coderClass.getCanonicalName() + " cannot be retrieved. ");
- return false;
- }
-
- if (modelHash == this.modelClassLoaderHash) {
- if (logger.isInfoEnabled())
- logger.info(coderClass.getCanonicalName() +
- this + " class loader matches original drools controller rules classloader " +
- coderClass.getClassLoader());
- return true;
- } else {
- if (logger.isWarnEnabled())
- logger.warn(this + coderClass.getCanonicalName() + " class loaders don't match " +
- coderClass.getClassLoader() + " vs " +
- this.policyContainer.getClassLoader());
- return false;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean start() {
-
- if (logger.isInfoEnabled())
- logger.info("START: " + this);
-
- synchronized (this) {
- if (this.alive)
- return true;
-
- this.alive = true;
- }
-
- return this.policyContainer.start();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean stop() {
-
- logger.info("STOP: " + this);
-
- synchronized (this) {
- if (!this.alive)
- return true;
-
- this.alive = false;
- }
-
- return this.policyContainer.stop();
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void shutdown() throws IllegalStateException {
- logger.info("{}: SHUTDOWN", this);
-
- try {
- this.stop();
- this.removeCoders();
- } catch (Exception e) {
- logger.error("{} SHUTDOWN FAILED because of {}", this, e.getMessage(), e);
- } finally {
- this.policyContainer.shutdown();
- }
-
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void halt() throws IllegalStateException {
- logger.info("{}: HALT", this);
-
- try {
- this.stop();
- this.removeCoders();
- } catch (Exception e) {
- logger.error("{} HALT FAILED because of {}", this, e.getMessage(), e);
- } finally {
- this.policyContainer.destroy();
- }
- }
-
- /**
- * removes this drools controllers and encoders and decoders from operation
- */
- protected void removeCoders() {
- logger.info("{}: REMOVE-CODERS", this);
-
- try {
- this.removeDecoders();
- } catch (IllegalArgumentException e) {
- logger.error("{} REMOVE-DECODERS FAILED because of {}", this, e.getMessage(), e);
- }
-
- try {
- this.removeEncoders();
- } catch (IllegalArgumentException e) {
- logger.error("{} REMOVE-ENCODERS FAILED because of {}", this, e.getMessage(), e);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isAlive() {
- return this.alive;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean offer(String topic, String event) {
- logger.debug("{}: OFFER: {} <- {}", this, topic, event);
-
- if (this.locked)
- return true;
-
- if (!this.alive)
- return true;
-
- // 0. Check if the policy container has any sessions
-
- if (this.policyContainer.getPolicySessions().size() <= 0) {
- // no sessions
- return true;
- }
-
- // 1. Now, check if this topic has a decoder:
-
- if (!EventProtocolCoder.manager.isDecodingSupported(this.getGroupId(),
- this.getArtifactId(),
- topic)) {
-
- logger.warn("{}: DECODING-UNSUPPORTED {}:{}:{}", this,
- topic, this.getGroupId(), this.getArtifactId());
- return true;
- }
-
- // 2. Decode
-
- Object anEvent;
- try {
- anEvent = EventProtocolCoder.manager.decode(this.getGroupId(),
- this.getArtifactId(),
- topic,
- event);
- } catch (UnsupportedOperationException uoe) {
- logger.debug("{}: DECODE FAILED: {} <- {} because of {}", this, topic,
- event, uoe.getMessage(), uoe);
- return true;
- } catch (Exception e) {
- logger.warn("{}: DECODE FAILED: {} <- {} because of {}", this, topic,
- event, e.getMessage(), e);
- return true;
- }
-
- synchronized(this.recentSourceEvents) {
- this.recentSourceEvents.add(anEvent);
- }
-
- // increment event count for Nagios monitoring
- PdpJmx.getInstance().updateOccured();
-
- // Broadcast
-
- if (logger.isInfoEnabled())
- logger.info(this + "BROADCAST-INJECT of " + event + " FROM " + topic + " INTO " + this.policyContainer.getName());
-
- if (!this.policyContainer.insertAll(anEvent))
- logger.warn(this + "Failed to inject into PolicyContainer " + this.getSessionNames());
-
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean deliver(TopicSink sink, Object event)
- throws IllegalArgumentException,
- IllegalStateException,
- UnsupportedOperationException {
-
- if (logger.isInfoEnabled())
- logger.info(this + "DELIVER: " + event + " FROM " + this + " TO " + sink);
-
- if (sink == null)
- throw new IllegalArgumentException
- (this + " invalid sink");
-
- if (event == null)
- throw new IllegalArgumentException
- (this + " invalid event");
-
- if (this.locked)
- throw new IllegalStateException
- (this + " is locked");
-
- if (!this.alive)
- throw new IllegalStateException
- (this + " is stopped");
-
- String json =
- EventProtocolCoder.manager.encode(sink.getTopic(), event, this);
-
- synchronized(this.recentSinkEvents) {
- this.recentSinkEvents.add(json);
- }
-
- return sink.send(json);
-
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getVersion() {
- return this.policyContainer.getVersion();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getArtifactId() {
- return this.policyContainer.getArtifactId();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getGroupId() {
- return this.policyContainer.getGroupId();
- }
-
- /**
- * @return the modelClassLoaderHash
- */
- public int getModelClassLoaderHash() {
- return modelClassLoaderHash;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized boolean lock() {
- logger.info("LOCK: " + this);
-
- this.locked = true;
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized boolean unlock() {
- logger.info("UNLOCK: " + this);
-
- this.locked = false;
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isLocked() {
- return this.locked;
- }
-
- /**
- * {@inheritDoc}
- */
- @JsonIgnore
- public PolicyContainer getContainer() {
- return this.policyContainer;
- }
-
- /**
- * {@inheritDoc}
- */
- @JsonProperty("sessions")
- @Override
- public List<String> getSessionNames() {
- return getSessionNames(true);
- }
-
- /**
- * {@inheritDoc}
- */
- @JsonProperty("sessionCoordinates")
- @Override
- public List<String> getCanonicalSessionNames() {
- return getSessionNames(false);
- }
-
- /**
- * get session names
- * @param abbreviated true for the short form, otherwise the long form
- * @return session names
- */
- protected List<String> getSessionNames(boolean abbreviated) {
- List<String> sessionNames = new ArrayList<String>();
- try {
- for (PolicySession session: this.policyContainer.getPolicySessions()) {
- if (abbreviated)
- sessionNames.add(session.getName());
- else
- sessionNames.add(session.getFullName());
- }
- } catch (Exception e) {
- logger.warn("Can't retrieve CORE sessions: " + e.getMessage(), e);
- sessionNames.add(e.getMessage());
- }
- return sessionNames;
- }
-
- /**
- * provides the underlying core layer container sessions
- *
- * @return the attached Policy Container
- */
- protected List<PolicySession> getSessions() {
- List<PolicySession> sessions = new ArrayList<PolicySession>();
- sessions.addAll(this.policyContainer.getPolicySessions());
- return sessions;
- }
-
- /**
- * provides the underlying core layer container session with name sessionName
- *
- * @param sessionName session name
- * @return the attached Policy Container
- * @throws IllegalArgumentException when an invalid session name is provided
- * @throws IllegalStateException when the drools controller is in an invalid state
- */
- protected PolicySession getSession(String sessionName) {
- if (sessionName == null || sessionName.isEmpty())
- throw new IllegalArgumentException("A Session Name must be provided");
-
- List<PolicySession> sessions = this.getSessions();
- for (PolicySession session : sessions) {
- if (sessionName.equals(session.getName()) || sessionName.equals(session.getName()))
- return session;
- }
-
- throw new IllegalArgumentException("Invalid Session Name: " + sessionName);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Map<String,Integer> factClassNames(String sessionName) throws IllegalArgumentException {
- if (sessionName == null || sessionName.isEmpty())
- throw new IllegalArgumentException("Invalid Session Name: " + sessionName);
-
- // List<String> classNames = new ArrayList<>();
- Map<String,Integer> classNames = new HashMap<>();
-
- PolicySession session = getSession(sessionName);
- KieSession kieSession = session.getKieSession();
-
- Collection<FactHandle> facts = session.getKieSession().getFactHandles();
- for (FactHandle fact : facts) {
- try {
- String className = kieSession.getObject(fact).getClass().getName();
- if (classNames.containsKey(className))
- classNames.put(className, classNames.get(className) + 1);
- else
- classNames.put(className, 1);
- } catch (Exception e) {
- if (logger.isInfoEnabled())
- logger.info("Object cannot be retrieved from fact: " + fact);
- }
- }
-
- return classNames;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public long factCount(String sessionName) throws IllegalArgumentException {
- if (sessionName == null || sessionName.isEmpty())
- throw new IllegalArgumentException("Invalid Session Name: " + sessionName);
-
- PolicySession session = getSession(sessionName);
- return session.getKieSession().getFactCount();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<Object> facts(String sessionName, String className, boolean delete) {
- if (sessionName == null || sessionName.isEmpty())
- throw new IllegalArgumentException("Invalid Session Name: " + sessionName);
-
- if (className == null || className.isEmpty())
- throw new IllegalArgumentException("Invalid Class Name: " + className);
-
- Class<?> factClass =
- ReflectionUtil.fetchClass(this.policyContainer.getClassLoader(), className);
- if (factClass == null)
- throw new IllegalArgumentException("Class cannot be fetched in model's classloader: " + className);
-
- PolicySession session = getSession(sessionName);
- KieSession kieSession = session.getKieSession();
-
- List<Object> factObjects = new ArrayList<>();
-
- Collection<FactHandle> factHandles = kieSession.getFactHandles(new ClassObjectFilter(factClass));
- for (FactHandle factHandle : factHandles) {
- try {
- factObjects.add(kieSession.getObject(factHandle));
- if (delete)
- kieSession.delete(factHandle);
- } catch (Exception e) {
- if (logger.isInfoEnabled())
- logger.info("Object cannot be retrieved from fact: " + factHandle);
- }
- }
-
- return factObjects;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<Object> factQuery(String sessionName, String queryName, String queriedEntity, boolean delete, Object... queryParams) {
- if (sessionName == null || sessionName.isEmpty())
- throw new IllegalArgumentException("Invalid Session Name: " + sessionName);
-
- if (queryName == null || queryName.isEmpty())
- throw new IllegalArgumentException("Invalid Query Name: " + queryName);
-
- if (queriedEntity == null || queriedEntity.isEmpty())
- throw new IllegalArgumentException("Invalid Queried Entity: " + queriedEntity);
-
- PolicySession session = getSession(sessionName);
- KieSession kieSession = session.getKieSession();
-
- boolean found = false;
- for (KiePackage kiePackage : kieSession.getKieBase().getKiePackages()) {
- for (Query q : kiePackage.getQueries()) {
- if (q.getName() != null && q.getName().equals(queryName)) {
- found = true;
- break;
- }
- }
- }
- if (!found)
- throw new IllegalArgumentException("Invalid Query Name: " + queryName);
-
- List<Object> factObjects = new ArrayList<>();
-
- QueryResults queryResults = kieSession.getQueryResults(queryName, queryParams);
- for (QueryResultsRow row : queryResults) {
- try {
- factObjects.add(row.get(queriedEntity));
- if (delete)
- kieSession.delete(row.getFactHandle(queriedEntity));
- } catch (Exception e) {
- if (logger.isInfoEnabled())
- logger.info("Object cannot be retrieved from fact: " + row);
- }
- }
-
- return factObjects;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Class<?> fetchModelClass(String className) throws IllegalStateException {
- Class<?> modelClass =
- ReflectionUtil.fetchClass(this.policyContainer.getClassLoader(), className);
- return modelClass;
- }
-
- /**
- * @return the recentSourceEvents
- */
- @Override
- public Object[] getRecentSourceEvents() {
- synchronized(this.recentSourceEvents) {
- Object[] events = new Object[recentSourceEvents.size()];
- return recentSourceEvents.toArray(events);
- }
- }
-
- /**
- * @return the recentSinkEvents
- */
- @Override
- public String[] getRecentSinkEvents() {
- synchronized(this.recentSinkEvents) {
- String[] events = new String[recentSinkEvents.size()];
- return recentSinkEvents.toArray(events);
- }
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isBrained() {
- return true;
- }
-
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("MavenDroolsController [policyContainer=")
- .append((policyContainer != null) ? policyContainer.getName() : "NULL").append(":")
- .append(", alive=")
- .append(alive).append(", locked=")
- .append(", modelClassLoaderHash=").append(modelClassLoaderHash).append("]");
- return builder.toString();
- }
-
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/NullDroolsController.java b/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/NullDroolsController.java
deleted file mode 100644
index 7f5d4665..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/NullDroolsController.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.controller.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.openecomp.policy.drools.controller.DroolsController;
-import org.openecomp.policy.drools.core.PolicyContainer;
-import org.openecomp.policy.drools.event.comm.TopicSink;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration;
-
-/**
- * no-op Drools Controller
- */
-public class NullDroolsController implements DroolsController {
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean start() throws IllegalStateException {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean stop() throws IllegalStateException {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void shutdown() throws IllegalStateException {
- return;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void halt() throws IllegalStateException {
- return;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isAlive() {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean lock() {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean unlock() {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isLocked() {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getGroupId() {
- return NO_GROUP_ID;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getArtifactId() {
- return NO_ARTIFACT_ID;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getVersion() {
- return NO_VERSION;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<String> getSessionNames() {
- return new ArrayList<String>();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<String> getCanonicalSessionNames() {
- return new ArrayList<String>();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean offer(String topic, String event) {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean deliver(TopicSink sink, Object event)
- throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException {
- throw new IllegalStateException(this.getClass().getCanonicalName() + " invoked");
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Object[] getRecentSourceEvents() {
- return new String[0];
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PolicyContainer getContainer() {
- return null;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String[] getRecentSinkEvents() {
- return new String[0];
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean ownsCoder(Class<? extends Object> coderClass, int modelHash) throws IllegalStateException {
- throw new IllegalStateException(this.getClass().getCanonicalName() + " invoked");
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Class<?> fetchModelClass(String className) throws IllegalArgumentException {
- throw new IllegalArgumentException(this.getClass().getCanonicalName() + " invoked");
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isBrained() {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("NullDroolsController []");
- return builder.toString();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void updateToVersion(String newGroupId, String newArtifactId, String newVersion,
- List<TopicCoderFilterConfiguration> decoderConfigurations,
- List<TopicCoderFilterConfiguration> encoderConfigurations)
- throws IllegalArgumentException, LinkageError, Exception {
- throw new IllegalArgumentException(this.getClass().getCanonicalName() + " invoked");
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Map<String, Integer> factClassNames(String sessionName)
- throws IllegalArgumentException {
- return new HashMap<String,Integer>();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public long factCount(String sessionName) throws IllegalArgumentException {
- return 0;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<Object> facts(String sessionName, String className, boolean delete) {
- return new ArrayList<Object>();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<Object> factQuery(String sessionName, String queryName,
- String queriedEntity,
- boolean delete, Object... queryParams) {
- return new ArrayList<Object>();
- }
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyControllerFeatureAPI.java b/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyControllerFeatureAPI.java
deleted file mode 100644
index 66f64a82..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyControllerFeatureAPI.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.features;
-
-import java.util.Properties;
-
-import org.openecomp.policy.drools.event.comm.Topic.CommInfrastructure;
-import org.openecomp.policy.drools.system.PolicyController;
-import org.openecomp.policy.drools.utils.OrderedService;
-import org.openecomp.policy.drools.utils.OrderedServiceImpl;
-
-public interface PolicyControllerFeatureAPI extends OrderedService {
-
- /**
- * called before creating a controller with name 'name' and
- * properties 'properties'
- *
- * @param name name of the the controller
- * @param properties configuration properties
- *
- * @return a policy controller. A take over of the creation operation
- * is performed by returning a non-null policy controller.
- * 'null' indicates that no take over has taken place, and processing should
- * continue to the next feature provider.
- */
- public default PolicyController beforeCreate(String name, Properties properties) {return null;}
-
- /**
- * called after creating a controller with name 'name'
- *
- * @param controller controller
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterCreate(PolicyController controller) {return false;}
-
- /**
- * intercept before the Policy Controller is started.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeStart(PolicyController controller) {return false;}
-
- /**
- * intercept after the Policy Controller is started.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterStart(PolicyController controller) {return false;}
-
- /**
- * intercept before the Policy Controller is stopped.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise..
- */
- public default boolean beforeStop(PolicyController controller) {return false;}
-
- /**
- * intercept after the Policy Controller is stopped
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.d.
- */
- public default boolean afterStop(PolicyController controller) {return false;}
-
- /**
- * intercept before the Policy Controller is locked
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeLock(PolicyController controller) {return false;}
-
- /**
- * intercept after the Policy Controller is locked
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise..
- */
- public default boolean afterLock(PolicyController controller) {return false;}
-
- /**
- * intercept before the Policy Controller is locked
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeUnlock(PolicyController controller) {return false;}
-
- /**
- * intercept after the Policy Controller is locked
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterUnlock(PolicyController controller) {return false;}
-
- /**
- * intercept before the Policy Controller is shut down
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise..
- */
- public default boolean beforeShutdown(PolicyController controller) {return false;}
-
- /**
- * called after the Policy Controller is shut down
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterShutdown(PolicyController controller) {return false;}
-
- /**
- * intercept before the Policy Controller is halted
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise..
- */
- public default boolean beforeHalt(PolicyController controller) {return false;}
-
- /**
- * called after the Policy Controller is halted
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterHalt(PolicyController controller) {return false;}
-
-
- /**
- * intercept before the Policy Controller is offered an event
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeOffer(PolicyController controller,
- CommInfrastructure protocol,
- String topic,
- String event) {return false;}
-
- /**
- * called after the Policy Controller processes an event offer
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterOffer(PolicyController controller,
- CommInfrastructure protocol,
- String topic,
- String event,
- boolean success) {return false;}
-
- /**
- * intercept before the Policy Controller delivers (posts) an event
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeDeliver(PolicyController controller,
- CommInfrastructure protocol,
- String topic,
- Object event) {return false;}
-
- /**
- * called after the Policy Controller delivers (posts) an event
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterDeliver(PolicyController controller,
- CommInfrastructure protocol,
- String topic,
- Object event,
- boolean success) {return false;}
-
-
- /**
- * Feature providers implementing this interface
- */
- public static final OrderedServiceImpl<PolicyControllerFeatureAPI> providers =
- new OrderedServiceImpl<PolicyControllerFeatureAPI>(PolicyControllerFeatureAPI.class);
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyEngineFeatureAPI.java b/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyEngineFeatureAPI.java
deleted file mode 100644
index df2ddd6f..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyEngineFeatureAPI.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-engine
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.features;
-
-import java.util.Properties;
-
-import org.openecomp.policy.drools.system.PolicyEngine;
-import org.openecomp.policy.drools.utils.OrderedService;
-import org.openecomp.policy.drools.utils.OrderedServiceImpl;
-
-/**
- * Policy Engine Feature API.
- * Provides Interception Points during the Policy Engine lifecycle.
- */
-public interface PolicyEngineFeatureAPI extends OrderedService {
-
- /**
- * intercept before the Policy Engine is commanded to boot.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeBoot(PolicyEngine engine, String cliArgs[]) {return false;};
-
- /**
- * intercept after the Policy Engine is booted.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterBoot(PolicyEngine engine) {return false;};
-
- /**
- * intercept before the Policy Engine is configured.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeConfigure(PolicyEngine engine, Properties properties) {return false;};
-
- /**
- * intercept after the Policy Engine is configured.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterConfigure(PolicyEngine engine) {return false;};
-
- /**
- * intercept before the Policy Engine goes active.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeActivate(PolicyEngine engine) {return false;};
-
- /**
- * intercept after the Policy Engine goes active.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterActivate(PolicyEngine engine) {return false;};
-
- /**
- * intercept before the Policy Engine goes standby.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeDeactivate(PolicyEngine engine) {return false;};
-
- /**
- * intercept after the Policy Engine goes standby.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterDeactivate(PolicyEngine engine) {return false;};
-
- /**
- * intercept before the Policy Engine is started.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeStart(PolicyEngine engine) {return false;};
-
- /**
- * intercept after the Policy Engine is started.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterStart(PolicyEngine engine) {return false;};
-
- /**
- * intercept before the Policy Engine is stopped.
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise..
- */
- public default boolean beforeStop(PolicyEngine engine) {return false;};
-
- /**
- * intercept after the Policy Engine is stopped
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.d.
- */
- public default boolean afterStop(PolicyEngine engine) {return false;};
-
- /**
- * intercept before the Policy Engine is locked
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeLock(PolicyEngine engine) {return false;};
-
- /**
- * intercept after the Policy Engine is locked
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise..
- */
- public default boolean afterLock(PolicyEngine engine) {return false;};
-
- /**
- * intercept before the Policy Engine is locked
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean beforeUnlock(PolicyEngine engine) {return false;};
-
- /**
- * intercept after the Policy Engine is locked
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterUnlock(PolicyEngine engine) {return false;};
-
- /**
- * intercept the Policy Engine is shut down
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise..
- */
- public default boolean beforeShutdown(PolicyEngine engine){return false;};
-
- /**
- * called after the Policy Engine is shut down
- *
- * @return true if this feature intercepts and takes ownership
- * of the operation preventing the invocation of
- * lower priority features. False, otherwise.
- */
- public default boolean afterShutdown(PolicyEngine engine) {return false;};
-
- /**
- * Feature providers implementing this interface
- */
- public static final OrderedServiceImpl<PolicyEngineFeatureAPI> providers =
- new OrderedServiceImpl<>(PolicyEngineFeatureAPI.class);
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/persistence/SystemPersistence.java b/policy-management/src/main/java/org/openecomp/policy/drools/persistence/SystemPersistence.java
deleted file mode 100644
index dda20a08..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/persistence/SystemPersistence.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.persistence;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.Properties;
-
-import org.openecomp.policy.drools.utils.PropertyUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public interface SystemPersistence {
-
- /**
- * configuration directory
- */
- public static String CONFIG_DIR_NAME = "config";
-
- /**
- * policy controllers suffix
- */
- public final static String CONTROLLER_SUFFIX_IDENTIFIER = "-controller";
-
- /**
- * policy controller properties file suffix
- */
- public final static String PROPERTIES_FILE_CONTROLLER_SUFFIX =
- CONTROLLER_SUFFIX_IDENTIFIER + ".properties";
-
- /**
- * policy engine properties file name
- */
- public final static String PROPERTIES_FILE_ENGINE = "policy-engine.properties";
-
-
- /**
- * backs up a controller configuration.
- *
- * @param controllerName the controller name
- * @return true if the configuration is backed up
- */
- public boolean backupController(String controllerName);
-
- /**
- * persists controller configuration
- *
- * @param controllerName the controller name
- * @param configuration object containing the configuration
- * @return true if storage is succesful, false otherwise
- * @throws IllegalArgumentException if the configuration cannot be handled by the persistence manager
- */
- public boolean storeController(String controllerName, Object configuration)
- throws IllegalArgumentException;
-
- /**
- * delete controller configuration
- *
- * @param controllerName the controller name
- * @return true if storage is succesful, false otherwise
- */
- public boolean deleteController(String controllerName);
-
- /**
- * get controller properties
- *
- * @param controllerName controller name
- * @return properties for this controller
- * @throws IllegalArgumentException if the controller name does not lead to a properties configuration
- */
- public Properties getControllerProperties(String controllerName)
- throws IllegalArgumentException;
-
- /**
- * get properties by name
- *
- * @param name
- * @return properties
- * @throws IllegalArgumentException if the name does not lead to a properties configuration
- */
- public Properties getProperties(String name) throws IllegalArgumentException;
-
- /**
- * Persistence Manager. For now it is a file-based properties management,
- * In the future, it will probably be DB based, so manager implementation
- * will change.
- */
- public static final SystemPersistence manager = new SystemPropertiesPersistence();
-}
-
-/**
- * Properties based Persistence
- */
-class SystemPropertiesPersistence implements SystemPersistence {
-
- /**
- * logger
- */
- private static Logger logger = LoggerFactory.getLogger(SystemPropertiesPersistence.class);
-
- /**
- * backs up the properties-based controller configuration
- * @param controllerName the controller name
- * @return true if the configuration is backed up in disk or back up does not apply, false otherwise.
- */
- @Override
- public boolean backupController(String controllerName) {
- Path controllerPropertiesPath =
- Paths.get(CONFIG_DIR_NAME, controllerName + PROPERTIES_FILE_CONTROLLER_SUFFIX);
-
- if (Files.exists(controllerPropertiesPath)) {
- try {
- logger.warn("There is an existing configuration file at " +
- controllerPropertiesPath.toString() +
- " with contents: " + Files.readAllBytes(controllerPropertiesPath));
- Path controllerPropertiesBakPath =
- Paths.get(CONFIG_DIR_NAME, controllerName +
- PROPERTIES_FILE_CONTROLLER_SUFFIX + ".bak");
- Files.copy(controllerPropertiesPath,
- controllerPropertiesBakPath, StandardCopyOption.REPLACE_EXISTING);
- } catch (Exception e) {
- logger.warn("{}: cannot be backed up", controllerName, e);
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * persists properties-based controller configuration and makes a backup if necessary
- * @param controllerName the controller name
- * @return true if the properties has been stored in disk, false otherwise
- */
- @Override
- public boolean storeController(String controllerName, Object configuration) {
- if (!(configuration instanceof Properties)) {
- throw new IllegalArgumentException("configuration must be of type properties to be handled by this manager");
- }
-
- Properties properties = (Properties) configuration;
-
- Path controllerPropertiesPath =
- Paths.get(CONFIG_DIR_NAME, controllerName + PROPERTIES_FILE_CONTROLLER_SUFFIX);
- if (Files.exists(controllerPropertiesPath)) {
- try {
- Properties oldProperties = PropertyUtil.getProperties(controllerPropertiesPath.toFile());
- if (oldProperties.equals(properties)) {
- logger.info("A properties file with the same contents already exists for controller " +
- controllerName +
- ". No action is taken");
- return true;
- } else {
- this.backupController(controllerName);
- }
- } catch (Exception e) {
- logger.info("{}: no existing Properties", controllerName);
- // continue
- }
- }
-
- try {
- File controllerPropertiesFile = controllerPropertiesPath.toFile();
- FileWriter writer = new FileWriter(controllerPropertiesFile);
- properties.store(writer, "Machine created Policy Controller Configuration");
- } catch (Exception e) {
- logger.warn("{}: cannot be STORED", controllerName, e);
- return false;
- }
-
- return true;
- }
-
- /**
- * deletes properties-based controller configuration
- * @param controllerName the controller name
- * @return true if the properties has been deleted from disk, false otherwise
- */
- @Override
- public boolean deleteController(String controllerName) {
-
- Path controllerPropertiesPath =
- Paths.get(CONFIG_DIR_NAME,
- controllerName + PROPERTIES_FILE_CONTROLLER_SUFFIX);
-
- if (Files.exists(controllerPropertiesPath)) {
- try {
- Path controllerPropertiesBakPath =
- Paths.get(CONFIG_DIR_NAME, controllerName +
- PROPERTIES_FILE_CONTROLLER_SUFFIX + ".bak");
- Files.move(controllerPropertiesPath,
- controllerPropertiesBakPath,
- StandardCopyOption.REPLACE_EXISTING);
- } catch (Exception e) {
- logger.warn("{}: cannot be DELETED", controllerName, e);
- return false;
- }
- }
-
- return true;
- }
-
- @Override
- public Properties getControllerProperties(String controllerName) throws IllegalArgumentException {
- return this.getProperties(controllerName + CONTROLLER_SUFFIX_IDENTIFIER);
- }
-
- @Override
- public Properties getProperties(String name) throws IllegalArgumentException {
- Path propertiesPath =
- Paths.get(CONFIG_DIR_NAME, name + ".properties");
-
- if (!Files.exists(propertiesPath)) {
- throw new IllegalArgumentException("properties for " + name + " are not persisted.");
- }
-
- try {
- return PropertyUtil.getProperties(propertiesPath.toFile());
- } catch (Exception e) {
- logger.warn("{}: can't read properties @ {}", name, propertiesPath);
- throw new IllegalArgumentException("can't read properties for " +
- name + " @ " +
- propertiesPath);
- }
- }
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java
deleted file mode 100644
index 819ee812..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java
+++ /dev/null
@@ -1,1393 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.protocol.coders;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.openecomp.policy.drools.controller.DroolsController;
-import org.openecomp.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomJacksonCoder;
-import org.openecomp.policy.drools.utils.Pair;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Coder (Encoder/Decoder) of Events.
- */
-public interface EventProtocolCoder {
-
- public static class CoderFilters {
-
- /**
- * coder class
- */
- protected String factClass;
-
- /**
- * filters to apply to the selection of the decodedClass;
- */
- protected JsonProtocolFilter filter;
-
- /**
- * classloader hash
- */
- protected int modelClassLoaderHash;
-
-
- /**
- * constructor
- *
- * @param codedClass coder class
- * @param filter filters to apply
- */
- public CoderFilters(String codedClass, JsonProtocolFilter filter, int modelClassLoaderHash) {
- this.factClass = codedClass;
- this.filter = filter;
- this.modelClassLoaderHash = modelClassLoaderHash;
- }
-
- /**
- * @return the codedClass
- */
- public String getCodedClass() {
- return factClass;
- }
-
- /**
- * @param codedClass the decodedClass to set
- */
- public void setCodedClass(String codedClass) {
- this.factClass = codedClass;
- }
-
- /**
- * @return the filter
- */
- public synchronized JsonProtocolFilter getFilter() {
- return filter;
- }
-
- /**
- * @param filter the filter to set
- */
- public synchronized void setFilter(JsonProtocolFilter filter) {
- this.filter = filter;
- }
-
- public int getModelClassLoaderHash() {
- return modelClassLoaderHash;
- }
-
- public void setFromClassLoaderHash(int fromClassLoaderHash) {
- this.modelClassLoaderHash = fromClassLoaderHash;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("CoderFilters [factClass=").append(factClass).append(", filter=").append(filter)
- .append(", modelClassLoaderHash=").append(modelClassLoaderHash).append("]");
- return builder.toString();
- }
-
- }
-
- /**
- * Adds a Decoder class to decode the protocol over this topic
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic the topic
- * @param eventClass the event class
- * @param protocolFilter filters to selectively choose a particular decoder
- * when there are multiples
- *
- * @throw IllegalArgumentException if an invalid parameter is passed
- */
- public void addDecoder(String groupId, String artifactId,
- String topic,
- String eventClass,
- JsonProtocolFilter protocolFilter,
- CustomGsonCoder customGsonCoder,
- CustomJacksonCoder customJacksonCoder,
- int modelClassLoaderHash)
- throws IllegalArgumentException;
-
- /**
- * removes all decoders associated with the controller id
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic of the controller
- *
- * @throws IllegalArgumentException if invalid arguments have been provided
- */
- void removeEncoders(String groupId, String artifactId, String topic) throws IllegalArgumentException;
-
- /**
- * removes decoders associated with the controller id and topic
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic the topic
- *
- * @throws IllegalArgumentException if invalid arguments have been provided
- */
- public void removeDecoders(String groupId, String artifactId, String topic) throws IllegalArgumentException;
-
- /**
- * Given a controller id and a topic, it gives back its filters
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic the topic
- *
- * return list of decoders
- *
- * @throw IllegalArgumentException if an invalid parameter is passed
- */
- public List<CoderFilters> getDecoderFilters(String groupId, String artifactId, String topic)
- throws IllegalArgumentException;
-
-
- /**
- * Given a controller id and a topic, it gives back the decoding configuration
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic the topic
- *
- * return decoding toolset
- *
- * @throw IllegalArgumentException if an invalid parameter is passed
- */
- public ProtocolCoderToolset getDecoders(String groupId, String artifactId, String topic)
- throws IllegalArgumentException;
-
- /**
- * Given a controller id and a topic, it gives back all the decoding configurations
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic the topic
- *
- * return decoding toolset
- *
- * @throw IllegalArgumentException if an invalid parameter is passed
- */
- public List<ProtocolCoderToolset> getDecoders(String groupId, String artifactId)
- throws IllegalArgumentException;
-
-
- /**
- * gets all decoders associated with the group and artifact ids
- * @param groupId of the controller
- * @param artifactId of the controller
- *
- * @throws IllegalArgumentException if invalid arguments have been provided
- */
- public List<CoderFilters> getDecoderFilters(String groupId, String artifactId) throws IllegalArgumentException;
-
-
- /**
- * Given a controller id and a topic, it gives back the classes that implements the encoding
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic the topic
- *
- * return list of decoders
- *
- * @throw IllegalArgumentException if an invalid parameter is passed
- */
- public List<CoderFilters> getEncoderFilters(String groupId, String artifactId, String topic)
- throws IllegalArgumentException;
-
- /**
- * gets all encoders associated with the group and artifact ids
- * @param groupId of the controller
- * @param artifactId of the controller
- *
- * @throws IllegalArgumentException if invalid arguments have been provided
- */
- public List<CoderFilters> getEncoderFilters(String groupId, String artifactId) throws IllegalArgumentException;
-
- /**
- * Given a controller id, a topic, and a classname, it gives back the classes that implements the decoding
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic the topic
- * @param classname classname
- *
- * return list of decoders
- *
- * @throw IllegalArgumentException if an invalid parameter is passed
- */
- public CoderFilters getDecoderFilters(String groupId, String artifactId, String topic, String classname)
- throws IllegalArgumentException;
-
- /**
- * is there a decoder supported for the controller id and topic
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic protocol
- * @return true if supported
- */
- public boolean isDecodingSupported(String groupId, String artifactId, String topic);
-
- /**
- * Adds a Encoder class to encode the protocol over this topic
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic the topic
- * @param eventClass the event class
- * @param protocolFilter filters to selectively choose a particular decoder
- * when there are multiples
- *
- * @throw IllegalArgumentException if an invalid parameter is passed
- */
- public void addEncoder(String groupId, String artifactId, String topic,
- String eventClass,
- JsonProtocolFilter protocolFilter,
- CustomGsonCoder customGsonCoder,
- CustomJacksonCoder customJacksonCoder,
- int modelClassLoaderHash)
- throws IllegalArgumentException;
-
- /**
- * is there an encoder supported for the controller id and topic
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic protocol
- * @return true if supported
- */
- public boolean isEncodingSupported(String groupId, String artifactId, String topic);
-
- /**
- * get encoder based on coordinates and classname
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic protocol
- * @param json event string
- * @return
- * @throws IllegalArgumentException invalid arguments passed in
- */
- public CoderFilters getEncoderFilters(String groupId, String artifactId, String topic, String classname)
- throws IllegalArgumentException;
-
- /**
- * get encoder based on topic and encoded class
- *
- * @param topic topic
- * @param encodedClass encoded class
- * @return
- * @throws IllegalArgumentException invalid arguments passed in
- */
- public List<CoderFilters> getReverseEncoderFilters(String topic, String encodedClass)
- throws IllegalArgumentException;
-
- /**
- * gets the identifier of the creator of the encoder
- *
- * @param topic topic
- * @param encodedClass encoded class
- * @return a drools controller
- * @throws IllegalArgumentException invalid arguments passed in
- */
- public DroolsController getDroolsController(String topic, Object encodedClass)
- throws IllegalArgumentException;
-
- /**
- * gets the identifier of the creator of the encoder
- *
- * @param topic topic
- * @param encodedClass encoded class
- * @return list of drools controllers
- * @throws IllegalArgumentException invalid arguments passed in
- */
- public List<DroolsController> getDroolsControllers(String topic, Object encodedClass)
- throws IllegalArgumentException;
-
- /**
- * decode topic's stringified event (json) to corresponding Event Object.
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic protocol
- * @param json event string
- * @return
- * @throws IllegalArgumentException invalid arguments passed in
- * @throws UnsupportedOperationException if the operation is not supported
- * @throws IllegalStateException if the system is in an illegal state
- */
- public Object decode(String groupId, String artifactId, String topic, String json)
- throws IllegalArgumentException, UnsupportedOperationException, IllegalStateException;
-
- /**
- * encodes topic's stringified event (json) to corresponding Event Object.
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic protocol
- * @param event Object
- *
- * @throws IllegalArgumentException invalid arguments passed in
- */
- public String encode(String groupId, String artifactId, String topic, Object event)
- throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException;
-
- /**
- * encodes topic's stringified event (json) to corresponding Event Object.
- *
- * @param topic topic
- * @param event event object
- *
- * @throws IllegalArgumentException invalid arguments passed in
- * @throws UnsupportedOperationException operation cannot be performed
- */
- public String encode(String topic, Object event)
- throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException;
-
- /**
- * encodes topic's stringified event (json) to corresponding Event Object.
- *
- * @param topic topic
- * @param event event object
- * @param droolsController
- *
- * @throws IllegalArgumentException invalid arguments passed in
- * @throws UnsupportedOperationException operation cannot be performed
- */
- public String encode(String topic, Object event, DroolsController droolsController)
- throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException;
-
- /**
- * singleton reference to the global event protocol coder
- */
- public static EventProtocolCoder manager = new MultiplexorEventProtocolCoder();
-}
-
-/**
- * Protocol Coder that does its best attempt to decode/encode, selecting the best
- * class and best fitted json parsing tools.
- */
-class MultiplexorEventProtocolCoder implements EventProtocolCoder {
- /**
- * Logger
- */
- private static Logger logger = LoggerFactory.getLogger(MultiplexorEventProtocolCoder.class);
-
- /**
- * Decoders
- */
- protected EventProtocolDecoder decoders = new EventProtocolDecoder();
-
- /**
- * Encoders
- */
- protected EventProtocolEncoder encoders = new EventProtocolEncoder();
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void addDecoder(String groupId, String artifactId, String topic,
- String eventClass,
- JsonProtocolFilter protocolFilter,
- CustomGsonCoder customGsonCoder,
- CustomJacksonCoder customJacksonCoder,
- int modelClassLoaderHash)
- throws IllegalArgumentException {
- logger.info("{}: add-decoder {}:{}:{}:{}:{}:{}:{}:{}", this,
- groupId, artifactId, topic, eventClass,
- protocolFilter, customGsonCoder, customJacksonCoder,
- modelClassLoaderHash);
- this.decoders.add(groupId, artifactId, topic, eventClass, protocolFilter,
- customGsonCoder, customJacksonCoder, modelClassLoaderHash);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void addEncoder(String groupId, String artifactId, String topic,
- String eventClass,
- JsonProtocolFilter protocolFilter,
- CustomGsonCoder customGsonCoder,
- CustomJacksonCoder customJacksonCoder,
- int modelClassLoaderHash)
- throws IllegalArgumentException {
- logger.info("{}: add-decoder {}:{}:{}:{}:{}:{}:{}:{}", this,
- groupId, artifactId, topic, eventClass,
- protocolFilter, customGsonCoder, customJacksonCoder,
- modelClassLoaderHash);
- this.encoders.add(groupId, artifactId, topic, eventClass, protocolFilter,
- customGsonCoder, customJacksonCoder, modelClassLoaderHash);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void removeDecoders(String groupId, String artifactId, String topic)
- throws IllegalArgumentException {
- logger.info("{}: remove-decoder {}:{}:{}", this, groupId, artifactId, topic);
- this.decoders.remove(groupId, artifactId, topic);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void removeEncoders(String groupId, String artifactId, String topic)
- throws IllegalArgumentException {
- logger.info("{}: remove-encoder {}:{}:{}", this, groupId, artifactId, topic);
- this.encoders.remove(groupId, artifactId, topic);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isDecodingSupported(String groupId, String artifactId, String topic) {
- return this.decoders.isCodingSupported(groupId, artifactId, topic);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isEncodingSupported(String groupId, String artifactId, String topic) {
- return this.encoders.isCodingSupported(groupId, artifactId, topic);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Object decode(String groupId, String artifactId, String topic, String json)
- throws IllegalArgumentException, UnsupportedOperationException, IllegalStateException {
- logger.debug("{}: decode {}:{}:{}:{}", this, groupId, artifactId, topic, json);
- return this.decoders.decode(groupId, artifactId, topic, json);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String encode(String groupId, String artifactId, String topic, Object event)
- throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException {
- logger.debug("{}: encode {}:{}:{}:{}", this, groupId, artifactId, topic, event);
- return this.encoders.encode(groupId, artifactId, topic, event);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String encode(String topic, Object event)
- throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException {
- logger.debug("{}: encode {}:{}", this, topic, event);
- return this.encoders.encode(topic, event);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String encode(String topic, Object event, DroolsController droolsController)
- throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException {
- logger.debug("{}: encode {}:{}:{}", this, topic, event, droolsController);
- return this.encoders.encode(topic, event, droolsController);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<CoderFilters> getDecoderFilters(String groupId, String artifactId, String topic)
- throws IllegalArgumentException {
- return this.decoders.getFilters(groupId, artifactId, topic);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public ProtocolCoderToolset getDecoders(String groupId, String artifactId, String topic)
- throws IllegalArgumentException {
- Pair<ProtocolCoderToolset,ProtocolCoderToolset> decoderToolsets = this.decoders.getCoders(groupId, artifactId, topic);
- if (decoderToolsets == null)
- throw new IllegalArgumentException("Decoders not found for " + groupId + ":" + artifactId + ":" + topic);
-
- return decoderToolsets.first();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<CoderFilters> getEncoderFilters(String groupId, String artifactId, String topic)
- throws IllegalArgumentException {
- return this.encoders.getFilters(groupId, artifactId, topic);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public CoderFilters getDecoderFilters(String groupId, String artifactId, String topic, String classname)
- throws IllegalArgumentException {
- return this.decoders.getFilters(groupId, artifactId, topic, classname);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public CoderFilters getEncoderFilters(String groupId, String artifactId, String topic, String classname)
- throws IllegalArgumentException {
- return this.encoders.getFilters(groupId, artifactId, topic, classname);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<CoderFilters> getReverseEncoderFilters(String topic, String encodedClass) throws IllegalArgumentException {
- return this.encoders.getReverseFilters(topic, encodedClass);
- }
-
- /**
- * get all deocders by maven coordinates and topic
- *
- * @param groupId group id
- * @param artifactId artifact id
- *
- * @return list of decoders
- * @throws IllegalArgumentException if invalid input
- */
- @Override
- public List<ProtocolCoderToolset> getDecoders(String groupId, String artifactId)
- throws IllegalArgumentException {
-
- List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> decoderToolsets = this.decoders.getCoders(groupId, artifactId);
- if (decoderToolsets == null)
- throw new IllegalArgumentException("Decoders not found for " + groupId + ":" + artifactId);
-
- List<ProtocolCoderToolset> parser1CoderToolset = new ArrayList<>();
- for (Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderToolsetPair : decoderToolsets) {
- parser1CoderToolset.add(coderToolsetPair.first());
- }
-
- return parser1CoderToolset;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<CoderFilters> getDecoderFilters(String groupId, String artifactId) throws IllegalArgumentException {
- return this.decoders.getFilters(groupId, artifactId);
-
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<CoderFilters> getEncoderFilters(String groupId, String artifactId) throws IllegalArgumentException {
- return this.encoders.getFilters(groupId, artifactId);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public DroolsController getDroolsController(String topic, Object encodedClass) throws IllegalArgumentException {
- return this.encoders.getDroolsController(topic, encodedClass);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<DroolsController> getDroolsControllers(String topic, Object encodedClass) throws IllegalArgumentException {
- return this.encoders.getDroolsControllers(topic, encodedClass);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("MultiplexorEventProtocolCoder [decoders=").append(decoders).append(", encoders=")
- .append(encoders).append("]");
- return builder.toString();
- }
-}
-
-/**
- * This protocol Coder that does its best attempt to decode/encode, selecting the best
- * class and best fitted json parsing tools.
- */
-abstract class GenericEventProtocolCoder {
- private static Logger logger = LoggerFactory.getLogger(GenericEventProtocolCoder.class);
-
- /**
- * Mapping topic:controller-id -> <protocol-decoder-toolset-pair>
- * where protocol-coder-toolset-pair contains both a jackson-protocol-coder-toolset
- * and a gson-protocol-coder-toolset. The first value of the pair will the
- * protocol coder toolset most likely to be successful with the encoding or decoding,
- * and consequently the second value will be the less likely.
- */
- protected final HashMap<String, Pair<ProtocolCoderToolset,ProtocolCoderToolset>> coders =
- new HashMap<String, Pair<ProtocolCoderToolset,ProtocolCoderToolset>>();
-
- /**
- * Mapping topic + classname -> Protocol Set
- */
- protected final HashMap<String, List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>>> reverseCoders =
- new HashMap<String, List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>>>();
-
- protected boolean multipleToolsetRetries = false;
-
- GenericEventProtocolCoder(boolean multipleToolsetRetries) {
- this.multipleToolsetRetries = multipleToolsetRetries;
- }
-
- /**
- * Index a new coder
- *
- * @param groupId of the controller
- * @param artifactId of the controller
- * @param topic the topic
- * @param eventClass the event class
- * @param protocolFilter filters to selectively choose a particular decoder
- * when there are multiples
- *
- * @throw IllegalArgumentException if an invalid parameter is passed
- */
- public void add(String groupId, String artifactId,
- String topic,
- String eventClass,
- JsonProtocolFilter protocolFilter,
- CustomGsonCoder customGsonCoder,
- CustomJacksonCoder customJacksonCoder,
- int modelClassLoaderHash)
- throws IllegalArgumentException {
- if (groupId == null || groupId.isEmpty()) {
- throw new IllegalArgumentException("Invalid group id");
- }
-
- if (artifactId == null || artifactId.isEmpty())
- throw new IllegalArgumentException("Invalid artifact id");
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid Topic");
-
- if (eventClass == null) {
- throw new IllegalArgumentException("Invalid Event Class");
- }
-
- String key = this.codersKey(groupId, artifactId, topic);
- String reverseKey = this.reverseCodersKey(topic, eventClass);
-
- synchronized(this) {
- if (coders.containsKey(key)) {
- Pair<ProtocolCoderToolset, ProtocolCoderToolset> toolsets = coders.get(key);
-
- logger.info("{}: adding coders for existing {}: ", this, key, toolsets.first());
-
- toolsets.first().addCoder(eventClass, protocolFilter, modelClassLoaderHash);
- toolsets.second().addCoder(eventClass, protocolFilter, modelClassLoaderHash);
-
- if (!reverseCoders.containsKey(reverseKey)) {
- logger.info("{}: adding new reverse coders (multiple classes case) for {}:{}: {}",
- this, reverseKey, key, toolsets.first());
-
- List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> reverseMappings =
- new ArrayList<Pair<ProtocolCoderToolset,ProtocolCoderToolset>>();
- reverseMappings.add(toolsets);
- reverseCoders.put(reverseKey, reverseMappings);
- }
- return;
- }
-
- GsonProtocolCoderToolset gsonCoderTools =
- new GsonProtocolCoderToolset
- (topic, key,
- groupId, artifactId,
- eventClass, protocolFilter,
- customGsonCoder,
- modelClassLoaderHash);
-
- JacksonProtocolCoderToolset jacksonCoderTools =
- new JacksonProtocolCoderToolset
- (topic, key,
- groupId, artifactId,
- eventClass, protocolFilter,
- customJacksonCoder,
- modelClassLoaderHash);
-
- // Use Gson as the first priority encoding/decoding toolset, and Jackson
- // as second. This is because it has been observed that they can diverge
- // somewhat in the encoding/decoding data types, which can produce json
- // that may result incompatible with what some network elements are
- // expecting. As decoding takes place, this element will reconfigure
- // itself to set the jackson one as the favoured one first, if errors
- // are detected in the gson encoding
-
- Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools =
- new Pair<ProtocolCoderToolset,ProtocolCoderToolset>(gsonCoderTools,
- jacksonCoderTools);
-
- logger.info("{}: adding coders for new {}: {}", this, key, coderTools.first());
-
- coders.put(key, coderTools);
-
- if (reverseCoders.containsKey(reverseKey)) {
- // There is another controller (different group id/artifact id/topic)
- // that shares the class and the topic.
-
- List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> toolsets =
- reverseCoders.get(reverseKey);
- boolean present = false;
- for (Pair<ProtocolCoderToolset,ProtocolCoderToolset> parserSet: toolsets) {
- // just doublecheck
- present = parserSet.first().getControllerId().equals(key);
- if (present) {
- /* anomaly */
- logger.error("{}: unexpected toolset reverse mapping found for {}:{}: {}",
- this, reverseKey, key, parserSet.first());
- }
- }
-
- if (present) {
- return;
- } else {
- logger.info("{}: adding coder set for {}: {} ", this,
- reverseKey, coderTools.getFirst());
- toolsets.add(coderTools);
- }
- } else {
- List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> toolsets =
- new ArrayList<Pair<ProtocolCoderToolset,ProtocolCoderToolset>>();
- toolsets.add(coderTools);
-
- logger.info("{}: adding toolset for reverse key {}: {}", this, reverseKey, toolsets);
- reverseCoders.put(reverseKey, toolsets);
- }
-
- }
- }
-
- /**
- * produces key for indexing toolset entries
- *
- * @param group group id
- * @param artifactId artifact id
- * @param topic topic
- * @return index key
- */
- protected String codersKey(String groupId, String artifactId, String topic) {
- return groupId + ":" + artifactId + ":" + topic;
- }
-
- /**
- * produces a key for the reverse index
- *
- * @param topic topic
- * @param eventClass coded class
- * @return reverse index key
- */
- protected String reverseCodersKey(String topic, String eventClass) {
- return topic + ":" + eventClass;
- }
-
- /**
- * remove coder
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @param topic topic
- * @throws IllegalArgumentException if invalid input
- */
- public void remove(String groupId, String artifactId, String topic)
- throws IllegalArgumentException {
-
- if (groupId == null || groupId.isEmpty())
- throw new IllegalArgumentException("Invalid group id");
-
- if (artifactId == null || artifactId.isEmpty())
- throw new IllegalArgumentException("Invalid artifact id");
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid Topic");
-
- String key = this.codersKey(groupId, artifactId, topic);
-
- synchronized(this) {
- if (coders.containsKey(key)) {
- Pair<ProtocolCoderToolset, ProtocolCoderToolset> p = coders.remove(key);
-
- logger.info("{}: removed toolset for {}: {}", this, key, p.getFirst());
-
- for (CoderFilters codeFilter : p.first().getCoders()) {
- String className = codeFilter.getCodedClass();
- String reverseKey = this.reverseCodersKey(topic, className);
- if (this.reverseCoders.containsKey(reverseKey) ) {
- List<Pair<ProtocolCoderToolset, ProtocolCoderToolset>> toolsets =
- this.reverseCoders.get(reverseKey);
- Iterator<Pair<ProtocolCoderToolset, ProtocolCoderToolset>> toolsetsIter =
- toolsets.iterator();
- while (toolsetsIter.hasNext()) {
- Pair<ProtocolCoderToolset, ProtocolCoderToolset> toolset = toolsetsIter.next();
- if (toolset.first().getControllerId().equals(key)) {
- logger.info("{}: removed coder from toolset for {} from reverse mapping {}: ",
- this, reverseKey);
- toolsetsIter.remove();
- }
- }
-
- if (this.reverseCoders.get(reverseKey).isEmpty()) {
- logger.info("{}: removing reverse mapping for {}: ", this, reverseKey);
- this.reverseCoders.remove(reverseKey);
- }
- }
- }
- }
- }
- }
-
- /**
- * does it support coding?
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @param topic topic
- * @return true if its is codable
- */
- public boolean isCodingSupported(String groupId, String artifactId, String topic) {
-
- if (groupId == null || groupId.isEmpty())
- throw new IllegalArgumentException("Invalid group id");
-
- if (artifactId == null || artifactId.isEmpty())
- throw new IllegalArgumentException("Invalid artifact id");
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid Topic");
-
- String key = this.codersKey(groupId, artifactId, topic);
- synchronized(this) {
- return (coders.containsKey(key));
- }
- }
-
- /**
- * decode a json string into an Object
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @param topic topic
- * @param json json string to convert to object
- * @return the decoded object
- * @throws IllegalArgumentException if invalid argument is provided
- * @throws UnsupportedOperationException if the operation cannot be performed
- */
- public Object decode(String groupId, String artifactId, String topic, String json)
- throws IllegalArgumentException, UnsupportedOperationException, IllegalStateException {
-
- if (!isCodingSupported(groupId, artifactId, topic))
- throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic) + " for encoding");
-
- String key = this.codersKey(groupId, artifactId, topic);
- Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
- try {
- Object event = coderTools.first().decode(json);
- if (event != null)
- return event;
- } catch (Exception e) {
- logger.debug("{}, cannot decode {}", this, json, e);
- }
-
- if (multipleToolsetRetries) {
- // try the less favored toolset
- try {
- Object event = coderTools.second().decode(json);
- if (event != null) {
- // change the priority of the toolset
- synchronized(this) {
- ProtocolCoderToolset first = coderTools.first();
- ProtocolCoderToolset second = coderTools.second();
- coderTools.first(second);
- coderTools.second(first);
- }
-
- return event;
- }
- } catch (Exception e) {
- throw new UnsupportedOperationException(e);
- }
- }
-
- throw new UnsupportedOperationException("Cannot decode neither with gson or jackson");
- }
-
- /**
- * encode an object into a json string
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @param topic topic
- * @param event object to convert to string
- * @return the json string
- * @throws IllegalArgumentException if invalid argument is provided
- * @throws UnsupportedOperationException if the operation cannot be performed
- */
- public String encode(String groupId, String artifactId, String topic, Object event)
- throws IllegalArgumentException, UnsupportedOperationException {
-
- if (!isCodingSupported(groupId, artifactId, topic))
- throw new IllegalArgumentException
- ("Unsupported:" + codersKey(groupId, artifactId, topic));
-
- if (event == null)
- throw new IllegalArgumentException("Unsupported topic:" + topic);
-
- // reuse the decoder set, since there must be affinity in the model
- String key = this.codersKey(groupId, artifactId, topic);
- return this.encodeInternal(key, event);
- }
-
- /**
- * encode an object into a json string
- *
- * @param key identifier
- * @param event object to convert to string
- * @return the json string
- * @throws IllegalArgumentException if invalid argument is provided
- * @throws UnsupportedOperationException if the operation cannot be performed
- */
- protected String encodeInternal(String key, Object event)
- throws IllegalArgumentException, UnsupportedOperationException {
-
- logger.debug("{}: encode for {}: {}", this, key, event);
-
- Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
- try {
- String json = coderTools.first().encode(event);
- if (json != null && !json.isEmpty())
- return json;
- } catch (Exception e) {
- logger.warn("{}: cannot encode (first) for {}: {}", this, key, event, e);
- }
-
- if (multipleToolsetRetries) {
- // try the less favored toolset
- try {
- String json = coderTools.second().encode(event);
- if (json != null) {
- // change the priority of the toolset
- synchronized(this) {
- ProtocolCoderToolset first = coderTools.first();
- ProtocolCoderToolset second = coderTools.second();
- coderTools.first(second);
- coderTools.second(first);
- }
-
- return json;
- }
- } catch (Exception e) {
- logger.error("{}: cannot encode (second) for {}: {}", this, key, event, e);
- throw new UnsupportedOperationException(e);
- }
- }
-
- throw new UnsupportedOperationException("Cannot decode neither with gson or jackson");
- }
-
- /**
- * encode an object into a json string
- *
- * @param topic topic
- * @param event object to convert to string
- * @return the json string
- * @throws IllegalArgumentException if invalid argument is provided
- * @throws UnsupportedOperationException if the operation cannot be performed
- */
- public String encode(String topic, Object event)
- throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException {
-
- if (event == null)
- throw new IllegalArgumentException("Invalid encoded class");
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid topic");
-
- List<DroolsController> droolsControllers = droolsCreators(topic, event);
-
- if (droolsControllers.isEmpty())
- throw new IllegalArgumentException("no drools controller has been found");
-
- if (droolsControllers.size() > 1) {
- logger.warn("{}: multiple drools-controller {} for {}:{} ", this, topic,
- droolsControllers, event.getClass().getCanonicalName());
- // continue
- }
-
- String key = codersKey(droolsControllers.get(0).getGroupId(), droolsControllers.get(0).getArtifactId(), topic);
- return this.encodeInternal(key, event);
- }
-
- /**
- * encode an object into a json string
- *
- * @param topic topic
- * @param encodedClass object to convert to string
- * @return the json string
- * @throws IllegalArgumentException if invalid argument is provided
- * @throws UnsupportedOperationException if the operation cannot be performed
- */
- public String encode(String topic, Object encodedClass, DroolsController droolsController)
- throws IllegalArgumentException, IllegalArgumentException, UnsupportedOperationException {
-
- if (encodedClass == null)
- throw new IllegalArgumentException("Invalid encoded class");
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid topic");
-
- String key = codersKey(droolsController.getGroupId(), droolsController.getArtifactId(), topic);
- return this.encodeInternal(key, encodedClass);
- }
-
- /**
- * @param topic
- * @param encodedClass
- * @param reverseKey
- * @return
- * @throws IllegalStateException
- * @throws IllegalArgumentException
- */
- protected List<DroolsController> droolsCreators(String topic, Object encodedClass)
- throws IllegalStateException, IllegalArgumentException {
-
- List<DroolsController> droolsControllers = new ArrayList<DroolsController>();
-
- String reverseKey = this.reverseCodersKey(topic, encodedClass.getClass().getCanonicalName());
- if (!this.reverseCoders.containsKey(reverseKey)) {
- logger.warn("{}: no reverse mapping for {}", this, reverseKey);
- return droolsControllers;
- }
-
- List<Pair<ProtocolCoderToolset, ProtocolCoderToolset>>
- toolsets = this.reverseCoders.get(reverseKey);
-
- // There must be multiple toolset pairs associated with <topic,classname> reverseKey
- // case 2 different controllers use the same models and register the same encoder for
- // the same topic. This is assumed not to occur often but for the purpose of encoding
- // but there should be no side-effects. Ownership is crosscheck against classname and
- // classloader reference.
-
- if (toolsets == null || toolsets.isEmpty())
- throw new IllegalStateException("No Encoders toolsets available for topic "+ topic +
- " encoder " + encodedClass.getClass().getCanonicalName());
-
- for (Pair<ProtocolCoderToolset, ProtocolCoderToolset> encoderSet : toolsets) {
- // figure out the right toolset
- String groupId = encoderSet.first().getGroupId();
- String artifactId = encoderSet.first().getArtifactId();
- List<CoderFilters> coders = encoderSet.first().getCoders();
- for (CoderFilters coder : coders) {
- if (coder.getCodedClass().equals(encodedClass.getClass().getCanonicalName())) {
- DroolsController droolsController =
- DroolsController.factory.get(groupId, artifactId, "");
- if (droolsController.ownsCoder(encodedClass.getClass(), coder.getModelClassLoaderHash())) {
- droolsControllers.add(droolsController);
- }
- }
- }
- }
-
- if (droolsControllers.isEmpty())
- throw new IllegalStateException("No Encoders toolsets available for "+ topic +
- ":" + encodedClass.getClass().getCanonicalName());
-
- return droolsControllers;
- }
-
-
- /**
- * get all filters by maven coordinates and topic
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @param topic topic
- * @return list of coders
- * @throws IllegalArgumentException if invalid input
- */
- public List<CoderFilters> getFilters(String groupId, String artifactId, String topic)
- throws IllegalArgumentException {
-
- if (!isCodingSupported(groupId, artifactId, topic))
- throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic));
-
- String key = this.codersKey(groupId, artifactId, topic);
- Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
- return coderTools.first().getCoders();
- }
-
- /**
- * get all coders by maven coordinates and topic
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @param topic topic
- * @return list of coders
- * @throws IllegalArgumentException if invalid input
- */
- public Pair<ProtocolCoderToolset,ProtocolCoderToolset> getCoders(String groupId, String artifactId, String topic)
- throws IllegalArgumentException {
-
- if (!isCodingSupported(groupId, artifactId, topic))
- throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic));
-
- String key = this.codersKey(groupId, artifactId, topic);
- Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
- return coderTools;
- }
-
- /**
- * get all coders by maven coordinates and topic
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @return list of coders
- * @throws IllegalArgumentException if invalid input
- */
- public List<CoderFilters> getFilters(String groupId, String artifactId)
- throws IllegalArgumentException {
-
- if (groupId == null || groupId.isEmpty())
- throw new IllegalArgumentException("Invalid group id");
-
- if (artifactId == null || artifactId.isEmpty())
- throw new IllegalArgumentException("Invalid artifact id");
-
- String key = this.codersKey(groupId, artifactId, "");
-
- List<CoderFilters> codersFilters = new ArrayList<CoderFilters>();
- for (Map.Entry<String, Pair<ProtocolCoderToolset,ProtocolCoderToolset>> entry : coders.entrySet()) {
- if (entry.getKey().startsWith(key)) {
- codersFilters.addAll(entry.getValue().first().getCoders());
- }
- }
-
- return codersFilters;
- }
-
- /**
- * get all coders by maven coordinates and topic
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @return list of coders
- * @throws IllegalArgumentException if invalid input
- */
- public List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> getCoders(String groupId, String artifactId)
- throws IllegalArgumentException {
-
- if (groupId == null || groupId.isEmpty())
- throw new IllegalArgumentException("Invalid group id");
-
- if (artifactId == null || artifactId.isEmpty())
- throw new IllegalArgumentException("Invalid artifact id");
-
- String key = this.codersKey(groupId, artifactId, "");
-
- List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> coderToolset = new ArrayList<Pair<ProtocolCoderToolset,ProtocolCoderToolset>>();
- for (Map.Entry<String, Pair<ProtocolCoderToolset,ProtocolCoderToolset>> entry : coders.entrySet()) {
- if (entry.getKey().startsWith(key)) {
- coderToolset.add(entry.getValue());
- }
- }
-
- return coderToolset;
- }
-
-
- /**
- * get all filters by maven coordinates, topic, and classname
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @param topic topic
- * @param classname
- * @return list of coders
- * @throws IllegalArgumentException if invalid input
- */
- public CoderFilters getFilters(String groupId, String artifactId, String topic, String classname)
- throws IllegalArgumentException {
-
- if (!isCodingSupported(groupId, artifactId, topic))
- throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic));
-
- if (classname == null || classname.isEmpty())
- throw new IllegalArgumentException("classname must be provided");
-
- String key = this.codersKey(groupId, artifactId, topic);
- Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
- return coderTools.first().getCoder(classname);
- }
-
- /**
- * get coded based on class and topic
- *
- * @param topic
- * @param codedClass
- * @return
- * @throws IllegalArgumentException
- */
- public List<CoderFilters> getReverseFilters(String topic, String codedClass)
- throws IllegalArgumentException {
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Unsupported");
-
- if (codedClass == null)
- throw new IllegalArgumentException("class must be provided");
-
- String key = this.reverseCodersKey(topic, codedClass);
- List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> toolsets = this.reverseCoders.get(key);
- if (toolsets == null)
- throw new IllegalArgumentException("No Coder found for " + key);
-
-
- List<CoderFilters> coders = new ArrayList<CoderFilters>();
- for (Pair<ProtocolCoderToolset,ProtocolCoderToolset> toolset: toolsets) {
- coders.addAll(toolset.first().getCoders());
- }
-
- return coders;
- }
-
- /**
- * returns group and artifact id of the creator of the encoder
- *
- * @param topic
- * @param fact
- * @return
- * @throws IllegalArgumentException
- */
- DroolsController getDroolsController(String topic, Object fact)
- throws IllegalArgumentException {
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Unsupported");
-
- if (fact == null)
- throw new IllegalArgumentException("class must be provided");
-
- List<DroolsController> droolsControllers = droolsCreators(topic, fact);
-
- if (droolsControllers.isEmpty())
- throw new IllegalArgumentException("Invalid Topic: " + topic);
-
- if (droolsControllers.size() > 1) {
- logger.warn("{}: multiple drools-controller {} for {}:{} ", this,
- droolsControllers, topic, fact.getClass().getCanonicalName());
- // continue
- }
- return droolsControllers.get(0);
- }
-
- /**
- * returns group and artifact id of the creator of the encoder
- *
- * @param topic
- * @param fact
- * @return
- * @throws IllegalArgumentException
- */
- List<DroolsController> getDroolsControllers(String topic, Object fact)
- throws IllegalArgumentException {
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Unsupported");
-
- if (fact == null)
- throw new IllegalArgumentException("class must be provided");
-
- List<DroolsController> droolsControllers = droolsCreators(topic, fact);
- if (droolsControllers.size() > 1) {
- // unexpected
- logger.warn("{}: multiple drools-controller {} for {}:{} ", this,
- droolsControllers, topic, fact.getClass().getCanonicalName());
- // continue
- }
- return droolsControllers;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("GenericEventProtocolCoder [coders=").append(coders.keySet()).append(", reverseCoders=")
- .append(reverseCoders.keySet()).append("]");
- return builder.toString();
- }
-}
-
-class EventProtocolDecoder extends GenericEventProtocolCoder {
-
- public EventProtocolDecoder(){super(false);}
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("EventProtocolDecoder [toString()=").append(super.toString()).append("]");
- return builder.toString();
- }
-
-}
-
-class EventProtocolEncoder extends GenericEventProtocolCoder {
-
- public EventProtocolEncoder(){super(false);}
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("EventProtocolEncoder [toString()=").append(super.toString()).append("]");
- return builder.toString();
- }
-} \ No newline at end of file
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/JsonProtocolFilter.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/JsonProtocolFilter.java
deleted file mode 100644
index 7831e7b8..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/JsonProtocolFilter.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.protocol.coders;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.openecomp.policy.drools.utils.Pair;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-
-/**
- * JSON Protocol Filter. Evaluates an JSON string and evaluates if it
- * passes its filters.
- */
-public class JsonProtocolFilter {
-
- /**
- * Logger
- */
- private static Logger logger = LoggerFactory.getLogger(JsonProtocolFilter.class);
-
- /**
- * Helper class to collect Filter information
- */
- public static class FilterRule {
- /**
- * Field name
- */
- protected String name;
-
- /**
- * Field Value regex
- */
- protected String regex;
-
- /**
- * Filter Constructor
- *
- * @param name field name
- * @param regex field regex value
- */
- public FilterRule(String name, String regex) {
- this.name = name;
- this.regex = regex;
- }
-
- /**
- * Default constructor (for serialization only)
- */
- public FilterRule() {
- super();
- }
-
- /**
- * gets name
- *
- * @return
- */
- public String getName() {
- return name;
- }
-
- /**
- * gets regex
- *
- * @return
- */
- public String getRegex() {
- return regex;
- }
-
- /**
- * sets field name
- * @param name field name
- */
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * sets regex name
- * @param regex
- */
- public void setRegex(String regex) {
- this.regex = regex;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("Filter [name=").append(name).append(", regex=").append(regex).append("]");
- return builder.toString();
- }
- }
-
- /**
- * all the filters to be applied
- */
- protected List<FilterRule> rules = new ArrayList<FilterRule>();
-
- /**
- *
- * @param rawFilters raw filter initialization
- *
- * @throws IllegalArgumentException an invalid input has been provided
- */
- public static JsonProtocolFilter fromRawFilters(List<Pair<String, String>> rawFilters)
- throws IllegalArgumentException {
-
- if (rawFilters == null) {
- throw new IllegalArgumentException("No raw filters provided");
- }
-
- List<FilterRule> filters = new ArrayList<FilterRule>();
- for (Pair<String, String> filterPair: rawFilters) {
- if (filterPair.first() == null || filterPair.first().isEmpty()) {
- continue;
- }
-
- filters.add(new FilterRule(filterPair.first(), filterPair.second()));
- }
- return new JsonProtocolFilter(filters);
- }
-
- /**
- * Create a Protocol Filter
- *
- * @throws IllegalArgumentException an invalid input has been provided
- */
- public JsonProtocolFilter() throws IllegalArgumentException {}
-
- /**
- *
- * @param rawFilters raw filter initialization
- *
- * @throws IllegalArgumentException an invalid input has been provided
- */
- public JsonProtocolFilter(List<FilterRule> filters) throws IllegalArgumentException {
- this.rules = filters;
- }
-
- /**
- * are there any filters?
- *
- * @return true if there are filters, false otherwise
- */
- public boolean isRules() {
- return !this.rules.isEmpty();
- }
-
- /**
- * accept a JSON string as conformant it if passes all filters
- *
- * @param json json is a JSON object
- * @return true if json string is conformant
- *
- * @throws IllegalArgumentException an invalid input has been provided
- */
- public synchronized boolean accept(JsonElement json) throws IllegalArgumentException {
- if (json == null) {
- throw new IllegalArgumentException("no JSON provided");
- }
-
- if (rules.isEmpty()) {
- return true;
- }
-
- try {
- if (!json.isJsonObject()) {
- return false;
- }
-
- JsonObject event = json.getAsJsonObject();
- for (FilterRule filter: rules) {
- if (filter.regex == null ||
- filter.regex.isEmpty() ||
- filter.regex.equals(".*")) {
-
- // Only check for presence
- if (!event.has(filter.name)) {
- return false;
- }
- } else {
- JsonElement field = event.get(filter.name);
- if (field == null) {
- return false;
- }
-
- String fieldValue = field.getAsString();
- if (!fieldValue.matches(filter.regex)) {
- return false;
- }
- }
- }
- return true;
- } catch (Exception e) {
- throw new IllegalArgumentException(e);
- }
- }
-
- /**
- * accept a JSON string as conformant it if passes all filters
- *
- * @param json json string
- * @return true if json string is conformant
- *
- * @throws IllegalArgumentException an invalid input has been provided
- */
- public synchronized boolean accept(String json) throws IllegalArgumentException {
- if (json == null || json.isEmpty()) {
- throw new IllegalArgumentException("no JSON provided");
- }
-
- if (rules.isEmpty()) {
- return true;
- }
-
- try {
- JsonElement element = new JsonParser().parse(json);
- if (element == null || !element.isJsonObject()) {
- return false;
- }
-
- return this.accept(element.getAsJsonObject());
- } catch (IllegalArgumentException ile) {
- throw ile;
- } catch (Exception e) {
- logger.info("{}: cannot accept {} because of {}",
- this, json, e.getMessage(), e);
- throw new IllegalArgumentException(e);
- }
- }
-
- public List<FilterRule> getRules() {
- return rules;
- }
-
- public synchronized void setRules(List<FilterRule> rulesFilters) {
- this.rules = rulesFilters;
- }
-
- public synchronized void deleteRules(String name) {
- for (FilterRule rule : new ArrayList<>(this.rules)) {
- if (rule.name.equals(name)) {
- this.rules.remove(rule);
- }
- }
- }
-
- public List<FilterRule> getRules(String name) {
- ArrayList<FilterRule> temp = new ArrayList<>();
- for (FilterRule rule : new ArrayList<>(this.rules)) {
- if (rule.name.equals(name)) {
- temp.add(rule);
- }
- }
- return temp;
- }
-
- public synchronized void deleteRule(String name, String regex) {
- for (FilterRule rule : new ArrayList<>(this.rules)) {
- if (rule.name.equals(name) && rule.regex.equals(regex)) {
- this.rules.remove(rule);
- }
- }
- }
-
- public synchronized void addRule(String name, String regex) {
- for (FilterRule rule : new ArrayList<>(this.rules)) {
- if (rule.name.equals(name) && rule.regex.equals(regex)) {
- return;
- }
- }
-
- this.rules.add(new FilterRule(name,regex));
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("JsonProtocolFilter [rules=").append(rules).append("]");
- return builder.toString();
- }
-
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/ProtocolCoderToolset.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/ProtocolCoderToolset.java
deleted file mode 100644
index bf7a43f3..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/ProtocolCoderToolset.java
+++ /dev/null
@@ -1,683 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.protocol.coders;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.time.Instant;
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.openecomp.policy.drools.controller.DroolsController;
-import org.openecomp.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomCoder;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
-import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomJacksonCoder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonDeserializationContext;
-import com.google.gson.JsonDeserializer;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParseException;
-import com.google.gson.JsonParser;
-import com.google.gson.JsonPrimitive;
-import com.google.gson.JsonSerializationContext;
-import com.google.gson.JsonSerializer;
-
-/**
- * Protocol Coding/Decoding Toolset
- */
-public abstract class ProtocolCoderToolset {
-
- /**
- * Logger
- */
- private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
-
- /**
- * topic
- */
- protected final String topic;
-
- /**
- * controller id
- */
- protected final String controllerId;
-
- /**
- * group id
- */
- protected final String groupId;
-
- /**
- * artifact id
- */
- protected final String artifactId;
-
- /**
- * Protocols and associated Filters
- */
- protected final List<CoderFilters> coders = new ArrayList<CoderFilters>();
-
- /**
- * Tree model (instead of class model) generic parsing to be able to inspect elements
- */
- protected JsonParser filteringParser = new JsonParser();
-
- /**
- * custom coder
- */
- protected CustomCoder customCoder;
-
- /**
- * Constructor
- *
- * @param topic the topic
- * @param controllerId the controller id
- * @param codedClass the decoded class
- * @param filters list of filters that apply to the
- * selection of this decodedClass in case of multiplicity
- * @throws IllegalArgumentException if invalid data has been passed in
- */
- public ProtocolCoderToolset(String topic,
- String controllerId,
- String groupId,
- String artifactId,
- String codedClass,
- JsonProtocolFilter filters,
- CustomCoder customCoder,
- int modelClassLoaderHash)
- throws IllegalArgumentException {
-
- if (topic == null || controllerId == null ||
- groupId == null || artifactId == null ||
- codedClass == null || filters == null ||
- topic.isEmpty() || controllerId.isEmpty()) {
- // TODO
- throw new IllegalArgumentException("Invalid input");
- }
-
- this.topic = topic;
- this.controllerId = controllerId;
- this.groupId = groupId;
- this.artifactId = artifactId;
- this.coders.add(new CoderFilters(codedClass, filters, modelClassLoaderHash));
- this.customCoder = customCoder;
- }
-
- /**
- * gets the coder + filters associated with this class name
- *
- * @param classname class name
- * @return the decoder filters or null if not found
- */
- public CoderFilters getCoder(String classname) {
- for (CoderFilters decoder: this.coders) {
- if (decoder.factClass.equals(classname)) {
- return decoder;
- }
- }
- return null;
- }
-
- /**
- * get all coder filters in use
- *
- * @return coder filters
- */
- public List<CoderFilters> getCoders() {
- return this.coders;
- }
-
- /**
- * add coder or replace it exists
- *
- * @param eventClass decoder
- * @param filter filter
- */
- public void addCoder(String eventClass, JsonProtocolFilter filter, int modelClassLoaderHash) {
- synchronized(this) {
- for (CoderFilters coder: this.coders) {
- if (coder.factClass.equals(eventClass)) {
- // this is a better check than checking pointers, just
- // in case classloader is different and this is just an update
- coder.factClass = eventClass;
- coder.filter = filter;
- coder.modelClassLoaderHash = modelClassLoaderHash;
- return;
- }
- }
- }
-
- this.coders.add(new CoderFilters(eventClass, filter, modelClassLoaderHash));
- }
-
- /**
- * remove coder
- *
- * @param eventClass decoder
- * @param filter filter
- */
- public void removeCoders(String eventClass) {
- synchronized(this) {
- Iterator<CoderFilters> codersIt = this.coders.iterator();
- while (codersIt.hasNext()) {
- CoderFilters coder = codersIt.next();
- if (coder.factClass.equals(eventClass)) {
- codersIt.remove();
- }
- }
- }
- }
-
- /**
- * gets the topic
- *
- * @return the topic
- */
- public String getTopic() {return topic;}
-
- /**
- * gets the controller id
- *
- * @return the controller id
- */
- public String getControllerId() {return controllerId;}
-
- /**
- * @return the groupId
- */
- public String getGroupId() {
- return groupId;
- }
-
- /**
- * @return the artifactId
- */
- public String getArtifactId() {
- return artifactId;
- }
-
- /**
- * @return the customCoder
- */
- public CustomCoder getCustomCoder() {
- return customCoder;
- }
-
- /**
- * @param customCoder the customCoder to set
- */
- public void setCustomCoder(CustomCoder customCoder) {
- this.customCoder = customCoder;
- }
-
- /**
- * performs filtering on a json string
- *
- * @param json json string
- * @return the decoder that passes the filter, otherwise null
- * @throws UnsupportedOperationException can't filter
- * @throws IllegalArgumentException invalid input
- */
- protected CoderFilters filter(String json)
- throws UnsupportedOperationException, IllegalArgumentException, IllegalStateException {
-
-
- // 1. Get list of decoding classes for this controller Id and topic
- // 2. If there are no classes, return error
- // 3. Otherwise, from the available classes for decoding, pick the first one that
- // passes the filters
-
- // Don't parse if it is not necessary
-
- if (this.coders.isEmpty()) {
- // TODO this is an error
- throw new IllegalStateException("No coders available");
- }
-
- if (this.coders.size() == 1) {
- JsonProtocolFilter filter = this.coders.get(0).getFilter();
- if (!filter.isRules()) {
- return this.coders.get(0);
- }
- }
-
- JsonElement event;
- try {
- event = this.filteringParser.parse(json);
- } catch (Exception e) {
- throw new UnsupportedOperationException(e);
- }
-
- for (CoderFilters decoder: this.coders) {
- try {
- boolean accepted = decoder.getFilter().accept(event);
- if (accepted) {
- return decoder;
- }
- } catch (Exception e) {
- logger.info("{}: unexpected failure accepting {} because of {}",
- this, event, e.getMessage(), e);
- // continue
- }
- }
-
- return null;
- }
-
- /**
- * Decode json into a POJO object
- * @param json json string
- *
- * @return a POJO object for the json string
- * @throws IllegalArgumentException if an invalid parameter has been received
- * @throws UnsupportedOperationException if parsing into POJO is not possible
- */
- public abstract Object decode(String json)
- throws IllegalArgumentException, UnsupportedOperationException, IllegalStateException;
-
- /**
- * Encodes a POJO object into a JSON String
- *
- * @param event JSON POJO event to be converted to String
- * @return JSON string version of POJO object
- * @throws IllegalArgumentException if an invalid parameter has been received
- * @throws UnsupportedOperationException if parsing into POJO is not possible
- */
- public abstract String encode(Object event)
- throws IllegalArgumentException, UnsupportedOperationException;
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("ProtocolCoderToolset [topic=").append(topic).append(", controllerId=").append(controllerId)
- .append(", groupId=").append(groupId).append(", artifactId=").append(artifactId).append(", coders=")
- .append(coders).append(", filteringParser=").append(filteringParser).append(", customCoder=")
- .append(customCoder).append("]");
- return builder.toString();
- }
-}
-
-/**
- * Tools used for encoding/decoding using Jackson
- */
-class JacksonProtocolCoderToolset extends ProtocolCoderToolset {
- private static Logger logger = LoggerFactory.getLogger(JacksonProtocolCoderToolset.class);
- /**
- * decoder
- */
- @JsonIgnore
- protected final ObjectMapper decoder = new ObjectMapper();
-
- /**
- * encoder
- */
- @JsonIgnore
- protected final ObjectMapper encoder = new ObjectMapper();
-
- /**
- * Toolset to encode/decode tools associated with a topic
- *
- * @param topic topic
- * @param decodedClass decoded class of an event
- * @param filter
- */
- public JacksonProtocolCoderToolset(String topic, String controllerId,
- String groupId, String artifactId,
- String decodedClass,
- JsonProtocolFilter filter,
- CustomJacksonCoder customJacksonCoder,
- int modelClassLoaderHash) {
- super(topic, controllerId, groupId, artifactId, decodedClass, filter, customJacksonCoder, modelClassLoaderHash);
- decoder.registerModule(new JavaTimeModule());
- decoder.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
- false);
- }
-
- /**
- * gets the Jackson decoder
- *
- * @return the Jackson decoder
- */
- @JsonIgnore
- protected ObjectMapper getDecoder() {return decoder;}
-
- /**
- * gets the Jackson encoder
- *
- * @return the Jackson encoder
- */
- @JsonIgnore
- protected ObjectMapper getEncoder() {return encoder;}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Object decode(String json)
- throws IllegalArgumentException, UnsupportedOperationException, IllegalStateException {
-
- // 0. Use custom coder if available
-
- if (this.customCoder != null) {
- throw new UnsupportedOperationException
- ("Jackon Custom Decoder is not supported at this time");
- }
-
- DroolsController droolsController =
- DroolsController.factory.get(groupId, artifactId, "");
- if (droolsController == null) {
- logger.warn("{}: no drools-controller to process {}", this, json);
- throw new IllegalStateException("no drools-controller to process event");
- }
-
- CoderFilters decoderFilter = filter(json);
- if (decoderFilter == null) {
- logger.debug("{}: no decoder to process {}", this, json);
- throw new UnsupportedOperationException("no decoder to process event");
- }
-
- Class<?> decoderClass;
- try {
- decoderClass =
- droolsController.fetchModelClass(decoderFilter.getCodedClass());
- if (decoderClass == null) {
- logger.warn("{}: cannot fetch application class {}", this, decoderFilter.getCodedClass());
- throw new IllegalStateException("cannot fetch application class " + decoderFilter.getCodedClass());
- }
- } catch (Exception e) {
- logger.warn("{}: cannot fetch application class {} because of {}", this,
- decoderFilter.getCodedClass(), e.getMessage());
- throw new UnsupportedOperationException("cannot fetch application class " + decoderFilter.getCodedClass(), e);
- }
-
-
- try {
- Object fact = this.decoder.readValue(json, decoderClass);
- return fact;
- } catch (Exception e) {
- logger.warn("{} cannot decode {} into {} because of {}",
- this, json, decoderClass.getName(), e.getMessage(), e);
- throw new UnsupportedOperationException("cannont decode into " + decoderFilter.getCodedClass(), e);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String encode(Object event)
- throws IllegalArgumentException, UnsupportedOperationException {
-
- // 0. Use custom coder if available
-
- if (this.customCoder != null) {
- throw new UnsupportedOperationException
- ("Jackon Custom Encoder is not supported at this time");
- }
-
- try {
- String encodedEvent = this.encoder.writeValueAsString(event);
- return encodedEvent;
- } catch (JsonProcessingException e) {
- logger.error("{} cannot encode {} because of {}", this, event, e.getMessage(), e);
- throw new UnsupportedOperationException("event cannot be encoded");
- }
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("JacksonProtocolCoderToolset [toString()=").append(super.toString()).append("]");
- return builder.toString();
- }
-
-}
-
-/**
- * Tools used for encoding/decoding using Jackson
- */
-class GsonProtocolCoderToolset extends ProtocolCoderToolset {
-
- /**
- * Logger
- */
- private static Logger logger = LoggerFactory.getLogger(GsonProtocolCoderToolset.class);
-
- /**
- * Formatter for JSON encoding/decoding
- */
- @JsonIgnore
- public static DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSxxx");
-
- @JsonIgnore
- public static DateTimeFormatter zuluFormat = DateTimeFormatter.ISO_INSTANT;
-
- /**
- * Adapter for ZonedDateTime
- */
-
- public static class GsonUTCAdapter implements JsonSerializer<ZonedDateTime>, JsonDeserializer<ZonedDateTime> {
-
- public ZonedDateTime deserialize(JsonElement element, Type type, JsonDeserializationContext context)
- throws JsonParseException {
- try {
- return ZonedDateTime.parse(element.getAsString(), format);
- } catch (Exception e) {
- logger.info("GsonUTCAdapter: cannot parse {} because of {}",
- element, e.getMessage(), e);
- }
- return null;
- }
-
- public JsonElement serialize(ZonedDateTime datetime, Type type, JsonSerializationContext context) {
- return new JsonPrimitive(datetime.format(format));
- }
- }
-
- public static class GsonInstantAdapter implements JsonSerializer<Instant>, JsonDeserializer<Instant> {
-
- @Override
- public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
- throws JsonParseException {
- return Instant.ofEpochMilli(json.getAsLong());
- }
-
- @Override
- public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) {
- return new JsonPrimitive(src.toEpochMilli());
- }
-
- }
-
-
- /**
- * decoder
- */
- @JsonIgnore
- protected final Gson decoder = new GsonBuilder().disableHtmlEscaping().
- registerTypeAdapter(ZonedDateTime.class, new GsonUTCAdapter()).
- create();
-
- /**
- * encoder
- */
- @JsonIgnore
- protected final Gson encoder = new GsonBuilder().disableHtmlEscaping().
- registerTypeAdapter(ZonedDateTime.class, new GsonUTCAdapter()).
- create();
-
- /**
- * Toolset to encode/decode tools associated with a topic
- *
- * @param topic topic
- * @param decodedClass decoded class of an event
- * @param filter
- */
- public GsonProtocolCoderToolset(String topic, String controllerId,
- String groupId, String artifactId,
- String decodedClass,
- JsonProtocolFilter filter,
- CustomGsonCoder customGsonCoder,
- int modelClassLoaderHash) {
- super(topic, controllerId, groupId, artifactId, decodedClass, filter, customGsonCoder, modelClassLoaderHash);
- }
-
- /**
- * gets the Gson decoder
- *
- * @return the Gson decoder
- */
- @JsonIgnore
- protected Gson getDecoder() {return decoder;}
-
- /**
- * gets the Gson encoder
- *
- * @return the Gson encoder
- */
- @JsonIgnore
- protected Gson getEncoder() {return encoder;}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Object decode(String json)
- throws IllegalArgumentException, UnsupportedOperationException, IllegalStateException {
-
- DroolsController droolsController =
- DroolsController.factory.get(groupId, artifactId, "");
- if (droolsController == null) {
- logger.warn("{}: no drools-controller to process {}", this, json);
- throw new IllegalStateException("no drools-controller to process event");
- }
-
- CoderFilters decoderFilter = filter(json);
- if (decoderFilter == null) {
- logger.debug("{}: no decoder to process {}", this, json);
- throw new UnsupportedOperationException("no decoder to process event");
- }
-
- Class<?> decoderClass;
- try {
- decoderClass =
- droolsController.fetchModelClass(decoderFilter.getCodedClass());
- if (decoderClass == null) {
- logger.warn("{}: cannot fetch application class {}", this, decoderFilter.getCodedClass());
- throw new IllegalStateException("cannot fetch application class " + decoderFilter.getCodedClass());
- }
- } catch (Exception e) {
- logger.warn("{}: cannot fetch application class {} because of {}", this,
- decoderFilter.getCodedClass(), e.getMessage());
- throw new UnsupportedOperationException("cannot fetch application class " + decoderFilter.getCodedClass(), e);
- }
-
- if (this.customCoder != null) {
- try {
- Class<?> gsonClassContainer =
- droolsController.fetchModelClass(this.customCoder.getClassContainer());
- Field gsonField = gsonClassContainer.getField(this.customCoder.staticCoderField);
- Object gsonObject = gsonField.get(null);
- Method fromJsonMethod = gsonObject.getClass().
- getDeclaredMethod
- ("fromJson", new Class[]{String.class, Class.class});
- Object fact = fromJsonMethod.invoke(gsonObject, json, decoderClass);
- return fact;
- } catch (Exception e) {
- logger.warn("{}: cannot fetch application class {} because of {}", this,
- decoderFilter.getCodedClass(), e.getMessage());
- throw new UnsupportedOperationException("cannot fetch application class " + decoderFilter.getCodedClass(), e);
- }
- } else {
- try {
- Object fact = this.decoder.fromJson(json, decoderClass);
- return fact;
- } catch (Exception e) {
- logger.warn("{} cannot decode {} into {} because of {}",
- this, json, decoderClass.getName(), e.getMessage(), e);
- throw new UnsupportedOperationException("cannont decode into " + decoderFilter.getCodedClass(), e);
- }
- }
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String encode(Object event)
- throws IllegalArgumentException, UnsupportedOperationException {
-
- DroolsController droolsController =
- DroolsController.factory.get(groupId, artifactId, null);
- if (droolsController == null) {
- logger.info("{}: no drools-controller to process {} (continue)", this, event);
- throw new IllegalStateException("custom-coder but no drools-controller");
- }
-
- if (this.customCoder != null) {
- try {
- Class<?> gsonClassContainer =
- droolsController.fetchModelClass(this.customCoder.getClassContainer());
- Field gsonField = gsonClassContainer.getField(this.customCoder.staticCoderField);
- Object gsonObject = gsonField.get(null);
- Method toJsonMethod = gsonObject.getClass().
- getDeclaredMethod
- ("toJson", new Class[]{Object.class});
- String encodedJson = (String) toJsonMethod.invoke(gsonObject, event);
- return encodedJson;
- } catch (Exception e) {
- logger.warn("{} cannot custom-encode {} because of {}", this, event, e.getMessage(), e);
- throw new UnsupportedOperationException("event cannot be encoded", e);
- }
- } else {
- try {
- String encodedEvent = this.encoder.toJson(event);
- return encodedEvent;
- } catch (Exception e) {
- logger.warn("{} cannot encode {} because of {}", this, event, e.getMessage(), e);
- throw new UnsupportedOperationException("event cannot be encoded", e);
- }
- }
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("GsonProtocolCoderToolset [toString()=").append(super.toString()).append("]");
- return builder.toString();
- }
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/TopicCoderFilterConfiguration.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/TopicCoderFilterConfiguration.java
deleted file mode 100644
index 3c112573..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/TopicCoderFilterConfiguration.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.protocol.coders;
-
-import java.util.List;
-
-public class TopicCoderFilterConfiguration {
-
- /**
- * Custom coder, contains class and static field to access parser that the controller
- * desires to use instead of the framework provided parser
- */
- public static abstract class CustomCoder {
- protected String className;
- protected String staticCoderField;
-
- /**
- * create custom coder from raw string in the following format
- * (typically embedded in a property file):
- *
- * Note this is to support decoding/encoding of partial structures that are
- * only known by the model.
- *
- * @param rawCustomCoder with format: <class-containing-custom-coder>,<static-coder-field>
- */
- public CustomCoder(String rawCustomCoder) throws IllegalArgumentException {
- if (rawCustomCoder != null && !rawCustomCoder.isEmpty()) {
-
- this.className = rawCustomCoder.substring(0,rawCustomCoder.indexOf(","));
- if (this.className == null || this.className.isEmpty()) {
- throw new IllegalArgumentException("No classname to create CustomCoder cannot be created");
- }
-
- this.staticCoderField = rawCustomCoder.substring(rawCustomCoder.indexOf(",")+1);
- if (this.staticCoderField == null || this.staticCoderField.isEmpty()) {
- throw new IllegalArgumentException
- ("No staticCoderField to create CustomCoder cannot be created for class " +
- className);
- }
-
- }
- }
- /**
- * @param classContainer
- * @param staticCoderField
- */
- public CustomCoder(String className, String staticCoderField) throws IllegalArgumentException {
- if (className == null || className.isEmpty()) {
- throw new IllegalArgumentException("No classname to create CustomCoder cannot be created");
- }
-
- if (staticCoderField == null || staticCoderField.isEmpty()) {
- throw new IllegalArgumentException
- ("No staticCoderField to create CustomCoder cannot be created for class " +
- className);
- }
-
- this.className = className;
- this.staticCoderField = staticCoderField;
- }
-
- /**
- * @return the className
- */
- public String getClassContainer() {
- return className;
- }
-
- /**
- * @param className the className to set
- */
- public void setClassContainer(String className) {
- this.className = className;
- }
-
- /**
- * @return the staticCoderField
- */
- public String getStaticCoderField() {
- return staticCoderField;
- }
-
- /**
- * @param staticCoderField the staticGson to set
- */
- public void setStaticCoderField(String staticCoderField) {
- this.staticCoderField = staticCoderField;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("CustomCoder [className=").append(className).append(", staticCoderField=")
- .append(staticCoderField).append("]");
- return builder.toString();
- }
- }
-
- public static class CustomGsonCoder extends CustomCoder {
-
- public CustomGsonCoder(String className, String staticCoderField) {
- super(className, staticCoderField);
- }
-
- public CustomGsonCoder(String customGson) throws IllegalArgumentException {
- super(customGson);
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("CustomGsonCoder [toString()=").append(super.toString()).append("]");
- return builder.toString();
- }
-
- }
-
- public static class CustomJacksonCoder extends CustomCoder {
-
- public CustomJacksonCoder(String className, String staticCoderField) {
- super(className, staticCoderField);
- }
-
- public CustomJacksonCoder(String customJackson) throws IllegalArgumentException {
- super(customJackson);
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("CustomJacksonCoder [toString()=").append(super.toString()).append("]");
- return builder.toString();
- }
-
- }
-
- /**
- * Coder/Decoder class and Filter container. The decoder class is potential,
- * in order to be operational needs to be fetched from an available
- * class loader.
- *
- */
- public static class PotentialCoderFilter {
-
- /**
- * decoder class (pending from being able to be fetched and found
- * in some class loader)
- */
- protected String codedClass;
-
- /**
- * filters to apply to the selection of the decodedClass;
- */
- protected JsonProtocolFilter filter;
-
- /**
- * constructor
- *
- * @param codedClass decoder class
- * @param filter filters to apply
- */
- public PotentialCoderFilter(String codedClass, JsonProtocolFilter filter) {
- this.codedClass = codedClass;
- this.filter = filter;
- }
-
- /**
- * @return the decodedClass
- */
- public String getCodedClass() {
- return codedClass;
- }
-
- /**
- * @param decodedClass the decodedClass to set
- */
- public void setCodedClass(String decodedClass) {
- this.codedClass = decodedClass;
- }
-
- /**
- * @return the filter
- */
- public JsonProtocolFilter getFilter() {
- return filter;
- }
-
- /**
- * @param filter the filter to set
- */
- public void setFilter(JsonProtocolFilter filter) {
- this.filter = filter;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("PotentialCoderFilter [codedClass=").append(codedClass).append(", filter=").append(filter)
- .append("]");
- return builder.toString();
- }
- }
-
- /**
- * the source topic
- */
- protected final String topic;
-
- /**
- * List of decoder -> filters
- */
- protected final List<PotentialCoderFilter> coderFilters;
-
- /**
- * custom gson coder that this controller prefers to use instead of the framework ones
- */
- protected CustomGsonCoder customGsonCoder;
-
- /**
- * custom jackson coder that this controller prefers to use instead of the framework ones
- */
- protected CustomJacksonCoder customJacksonCoder;
-
- /**
- * Constructor
- *
- * @param decoderFilters list of decoders and associated filters
- * @param topic the topic
- */
- public TopicCoderFilterConfiguration(String topic, List<PotentialCoderFilter> decoderFilters,
- CustomGsonCoder customGsonCoder,
- CustomJacksonCoder customJacksonCoder) {
- this.coderFilters = decoderFilters;
- this.topic = topic;
- this.customGsonCoder = customGsonCoder;
- this.customJacksonCoder = customJacksonCoder;
- }
-
- /**
- * @return the topic
- */
- public String getTopic() {
- return topic;
- }
-
- /**
- * @return the decoderFilters
- */
- public List<PotentialCoderFilter> getCoderFilters() {
- return coderFilters;
- }
-
- /**
- * @return the customGsonCoder
- */
- public CustomGsonCoder getCustomGsonCoder() {
- return customGsonCoder;
- }
-
- /**
- * @param customGsonCoder the customGsonCoder to set
- */
- public void setCustomGsonCoder(CustomGsonCoder customGsonCoder) {
- this.customGsonCoder = customGsonCoder;
- }
-
- /**
- * @return the customJacksonCoder
- */
- public CustomJacksonCoder getCustomJacksonCoder() {
- return customJacksonCoder;
- }
-
- /**
- * @param customJacksonCoder the customJacksonCoder to set
- */
- public void setCustomJacksonCoder(CustomJacksonCoder customJacksonCoder) {
- this.customJacksonCoder = customJacksonCoder;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("TopicCoderFilterConfiguration [topic=").append(topic).append(", coderFilters=")
- .append(coderFilters).append(", customGsonCoder=").append(customGsonCoder)
- .append(", customJacksonCoder=").append(customJacksonCoder).append("]");
- return builder.toString();
- }
-
-
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/ControllerConfiguration.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/ControllerConfiguration.java
deleted file mode 100644
index 98af02ee..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/ControllerConfiguration.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.protocol.configuration;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-
-import com.fasterxml.jackson.annotation.JsonAnyGetter;
-import com.fasterxml.jackson.annotation.JsonAnySetter;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-
-/**
- * Drools Related Information
- *
- */
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class ControllerConfiguration {
-
- public static final String CONFIG_CONTROLLER_OPERATION_CREATE = "create";
- public static final String CONFIG_CONTROLLER_OPERATION_UPDATE = "update";
- public static final String CONFIG_CONTROLLER_OPERATION_LOCK = "lock";
- public static final String CONFIG_CONTROLLER_OPERATION_UNLOCK = "unlock";
-
- /**
- *
- * (Required)
- *
- */
- @JsonProperty("name")
- private String name;
- /**
- * Set of operations that can be applied to a controller: create, lock
- * (Required)
- *
- */
- @JsonProperty("operation")
- private String operation;
- /**
- * Maven Related Information
- *
- */
- @JsonProperty("drools")
- private DroolsConfiguration drools;
- @JsonIgnore
- private Map<String, Object> additionalProperties = new HashMap<String, Object>();
- protected final static Object NOT_FOUND_VALUE = new Object();
-
- /**
- * No args constructor for use in serialization
- *
- */
- public ControllerConfiguration() {
- }
-
- /**
- *
- * @param name
- * @param drools
- * @param operation
- */
- public ControllerConfiguration(String name, String operation, DroolsConfiguration drools) {
- this.name = name;
- this.operation = operation;
- this.drools = drools;
- }
-
- /**
- *
- * (Required)
- *
- * @return
- * The name
- */
- @JsonProperty("name")
- public String getName() {
- return name;
- }
-
- /**
- *
- * (Required)
- *
- * @param name
- * The name
- */
- @JsonProperty("name")
- public void setName(String name) {
- this.name = name;
- }
-
- public ControllerConfiguration withName(String name) {
- this.name = name;
- return this;
- }
-
- /**
- * Set of operations that can be applied to a controller: create, lock
- * (Required)
- *
- * @return
- * The operation
- */
- @JsonProperty("operation")
- public String getOperation() {
- return operation;
- }
-
- /**
- * Set of operations that can be applied to a controller: create, lock
- * (Required)
- *
- * @param operation
- * The operation
- */
- @JsonProperty("operation")
- public void setOperation(String operation) {
- this.operation = operation;
- }
-
- public ControllerConfiguration withOperation(String operation) {
- this.operation = operation;
- return this;
- }
-
- /**
- * Maven Related Information
- *
- * @return
- * The drools
- */
- @JsonProperty("drools")
- public DroolsConfiguration getDrools() {
- return drools;
- }
-
- /**
- * Maven Related Information
- *
- * @param drools
- * The drools
- */
- @JsonProperty("drools")
- public void setDrools(DroolsConfiguration drools) {
- this.drools = drools;
- }
-
- public ControllerConfiguration withDrools(DroolsConfiguration drools) {
- this.drools = drools;
- return this;
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
-
- @JsonAnyGetter
- public Map<String, Object> getAdditionalProperties() {
- return this.additionalProperties;
- }
-
- @JsonAnySetter
- public void setAdditionalProperty(String name, Object value) {
- this.additionalProperties.put(name, value);
- }
-
- public ControllerConfiguration withAdditionalProperty(String name, Object value) {
- this.additionalProperties.put(name, value);
- return this;
- }
-
- protected boolean declaredProperty(String name, Object value) {
- switch (name) {
- case "name":
- if (value instanceof String) {
- setName(((String) value));
- } else {
- throw new IllegalArgumentException(("property \"name\" is of type \"java.lang.String\", but got "+ value.getClass().toString()));
- }
- return true;
- case "operation":
- if (value instanceof String) {
- setOperation(((String) value));
- } else {
- throw new IllegalArgumentException(("property \"operation\" is of type \"java.lang.String\", but got "+ value.getClass().toString()));
- }
- return true;
- case "drools":
- if (value instanceof DroolsConfiguration) {
- setDrools(((DroolsConfiguration) value));
- } else {
- throw new IllegalArgumentException(("property \"drools\" is of type \"org.openecomp.policy.drools.protocol.configuration.Drools\", but got "+ value.getClass().toString()));
- }
- return true;
- default:
- return false;
- }
- }
-
- protected Object declaredPropertyOrNotFound(String name, Object notFoundValue) {
- switch (name) {
- case "name":
- return getName();
- case "operation":
- return getOperation();
- case "drools":
- return getDrools();
- default:
- return notFoundValue;
- }
- }
-
- @SuppressWarnings({
- "unchecked"
- })
- public<T >T get(String name) {
- Object value = declaredPropertyOrNotFound(name, ControllerConfiguration.NOT_FOUND_VALUE);
- if (ControllerConfiguration.NOT_FOUND_VALUE!= value) {
- return ((T) value);
- } else {
- return ((T) getAdditionalProperties().get(name));
- }
- }
-
- public void set(String name, Object value) {
- if (!declaredProperty(name, value)) {
- getAdditionalProperties().put(name, ((Object) value));
- }
- }
-
- public ControllerConfiguration with(String name, Object value) {
- if (!declaredProperty(name, value)) {
- getAdditionalProperties().put(name, ((Object) value));
- }
- return this;
- }
-
- @Override
- public int hashCode() {
- return new HashCodeBuilder().append(name).append(operation).append(drools).append(additionalProperties).toHashCode();
- }
-
- @Override
- public boolean equals(Object other) {
- if (other == this) {
- return true;
- }
- if ((other instanceof ControllerConfiguration) == false) {
- return false;
- }
- ControllerConfiguration rhs = ((ControllerConfiguration) other);
- return new EqualsBuilder().append(name, rhs.name).append(operation, rhs.operation).append(drools, rhs.drools).append(additionalProperties, rhs.additionalProperties).isEquals();
- }
-
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/DroolsConfiguration.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/DroolsConfiguration.java
deleted file mode 100644
index 87cf2348..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/DroolsConfiguration.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.protocol.configuration;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-
-import com.fasterxml.jackson.annotation.JsonAnyGetter;
-import com.fasterxml.jackson.annotation.JsonAnySetter;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-
-/**
- * Maven Related Information
- *
- */
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class DroolsConfiguration {
-
- /**
- * Maven Artifact ID
- * (Required)
- *
- */
- @JsonProperty("artifactId")
- private String artifactId;
- /**
- * Maven Group ID
- * (Required)
- *
- */
- @JsonProperty("groupId")
- private String groupId;
- /**
- * Maven Version
- * (Required)
- *
- */
- @JsonProperty("version")
- private String version;
- @JsonIgnore
- private Map<String, Object> additionalProperties = new HashMap<String, Object>();
- protected final static Object NOT_FOUND_VALUE = new Object();
-
- /**
- * No args constructor for use in serialization
- *
- */
- public DroolsConfiguration() {
- }
-
- /**
- *
- * @param groupId
- * @param artifactId
- * @param version
- */
- public DroolsConfiguration(String artifactId, String groupId, String version) {
- this.artifactId = artifactId;
- this.groupId = groupId;
- this.version = version;
- }
-
- /**
- * Maven Artifact ID
- * (Required)
- *
- * @return
- * The artifactId
- */
- @JsonProperty("artifactId")
- public String getArtifactId() {
- return artifactId;
- }
-
- /**
- * Maven Artifact ID
- * (Required)
- *
- * @param artifactId
- * The artifactId
- */
- @JsonProperty("artifactId")
- public void setArtifactId(String artifactId) {
- this.artifactId = artifactId;
- }
-
- public DroolsConfiguration withArtifactId(String artifactId) {
- this.artifactId = artifactId;
- return this;
- }
-
- /**
- * Maven Group ID
- * (Required)
- *
- * @return
- * The groupId
- */
- @JsonProperty("groupId")
- public String getGroupId() {
- return groupId;
- }
-
- /**
- * Maven Group ID
- * (Required)
- *
- * @param groupId
- * The groupId
- */
- @JsonProperty("groupId")
- public void setGroupId(String groupId) {
- this.groupId = groupId;
- }
-
- public DroolsConfiguration withGroupId(String groupId) {
- this.groupId = groupId;
- return this;
- }
-
- /**
- * Maven Version
- * (Required)
- *
- * @return
- * The version
- */
- @JsonProperty("version")
- public String getVersion() {
- return version;
- }
-
- /**
- * Maven Version
- * (Required)
- *
- * @param version
- * The version
- */
- @JsonProperty("version")
- public void setVersion(String version) {
- this.version = version;
- }
-
- public DroolsConfiguration withVersion(String version) {
- this.version = version;
- return this;
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
-
- @JsonAnyGetter
- public Map<String, Object> getAdditionalProperties() {
- return this.additionalProperties;
- }
-
- @JsonAnySetter
- public void setAdditionalProperty(String name, Object value) {
- this.additionalProperties.put(name, value);
- }
-
- public DroolsConfiguration withAdditionalProperty(String name, Object value) {
- this.additionalProperties.put(name, value);
- return this;
- }
-
- protected boolean declaredProperty(String name, Object value) {
- switch (name) {
- case "artifactId":
- if (value instanceof String) {
- setArtifactId(((String) value));
- } else {
- throw new IllegalArgumentException(("property \"artifactId\" is of type \"java.lang.String\", but got "+ value.getClass().toString()));
- }
- return true;
- case "groupId":
- if (value instanceof String) {
- setGroupId(((String) value));
- } else {
- throw new IllegalArgumentException(("property \"groupId\" is of type \"java.lang.String\", but got "+ value.getClass().toString()));
- }
- return true;
- case "version":
- if (value instanceof String) {
- setVersion(((String) value));
- } else {
- throw new IllegalArgumentException(("property \"version\" is of type \"java.lang.String\", but got "+ value.getClass().toString()));
- }
- return true;
- default:
- return false;
- }
- }
-
- protected Object declaredPropertyOrNotFound(String name, Object notFoundValue) {
- switch (name) {
- case "artifactId":
- return getArtifactId();
- case "groupId":
- return getGroupId();
- case "version":
- return getVersion();
- default:
- return notFoundValue;
- }
- }
-
- @SuppressWarnings({
- "unchecked"
- })
- public<T >T get(String name) {
- Object value = declaredPropertyOrNotFound(name, DroolsConfiguration.NOT_FOUND_VALUE);
- if (DroolsConfiguration.NOT_FOUND_VALUE!= value) {
- return ((T) value);
- } else {
- return ((T) getAdditionalProperties().get(name));
- }
- }
-
- public void set(String name, Object value) {
- if (!declaredProperty(name, value)) {
- getAdditionalProperties().put(name, ((Object) value));
- }
- }
-
- public DroolsConfiguration with(String name, Object value) {
- if (!declaredProperty(name, value)) {
- getAdditionalProperties().put(name, ((Object) value));
- }
- return this;
- }
-
- @Override
- public int hashCode() {
- return new HashCodeBuilder().append(artifactId).append(groupId).append(version).append(additionalProperties).toHashCode();
- }
-
- @Override
- public boolean equals(Object other) {
- if (other == this) {
- return true;
- }
- if ((other instanceof DroolsConfiguration) == false) {
- return false;
- }
- DroolsConfiguration rhs = ((DroolsConfiguration) other);
- return new EqualsBuilder().append(artifactId, rhs.artifactId).append(groupId, rhs.groupId).append(version, rhs.version).append(additionalProperties, rhs.additionalProperties).isEquals();
- }
-
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/PdpdConfiguration.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/PdpdConfiguration.java
deleted file mode 100644
index 65de6656..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/configuration/PdpdConfiguration.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.protocol.configuration;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import com.fasterxml.jackson.annotation.JsonAnyGetter;
-import com.fasterxml.jackson.annotation.JsonAnySetter;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-
-
-/**
- * ENGINE-CONFIGURATION
- * <p>
- *
- *
- */
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class PdpdConfiguration {
-
- /**
- * Controller Entity ID
- */
- public static final String CONFIG_ENTITY_CONTROLLER = "controller";
-
- /**
- * Unique Transaction ID. This is an UUID.
- * (Required)
- *
- */
- @JsonProperty("requestID")
- private String requestID;
- /**
- * Set of entities on which configuration can be performed: controller
- * (Required)
- *
- */
- @JsonProperty("entity")
- private String entity;
- /**
- * Controller Information, only applicable when the entity is set to controller
- *
- */
- @JsonProperty("controllers")
- private List<ControllerConfiguration> controllers = new ArrayList<ControllerConfiguration>();
- @JsonIgnore
- private Map<String, Object> additionalProperties = new HashMap<String, Object>();
- protected final static Object NOT_FOUND_VALUE = new Object();
-
- /**
- * No args constructor for use in serialization
- *
- */
- public PdpdConfiguration() {
- }
-
- /**
- *
- * @param controller
- * @param requestID
- * @param entity
- */
- public PdpdConfiguration(String requestID, String entity, List<ControllerConfiguration> controllers) {
- this.requestID = requestID;
- this.entity = entity;
- this.controllers = controllers;
- }
-
- /**
- * Unique Transaction ID. This is an UUID.
- * (Required)
- *
- * @return
- * The requestID
- */
- @JsonProperty("requestID")
- public String getRequestID() {
- return requestID;
- }
-
- /**
- * Unique Transaction ID. This is an UUID.
- * (Required)
- *
- * @param requestID
- * The requestID
- */
- @JsonProperty("requestID")
- public void setRequestID(String requestID) {
- this.requestID = requestID;
- }
-
- public PdpdConfiguration withRequestID(String requestID) {
- this.requestID = requestID;
- return this;
- }
-
- /**
- * Set of entities on which configuration can be performed: controller
- * (Required)
- *
- * @return
- * The entity
- */
- @JsonProperty("entity")
- public String getEntity() {
- return entity;
- }
-
- /**
- * Set of entities on which configuration can be performed: controller
- * (Required)
- *
- * @param entity
- * The entity
- */
- @JsonProperty("entity")
- public void setEntity(String entity) {
- this.entity = entity;
- }
-
- public PdpdConfiguration withEntity(String entity) {
- this.entity = entity;
- return this;
- }
-
- /**
- * Controller Information, only applicable when the entity is set to controller
- *
- * @return
- * The controller
- */
- @JsonProperty("controller")
- public List<ControllerConfiguration> getControllers() {
- return controllers;
- }
-
- /**
- * Controller Information, only applicable when the entity is set to controller
- *
- * @param controller
- * The controller
- */
- @JsonProperty("controller")
- public void setControllers(List<ControllerConfiguration> controllers) {
- this.controllers = controllers;
- }
-
- public PdpdConfiguration withController(List<ControllerConfiguration> controllers) {
- this.controllers = controllers;
- return this;
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
-
- @JsonAnyGetter
- public Map<String, Object> getAdditionalProperties() {
- return this.additionalProperties;
- }
-
- @JsonAnySetter
- public void setAdditionalProperty(String name, Object value) {
- this.additionalProperties.put(name, value);
- }
-
- public PdpdConfiguration withAdditionalProperty(String name, Object value) {
- this.additionalProperties.put(name, value);
- return this;
- }
-
- @SuppressWarnings("unchecked")
- protected boolean declaredProperty(String name, Object value) {
- switch (name) {
- case "requestID":
- if (value instanceof String) {
- setRequestID(((String) value));
- } else {
- throw new IllegalArgumentException(("property \"requestID\" is of type \"java.lang.String\", but got "+ value.getClass().toString()));
- }
- return true;
- case "entity":
- if (value instanceof String) {
- setEntity(((String) value));
- } else {
- throw new IllegalArgumentException(("property \"entity\" is of type \"java.lang.String\", but got "+ value.getClass().toString()));
- }
- return true;
- case "controllers":
- if (value instanceof List) {
- setControllers(((List<ControllerConfiguration> ) value));
- } else {
- throw new IllegalArgumentException(("property \"controllers\" is of type \"java.util.List<org.openecomp.policy.drools.protocol.configuration.Controller>\", but got "+ value.getClass().toString()));
- }
- return true;
- default:
- return false;
- }
- }
-
- protected Object declaredPropertyOrNotFound(String name, Object notFoundValue) {
- switch (name) {
- case "requestID":
- return getRequestID();
- case "entity":
- return getEntity();
- case "controllers":
- return getControllers();
- default:
- return notFoundValue;
- }
- }
-
- @SuppressWarnings({
- "unchecked"
- })
- public<T >T get(String name) {
- Object value = declaredPropertyOrNotFound(name, PdpdConfiguration.NOT_FOUND_VALUE);
- if (PdpdConfiguration.NOT_FOUND_VALUE!= value) {
- return ((T) value);
- } else {
- return ((T) getAdditionalProperties().get(name));
- }
- }
-
- public void set(String name, Object value) {
- if (!declaredProperty(name, value)) {
- getAdditionalProperties().put(name, ((Object) value));
- }
- }
-
- public PdpdConfiguration with(String name, Object value) {
- if (!declaredProperty(name, value)) {
- getAdditionalProperties().put(name, ((Object) value));
- }
- return this;
- }
-
- @Override
- public int hashCode() {
- return new HashCodeBuilder().append(requestID).append(entity).append(controllers).append(additionalProperties).toHashCode();
- }
-
- @Override
- public boolean equals(Object other) {
- if (other == this) {
- return true;
- }
- if ((other instanceof PdpdConfiguration) == false) {
- return false;
- }
- PdpdConfiguration rhs = ((PdpdConfiguration) other);
- return new EqualsBuilder().append(requestID, rhs.requestID).append(entity, rhs.entity).append(controllers, rhs.controllers).append(additionalProperties, rhs.additionalProperties).isEquals();
- }
-
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/server/restful/RestManager.java b/policy-management/src/main/java/org/openecomp/policy/drools/server/restful/RestManager.java
deleted file mode 100644
index be6c4962..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/server/restful/RestManager.java
+++ /dev/null
@@ -1,2335 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.server.restful;
-
-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 java.util.UUID;
-import java.util.regex.Pattern;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-
-import org.openecomp.policy.drools.controller.DroolsController;
-import org.openecomp.policy.drools.event.comm.TopicEndpoint;
-import org.openecomp.policy.drools.event.comm.TopicSink;
-import org.openecomp.policy.drools.event.comm.TopicSource;
-import org.openecomp.policy.drools.event.comm.bus.DmaapTopicSink;
-import org.openecomp.policy.drools.event.comm.bus.DmaapTopicSource;
-import org.openecomp.policy.drools.event.comm.bus.UebTopicSink;
-import org.openecomp.policy.drools.event.comm.bus.UebTopicSource;
-import org.openecomp.policy.drools.features.PolicyControllerFeatureAPI;
-import org.openecomp.policy.drools.features.PolicyEngineFeatureAPI;
-import org.openecomp.policy.drools.properties.PolicyProperties;
-import org.openecomp.policy.drools.protocol.coders.EventProtocolCoder;
-import org.openecomp.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
-import org.openecomp.policy.drools.protocol.coders.JsonProtocolFilter;
-import org.openecomp.policy.drools.protocol.coders.JsonProtocolFilter.FilterRule;
-import org.openecomp.policy.drools.protocol.coders.ProtocolCoderToolset;
-import org.openecomp.policy.drools.protocol.configuration.ControllerConfiguration;
-import org.openecomp.policy.drools.protocol.configuration.PdpdConfiguration;
-import org.openecomp.policy.drools.system.PolicyController;
-import org.openecomp.policy.drools.system.PolicyEngine;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import ch.qos.logback.classic.LoggerContext;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-import io.swagger.annotations.Info;
-import io.swagger.annotations.SwaggerDefinition;
-import io.swagger.annotations.Tag;
-
-
-/**
- * Telemetry JAX-RS Interface to the PDP-D
- */
-
-@Path("/policy/pdp")
-@Produces(MediaType.APPLICATION_JSON)
-@Consumes(MediaType.APPLICATION_JSON)
-@Api
-@SwaggerDefinition(
- info = @Info(
- description = "PDP-D Telemetry Services",
- version = "v1.0",
- title = "PDP-D Telemetry"
- ),
- consumes = {MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN},
- produces = {MediaType.APPLICATION_JSON},
- schemes = {SwaggerDefinition.Scheme.HTTP},
- tags = {
- @Tag(name = "pdp-d-telemetry", description = "Drools PDP Telemetry Operations")
- }
-)
-public class RestManager {
- /**
- * Logger
- */
- private static Logger logger = LoggerFactory.getLogger(RestManager.class);
-
- @GET
- @Path("engine")
- @ApiOperation(
- value="Retrieves the Engine Operational Status",
- notes="Top-level abstraction. Provides a global view of resources",
- response=PolicyEngine.class
- )
- public Response engine() {
- return Response.status(Response.Status.OK).entity(PolicyEngine.manager).build();
- }
-
- @DELETE
- @Path("engine")
- @ApiOperation(
- value="Shuts down the Engine",
- notes="Deleting the engine, the top-level abstraction, equivalenty shuts it down",
- response=PolicyEngine.class
- )
- public Response engineShutdown() {
- try {
- PolicyEngine.manager.shutdown();
- } catch (IllegalStateException e) {
- logger.error("{}: cannot shutdown {} because of {}", this, PolicyEngine.manager, e.getMessage(), e);
- return Response.status(Response.Status.BAD_REQUEST).
- entity(PolicyEngine.manager).
- build();
- }
-
- return Response.status(Response.Status.OK).
- entity(PolicyEngine.manager).
- build();
- }
-
- @GET
- @Path("engine/features")
- @ApiOperation(
- value="Engine Features",
- notes="Provides the list of loaded features using the PolicyEngineFeatureAPI",
- responseContainer="List"
- )
- public Response engineFeatures() {
- return Response.status(Response.Status.OK).entity(PolicyEngine.manager.getFeatures()).build();
- }
-
- @GET
- @Path("engine/features/inventory")
- @ApiOperation(
- value="Engine Detailed Feature Inventory",
- notes="Provides detailed list of loaded features using the PolicyEngineFeatureAPI",
- responseContainer="List",
- response=PolicyEngineFeatureAPI.class
- )
- public Response engineFeaturesInventory() {
- return Response.status(Response.Status.OK).entity(PolicyEngine.manager.getFeatureProviders()).build();
- }
-
- @GET
- @Path("engine/features/{featureName}")
- @ApiOperation(
- value="Engine Feature",
- notes="Provides Details for a given feature Engine Provider",
- response=PolicyEngineFeatureAPI.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message = "The feature cannot be found")
- })
- public Response engineFeature(@ApiParam(value="Feature Name", required=true)
- @PathParam("featureName") String featureName) {
- try {
- return Response.status(Response.Status.OK).
- entity(PolicyEngine.manager.getFeatureProvider(featureName)).build();
- } catch(IllegalArgumentException iae) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(iae.getMessage())).build();
- }
- }
-
- @GET
- @Path("engine/inputs")
- @ApiOperation(
- value="Engine Input Ports",
- notes="List of input ports",
- responseContainer="List"
- )
- public Response engineInputs() {
- return Response.status(Response.Status.OK).
- entity(Arrays.asList(Inputs.values())).
- build();
- }
-
- @POST
- @Path("engine/inputs/configuration")
- @ApiOperation(
- value="Engine Input Configuration Requests",
- notes="Feeds a configuration request input into the Engine"
- )
- @ApiResponses(value={
- @ApiResponse(code=406, message = "The configuration request cannot be honored")
- })
- public Response engineUpdate(
- @ApiParam(value="Configuration to apply", required=true) PdpdConfiguration configuration) {
- PolicyController controller = null;
- boolean success = true;
- try {
- success = PolicyEngine.manager.configure(configuration);
- } catch (Exception e) {
- success = false;
- logger.info("{}: cannot configure {} because of {}", this, PolicyEngine.manager, e.getMessage(), e);
- }
-
- if (!success)
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation")).build();
- else
- return Response.status(Response.Status.OK).entity(controller).build();
- }
-
- @GET
- @Path("engine/properties")
- @ApiOperation(
- value="Engine Configuration Properties",
- notes="Used for booststrapping the engine",
- response=Properties.class
- )
- public Response engineProperties() {
- return Response.status(Response.Status.OK).entity(PolicyEngine.manager.getProperties()).build();
- }
-
- @GET
- @Path("engine/switches")
- @ApiOperation(
- value="Engine Control Switches",
- notes="List of the Engine Control Switches",
- responseContainer="List"
- )
- public Response engineSwitches() {
- return Response.status(Response.Status.OK).
- entity(Arrays.asList(Switches.values())).
- build();
- }
-
- @PUT
- @Path("engine/switches/activation")
- @ApiOperation(
- value="Switches on the Engine Activation Switch",
- notes="Turns on Activation Switch on the Engine. This order entails that the engine " +
- "and controllers are unlocked and started",
- response=PolicyEngine.class
- )
- public Response engineActivation() {
- boolean success = true;
- try {
- PolicyEngine.manager.activate();
- } catch (Exception e) {
- success = false;
- logger.info("{}: cannot activate {} because of {}", this, PolicyEngine.manager, e.getMessage(), e);
- }
-
- if (!success)
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation")).build();
- else
- return Response.status(Response.Status.OK).entity(PolicyEngine.manager).build();
- }
-
- @DELETE
- @Path("engine/switches/activation")
- @ApiOperation(
- value="Switches off Engine Activation Switch",
- notes="Turns off the Activation Switch on the Engine. This order entails that the engine " +
- "and controllers are locked (with the exception of those resources defined as unmanaged)",
- response=PolicyEngine.class
- )
- public Response engineDeactivation() {
- boolean success = true;
- try {
- PolicyEngine.manager.deactivate();
- } catch (Exception e) {
- success = false;
- logger.info("{}: cannot deactivate {} because of {}", this, PolicyEngine.manager, e.getMessage(), e);
- }
-
- if (!success)
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation")).build();
- else
- return Response.status(Response.Status.OK).entity(PolicyEngine.manager).build();
- }
-
- @PUT
- @Path("engine/switches/lock")
- @ApiOperation(
- value="Switches on the Engine Lock Control",
- notes="This switch locks all the engine resources as a whole, except those that are defined unmanaged",
- response=PolicyEngine.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response engineLock() {
- boolean success = PolicyEngine.manager.lock();
- if (success)
- return Response.status(Status.OK).
- entity(PolicyEngine.manager).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation")).
- build();
- }
-
- @DELETE
- @Path("engine/switches/lock")
- @ApiOperation(
- value="Switches off the Lock control",
- notes="This switch locks all the engine resources as a whole, except those that are defined unmanaged",
- response=PolicyEngine.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response engineUnlock() {
- boolean success = PolicyEngine.manager.unlock();
- if (success)
- return Response.status(Status.OK).
- entity(PolicyEngine.manager).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation")).
- build();
- }
-
- @GET
- @Path("engine/controllers")
- @ApiOperation(
- value="Lists the Policy Controllers Names",
- notes="Unique Policy Controller Identifiers",
- responseContainer="List"
- )
- public Response controllers() {
- return Response.status(Response.Status.OK).entity(PolicyEngine.manager.getPolicyControllerIds()).build();
- }
-
- @GET
- @Path("engine/controllers/inventory")
- @ApiOperation(
- value="Lists the Policy Controllers",
- notes="Detailed list of Policy Controllers",
- responseContainer="List",
- response=PolicyController.class
- )
- public Response controllerInventory() {
- return Response.status(Response.Status.OK).entity(PolicyEngine.manager.getPolicyControllers()).build();
- }
-
- @POST
- @Path("engine/controllers")
- @ApiOperation(
- value="Creates and starts a new Policy Controller",
- notes="Controller creation based on properties",
- response=PolicyController.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=400, message = "Invalid configuration information has been provided"),
- @ApiResponse(code=304, message = "The controller already exists"),
- @ApiResponse(code=406, message = "The administrative state of the system prevents it " +
- "from processing this request"),
- @ApiResponse(code=206, message = "The controller has been created " +
- "but cannot be started"),
- @ApiResponse(code=201, message = "The controller has been succesfully created and started")
- })
- public Response controllerAdd(@ApiParam(value="Configuration Properties to apply", required = true)
- Properties config) {
- if (config == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error("A configuration must be provided")).
- build();
-
- String controllerName = config.getProperty(PolicyProperties.PROPERTY_CONTROLLER_NAME);
- if (controllerName == null || controllerName.isEmpty())
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error
- ("Configuration must have an entry for " +
- PolicyProperties.PROPERTY_CONTROLLER_NAME)).
- build();
-
- PolicyController controller;
- try {
- controller = PolicyController.factory.get(controllerName);
- if (controller != null)
- return Response.status(Response.Status.NOT_MODIFIED).
- entity(controller).
- build();
- } catch (IllegalArgumentException e) {
- // This is OK
- } catch (IllegalStateException e) {
- logger.info("{}: cannot get policy-controller because of {}", this, e.getMessage(), e);
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " not found")).build();
- }
-
- try {
- controller = PolicyEngine.manager.createPolicyController
- (config.getProperty(PolicyProperties.PROPERTY_CONTROLLER_NAME), config);
- } catch (IllegalArgumentException | IllegalStateException e) {
- logger.warn("{}: cannot create policy-controller because of {}", this, e.getMessage(), e);
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(e.getMessage())).
- build();
- }
-
- try {
- boolean success = controller.start();
- if (!success) {
- logger.info("{}: cannot start {}", this, controller);
- return Response.status(Response.Status.PARTIAL_CONTENT).
- entity(new Error(controllerName + " can't be started")).build();
- }
- } catch (IllegalStateException e) {
- logger.info("{}: cannot start {} because of {}", this, controller, e.getMessage(), e);;
- return Response.status(Response.Status.PARTIAL_CONTENT).
- entity(controller).build();
- }
-
- return Response.status(Response.Status.CREATED).
- entity(controller).
- build();
- }
-
- @GET
- @Path("engine/controllers/features")
- @ApiOperation(
- value="Lists of Feature Providers Identifiers",
- notes="Unique Policy Controller Identifiers",
- responseContainer="List"
- )
- public Response controllerFeatures() {
- return Response.status(Response.Status.OK).entity(PolicyEngine.manager.getFeatures()).build();
- }
-
- @GET
- @Path("engine/controllers/features/inventory")
- @ApiOperation(
- value="Detailed Controllers Feature Inventory",
- notes="Provides detailed list of loaded features using the PolicyControllerFeatureAPI",
- responseContainer="List",
- response=PolicyControllerFeatureAPI.class
- )
- public Response controllerFeaturesInventory() {
- return Response.status(Response.Status.OK).
- entity(PolicyController.factory.getFeatureProviders()).
- build();
- }
-
- @GET
- @Path("engine/controllers/features/{featureName}")
- @ApiOperation(
- value="Controller Feature",
- notes="Provides Details for a given Policy Controller feature provider",
- response=PolicyControllerFeatureAPI.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message = "The feature cannot be found")
- })
- public Response controllerFeature(@ApiParam(value="Feature Name", required=true)
- @PathParam("featureName") String featureName) {
- try {
- return Response.status(Response.Status.OK).
- entity(PolicyController.factory.getFeatureProvider(featureName)).
- build();
- } catch(IllegalArgumentException iae) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(iae.getMessage())).build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}")
- @ApiOperation(
- value="Retrieves a Policy Controller",
- notes="A Policy Controller is a concrete drools application abstraction. " +
- "It aggregates networking, drools, and other resources," +
- "as provides operational controls over drools applications",
- response=PolicyController.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response controller(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
- try {
- return Response.status(Response.Status.OK).
- entity(PolicyController.factory.get(controllerName)).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " not acceptable")).
- build();
- }
- }
-
- @DELETE
- @Path("engine/controllers/{controller}")
- @ApiOperation(
- value="Deletes a Policy Controller",
- notes="A Policy Controller is a concrete drools application abstraction. " +
- "It aggregates networking, drools, and other resources," +
- "as provides operational controls over drools applications",
- response=PolicyController.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled"),
- @ApiResponse(code=500, message="A problem has occurred while deleting the Policy Controller")
- })
- public Response controllerDelete(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
-
- PolicyController controller;
- try {
- controller =
- PolicyController.factory.get(controllerName);
- if (controller == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + " does not exist")).
- build();
- } catch (IllegalArgumentException e) {
- logger.info("{}: cannot get policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + " not found: " + e.getMessage())).
- build();
- } catch (IllegalStateException e) {
- logger.info("{}: cannot get policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " not acceptable")).build();
- }
-
- try {
- PolicyEngine.manager.removePolicyController(controllerName);
- } catch (IllegalArgumentException | IllegalStateException e) {
- logger.info("{}: cannot remove policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
- return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
- entity(new Error(e.getMessage())).
- build();
- }
-
- return Response.status(Response.Status.OK).
- entity(controller).
- build();
- }
-
- @GET
- @Path("engine/controllers/{controller}/properties")
- @ApiOperation(
- value="Retrieves the configuration properties of a Policy Controller",
- notes="Configuration resources used by the controller if Properties format",
- response=PolicyController.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response controllerProperties(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
- try {
- PolicyController controller = PolicyController.factory.get(controllerName);
- return Response.status(Response.Status.OK).
- entity(controller.getProperties()).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/inputs")
- @ApiOperation(
- value="Policy Controller Input Ports",
- notes="List of input ports",
- responseContainer="List"
- )
- public Response controllerInputs() {
- return Response.status(Response.Status.OK).
- entity(Arrays.asList(Inputs.values())).
- build();
- }
-
- @POST
- @Path("engine/controllers/{controller}/inputs/configuration")
- @ApiOperation(
- value="Policy Controller Input Configuration Requests",
- notes="Feeds a configuration request input into the given Policy Controller"
- )
- @ApiResponses(value={
- @ApiResponse(code=400, message = "The configuration request is invalid"),
- @ApiResponse(code=406, message = "The configuration request cannot be honored")
- })
- public Response controllerUpdate(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Configuration to apply", required=true)
- ControllerConfiguration controllerConfiguration) {
-
- if (controllerName == null || controllerName.isEmpty() ||
- controllerConfiguration == null ||
- controllerConfiguration.getName().intern() != controllerName)
- return Response.status(Response.Status.BAD_REQUEST).
- entity("A valid or matching controller names must be provided").
- build();
-
- PolicyController controller;
- try {
- controller = PolicyEngine.manager.updatePolicyController(controllerConfiguration);
- if (controller == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + " does not exist")).
- build();
- } catch (IllegalArgumentException e) {
- logger.info("{}: cannot update policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + " not found: " + e.getMessage())).
- build();
- } catch (Exception e) {
- logger.info("{}: cannot update policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " not acceptable")).build();
- }
-
- return Response.status(Response.Status.OK).
- entity(controller).
- build();
- }
-
- @GET
- @Path("engine/controllers/{controller}/switches")
- @ApiOperation(
- value="Policy Controller Switches",
- notes="List of the Policy Controller Switches",
- responseContainer="List"
- )
- public Response controllerSwitches() {
- return Response.status(Response.Status.OK).
- entity(Arrays.asList(Switches.values())).
- build();
- }
-
- @PUT
- @Path("engine/controllers/{controller}/switches/lock")
- @ApiOperation(
- value="Switches on the Policy Controller Lock Control",
- notes="This action on the switch locks the Policy Controller",
- response=PolicyController.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response controllerLock(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
- PolicyController policyController = PolicyController.factory.get(controllerName);
- boolean success = policyController.lock();
- if (success)
- return Response.status(Status.OK).
- entity(policyController).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("Controller " + controllerName + " cannot be locked")).
- build();
- }
-
- @DELETE
- @Path("engine/controllers/{controller}/switches/lock")
- @ApiOperation(
- value="Switches off the Policy Controller Lock Control",
- notes="This action on the switch unlocks the Policy Controller",
- response=PolicyController.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response controllerUnlock(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
- PolicyController policyController = PolicyController.factory.get(controllerName);
- boolean success = policyController.unlock();
- if (success)
- return Response.status(Status.OK).
- entity(policyController).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("Controller " + controllerName + " cannot be unlocked")).
- build();
- }
-
- @GET
- @Path("engine/controllers/{controller}/drools")
- @ApiOperation(
- value="Retrieves the Drools Controller subcomponent of the Policy Controller",
- notes="The Drools Controller provides an abstraction over the Drools subsystem",
- response=DroolsController.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response drools(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- return Response.status(Response.Status.OK).
- entity(drools).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/drools/facts")
- @ApiOperation(
- value="Retrieves Facts Summary information for a given controller",
- notes="Provides the session names, and a count of fact object in the drools working memory",
- responseContainer="Map"
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response droolsFacts(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
- try {
- Map<String,Long> sessionCounts = new HashMap<>();
- DroolsController drools = getDroolsController(controllerName);
- for (String session : drools.getSessionNames()) {
- sessionCounts.put(session, drools.factCount(session));
- }
- return Response.status(Response.Status.OK).
- entity(sessionCounts).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/drools/facts/{session}")
- @ApiOperation(
- value="Retrieves Fact Types (classnames) for a given controller and its count",
- notes="The fact types are the classnames of the objects inserted in the drools working memory",
- responseContainer="Map"
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller or session cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response droolsFacts(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Drools Session Name", required=true)
- @PathParam("session") String sessionName) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- return Response.status(Response.Status.OK).
- entity(drools.factClassNames(sessionName)).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error("entity not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + sessionName + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/drools/facts/{session}/{factType}")
- @ApiOperation(
- value="Retrieves fact objects of a given type in the drools working memory" +
- "for a given controller and session",
- notes="The fact types are the classnames of the objects inserted in the drools working memory",
- responseContainer="List"
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, session, or fact type cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response droolsFacts(@ApiParam(value="Fact count", required=false)
- @DefaultValue("false") @QueryParam("count") boolean count,
- @ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Drools Session Name", required=true)
- @PathParam("session") String sessionName,
- @ApiParam(value="Drools Fact Type", required=true)
- @PathParam("factType") String factType) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- List<Object> facts = drools.facts(sessionName, factType, false);
- if (!count)
- return Response.status(Response.Status.OK).entity(facts).build();
- else
- return Response.status(Response.Status.OK).entity(facts.size()).build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + sessionName + ":" + factType +
- " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + sessionName + ":" + factType +
- " not acceptable")).
- build();
- }
- }
-
- @DELETE
- @Path("engine/controllers/{controller}/drools/facts/{session}/{factType}")
- @ApiOperation(
- value="Deletes all the fact objects of a given type from the drools working memory" +
- "for a given controller and session. The objects retracted from the working " +
- "memory are provided in the response.",
- notes="The fact types are the classnames of the objects inserted in the drools working memory",
- responseContainer="List"
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, session, or fact type, cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled"),
- @ApiResponse(code=500, message="A server error has occurred processing this request")
- })
- public Response droolsFactsDelete(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Drools Session Name", required=true)
- @PathParam("session") String sessionName,
- @ApiParam(value="Drools Fact Type", required=true)
- @PathParam("factType") String factType) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- List<Object> facts = drools.facts(sessionName, factType, true);
- return Response.status(Response.Status.OK).entity(facts).build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + sessionName + ":" + factType +
- " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + sessionName + ":" + factType +
- " not acceptable")).
- build();
- } catch (Exception e) {
- return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
- entity(new Error(e.getMessage())).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/drools/facts/{session}/{query}/{queriedEntity}")
- @ApiOperation(
- value="Gets all the fact objects returned by a DRL query with no parameters from the drools working memory" +
- "for a given controller and session",
- notes="The DRL query must be defined in the DRL file",
- responseContainer="List"
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, session, or query information, cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled"),
- @ApiResponse(code=500, message="A server error has occurred processing this request")
- })
- public Response droolsFacts(@ApiParam(value="Fact count", required=false)
- @DefaultValue("false") @QueryParam("count") boolean count,
- @ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Drools Session Name", required=true)
- @PathParam("session") String sessionName,
- @ApiParam(value="Query Name Present in DRL", required=true)
- @PathParam("query") String queryName,
- @ApiParam(value="Query Identifier Present in the DRL Query", required=true)
- @PathParam("queriedEntity") String queriedEntity) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- List<Object> facts = drools.factQuery(sessionName, queryName, queriedEntity, false);
- if (!count)
- return Response.status(Response.Status.OK).entity(facts).build();
- else
- return Response.status(Response.Status.OK).entity(facts.size()).build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + sessionName + ":" + queryName +
- queriedEntity + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + sessionName + ":" + queryName +
- queriedEntity + " not acceptable")).
- build();
- } catch (Exception e) {
- return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
- entity(new Error(e.getMessage())).
- build();
- }
- }
-
- @POST
- @Path("engine/controllers/{controller}/drools/facts/{session}/{query}/{queriedEntity}")
- @ApiOperation(
- value="Gets all the fact objects returned by a DRL query with parameters from the drools working memory" +
- "for a given controller and session",
- notes="The DRL query with parameters must be defined in the DRL file",
- responseContainer="List"
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, session, or query information, cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled"),
- @ApiResponse(code=500, message="A server error has occurred processing this request")
- })
- public Response droolsFacts(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Drools Session Name", required=true)
- @PathParam("session") String sessionName,
- @ApiParam(value="Query Name Present in DRL", required=true)
- @PathParam("query") String queryName,
- @ApiParam(value="Query Identifier Present in the DRL Query", required=true)
- @PathParam("queriedEntity") String queriedEntity,
- @ApiParam(value="Query Parameter Values to pass in the DRL Query", required=false)
- List<Object> queryParameters) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- List<Object> facts;
- if (queryParameters == null || queryParameters.isEmpty())
- facts = drools.factQuery(sessionName, queryName, queriedEntity, false);
- else
- facts = drools.factQuery(sessionName, queryName, queriedEntity, false, queryParameters.toArray());
- return Response.status(Response.Status.OK).entity(facts).build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + sessionName + ":" + queryName +
- queriedEntity + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + sessionName + ":" + queryName +
- queriedEntity + " not acceptable")).
- build();
- } catch (Exception e) {
- return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
- entity(new Error(e.getMessage())).
- build();
- }
- }
-
- @DELETE
- @Path("engine/controllers/{controller}/drools/facts/{session}/{query}/{queriedEntity}")
- @ApiOperation(
- value="Deletes all the fact objects returned by a DRL query with parameters from the drools working memory" +
- "for a given controller and session",
- notes="The DRL query with parameters must be defined in the DRL file",
- responseContainer="List"
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, session, or query information, cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled"),
- @ApiResponse(code=500, message="A server error has occurred processing this request")
- })
- public Response droolsFactsDelete(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Drools Session Name", required=true)
- @PathParam("session") String sessionName,
- @ApiParam(value="Query Name Present in DRL", required=true)
- @PathParam("query") String queryName,
- @ApiParam(value="Query Identifier Present in the DRL Query", required=true)
- @PathParam("queriedEntity") String queriedEntity,
- @ApiParam(value="Query Parameter Values to pass in the DRL Query", required=false)
- List<Object> queryParameters) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- List<Object> facts;
- if (queryParameters == null || queryParameters.isEmpty())
- facts = drools.factQuery(sessionName, queryName, queriedEntity, true);
- else
- facts = drools.factQuery(sessionName, queryName, queriedEntity, true, queryParameters.toArray());
- return Response.status(Response.Status.OK).entity(facts).build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + sessionName + ":" + queryName +
- queriedEntity + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + sessionName + ":" + queryName +
- queriedEntity + " not acceptable")).
- build();
- } catch (Exception e) {
- return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
- entity(new Error(e.getMessage())).
- build();
- }
- }
-
- @POST
- @Path("engine/controllers/tools/coders/decoders/filters/rules/{ruleName}")
- @ApiOperation(
- value="Produces a Decoder Rule Filter in a format that the Policy Controller can understand",
- notes="The result can be used with other APIs to attach a filter to a decoder"
- )
- public Response rules(@ApiParam(value="Negate regex?", required=true)
- @DefaultValue("false") @QueryParam("negate") boolean negate,
- @ApiParam(value="Rule Name", required=true)
- @PathParam("ruleName") String name,
- @ApiParam(value="Regex expression", required=true)
- String regex) {
- String literalRegex = Pattern.quote(regex);
- if (negate)
- literalRegex = "^(?!" + literalRegex + "$).*";
-
- return Response.status(Status.OK).
- entity(new JsonProtocolFilter.FilterRule(name,literalRegex)).
- build();
- }
-
- @GET
- @Path("engine/controllers/{controller}/decoders")
- @ApiOperation(
- value="Gets all the decoders used by a controller",
- notes="A Policy Controller uses decoders to deserialize incoming network messages from " +
- "subscribed network topics into specific (fact) objects. " +
- "The deserialized (fact) object will typically be inserted in the drools working " +
- " memory of the controlled drools application.",
- responseContainer="List",
- response=ProtocolCoderToolset.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoders(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- List<ProtocolCoderToolset> decoders = EventProtocolCoder.manager.getDecoders
- (drools.getGroupId(), drools.getArtifactId());
- return Response.status(Response.Status.OK).
- entity(decoders).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/decoders/filters")
- @ApiOperation(
- value="Gets all the filters used by a controller",
- notes="A Policy Controller uses decoders to deserialize incoming network messages from " +
- "subscribed network topics into specific (fact) objects. " +
- "The deserialized (fact) object will typically be inserted in the drools working " +
- " memory of the controlled drools application." +
- "Acceptance filters are used to filter out undesired network messages for the given controller",
- responseContainer="List",
- response=CoderFilters.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoderFilters(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- List<CoderFilters> filters = EventProtocolCoder.manager.getDecoderFilters
- (drools.getGroupId(), drools.getArtifactId());
- return Response.status(Response.Status.OK).
- entity(filters).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/decoders/{topic}")
- @ApiOperation(
- value="Gets all the decoders in use by a controller for a networked topic",
- notes="A Policy Controller uses decoders to deserialize incoming network messages from " +
- "subscribed network topics into specific (fact) objects. " +
- "The deserialized (fact) object will typically be inserted in the drools working " +
- " memory of the controlled drools application.",
- responseContainer="List",
- response=ProtocolCoderToolset.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller or topic cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoder(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Networked Topic Name", required=true)
- @PathParam("topic") String topic) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- ProtocolCoderToolset decoder = EventProtocolCoder.manager.getDecoders
- (drools.getGroupId(), drools.getArtifactId(), topic);
- return Response.status(Response.Status.OK).
- entity(decoder).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + topic + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + topic + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/decoders/{topic}/filters")
- @ApiOperation(
- value="Gets all filters attached to decoders for a given networked topic in use by a controller",
- notes="A Policy Controller uses decoders to deserialize incoming network messages from " +
- "subscribed network topics into specific (fact) objects. " +
- "The deserialized (fact) object will typically be inserted in the drools working " +
- " memory of the controlled drools application." +
- "Acceptance filters are used to filter out undesired network messages for the given controller",
- responseContainer="List",
- response=CoderFilters.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller or topic cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoderFilter(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Networked Topic Name", required=true)
- @PathParam("topic") String topic) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- ProtocolCoderToolset decoder = EventProtocolCoder.manager.getDecoders
- (drools.getGroupId(), drools.getArtifactId(), topic);
- if (decoder == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(topic + " does not exist")).
- build();
- else
- return Response.status(Response.Status.OK).
- entity(decoder.getCoders()).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + topic + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + topic + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/decoders/{topic}/filters/{factType}")
- @ApiOperation(
- value="Gets all filters attached to decoders for a given subscribed networked topic " +
- "and fact type",
- notes="Decoders are associated with networked topics. A Policy Controller manages " +
- "multiple topics and therefore its attached decoders. " +
- "A Policy Controller uses filters to further specify the fact mapping. " +
- "Filters are applied on a per fact type (classname).",
- responseContainer="List",
- response=CoderFilters.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, topic, or fact type cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoderFilter(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Networked Topic Name", required=true)
- @PathParam("topic") String topic,
- @ApiParam(value="Fact Type", required=true)
- @PathParam("factType") String factClass) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- ProtocolCoderToolset decoder = EventProtocolCoder.manager.getDecoders
- (drools.getGroupId(), drools.getArtifactId(), topic);
- CoderFilters filters = decoder.getCoder(factClass);
- if (filters == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(topic + ":" + factClass + " does not exist")).
- build();
- else
- return Response.status(Response.Status.OK).
- entity(filters).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + " not acceptable")).
- build();
- }
- }
-
- @PUT
- @Path("engine/controllers/{controller}/decoders/{topic}/filters/{factType}")
- @ApiOperation(
- value="Attaches filters to the decoder for a given networked topic " +
- "and fact type",
- notes="Decoders are associated with networked topics. A Policy Controller manages " +
- "multiple topics and therefore its attached decoders. " +
- "A Policy Controller uses filters to further specify the fact mapping. " +
- "Filters are applied on a per fact type (classname).",
- responseContainer="List",
- response=CoderFilters.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, topic, fact type, cannot be found, " +
- "or a filter has not been provided"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoderFilter(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic,
- @ApiParam(value="Fact Type", required=true)
- @PathParam("factType") String factClass,
- @ApiParam(value="Configuration Filter", required=true)
- JsonProtocolFilter configFilters) {
-
- if (configFilters == null) {
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error("Configuration Filters not provided")).
- build();
- }
-
- try {
- DroolsController drools = getDroolsController(controllerName);
- ProtocolCoderToolset decoder = EventProtocolCoder.manager.getDecoders
- (drools.getGroupId(), drools.getArtifactId(), topic);
- CoderFilters filters = decoder.getCoder(factClass);
- if (filters == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(topic + ":" + factClass + " does not exist")).
- build();
- filters.setFilter(configFilters);
- return Response.status(Response.Status.OK).
- entity(filters).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/decoders/{topic}/filters/{factType}/rules")
- @ApiOperation(
- value="Gets the filter rules attached to a topic decoder of a controller",
- notes="Decoders are associated with networked topics. A Policy Controller manages " +
- "multiple topics and therefore its attached decoders. " +
- "A Policy Controller uses filters to further specify the fact mapping. " +
- "Filters are applied on a per fact type and are composed of field matching rules. ",
- responseContainer="List",
- response=FilterRule.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, topic, or fact type cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoderFilterRules(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic,
- @ApiParam(value="Fact Type", required=true)
- @PathParam("factType") String factClass) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- ProtocolCoderToolset decoder = EventProtocolCoder.manager.getDecoders
- (drools.getGroupId(), drools.getArtifactId(), topic);
-
- CoderFilters filters = decoder.getCoder(factClass);
- if (filters == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass + " does not exist")).
- build();
-
- JsonProtocolFilter filter = filters.getFilter();
- if (filter == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass + " no filters")).
- build();
-
- return Response.status(Response.Status.OK).
- entity(filter.getRules()).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + " not acceptable")).
- build();
- }
- }
-
- @GET
- @Path("engine/controllers/{controller}/decoders/{topic}/filters/{factType}/rules/{ruleName}")
- @ApiOperation(
- value="Gets a filter rule by name attached to a topic decoder of a controller",
- notes="Decoders are associated with networked topics. A Policy Controller manages " +
- "multiple topics and therefore its attached decoders. " +
- "A Policy Controller uses filters to further specify the fact mapping. " +
- "Filters are applied on a per fact type and are composed of field matching rules. ",
- responseContainer="List",
- response=FilterRule.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, topic, fact type, or rule name cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoderFilterRules(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic,
- @ApiParam(value="Fact Type", required=true)
- @PathParam("factType") String factClass,
- @ApiParam(value="Rule Name", required=true)
- @PathParam("ruleName") String ruleName) {
- try {
- DroolsController drools = getDroolsController(controllerName);
- ProtocolCoderToolset decoder = EventProtocolCoder.manager.getDecoders
- (drools.getGroupId(), drools.getArtifactId(), topic);
-
- CoderFilters filters = decoder.getCoder(factClass);
- if (filters == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass + " does not exist")).
- build();
-
- JsonProtocolFilter filter = filters.getFilter();
- if (filter == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass + " no filters")).
- build();
-
- return Response.status(Response.Status.OK).
- entity(filter.getRules(ruleName)).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + ": " + ruleName + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + ":" + ruleName + " not acceptable")).
- build();
- }
- }
-
- @DELETE
- @Path("engine/controllers/{controller}/decoders/{topic}/filters/{factType}/rules/{ruleName}")
- @ApiOperation(
- value="Deletes a filter rule by name attached to a topic decoder of a controller",
- notes="Decoders are associated with networked topics. A Policy Controller manages " +
- "multiple topics and therefore its attached decoders. " +
- "A Policy Controller uses filters to further specify the fact mapping. " +
- "Filters are applied on a per fact type and are composed of field matching rules. ",
- responseContainer="List",
- response=FilterRule.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, topic, fact type, or rule name cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoderFilterRuleDelete(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic,
- @ApiParam(value="Fact Type", required=true)
- @PathParam("factType") String factClass,
- @ApiParam(value="Rule Name", required=true)
- @PathParam("ruleName") String ruleName,
- @ApiParam(value="Filter Rule", required=true)
- FilterRule rule) {
-
- try {
- DroolsController drools = getDroolsController(controllerName);
- ProtocolCoderToolset decoder = EventProtocolCoder.manager.getDecoders
- (drools.getGroupId(), drools.getArtifactId(), topic);
-
- CoderFilters filters = decoder.getCoder(factClass);
- if (filters == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass + " does not exist")).
- build();
-
- JsonProtocolFilter filter = filters.getFilter();
- if (filter == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass + " no filters")).
- build();
-
- if (rule == null) {
- filter.deleteRules(ruleName);
- return Response.status(Response.Status.OK).
- entity(filter.getRules()).
- build();
- }
-
- if (rule.getName() == null || !rule.getName().equals(ruleName))
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass + ":" + ruleName +
- " rule name request inconsistencies (" + rule.getName() + ")")).
- build();
-
- filter.deleteRule(ruleName, rule.getRegex());
- return Response.status(Response.Status.OK).
- entity(filter.getRules()).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + ": " + ruleName + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + ":" + ruleName + " not acceptable")).
- build();
- }
- }
-
- @PUT
- @Path("engine/controllers/{controller}/decoders/{topic}/filters/{factType}/rules")
- @ApiOperation(
- value="Places a new filter rule in a topic decoder",
- notes="Decoders are associated with networked topics. A Policy Controller manages " +
- "multiple topics and therefore its attached decoders. " +
- "A Policy Controller uses filters to further specify the fact mapping. " +
- "Filters are applied on a per fact type and are composed of field matching rules. ",
- responseContainer="List",
- response=FilterRule.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The controller, topic, or fact type cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decoderFilterRule(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic,
- @ApiParam(value="Fact Type", required=true)
- @PathParam("factType") String factClass,
- @ApiParam(value="Rule Name", required=true)
- @PathParam("ruleName") String ruleName,
- @ApiParam(value="Filter Rule", required=true)
- FilterRule rule) {
-
- try {
- DroolsController drools = getDroolsController(controllerName);
- ProtocolCoderToolset decoder = EventProtocolCoder.manager.getDecoders
- (drools.getGroupId(), drools.getArtifactId(), topic);
-
- CoderFilters filters = decoder.getCoder(factClass);
- if (filters == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass + " does not exist")).
- build();
-
- JsonProtocolFilter filter = filters.getFilter();
- if (filter == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass + " no filters")).
- build();
-
- if (rule.getName() == null)
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + ":" + topic + ":" + factClass +
- " rule name request inconsistencies (" + rule.getName() + ")")).
- build();
-
- filter.addRule(rule.getName(), rule.getRegex());
- return Response.status(Response.Status.OK).
- entity(filter.getRules()).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + topic + ":" +
- factClass + " not acceptable")).
- build();
- }
- }
-
- @POST
- @Path("engine/controllers/{controller}/decoders/{topic}")
- @Consumes(MediaType.TEXT_PLAIN)
- @ApiOperation(
- value="Decodes a string into a fact object, and encodes it back into a string",
- notes="Tests the decode/encode functions of a controller",
- response=CodingResult.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=400, message="Bad input has been provided"),
- @ApiResponse(code=404, message="The controller cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response decode(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName,
- @ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic,
- @ApiParam(value="JSON String to decode", required=true)
- String json) {
-
- PolicyController policyController;
- try {
- policyController = PolicyController.factory.get(controllerName);
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(controllerName + ":" + topic + ":" +
- " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + ":" + topic + ":" +
- " not acceptable")).
- build();
- }
-
- CodingResult result = new CodingResult();
- result.decoding = false;
- result.encoding = false;
- result.jsonEncoding = null;
-
- Object event;
- try {
- event = EventProtocolCoder.manager.decode
- (policyController.getDrools().getGroupId(),
- policyController.getDrools().getArtifactId(),
- topic,
- json);
- result.decoding = true;
- } catch (Exception e) {
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(e.getMessage())).
- build();
- }
-
- try {
- result.jsonEncoding = EventProtocolCoder.manager.encode(topic, event);
- result.encoding = true;
- } catch (Exception e) {
- // continue so to propagate decoding results ..
- }
-
- return Response.status(Response.Status.OK).
- entity(result).
- build();
- }
-
- @GET
- @Path("engine/controllers/{controller}/encoders")
- @ApiOperation(
- value="Retrieves the encoder filters of a controller",
- notes="The encoders serializes a fact object, typically for network transmission",
- responseContainer="List",
- response=CoderFilters.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=400, message="Bad input has been provided"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response encoderFilters(@ApiParam(value="Policy Controller Name", required=true)
- @PathParam("controller") String controllerName) {
- List<CoderFilters> encoders;
- try {
- PolicyController controller = PolicyController.factory.get(controllerName);
- DroolsController drools = controller.getDrools();
- encoders = EventProtocolCoder.manager.getEncoderFilters
- (drools.getGroupId(), drools.getArtifactId());
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.BAD_REQUEST).
- entity(new Error(controllerName + " not found: " + e.getMessage())).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(controllerName + " is not accepting the request")).build();
- }
-
- return Response.status(Response.Status.OK).
- entity(encoders).
- build();
- }
-
- @GET
- @Path("engine/topics")
- @ApiOperation(
- value="Retrieves the managed topics",
- notes="Network Topics Aggregation",
- response=TopicEndpoint.class
- )
- public Response topics() {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager).
- build();
- }
-
- @GET
- @Path("engine/topics/switches")
- @ApiOperation(
- value="Topics Control Switches",
- notes="List of the Topic Control Switches",
- responseContainer="List"
- )
- public Response topicSwitches() {
- return Response.status(Response.Status.OK).
- entity(Arrays.asList(Switches.values())).
- build();
- }
-
- @PUT
- @Path("engine/topics/switches/lock")
- @ApiOperation(
- value="Locks all the managed topics",
- notes="The operation affects all managed sources and sinks",
- response=TopicEndpoint.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response topicsLock() {
- boolean success = TopicEndpoint.manager.lock();
- if (success)
- return Response.status(Status.OK).
- entity(TopicEndpoint.manager).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation")).
- build();
- }
-
- @DELETE
- @Path("engine/topics/switches/lock")
- @ApiOperation(
- value="Unlocks all the managed topics",
- notes="The operation affects all managed sources and sinks",
- response=TopicEndpoint.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response topicsUnlock() {
- boolean success = TopicEndpoint.manager.unlock();
- if (success)
- return Response.status(Status.OK).
- entity(TopicEndpoint.manager).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation")).
- build();
- }
-
- @GET
- @Path("engine/topics/sources")
- @ApiOperation(
- value="Retrieves the managed topic sources",
- notes="Network Topic Sources Agregation",
- responseContainer="List",
- response=TopicSource.class
- )
- public Response sources() {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getTopicSources()).
- build();
- }
-
- @GET
- @Path("engine/topics/sinks")
- @ApiOperation(
- value="Retrieves the managed topic sinks",
- notes="Network Topic Sinks Agregation",
- responseContainer="List",
- response=TopicSink.class
- )
- public Response sinks() {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getTopicSinks()).
- build();
- }
-
- @GET
- @Path("engine/topics/sources/ueb")
- @ApiOperation(
- value="Retrieves the UEB managed topic sources",
- notes="UEB Topic Sources Agregation",
- responseContainer="List",
- response=UebTopicSource.class
- )
- public Response uebSources() {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getUebTopicSources()).
- build();
- }
-
- @GET
- @Path("engine/topics/sinks/ueb")
- @ApiOperation(
- value="Retrieves the UEB managed topic sinks",
- notes="UEB Topic Sinks Agregation",
- responseContainer="List",
- response=UebTopicSource.class
- )
- public Response uebSinks() {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getUebTopicSinks()).
- build();
- }
-
- @GET
- @Path("engine/topics/sources/dmaap")
- @ApiOperation(
- value="Retrieves the DMaaP managed topic sources",
- notes="DMaaP Topic Sources Agregation",
- responseContainer="List",
- response=DmaapTopicSource.class
- )
- public Response dmaapSources() {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getDmaapTopicSources()).
- build();
- }
-
- @GET
- @Path("engine/topics/sinks/dmaap")
- @ApiOperation(
- value="Retrieves the DMaaP managed topic sinks",
- notes="DMaaP Topic Sinks Agregation",
- responseContainer="List",
- response=DmaapTopicSink.class
- )
- public Response dmaapSinks() {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getDmaapTopicSinks()).
- build();
- }
-
- @GET
- @Path("engine/topics/sources/ueb/{topic}")
- @ApiOperation(
- value="Retrieves an UEB managed topic source",
- notes="This is an UEB Network Communicaton Endpoint source of messages for the Engine",
- response=UebTopicSource.class
- )
- public Response uebSourceTopic(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getUebTopicSource(topic)).
- build();
- }
-
- @GET
- @Path("engine/topics/sinks/ueb/{topic}")
- @ApiOperation(
- value="Retrieves an UEB managed topic sink",
- notes="This is an UEB Network Communicaton Endpoint destination of messages from the Engine",
- response=UebTopicSink.class
- )
- public Response uebSinkTopic(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getUebTopicSink(topic)).
- build();
- }
-
- @GET
- @Path("engine/topics/sources/dmaap/{topic}")
- @ApiOperation(
- value="Retrieves a DMaaP managed topic source",
- notes="This is a DMaaP Network Communicaton Endpoint source of messages for the Engine",
- response=DmaapTopicSource.class
- )
- public Response dmaapSourceTopic(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getDmaapTopicSource(topic)).
- build();
- }
-
- @GET
- @Path("engine/topics/sinks/dmaap/{topic}")
- @ApiOperation(
- value="Retrieves a DMaaP managed topic sink",
- notes="This is a DMaaP Network Communicaton Endpoint destination of messages from the Engine",
- response=DmaapTopicSink.class
- )
- public Response dmaapSinkTopic(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- return Response.status(Response.Status.OK).
- entity(TopicEndpoint.manager.getDmaapTopicSink(topic)).
- build();
- }
-
- @GET
- @Path("engine/topics/sources/ueb/{topic}/events")
- @ApiOperation(
- value="Retrieves the latest events received by an UEB topic",
- notes="This is a UEB Network Communicaton Endpoint source of messages for the Engine",
- responseContainer="List"
- )
- public Response uebSourceEvents(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- return Response.status(Status.OK).
- entity(Arrays.asList(TopicEndpoint.manager.getUebTopicSource(topic).getRecentEvents())).
- build();
- }
-
- @GET
- @Path("engine/topics/sinks/ueb/{topic}/events")
- @ApiOperation(
- value="Retrieves the latest events sent from a topic",
- notes="This is a UEB Network Communicaton Endpoint sink of messages from the Engine",
- responseContainer="List"
- )
- public Response uebSinkEvents(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- return Response.status(Status.OK).
- entity(Arrays.asList(TopicEndpoint.manager.getUebTopicSink(topic).getRecentEvents())).
- build();
- }
-
- @GET
- @Path("engine/topics/sources/dmaap/{topic}/events")
- @ApiOperation(
- value="Retrieves the latest events received by a DMaaP topic",
- notes="This is a DMaaP Network Communicaton Endpoint source of messages for the Engine",
- responseContainer="List"
- )
- public Response dmaapSourceEvents(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- return Response.status(Status.OK).
- entity(Arrays.asList(TopicEndpoint.manager.getDmaapTopicSource(topic).getRecentEvents())).
- build();
- }
-
- @GET
- @Path("engine/topics/sinks/dmaap/{topic}/events")
- @ApiOperation(
- value="Retrieves the latest events send through a DMaaP topic",
- notes="This is a DMaaP Network Communicaton Endpoint destination of messages from the Engine",
- responseContainer="List"
- )
- public Response dmaapSinkEvents(
- @PathParam("topic") String topic) {
- return Response.status(Status.OK).
- entity(Arrays.asList(TopicEndpoint.manager.getDmaapTopicSink(topic).getRecentEvents())).
- build();
- }
-
- @GET
- @Path("engine/topics/sources/ueb/{topic}/switches")
- @ApiOperation(
- value="UEB Topic Control Switches",
- notes="List of the UEB Topic Control Switches",
- responseContainer="List"
- )
- public Response uebTopicSwitches() {
- return Response.status(Response.Status.OK).
- entity(Arrays.asList(Switches.values())).
- build();
- }
-
- @PUT
- @Path("engine/topics/sources/ueb/{topic}/switches/lock")
- @ApiOperation(
- value="Locks an UEB Source topic",
- response=UebTopicSource.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response uebTopicLock(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- UebTopicSource source = TopicEndpoint.manager.getUebTopicSource(topic);
- boolean success = source.lock();
- if (success)
- return Response.status(Status.OK).
- entity(source).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation on " + topic)).
- build();
- }
-
- @DELETE
- @Path("engine/topics/sources/ueb/{topic}/switches/lock")
- @ApiOperation(
- value="Unlocks an UEB Source topic",
- response=UebTopicSource.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response uebTopicUnlock(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- UebTopicSource source = TopicEndpoint.manager.getUebTopicSource(topic);
- boolean success = source.unlock();
- if (success)
- return Response.status(Status.OK).
- entity(source).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation on " + topic)).
- build();
- }
-
- @GET
- @Path("engine/topics/sources/dmaap/{topic}/switches")
- @ApiOperation(
- value="DMaaP Topic Control Switches",
- notes="List of the DMaaP Topic Control Switches",
- responseContainer="List"
- )
- public Response dmaapTopicSwitches() {
- return Response.status(Response.Status.OK).
- entity(Arrays.asList(Switches.values())).
- build();
- }
-
- @PUT
- @Path("engine/topics/sources/dmaap/{topic}/switches/lock")
- @ApiOperation(
- value="Locks an DMaaP Source topic",
- response=DmaapTopicSource.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response dmmapTopicLock(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- DmaapTopicSource source = TopicEndpoint.manager.getDmaapTopicSource(topic);
- boolean success = source.lock();
- if (success)
- return Response.status(Status.OK).
- entity(source).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("cannot perform operation on " + topic)).
- build();
- }
-
- @DELETE
- @Path("engine/topics/sources/dmaap/{topic}/switches/lock")
- @ApiOperation(
- value="Unlocks an DMaaP Source topic",
- response=DmaapTopicSource.class
- )
- @ApiResponses(value = {
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled")
- })
- public Response dmaapTopicUnlock(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic) {
- DmaapTopicSource source = TopicEndpoint.manager.getDmaapTopicSource(topic);
- boolean success = source.unlock();
- if (success)
- return Response.status(Status.OK).
- entity(source).
- build();
- else
- return Response.status(Status.SERVICE_UNAVAILABLE).
- entity(new Error("cannot perform operation on " + topic)).
- build();
- }
-
- @PUT
- @Path("engine/topics/sources/ueb/{topic}/events")
- @Consumes(MediaType.TEXT_PLAIN)
- @ApiOperation(
- value="Offers an event to an UEB topic for internal processing by the engine",
- notes="The offered event is treated as it was incoming from the network",
- responseContainer="List"
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The topic information cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled"),
- @ApiResponse(code=500, message="A server error has occurred processing this request")
- })
- public Response uebOffer(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic,
- @ApiParam(value="Network Message", required=true)
- String json) {
- try {
- UebTopicSource uebReader = TopicEndpoint.manager.getUebTopicSource(topic);
- boolean success = uebReader.offer(json);
- if (success)
- return Response.status(Status.OK).
- entity(Arrays.asList(TopicEndpoint.manager.getUebTopicSource(topic).getRecentEvents())).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("Failure to inject event over " + topic)).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(topic + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(topic + " not acceptable due to current state")).
- build();
- } catch (Exception e) {
- return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
- entity(new Error(e.getMessage())).
- build();
- }
- }
-
- @PUT
- @Path("engine/topics/sources/dmaap/{topic}/events")
- @Consumes(MediaType.TEXT_PLAIN)
- @ApiOperation(
- value="Offers an event to a DMaaP topic for internal processing by the engine",
- notes="The offered event is treated as it was incoming from the network",
- responseContainer="List"
- )
- @ApiResponses(value = {
- @ApiResponse(code=404, message="The topic information cannot be found"),
- @ApiResponse(code=406, message="The system is an administrative state that prevents " +
- "this request to be fulfilled"),
- @ApiResponse(code=500, message="A server error has occurred processing this request")
- })
- public Response dmaapOffer(@ApiParam(value="Topic Name", required=true)
- @PathParam("topic") String topic,
- @ApiParam(value="Network Message", required=true)
- String json) {
- try {
- DmaapTopicSource dmaapReader = TopicEndpoint.manager.getDmaapTopicSource(topic);
- boolean success = dmaapReader.offer(json);
- if (success)
- return Response.status(Status.OK).
- entity(Arrays.asList(TopicEndpoint.manager.getDmaapTopicSource(topic).getRecentEvents())).
- build();
- else
- return Response.status(Status.NOT_ACCEPTABLE).
- entity(new Error("Failure to inject event over " + topic)).
- build();
- } catch (IllegalArgumentException e) {
- return Response.status(Response.Status.NOT_FOUND).
- entity(new Error(topic + " not found")).
- build();
- } catch (IllegalStateException e) {
- return Response.status(Response.Status.NOT_ACCEPTABLE).
- entity(new Error(topic + " not acceptable due to current state")).
- build();
- } catch (Exception e) {
- return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
- entity(new Error(e.getMessage())).
- build();
- }
- }
-
- @GET
- @Path("engine/tools/uuid")
- @ApiOperation(
- value="Produces an UUID",
- notes="UUID generation utility"
- )
- @Produces(MediaType.TEXT_PLAIN)
- public Response uuid() {
- return Response.status(Status.OK).
- entity(UUID.randomUUID().toString()).
- build();
- }
-
- @GET
- @Path("engine/tools/loggers")
- @ApiOperation(
- value="all active loggers",
- responseContainer="List"
- )
- @ApiResponses(value = {
- @ApiResponse(code=500, message="logging misconfiguration")
- })
- public Response loggers() {
- List<String> names = new ArrayList<String>();
- if (!(LoggerFactory.getILoggerFactory() instanceof LoggerContext)) {
- logger.warn("The SLF4J logger factory is not configured for logback");
- return Response.status(Status.INTERNAL_SERVER_ERROR).
- entity(names).build();
- }
-
- LoggerContext context =
- (LoggerContext) LoggerFactory.getILoggerFactory();
- for (Logger logger: context.getLoggerList()) {
- names.add(logger.getName());
- }
-
- return Response.status(Status.OK).
- entity(names).
- build();
- }
-
- @GET
- @Path("engine/tools/loggers/{logger}")
- @ApiOperation(
- value="logging level of a logger"
- )
- @ApiResponses(value = {
- @ApiResponse(code=500, message="logging misconfiguration"),
- @ApiResponse(code=404, message="logger not found")
- })
- public Response loggerName(@ApiParam(value="Logger Name", required=true)
- @PathParam("logger") String loggerName) {
- if (!(LoggerFactory.getILoggerFactory() instanceof LoggerContext)) {
- logger.warn("The SLF4J logger factory is not configured for logback");
- return Response.status(Status.INTERNAL_SERVER_ERROR).build();
- }
-
- LoggerContext context =
- (LoggerContext) LoggerFactory.getILoggerFactory();
- ch.qos.logback.classic.Logger logger = context.getLogger(loggerName);
- if (logger == null) {
- return Response.status(Status.NOT_FOUND).build();
- }
-
- String loggerLevel = (logger.getLevel() != null) ? logger.getLevel().toString() : "";
- return Response.status(Status.OK).entity(loggerLevel).build();
- }
-
- @PUT
- @Path("engine/tools/loggers/{logger}/{level}")
- @ApiOperation(
- value="sets the logger level",
- notes="Please use the SLF4J logger levels"
- )
- @ApiResponses(value = {
- @ApiResponse(code=500, message="logging misconfiguration"),
- @ApiResponse(code=404, message="logger not found")
- })
- public Response loggerName(@ApiParam(value="Logger Name", required=true)
- @PathParam("logger") String loggerName,
- @ApiParam(value="Logger Level", required=true)
- @PathParam("level") String loggerLevel) {
- if (!(LoggerFactory.getILoggerFactory() instanceof LoggerContext)) {
- logger.warn("The SLF4J logger factory is not configured for logback");
- return Response.status(Status.INTERNAL_SERVER_ERROR).build();
- }
-
- LoggerContext context =
- (LoggerContext) LoggerFactory.getILoggerFactory();
- ch.qos.logback.classic.Logger logger = context.getLogger(loggerName);
- if (logger == null) {
- return Response.status(Status.NOT_FOUND).build();
- }
-
- logger.setLevel(ch.qos.logback.classic.Level.toLevel(loggerLevel));
- return Response.status(Status.OK).entity(logger.getLevel().toString()).build();
- }
-
- /**
- * gets the underlying drools controller from the named policy controller
- * @param controllerName the policy controller name
- * @return the underlying drools controller
- * @throws IllegalArgumentException if an invalid controller name has been passed in
- */
- protected DroolsController getDroolsController(String controllerName) throws IllegalArgumentException {
- PolicyController controller = PolicyController.factory.get(controllerName);
- if (controller == null)
- throw new IllegalArgumentException(controllerName + " does not exist");
-
- DroolsController drools = controller.getDrools();
- if (drools == null)
- throw new IllegalArgumentException(controllerName + " has no drools configuration");
-
- return drools;
- }
-
- /*
- * Helper classes for aggregation of results
- */
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("rest-telemetry-api []");
- return builder.toString();
- }
-
- /**
- * Coding/Encoding Results Aggregation Helper class
- */
- public static class CodingResult {
- /**
- * serialized output
- */
-
- public String jsonEncoding;
- /**
- * encoding result
- */
-
- public Boolean encoding;
-
- /**
- * decoding result
- */
- public Boolean decoding;
- }
-
- /**
- * Generic Error Reporting class
- */
- public static class Error {
- public String error;
-
- public Error(String error) {
- this.error = error;
- }
- }
-
- /**
- * Feed Ports into Resources
- */
- public enum Inputs {
- configuration,
- }
-
- /**
- * Resource Toggles
- */
- public enum Switches {
- activation,
- lock,
- }
-}
-
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java
deleted file mode 100644
index 1bb9a320..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.system;
-
-import java.io.File;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Properties;
-
-import org.openecomp.policy.drools.persistence.SystemPersistence;
-import org.openecomp.policy.drools.utils.PropertyUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Programmatic entry point to the management layer
- */
-public class Main {
-
- /**
- * logback configuration file system property
- */
- public static final String LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY = "logback.configurationFile";
-
- /**
- * logback configuration file system property
- */
- public static final String LOGBACK_CONFIGURATION_FILE_DEFAULT = "config/logback.xml";
-
- /**
- * constructor (hides public default one)
- */
- private Main() {}
-
- /**
- * main
- *
- * @param args program arguments
- */
- public static void main(String args[]) {
-
- /* logging defaults */
-
- if (System.getProperty(LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY) == null)
- System.setProperty(LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY, LOGBACK_CONFIGURATION_FILE_DEFAULT);
-
- /* 0. boot */
-
- PolicyEngine.manager.boot(args);
-
- Logger logger = LoggerFactory.getLogger(Main.class);
-
- File configDir = new File(SystemPersistence.CONFIG_DIR_NAME);
-
- if (!configDir.isDirectory()) {
- throw new IllegalArgumentException
- ("config directory: " + configDir.getAbsolutePath() +
- " not found");
- }
-
- /* 1. Configure the Engine */
-
- try {
- Path policyEnginePath = Paths.get(configDir.toPath().toString(), SystemPersistence.PROPERTIES_FILE_ENGINE);
- Properties properties = PropertyUtil.getProperties(policyEnginePath.toFile());
- PolicyEngine.manager.configure(properties);
- } catch (Exception e) {
- logger.warn("Main: cannot initialize {} because of {}", PolicyEngine.manager, e.getMessage(), e);
- }
-
- /* 2. Start the Engine with the basic services only (no Policy Controllers) */
-
- try {
- boolean success = PolicyEngine.manager.start();
- if (!success) {
- logger.warn("Main: {} has been partially started", PolicyEngine.manager);
- }
- } catch (IllegalStateException e) {
- logger.warn("Main: cannot start {} (bad state) because of {}", PolicyEngine.manager, e.getMessage(), e);
- } catch (Exception e) {
- logger.warn("Main: cannot start {} because of {}", PolicyEngine.manager, e.getMessage(), e);
- System.exit(1);
- }
-
- /* 3. Create and start the controllers */
-
- File[] controllerFiles = configDir.listFiles();
- for (File config : controllerFiles) {
-
- if (config.getName().endsWith(SystemPersistence.PROPERTIES_FILE_CONTROLLER_SUFFIX)) {
- int idxSuffix =
- config.getName().indexOf(SystemPersistence.PROPERTIES_FILE_CONTROLLER_SUFFIX);
- int lastIdxSuffix =
- config.getName().lastIndexOf(SystemPersistence.PROPERTIES_FILE_CONTROLLER_SUFFIX);
- if (idxSuffix != lastIdxSuffix) {
- throw new IllegalArgumentException
- ("Improper naming of controller properties file: " +
- "Expected <controller-name>" +
- SystemPersistence.PROPERTIES_FILE_CONTROLLER_SUFFIX);
- }
-
- String name =
- config.getName().substring(0, lastIdxSuffix);
- try {
- Properties properties = PropertyUtil.getProperties(config);
- PolicyController controller = PolicyEngine.manager.createPolicyController(name, properties);
- controller.start();
- } catch (Exception e) {
- logger.error("Main: cannot instantiate policy-controller {} because of {}", name, e.getMessage(), e);
- } catch (LinkageError e) {
- logger.warn("Main: cannot instantiate policy-controller {} (linkage) because of {}",
- name, e.getMessage(), e);
- }
- }
- }
- }
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyController.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyController.java
deleted file mode 100644
index 15d1acf3..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyController.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.system;
-
-import java.util.List;
-import java.util.Properties;
-
-import org.openecomp.policy.drools.controller.DroolsController;
-import org.openecomp.policy.drools.event.comm.TopicSource;
-import org.openecomp.policy.drools.event.comm.Topic.CommInfrastructure;
-import org.openecomp.policy.drools.event.comm.TopicSink;
-import org.openecomp.policy.drools.properties.Lockable;
-import org.openecomp.policy.drools.properties.Startable;
-import org.openecomp.policy.drools.protocol.configuration.DroolsConfiguration;
-
-/**
- * A Policy Controller is the higher level unit of control. It corresponds to
- * the ncomp equivalent of a controller. It provides management of underlying
- * resources associated with the policy controller, which is a) communication
- * infrastructure, and b) policy-core (drools) session infrastructure
- *
- */
-public interface PolicyController extends Startable, Lockable {
-
- /**
- * name of this Policy Controller
- */
- public String getName();
-
- /**
- * Get the topic readers of interest for this controller
- */
- public List<? extends TopicSource> getTopicSources();
-
- /**
- * Get the topic readers of interest for this controller
- */
- public List<? extends TopicSink> getTopicSinks();
-
- /**
- * Get the Drools Controller
- */
- public DroolsController getDrools();
-
- /**
- * update maven configuration
- *
- * @param newDroolsConfiguration new drools configuration
- * @return true if the update was successful, false otherwise
- */
- public boolean updateDrools(DroolsConfiguration newDroolsConfiguration);
-
- /**
- * Get the Properties
- */
- public Properties getProperties();
-
- /**
- * Attempts delivering of an String over communication
- * infrastructure "busType"
- *
- * @param eventBus Communication infrastructure identifier
- * @param topic topic
- * @param event the event object to send
- *
- * @return true if successful, false if a failure has occurred.
- * @throws IllegalArgumentException when invalid or insufficient
- * properties are provided
- * @throws IllegalStateException when the engine is in a state where
- * this operation is not permitted (ie. locked or stopped).
- * @throws UnsupportedOperationException when the engine cannot deliver due
- * to the functionality missing (ie. communication infrastructure
- * not supported.
- */
- public boolean deliver(CommInfrastructure busType, String topic,
- Object event)
- throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException;
-
- /**
- * halts and permanently releases all resources
- * @throws IllegalStateException
- */
- public void halt() throws IllegalStateException;
-
- /**
- * Factory that tracks and manages Policy Controllers
- */
- public static PolicyControllerFactory factory =
- new IndexedPolicyControllerFactory();
-
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyControllerFactory.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyControllerFactory.java
deleted file mode 100644
index 12a8acdc..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyControllerFactory.java
+++ /dev/null
@@ -1,522 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.system;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Properties;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.openecomp.policy.drools.controller.DroolsController;
-import org.openecomp.policy.drools.features.PolicyControllerFeatureAPI;
-import org.openecomp.policy.drools.protocol.configuration.DroolsConfiguration;
-import org.openecomp.policy.drools.system.internal.AggregatedPolicyController;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
-/**
- * Policy Controller Factory to manage controller creation, destruction,
- * and retrieval for management interfaces
- */
-public interface PolicyControllerFactory {
- /**
- * Build a controller from a properties file
- *
- * @param name the global name of this controller
- * @param properties input parameters in form of properties for controller
- * initialization.
- *
- * @return a Policy Controller
- *
- * @throws IllegalArgumentException invalid values provided in properties
- */
- public PolicyController build(String name, Properties properties)
- throws IllegalArgumentException;
-
- /**
- * patches (updates) a controller from a critical configuration update.
- *
- * @param name
- * @param configController
- *
- * @return a Policy Controller
- */
- public PolicyController patch(String name, DroolsConfiguration configController);
-
- /**
- * rebuilds (updates) a controller from a configuration update.
- *
- * @param controller
- * @param configController
- *
- * @return a Policy Controller
- */
- public PolicyController patch(PolicyController controller,
- DroolsConfiguration configController);
-
- /**
- * get PolicyController from DroolsController
- *
- * @param droolsController
- * @return
- * @throws IllegalArgumentException
- * @throws IllegalStateException
- */
- public PolicyController get(DroolsController droolsController)
- throws IllegalArgumentException, IllegalStateException;
-
- /**
- * Makes the Policy Controller identified by controllerName not operational, but
- * does not delete its associated data
- *
- * @param controllerName name of the policy controller
- * @throws IllegalArgumentException invalid arguments
- */
- public void shutdown(String controllerName) throws IllegalArgumentException;;
-
- /**
- * Makes the Policy Controller identified by controller not operational, but
- * does not delete its associated data
- *
- * @param controller a Policy Controller
- * @throws IllegalArgumentException invalid arguments
- */
- public void shutdown(PolicyController controller) throws IllegalArgumentException;
-
- /**
- * Releases all Policy Controllers from operation
- */
- public void shutdown();
-
- /**
- * Destroys this Policy Controller
- *
- * @param controllerName name of the policy controller
- * @throws IllegalArgumentException invalid arguments
- */
- public void destroy(String controllerName) throws IllegalArgumentException;;
-
- /**
- * Destroys this Policy Controller
- *
- * @param controller a Policy Controller
- * @throws IllegalArgumentException invalid arguments
- */
- public void destroy(PolicyController controller) throws IllegalArgumentException;
-
- /**
- * Releases all Policy Controller resources
- */
- public void destroy();
-
- /**
- * gets the Policy Controller identified by its name
- *
- * @param policyControllerName
- * @return
- * @throws IllegalArgumentException
- * @throws IllegalStateException
- */
- public PolicyController get(String policyControllerName)
- throws IllegalArgumentException, IllegalStateException;
-
- /**
- * gets the Policy Controller identified by group and artifact ids
- *
- * @param groupId group id
- * @param artifactId artifact id
- * @return
- * @throws IllegalArgumentException
- * @throws IllegalStateException
- */
- public PolicyController get(String groupId, String artifactId)
- throws IllegalArgumentException, IllegalStateException;
-
- /**
- * get features attached to the Policy Controllers
- * @return list of features
- */
- public List<PolicyControllerFeatureAPI> getFeatureProviders();
-
- /**
- * get named feature attached to the Policy Controllers
- * @return the feature
- */
- public PolicyControllerFeatureAPI getFeatureProvider(String featureName)
- throws IllegalArgumentException;
-
- /**
- * get features attached to the Policy Controllers
- * @return list of features
- */
- public List<String> getFeatures();
-
- /**
- * returns the current inventory of Policy Controllers
- *
- * @return a list of Policy Controllers
- */
- public List<PolicyController> inventory();
-}
-
-/**
- * Factory of Policy Controllers indexed by the name of the Policy Controller
- */
-class IndexedPolicyControllerFactory implements PolicyControllerFactory {
- // get an instance of logger
- private static Logger logger = LoggerFactory.getLogger(PolicyControllerFactory.class);
-
- /**
- * Policy Controller Name Index
- */
- protected HashMap<String,PolicyController> policyControllers =
- new HashMap<String,PolicyController>();
-
- /**
- * Group/Artifact Ids Index
- */
- protected HashMap<String,PolicyController> coordinates2Controller =
- new HashMap<String,PolicyController>();
-
- /**
- * produces key for indexing controller names
- *
- * @param group group id
- * @param artifactId artifact id
- * @return index key
- */
- protected String toKey(String groupId, String artifactId) {
- return groupId + ":" + artifactId;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized PolicyController build(String name, Properties properties)
- throws IllegalArgumentException {
-
- if (this.policyControllers.containsKey(name)) {
- return this.policyControllers.get(name);
- }
-
- /* A PolicyController does not exist */
-
- PolicyController controller =
- new AggregatedPolicyController(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)
- throws IllegalArgumentException {
-
- if (name == null || name.isEmpty() || !this.policyControllers.containsKey(name)) {
- throw new IllegalArgumentException("Invalid " + name);
- }
-
- if (droolsConfig == null)
- throw new IllegalArgumentException("Invalid Drools Configuration");
-
- PolicyController controller = this.get(name);
-
- if (controller == null) {
- logger.warn("A POLICY CONTROLLER of name " + name +
- "does not exist for patch operation: " + droolsConfig);
-
- throw new IllegalArgumentException("Not a valid controller of name " + name);
- }
-
- this.patch(controller, droolsConfig);
-
- if (logger.isInfoEnabled())
- logger.info("UPDATED drools configuration: " + droolsConfig + " on " + this);
-
- return controller;
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PolicyController patch(PolicyController controller, DroolsConfiguration droolsConfig)
- throws IllegalArgumentException {
-
- if (controller == null)
- throw new IllegalArgumentException("Not a valid controller: null");
-
- if (!controller.updateDrools(droolsConfig)) {
- logger.warn("Cannot update drools configuration: " + droolsConfig + " on " + this);
- throw new IllegalArgumentException("Cannot update drools configuration Drools Configuration");
- }
-
- if (logger.isInfoEnabled())
- logger.info("UPDATED drools configuration: " + droolsConfig + " on " + this);
-
- String coordinates = toKey(controller.getDrools().getGroupId(),
- controller.getDrools().getArtifactId());
-
- if (controller.getDrools().isBrained())
- this.coordinates2Controller.put(coordinates, controller);
-
- return controller;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void shutdown(String controllerName) throws IllegalArgumentException {
-
- if (controllerName == null || controllerName.isEmpty()) {
- throw new IllegalArgumentException("Invalid " + 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) throws IllegalArgumentException {
- 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
- * @return
- * @throws IllegalArgumentException
- */
- protected void unmanage(PolicyController controller) throws IllegalArgumentException {
- if (controller == null) {
- throw new IllegalArgumentException("Invalid Controller");
- }
-
- synchronized(this) {
- if (!this.policyControllers.containsKey(controller.getName())) {
- return;
- }
- controller = this.policyControllers.remove(controller.getName());
-
- String coordinates = toKey(controller.getDrools().getGroupId(),
- controller.getDrools().getArtifactId());
- this.coordinates2Controller.remove(coordinates);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void destroy(String controllerName) throws IllegalArgumentException {
-
- if (controllerName == null || controllerName.isEmpty()) {
- throw new IllegalArgumentException("Invalid " + 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) throws IllegalArgumentException {
- 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) throws IllegalArgumentException, IllegalStateException {
-
- if (name == null || name.isEmpty()) {
- throw new IllegalArgumentException("Invalid " + name);
- }
-
- synchronized(this) {
- if (this.policyControllers.containsKey(name)) {
- return this.policyControllers.get(name);
- } else {
- throw new IllegalArgumentException("Invalid " + name);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PolicyController get(String groupId, String artifactId)
- throws IllegalArgumentException, IllegalStateException {
-
- 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 new IllegalArgumentException("Invalid " + key);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PolicyController get(DroolsController droolsController)
- throws IllegalArgumentException, IllegalStateException {
-
- 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() {
- List<PolicyController> controllers =
- new ArrayList<PolicyController>(this.policyControllers.values());
- return controllers;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<String> getFeatures() {
- List<String> features = new ArrayList<String>();
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- features.add(feature.getName());
- }
- return features;
- }
-
- /**
- * {@inheritDoc}
- */
- @JsonIgnore
- @Override
- public List<PolicyControllerFeatureAPI> getFeatureProviders() {
- return PolicyControllerFeatureAPI.providers.getList();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PolicyControllerFeatureAPI getFeatureProvider(String featureName) throws IllegalArgumentException {
- if (featureName == null || featureName.isEmpty())
- throw new IllegalArgumentException("A feature name must be provided");
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- if (feature.getName().equals(featureName))
- return feature;
- }
-
- throw new IllegalArgumentException("Invalid Feature Name: " + featureName);
- }
-}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java
deleted file mode 100644
index 02479ec8..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java
+++ /dev/null
@@ -1,1461 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.system;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.openecomp.policy.drools.controller.DroolsController;
-import org.openecomp.policy.drools.core.PolicyContainer;
-import org.openecomp.policy.drools.core.jmx.PdpJmxListener;
-import org.openecomp.policy.drools.event.comm.Topic;
-import org.openecomp.policy.drools.event.comm.Topic.CommInfrastructure;
-import org.openecomp.policy.drools.event.comm.TopicEndpoint;
-import org.openecomp.policy.drools.event.comm.TopicListener;
-import org.openecomp.policy.drools.event.comm.TopicSink;
-import org.openecomp.policy.drools.event.comm.TopicSource;
-import org.openecomp.policy.drools.features.PolicyControllerFeatureAPI;
-import org.openecomp.policy.drools.features.PolicyEngineFeatureAPI;
-import org.openecomp.policy.drools.http.server.HttpServletServer;
-import org.openecomp.policy.drools.persistence.SystemPersistence;
-import org.openecomp.policy.drools.properties.Lockable;
-import org.openecomp.policy.drools.properties.PolicyProperties;
-import org.openecomp.policy.drools.properties.Startable;
-import org.openecomp.policy.drools.protocol.coders.EventProtocolCoder;
-import org.openecomp.policy.drools.protocol.configuration.ControllerConfiguration;
-import org.openecomp.policy.drools.protocol.configuration.PdpdConfiguration;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-/**
- * Policy Engine, the top abstraction for the Drools PDP Policy Engine.
- * It abstracts away a Drools PDP Engine from management purposes.
- * This is the best place to looking at the code from a top down approach.
- * Other managed entities can be obtained from the PolicyEngine, hierarchically.
- * <br>
- * PolicyEngine 1 --- * PolicyController 1 --- 1 DroolsController 1 --- 1 PolicyContainer 1 --- * PolicySession
- * <br>
- * PolicyEngine 1 --- 1 TopicEndpointManager 1 -- * TopicReader 1 --- 1 UebTopicReader
- * <br>
- * PolicyEngine 1 --- 1 TopicEndpointManager 1 -- * TopicReader 1 --- 1 DmaapTopicReader
- * <br>
- * PolicyEngine 1 --- 1 TopicEndpointManager 1 -- * TopicWriter 1 --- 1 DmaapTopicWriter
- * <br>
- * PolicyEngine 1 --- 1 TopicEndpointManager 1 -- * TopicReader 1 --- 1 RestTopicReader
- * <br>
- * PolicyEngine 1 --- 1 TopicEndpointManager 1 -- * TopicWriter 1 --- 1 RestTopicWriter
- * <br>
- * PolicyEngine 1 --- 1 ManagementServer
- */
-public interface PolicyEngine extends Startable, Lockable, TopicListener {
-
- /**
- * Default Config Server Port
- */
- public static final int CONFIG_SERVER_DEFAULT_PORT = 9696;
-
- /**
- * Default Config Server Hostname
- */
- public static final String CONFIG_SERVER_DEFAULT_HOST = "localhost";
-
- /**
- * Boot the engine
- *
- * @param cliArgs command line arguments
- */
- public void boot(String cliArgs[]);
-
- /**
- * configure the policy engine according to the given properties
- *
- * @param properties Policy Engine properties
- * @throws IllegalArgumentException when invalid or insufficient
- * properties are provided
- */
- public void configure(Properties properties) throws IllegalArgumentException;
-
- /**
- * registers a new Policy Controller with the Policy Engine
- * initialized per properties.
- *
- * @param controller name
- * @param properties properties to initialize the Policy Controller
- * @throws IllegalArgumentException when invalid or insufficient
- * properties are provided
- * @throws IllegalStateException when the engine is in a state where
- * this operation is not permitted.
- * @return the newly instantiated Policy Controller
- */
- public PolicyController createPolicyController(String name, Properties properties)
- throws IllegalArgumentException, IllegalStateException;
-
- /**
- * updates the Policy Engine with the given configuration
- *
- * @param configuration the configuration
- * @return success or failure
- * @throws IllegalArgumentException if invalid argument provided
- * @throws IllegalStateException if the system is in an invalid state
- */
- public boolean configure(PdpdConfiguration configuration)
- throws IllegalArgumentException, IllegalStateException;
-
- /**
- * updates a set of Policy Controllers with configuration information
- *
- * @param configuration
- * @return
- * @throws IllegalArgumentException
- * @throws IllegalStateException
- */
- public List<PolicyController> updatePolicyControllers(List<ControllerConfiguration> configuration)
- throws IllegalArgumentException, IllegalStateException;
-
- /**
- * updates an already existing Policy Controller with configuration information
- *
- * @param configuration configuration
- *
- * @return the updated Policy Controller
- * @throws IllegalArgumentException in the configuration is invalid
- * @throws IllegalStateException if the controller is in a bad state
- * @throws Exception any other reason
- */
- public PolicyController updatePolicyController(ControllerConfiguration configuration)
- throws Exception;
-
- /**
- * removes the Policy Controller identified by its name from the Policy Engine
- *
- * @param name name of the Policy Controller
- * @return the removed Policy Controller
- */
- public void removePolicyController(String name);
-
- /**
- * removes a Policy Controller from the Policy Engine
- * @param controller the Policy Controller to remove from the Policy Engine
- */
- public void removePolicyController(PolicyController controller);
-
- /**
- * returns a list of the available Policy Controllers
- *
- * @return list of Policy Controllers
- */
- public List<PolicyController> getPolicyControllers();
-
-
- /**
- * get policy controller names
- *
- * @return list of controller names
- */
- public List<String> getPolicyControllerIds();
-
- /**
- * get unmanaged sources
- *
- * @return unmanaged sources
- */
- public List<TopicSource> getSources();
-
- /**
- * get unmanaged sinks
- *
- * @return unmanaged sinks
- */
- public List<TopicSink> getSinks();
-
- /**
- * get unmmanaged http servers list
- * @return http servers
- */
- public List<HttpServletServer> getHttpServers();
-
- /**
- * get properties configuration
- *
- * @return properties objects
- */
- public Properties getProperties();
-
- /**
- * get features attached to the Policy Engine
- * @return list of features
- */
- public List<PolicyEngineFeatureAPI> getFeatureProviders();
-
- /**
- * get named feature attached to the Policy Engine
- * @return the feature
- */
- public PolicyEngineFeatureAPI getFeatureProvider(String featureName)
- throws IllegalArgumentException;
-
- /**
- * get features attached to the Policy Engine
- * @return list of features
- */
- public List<String> getFeatures();
-
- /**
- * Attempts the dispatching of an "event" object
- *
- * @param topic topic
- * @param event the event object to send
- *
- * @return true if successful, false if a failure has occurred.
- * @throws IllegalArgumentException when invalid or insufficient
- * properties are provided
- * @throws IllegalStateException when the engine is in a state where
- * this operation is not permitted (ie. locked or stopped).
- */
- public boolean deliver(String topic, Object event)
- throws IllegalArgumentException, IllegalStateException;
-
- /**
- * Attempts the dispatching of an "event" object over communication
- * infrastructure "busType"
- *
- * @param eventBus Communication infrastructure identifier
- * @param topic topic
- * @param event the event object to send
- *
- * @return true if successful, false if a failure has occurred.
- * @throws IllegalArgumentException when invalid or insufficient
- * properties are provided
- * @throws IllegalStateException when the engine is in a state where
- * this operation is not permitted (ie. locked or stopped).
- * @throws UnsupportedOperationException when the engine cannot deliver due
- * to the functionality missing (ie. communication infrastructure
- * not supported.
- */
- public boolean deliver(String busType, String topic, Object event)
- throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException;
-
- /**
- * Attempts the dispatching of an "event" object over communication
- * infrastructure "busType"
- *
- * @param eventBus Communication infrastructure enum
- * @param topic topic
- * @param event the event object to send
- *
- * @return true if successful, false if a failure has occurred.
- * @throws IllegalArgumentException when invalid or insufficient
- * properties are provided
- * @throws IllegalStateException when the engine is in a state where
- * this operation is not permitted (ie. locked or stopped).
- * @throws UnsupportedOperationException when the engine cannot deliver due
- * to the functionality missing (ie. communication infrastructure
- * not supported.
- */
- public boolean deliver(CommInfrastructure busType, String topic, Object event)
- throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException;
-
- /**
- * Attempts delivering of an String over communication
- * infrastructure "busType"
- *
- * @param eventBus Communication infrastructure identifier
- * @param topic topic
- * @param event the event object to send
- *
- * @return true if successful, false if a failure has occurred.
- * @throws IllegalArgumentException when invalid or insufficient
- * properties are provided
- * @throws IllegalStateException when the engine is in a state where
- * this operation is not permitted (ie. locked or stopped).
- * @throws UnsupportedOperationException when the engine cannot deliver due
- * to the functionality missing (ie. communication infrastructure
- * not supported.
- */
- public boolean deliver(CommInfrastructure busType, String topic,
- String event)
- throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException;
-
- /**
- * Invoked when the host goes into the active state.
- */
- public void activate();
-
- /**
- * Invoked when the host goes into the standby state.
- */
- public void deactivate();
-
- /**
- * Policy Engine Manager
- */
- public final static PolicyEngine manager = new PolicyEngineManager();
-}
-
-/**
- * Policy Engine Manager Implementation
- */
-class PolicyEngineManager implements PolicyEngine {
- /**
- * logger
- */
- private static Logger logger = LoggerFactory.getLogger(PolicyEngineManager.class);
-
- /**
- * Is the Policy Engine running?
- */
- protected boolean alive = false;
-
- /**
- * Is the engine locked?
- */
- protected boolean locked = false;
-
- /**
- * Properties used to initialize the engine
- */
- protected Properties properties;
-
- /**
- * Policy Engine Sources
- */
- protected List<? extends TopicSource> sources = new ArrayList<>();
-
- /**
- * Policy Engine Sinks
- */
- protected List<? extends TopicSink> sinks = new ArrayList<>();
-
- /**
- * Policy Engine HTTP Servers
- */
- protected List<HttpServletServer> httpServers = new ArrayList<HttpServletServer>();
-
- /**
- * gson parser to decode configuration requests
- */
- protected Gson decoder = new GsonBuilder().disableHtmlEscaping().create();
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized void boot(String cliArgs[]) {
-
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeBoot(this, cliArgs))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} before-boot failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- try {
- PolicyContainer.globalInit(cliArgs);
- } catch (Exception e) {
- logger.error("{}: cannot init policy-container because of {}", this, e.getMessage(), e);
- }
-
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.afterBoot(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} after-boot failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized void configure(Properties properties) throws IllegalArgumentException {
-
- if (properties == null) {
- logger.warn("No properties provided");
- throw new IllegalArgumentException("No properties provided");
- }
-
- /* policy-engine dispatch pre configure hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeConfigure(this, properties))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} before-configure failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- this.properties = properties;
-
- try {
- this.sources = TopicEndpoint.manager.addTopicSources(properties);
- for (TopicSource source: this.sources) {
- source.register(this);
- }
- } catch (Exception e) {
- logger.error("{}: add-sources failed", this, e);
- }
-
- try {
- this.sinks = TopicEndpoint.manager.addTopicSinks(properties);
- } catch (IllegalArgumentException e) {
- logger.error("{}: add-sinks failed", this, e);
- }
-
- try {
- this.httpServers = HttpServletServer.factory.build(properties);
- } catch (IllegalArgumentException e) {
- logger.error("{}: add-http-servers failed", this, e);
- }
-
- /* policy-engine dispatch post configure hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.afterConfigure(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} after-configure failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized PolicyController createPolicyController(String name, Properties properties)
- throws IllegalArgumentException, IllegalStateException {
-
- // check if a PROPERTY_CONTROLLER_NAME property is present
- // if so, override the given name
-
- String propertyControllerName = properties.getProperty(PolicyProperties.PROPERTY_CONTROLLER_NAME);
- if (propertyControllerName != null && !propertyControllerName.isEmpty()) {
- if (!propertyControllerName.equals(name)) {
- throw new IllegalStateException("Proposed name (" + name +
- ") and properties name (" + propertyControllerName +
- ") don't match");
- }
- name = propertyControllerName;
- }
-
- PolicyController controller;
- for (PolicyControllerFeatureAPI controllerFeature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- controller = controllerFeature.beforeCreate(name, properties);
- if (controller != null)
- return controller;
- } catch (Exception e) {
- logger.error("{}: feature {} before-controller-create failure because of {}",
- this, controllerFeature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- controller = PolicyController.factory.build(name, properties);
- if (this.isLocked())
- controller.lock();
-
- // feature hook
- for (PolicyControllerFeatureAPI controllerFeature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (controllerFeature.afterCreate(controller))
- return controller;
- } catch (Exception e) {
- logger.error("{}: feature {} after-controller-create failure because of {}",
- this, controllerFeature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return controller;
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean configure(PdpdConfiguration config) throws IllegalArgumentException, IllegalStateException {
-
- if (config == null)
- throw new IllegalArgumentException("No configuration provided");
-
- String entity = config.getEntity();
-
- switch (entity) {
- case PdpdConfiguration.CONFIG_ENTITY_CONTROLLER:
- /* only this one supported for now */
- List<ControllerConfiguration> configControllers = config.getControllers();
- if (configControllers == null || configControllers.isEmpty()) {
- if (logger.isInfoEnabled())
- logger.info("No controller configuration provided: " + config);
- return false;
- }
- List<PolicyController> policyControllers = this.updatePolicyControllers(config.getControllers());
- if (policyControllers == null || policyControllers.isEmpty())
- return false;
- else if (policyControllers.size() == configControllers.size())
- return true;
-
- return false;
- default:
- String msg = "Configuration Entity is not supported: " + entity;
- logger.warn(msg);
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<PolicyController> updatePolicyControllers(List<ControllerConfiguration> configControllers)
- throws IllegalArgumentException, IllegalStateException {
-
- List<PolicyController> policyControllers = new ArrayList<PolicyController>();
- if (configControllers == null || configControllers.isEmpty()) {
- if (logger.isInfoEnabled())
- logger.info("No controller configuration provided: " + configControllers);
- return policyControllers;
- }
-
- for (ControllerConfiguration configController: configControllers) {
- try {
- PolicyController policyController = this.updatePolicyController(configController);
- policyControllers.add(policyController);
- } catch (Exception e) {
- logger.error("{}: cannot update-policy-controllers because of {}", this, e.getMessage(), e);
- }
- }
-
- return policyControllers;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PolicyController updatePolicyController(ControllerConfiguration configController)
- throws Exception {
-
- if (configController == null)
- throw new IllegalArgumentException("No controller configuration has been provided");
-
- String controllerName = configController.getName();
- if (controllerName == null || controllerName.isEmpty()) {
- logger.warn("controller-name must be provided");
- throw new IllegalArgumentException("No controller configuration has been provided");
- }
-
- PolicyController policyController = null;
- try {
- String operation = configController.getOperation();
- if (operation == null || operation.isEmpty()) {
- logger.warn("operation must be provided");
- throw new IllegalArgumentException("operation must be provided");
- }
-
- try {
- policyController = PolicyController.factory.get(controllerName);
- } catch (IllegalArgumentException e) {
- // not found
- logger.warn("Policy Controller " + controllerName + " not found");
- }
-
- if (policyController == null) {
-
- if (operation.equalsIgnoreCase(ControllerConfiguration.CONFIG_CONTROLLER_OPERATION_LOCK) ||
- operation.equalsIgnoreCase(ControllerConfiguration.CONFIG_CONTROLLER_OPERATION_UNLOCK)) {
- throw new IllegalArgumentException(controllerName + " is not available for operation " + operation);
- }
-
- /* Recovery case */
-
- logger.warn("controller " + controllerName + " does not exist. " +
- "Attempting recovery from disk");
-
- Properties properties =
- SystemPersistence.manager.getControllerProperties(controllerName);
-
- /*
- * returned properties cannot be null (per implementation)
- * assert (properties != null)
- */
-
- if (properties == null) {
- throw new IllegalArgumentException(controllerName + " is invalid");
- }
-
- logger.warn("controller " + controllerName + " being recovered. " +
- "Reset controller's bad maven coordinates to brainless");
-
- /*
- * try to bring up bad controller in brainless mode,
- * after having it working, apply the new create/update operation.
- */
- properties.setProperty(PolicyProperties.RULES_GROUPID, DroolsController.NO_GROUP_ID);
- properties.setProperty(PolicyProperties.RULES_ARTIFACTID, DroolsController.NO_ARTIFACT_ID);
- properties.setProperty(PolicyProperties.RULES_VERSION, DroolsController.NO_VERSION);
-
- policyController = PolicyEngine.manager.createPolicyController(controllerName, properties);
-
- /* fall through to do brain update operation*/
- }
-
- switch (operation) {
- case ControllerConfiguration.CONFIG_CONTROLLER_OPERATION_CREATE:
- PolicyController.factory.patch(policyController, configController.getDrools());
- break;
- case ControllerConfiguration.CONFIG_CONTROLLER_OPERATION_UPDATE:
- policyController.unlock();
- PolicyController.factory.patch(policyController, configController.getDrools());
- break;
- case ControllerConfiguration.CONFIG_CONTROLLER_OPERATION_LOCK:
- policyController.lock();
- break;
- case ControllerConfiguration.CONFIG_CONTROLLER_OPERATION_UNLOCK:
- policyController.unlock();
- break;
- default:
- String msg = "Controller Operation Configuration is not supported: " +
- operation + " for " + controllerName;
- logger.warn(msg);
- throw new IllegalArgumentException(msg);
- }
-
- return policyController;
- } catch (Exception e) {
- logger.error("{}: cannot update-policy-controller because of {}", this, e.getMessage(), e);
- throw e;
- } catch (LinkageError e) {
- logger.error("{}: cannot update-policy-controllers (rules) because of {}", this, e.getMessage(), e);
- throw new IllegalStateException(e);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized boolean start() throws IllegalStateException {
-
- /* policy-engine dispatch pre start hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeStart(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} before-start failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- boolean success = true;
- if (this.locked)
- throw new IllegalStateException("Engine is locked");
-
- this.alive = true;
-
- /* Start Policy Engine exclusively-owned (unmanaged) http servers */
-
- for (HttpServletServer httpServer: this.httpServers) {
- try {
- if (!httpServer.waitedStart(5 * 1000L))
- success = false;
- } catch (Exception e) {
- logger.error("{}: cannot start http-server {} because of {}", this,
- httpServer, e.getMessage(), e);
- }
- }
-
- /* Start Policy Engine exclusively-owned (unmanaged) sources */
-
- for (TopicSource source: this.sources) {
- try {
- if (!source.start())
- success = false;
- } catch (Exception e) {
- logger.error("{}: cannot start topic-source {} because of {}", this,
- source, e.getMessage(), e);
- }
- }
-
- /* Start Policy Engine owned (unmanaged) sinks */
-
- for (TopicSink sink: this.sinks) {
- try {
- if (!sink.start())
- success = false;
- } catch (Exception e) {
- logger.error("{}: cannot start topic-sink {} because of {}", this,
- sink, e.getMessage(), e);
- }
- }
-
- /* Start Policy Controllers */
-
- List<PolicyController> controllers = PolicyController.factory.inventory();
- for (PolicyController controller : controllers) {
- try {
- if (!controller.start())
- success = false;
- } catch (Exception e) {
- logger.error("{}: cannot start policy-controller {} because of {}", this,
- controller, e.getMessage(), e);
- success = false;
- }
- }
-
- /* Start managed Topic Endpoints */
-
- try {
- if (!TopicEndpoint.manager.start())
- success = false;
- } catch (IllegalStateException e) {
- logger.warn("{}: Topic Endpoint Manager is in an invalid state because of {}", this, e.getMessage(), e);
- }
-
-
- // Start the JMX listener
-
- PdpJmxListener.start();
-
- /* policy-engine dispatch after start hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.afterStart(this))
- return success;
- } catch (Exception e) {
- logger.error("{}: feature {} after-start failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return success;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized boolean stop() {
-
- /* policy-engine dispatch pre stop hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeStop(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} before-stop failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- /* stop regardless of the lock state */
-
- boolean success = true;
- if (!this.alive)
- return true;
-
- this.alive = false;
-
- List<PolicyController> controllers = PolicyController.factory.inventory();
- for (PolicyController controller : controllers) {
- try {
- if (!controller.stop())
- success = false;
- } catch (Exception e) {
- logger.error("{}: cannot stop policy-controller {} because of {}", this,
- controller, e.getMessage(), e);
- success = false;
- }
- }
-
- /* Stop Policy Engine owned (unmanaged) sources */
- for (TopicSource source: this.sources) {
- try {
- if (!source.stop())
- success = false;
- } catch (Exception e) {
- logger.error("{}: cannot start topic-source {} because of {}", this,
- source, e.getMessage(), e);
- }
- }
-
- /* Stop Policy Engine owned (unmanaged) sinks */
- for (TopicSink sink: this.sinks) {
- try {
- if (!sink.stop())
- success = false;
- } catch (Exception e) {
- logger.error("{}: cannot start topic-sink {} because of {}", this,
- sink, e.getMessage(), e);
- }
- }
-
- /* stop all managed topics sources and sinks */
- if (!TopicEndpoint.manager.stop())
- success = false;
-
- /* stop all unmanaged http servers */
- for (HttpServletServer httpServer: this.httpServers) {
- try {
- if (!httpServer.stop())
- success = false;
- } catch (Exception e) {
- logger.error("{}: cannot start http-server {} because of {}", this,
- httpServer, e.getMessage(), e);
- }
- }
-
- /* policy-engine dispatch pre stop hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.afterStop(this))
- return success;
- } catch (Exception e) {
- logger.error("{}: feature {} after-stop failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return success;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized void shutdown() throws IllegalStateException {
-
- /* policy-engine dispatch pre shutdown hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeShutdown(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} before-shutdown failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- this.alive = false;
-
- /* Shutdown Policy Engine owned (unmanaged) sources */
- for (TopicSource source: this.sources) {
- try {
- source.shutdown();
- } catch (Exception e) {
- logger.error("{}: cannot shutdown topic-source {} because of {}", this,
- source, e.getMessage(), e);
- }
- }
-
- /* Shutdown Policy Engine owned (unmanaged) sinks */
- for (TopicSink sink: this.sinks) {
- try {
- sink.shutdown();
- } catch (Exception e) {
- logger.error("{}: cannot shutdown topic-sink {} because of {}", this,
- sink, e.getMessage(), e);
- }
- }
-
- /* Shutdown managed resources */
- PolicyController.factory.shutdown();
- TopicEndpoint.manager.shutdown();
- HttpServletServer.factory.destroy();
-
- // Stop the JMX listener
-
- PdpJmxListener.stop();
-
- /* policy-engine dispatch post shutdown hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.afterShutdown(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} after-shutdown failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
-
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- Thread.sleep(5000L);
- } catch (InterruptedException e) {
- logger.warn("{}: interrupted-exception while shutting down management server: ", this);
- }
-
- /* shutdown all unmanaged http servers */
- for (HttpServletServer httpServer: getHttpServers()) {
- try {
- httpServer.shutdown();
- } catch (Exception e) {
- logger.error("{}: cannot shutdown http-server {} because of {}", this,
- httpServer, e.getMessage(), e);
- }
- }
-
- try {
- Thread.sleep(5000L);
- } catch (InterruptedException e) {
- logger.warn("{}: interrupted-exception while shutting down management server: ", this);
- }
-
- System.exit(0);
- }
- }).start();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized boolean isAlive() {
- return this.alive;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized boolean lock() {
-
- /* policy-engine dispatch pre lock hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeLock(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} before-lock failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- if (this.locked)
- return true;
-
- this.locked = true;
-
- boolean success = true;
- List<PolicyController> controllers = PolicyController.factory.inventory();
- for (PolicyController controller : controllers) {
- try {
- success = controller.lock() && success;
- } catch (Exception e) {
- logger.error("{}: cannot lock policy-controller {} because of {}", this,
- controller, e.getMessage(), e);
- success = false;
- }
- }
-
- success = TopicEndpoint.manager.lock() && success;
-
- /* policy-engine dispatch post lock hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.afterLock(this))
- return success;
- } catch (Exception e) {
- logger.error("{}: feature {} after-lock failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return success;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized boolean unlock() {
-
- /* policy-engine dispatch pre unlock hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeUnlock(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} before-unlock failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- if (!this.locked)
- return true;
-
- this.locked = false;
-
- boolean success = true;
- List<PolicyController> controllers = PolicyController.factory.inventory();
- for (PolicyController controller : controllers) {
- try {
- success = controller.unlock() && success;
- } catch (Exception e) {
- logger.error("{}: cannot unlock policy-controller {} because of {}", this,
- controller, e.getMessage(), e);
- success = false;
- }
- }
-
- success = TopicEndpoint.manager.unlock() && success;
-
- /* policy-engine dispatch after unlock hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.afterUnlock(this))
- return success;
- } catch (Exception e) {
- logger.error("{}: feature {} after-unlock failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return success;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized boolean isLocked() {
- return this.locked;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void removePolicyController(String name) {
- PolicyController.factory.destroy(name);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void removePolicyController(PolicyController controller) {
- PolicyController.factory.destroy(controller);
- }
-
- /**
- * {@inheritDoc}
- */
- @JsonIgnore
- @Override
- public List<PolicyController> getPolicyControllers() {
- return PolicyController.factory.inventory();
- }
-
- /**
- * {@inheritDoc}
- */
- @JsonProperty("controllers")
- @Override
- public List<String> getPolicyControllerIds() {
- List<String> controllerNames = new ArrayList<String>();
- for (PolicyController controller: PolicyController.factory.inventory()) {
- controllerNames.add(controller.getName());
- }
- return controllerNames;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- @JsonIgnore
- public Properties getProperties() {
- return this.properties;
- }
-
-
- /**
- * {@inheritDoc}
- */
- @SuppressWarnings("unchecked")
- @Override
- public List<TopicSource> getSources() {
- return (List<TopicSource>) this.sources;
- }
-
- /**
- * {@inheritDoc}
- */
- @SuppressWarnings("unchecked")
- @Override
- public List<TopicSink> getSinks() {
- return (List<TopicSink>) this.sinks;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<HttpServletServer> getHttpServers() {
- return this.httpServers;
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<String> getFeatures() {
- List<String> features = new ArrayList<String>();
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- features.add(feature.getName());
- }
- return features;
- }
-
- /**
- * {@inheritDoc}
- */
- @JsonIgnore
- @Override
- public List<PolicyEngineFeatureAPI> getFeatureProviders() {
- return PolicyEngineFeatureAPI.providers.getList();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PolicyEngineFeatureAPI getFeatureProvider(String featureName) throws IllegalArgumentException {
- if (featureName == null || featureName.isEmpty())
- throw new IllegalArgumentException("A feature name must be provided");
-
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- if (feature.getName().equals(featureName))
- return feature;
- }
-
- throw new IllegalArgumentException("Invalid Feature Name: " + featureName);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onTopicEvent(CommInfrastructure commType, String topic, String event) {
- /* configuration request */
- try {
- PdpdConfiguration configuration = this.decoder.fromJson(event, PdpdConfiguration.class);
- this.configure(configuration);
- } catch (Exception e) {
- logger.error("{}: configuration-error due to {} because of {}",
- this, event, e.getMessage(), e);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean deliver(String topic, Object event)
- throws IllegalArgumentException, IllegalStateException {
-
- /*
- * Note this entry point is usually from the DRL
- */
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid Topic");
-
- if (event == null)
- throw new IllegalArgumentException("Invalid Event");
-
- if (!this.isAlive())
- throw new IllegalStateException("Policy Engine is stopped");
-
- if (this.isLocked())
- throw new IllegalStateException("Policy Engine is locked");
-
- List<? extends TopicSink> sinks =
- TopicEndpoint.manager.getTopicSinks(topic);
- if (sinks == null || sinks.isEmpty() || sinks.size() > 1)
- throw new IllegalStateException
- ("Cannot ensure correct delivery on topic " + topic + ": " + sinks);
-
- return this.deliver(sinks.get(0).getTopicCommInfrastructure(),
- topic, event);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean deliver(String busType, String topic, Object event)
- throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException {
-
- /*
- * Note this entry point is usually from the DRL (one of the reasons
- * busType is String.
- */
-
- if (busType == null || busType.isEmpty())
- throw new IllegalArgumentException
- ("Invalid Communication Infrastructure");
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid Topic");
-
- if (event == null)
- throw new IllegalArgumentException("Invalid Event");
-
- boolean valid = false;
- for (Topic.CommInfrastructure comm: Topic.CommInfrastructure.values()) {
- if (comm.name().equals(busType)) {
- valid = true;
- }
- }
-
- if (!valid)
- throw new IllegalArgumentException
- ("Invalid Communication Infrastructure: " + busType);
-
-
- if (!this.isAlive())
- throw new IllegalStateException("Policy Engine is stopped");
-
- if (this.isLocked())
- throw new IllegalStateException("Policy Engine is locked");
-
-
- return this.deliver(Topic.CommInfrastructure.valueOf(busType),
- topic, event);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean deliver(Topic.CommInfrastructure busType,
- String topic, Object event)
- throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException {
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid Topic");
-
- if (event == null)
- throw new IllegalArgumentException("Invalid Event");
-
- if (!this.isAlive())
- throw new IllegalStateException("Policy Engine is stopped");
-
- if (this.isLocked())
- throw new IllegalStateException("Policy Engine is locked");
-
- /* Try to send through the controller, this is the
- * preferred way, since it may want to apply additional
- * processing
- */
- try {
- DroolsController droolsController =
- EventProtocolCoder.manager.getDroolsController(topic, event);
- PolicyController controller = PolicyController.factory.get(droolsController);
- if (controller != null)
- return controller.deliver(busType, topic, event);
- } catch (Exception e) {
- logger.warn("{}: cannot find policy-controller to deliver {} over {}:{} because of {}",
- this, event, busType, topic, e.getMessage(), e);
-
- /* continue (try without routing through the controller) */
- }
-
- /*
- * cannot route through the controller, send directly through
- * the topic sink
- */
- try {
- String json = EventProtocolCoder.manager.encode(topic, event);
- return this.deliver(busType, topic, json);
-
- } catch (Exception e) {
- logger.warn("{}: cannot deliver {} over {}:{} because of {}",
- this, event, busType, topic, e.getMessage(), e);
- throw e;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean deliver(Topic.CommInfrastructure busType,
- String topic, String event)
- throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException {
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid Topic");
-
- if (event == null || event.isEmpty())
- throw new IllegalArgumentException("Invalid Event");
-
- if (!this.isAlive())
- throw new IllegalStateException("Policy Engine is stopped");
-
- if (this.isLocked())
- throw new IllegalStateException("Policy Engine is locked");
-
- try {
- TopicSink sink =
- TopicEndpoint.manager.getTopicSink
- (busType, topic);
-
- if (sink == null)
- throw new IllegalStateException("Inconsistent State: " + this);
-
- return sink.send(event);
-
- } catch (Exception e) {
- logger.warn("{}: cannot deliver {} over {}:{} because of {}",
- this, event, busType, topic, e.getMessage(), e);
- throw e;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized void activate() {
-
- /* policy-engine dispatch pre activate hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeActivate(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} before-activate failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- // activate 'policy-management'
- for (PolicyController policyController : getPolicyControllers()) {
- try {
- policyController.unlock();
- policyController.start();
- } catch (Exception e) {
- logger.error("{}: cannot activate of policy-controller {} because of {}",
- this, policyController,e.getMessage(), e);
- } catch (LinkageError e) {
- logger.error("{}: cannot activate (rules compilation) of policy-controller {} because of {}",
- this, policyController,e.getMessage(), e);
- }
- }
-
- this.unlock();
-
- /* policy-engine dispatch post activate hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.afterActivate(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} after-activate failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized void deactivate() {
-
- /* policy-engine dispatch pre deactivate hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeDeactivate(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} before-deactivate failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- this.lock();
-
- for (PolicyController policyController : getPolicyControllers()) {
- try {
- policyController.stop();
- } catch (Exception e) {
- logger.error("{}: cannot deactivate (stop) policy-controller {} because of {}",
- this, policyController, e.getMessage(), e);
- } catch (LinkageError e) {
- logger.error("{}: cannot deactivate (stop) policy-controller {} because of {}",
- this, policyController, e.getMessage(), e);
- }
- }
-
- /* policy-engine dispatch post deactivate hook */
- for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
- try {
- if (feature.afterDeactivate(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} after-deactivate failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("PolicyEngineManager [alive=").append(alive).append(", locked=").append(locked).append("]");
- return builder.toString();
- }
-
-}
-
-
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/internal/AggregatedPolicyController.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/internal/AggregatedPolicyController.java
deleted file mode 100644
index f0491624..00000000
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/internal/AggregatedPolicyController.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-management
- * ================================================================================
- * Copyright (C) 2017 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.openecomp.policy.drools.system.internal;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Properties;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.openecomp.policy.drools.controller.DroolsController;
-import org.openecomp.policy.drools.event.comm.Topic;
-import org.openecomp.policy.drools.event.comm.TopicEndpoint;
-import org.openecomp.policy.drools.event.comm.TopicListener;
-import org.openecomp.policy.drools.event.comm.TopicSink;
-import org.openecomp.policy.drools.event.comm.TopicSource;
-import org.openecomp.policy.drools.features.PolicyControllerFeatureAPI;
-import org.openecomp.policy.drools.persistence.SystemPersistence;
-import org.openecomp.policy.drools.properties.PolicyProperties;
-import org.openecomp.policy.drools.protocol.configuration.DroolsConfiguration;
-import org.openecomp.policy.drools.system.PolicyController;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
-/**
- * This implementation of the Policy Controller merely aggregates and tracks for
- * management purposes all underlying resources that this controller depends upon.
- */
-public class AggregatedPolicyController implements PolicyController,
- TopicListener {
-
- /**
- * Logger
- */
- private static Logger logger = LoggerFactory.getLogger(AggregatedPolicyController.class);
-
- /**
- * identifier for this policy controller
- */
- protected final String name;
-
- /**
- * Abstracted Event Sources List regardless communication
- * technology
- */
- protected final List<? extends TopicSource> sources;
-
- /**
- * Abstracted Event Sinks List regardless communication
- * technology
- */
- protected final List<? extends TopicSink> sinks;
-
- /**
- * Mapping topics to sinks
- */
- @JsonIgnore
- protected final HashMap<String, TopicSink> topic2Sinks =
- new HashMap<String, TopicSink>();
-
- /**
- * Is this Policy Controller running (alive) ?
- * reflects invocation of start()/stop() only
- */
- protected volatile boolean alive;
-
- /**
- * Is this Policy Controller locked ?
- * reflects if i/o controller related operations and start
- * are permitted,
- * more specifically: start(), deliver() and onTopicEvent().
- * It does not affect the ability to stop the
- * underlying drools infrastructure
- */
- protected volatile boolean locked;
-
- /**
- * Policy Drools Controller
- */
- protected volatile DroolsController droolsController;
-
- /**
- * Properties used to initialize controller
- */
- protected final Properties properties;
-
- /**
- * Constructor version mainly used for bootstrapping at initialization time
- * a policy engine controller
- *
- * @param name controller name
- * @param properties
- *
- * @throws IllegalArgumentException when invalid arguments are provided
- */
- public AggregatedPolicyController(String name, Properties properties)
- throws IllegalArgumentException {
-
- this.name = name;
-
- /*
- * 1. Register read topics with network infrastructure (ueb, dmaap, rest)
- * 2. Register write topics with network infrastructure (ueb, dmaap, rest)
- * 3. Register with drools infrastructure
- */
-
- // Create/Reuse Readers/Writers for all event sources endpoints
-
- this.sources = TopicEndpoint.manager.addTopicSources(properties);
- this.sinks = TopicEndpoint.manager.addTopicSinks(properties);
-
- initDrools(properties);
- initSinks();
-
- /* persist new properties */
- SystemPersistence.manager.storeController(name, properties);
- this.properties = properties;
- }
-
- /**
- * initialize drools layer
- * @throws IllegalArgumentException if invalid parameters are passed in
- */
- protected void initDrools(Properties properties) throws IllegalArgumentException {
- try {
- // Register with drools infrastructure
- this.droolsController = DroolsController.factory.build(properties, sources, sinks);
- } catch (Exception | LinkageError e) {
- logger.error("{}: cannot init-drools because of {}", this, e.getMessage(), e);
- throw new IllegalArgumentException(e);
- }
- }
-
- /**
- * initialize sinks
- * @throws IllegalArgumentException if invalid parameters are passed in
- */
- protected void initSinks() throws IllegalArgumentException {
- this.topic2Sinks.clear();
- for (TopicSink sink: sinks) {
- this.topic2Sinks.put(sink.getTopic(), sink);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean updateDrools(DroolsConfiguration newDroolsConfiguration) {
-
- DroolsConfiguration oldDroolsConfiguration =
- new DroolsConfiguration(this.droolsController.getArtifactId(),
- this.droolsController.getGroupId(),
- this.droolsController.getVersion());
-
- if (oldDroolsConfiguration.getGroupId().equalsIgnoreCase(newDroolsConfiguration.getGroupId()) &&
- oldDroolsConfiguration.getArtifactId().equalsIgnoreCase(newDroolsConfiguration.getArtifactId()) &&
- oldDroolsConfiguration.getVersion().equalsIgnoreCase(newDroolsConfiguration.getVersion())) {
- logger.warn("{}: cannot update-drools: identical configuration {} vs {}",
- this, oldDroolsConfiguration, newDroolsConfiguration);
- return true;
- }
-
- try {
- /* Drools Controller created, update initialization properties for restarts */
-
- this.properties.setProperty(PolicyProperties.RULES_GROUPID, newDroolsConfiguration.getGroupId());
- this.properties.setProperty(PolicyProperties.RULES_ARTIFACTID, newDroolsConfiguration.getArtifactId());
- this.properties.setProperty(PolicyProperties.RULES_VERSION, newDroolsConfiguration.getVersion());
-
- SystemPersistence.manager.storeController(name, this.properties);
-
- this.initDrools(this.properties);
-
- /* set drools controller to current locked status */
-
- if (this.isLocked())
- this.droolsController.lock();
- else
- this.droolsController.unlock();
-
- /* set drools controller to current alive status */
-
- if (this.isAlive())
- this.droolsController.start();
- else
- this.droolsController.stop();
-
- } catch (IllegalArgumentException e) {
- logger.error("{}: cannot update-drools because of {}", this, e.getMessage(), e);
- return false;
- }
-
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getName() {
- return this.name;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean start() throws IllegalStateException {
- logger.info("{}: start", this);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeStart(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} before-start failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- if (this.isLocked())
- throw new IllegalStateException("Policy Controller " + name + " is locked");
-
- synchronized(this) {
- if (this.alive)
- return true;
-
- this.alive = true;
- }
-
- boolean success = this.droolsController.start();
-
- // register for events
-
- for (TopicSource source: sources) {
- source.register(this);
- }
-
- for (TopicSink sink: sinks) {
- try {
- sink.start();
- } catch (Exception e) {
- logger.error("{}: cannot start {} because of {}",
- this, sink, e.getMessage(), e);
- }
- }
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.afterStart(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} after-start failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return success;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean stop() {
- logger.info("{}: stop", this);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeStop(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} before-stop failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- /* stop regardless locked state */
-
- synchronized(this) {
- if (!this.alive)
- return true;
-
- this.alive = false;
- }
-
- // 1. Stop registration
-
- for (TopicSource source: sources) {
- source.unregister(this);
- }
-
- boolean success = this.droolsController.stop();
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.afterStop(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} after-stop failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return success;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void shutdown() throws IllegalStateException {
- logger.info("{}: shutdown", this);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeShutdown(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} before-shutdown failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- this.stop();
-
- DroolsController.factory.shutdown(this.droolsController);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.afterShutdown(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} after-shutdown failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void halt() throws IllegalStateException {
- logger.info("{}: halt", this);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeHalt(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} before-halt failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- this.stop();
- DroolsController.factory.destroy(this.droolsController);
- SystemPersistence.manager.deleteController(this.name);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.afterHalt(this))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} after-halt failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onTopicEvent(Topic.CommInfrastructure commType,
- String topic, String event) {
-
- if (logger.isDebugEnabled())
- logger.debug("{}: event offered from {}:{}: {}", this, commType, topic, event);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeOffer(this, commType, topic, event))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} before-offer failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- if (this.locked)
- return;
-
- if (!this.alive)
- return;
-
- boolean success = this.droolsController.offer(topic, event);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.afterOffer(this, commType, topic, event, success))
- return;
- } catch (Exception e) {
- logger.error("{}: feature {} after-offer failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean deliver(Topic.CommInfrastructure commType,
- String topic, Object event)
- throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException {
-
- if (logger.isDebugEnabled())
- logger.debug("{}: deliver event to {}:{}: {}", this, commType, topic, event);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeDeliver(this, commType, topic, event))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} before-deliver failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- if (topic == null || topic.isEmpty())
- throw new IllegalArgumentException("Invalid Topic");
-
- if (event == null)
- throw new IllegalArgumentException("Invalid Event");
-
- if (!this.isAlive())
- throw new IllegalStateException("Policy Engine is stopped");
-
- if (this.isLocked())
- throw new IllegalStateException("Policy Engine is locked");
-
- if (!this.topic2Sinks.containsKey(topic)) {
- logger.warn("{}: cannot deliver event because the sink {}:{} is not registered: {}",
- this, commType, topic, event);
- throw new IllegalArgumentException("Unsuported topic " + topic + " for delivery");
- }
-
- boolean success = this.droolsController.deliver(this.topic2Sinks.get(topic), event);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.afterDeliver(this, commType, topic, event, success))
- return success;
- } catch (Exception e) {
- logger.error("{}: feature {} after-deliver failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return success;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isAlive() {
- return this.alive;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean lock() {
- logger.info("{}: lock", this);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeLock(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} before-lock failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- synchronized(this) {
- if (this.locked)
- return true;
-
- this.locked = true;
- }
-
- // it does not affect associated sources/sinks, they are
- // autonomous entities
-
- boolean success = this.droolsController.lock();
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.afterLock(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} after-lock failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return success;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean unlock() {
-
- logger.info("{}: unlock", this);
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.beforeUnlock(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} before-unlock failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- synchronized(this) {
- if (!this.locked)
- return true;
-
- this.locked = false;
- }
-
- boolean success = this.droolsController.unlock();
-
- for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
- try {
- if (feature.afterUnlock(this))
- return true;
- } catch (Exception e) {
- logger.error("{}: feature {} after-unlock failure because of {}",
- this, feature.getClass().getName(), e.getMessage(), e);
- }
- }
-
- return success;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isLocked() {
- return this.locked;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<? extends TopicSource> getTopicSources() {
- return this.sources;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public List<? extends TopicSink> getTopicSinks() {
- return this.sinks;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public DroolsController getDrools() {
- return this.droolsController;
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- @JsonIgnore
- public Properties getProperties() {
- return this.properties;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("AggregatedPolicyController [name=").append(name).append(", alive=").append(alive).append(", locked=").append(locked)
- .append(", droolsController=").append(droolsController).append("]");
- return builder.toString();
- }
-
-}
-