diff options
author | Straubs, Ralph (rs8887) <rs8887@att.com> | 2019-10-28 07:49:56 -0500 |
---|---|---|
committer | Straubs, Ralph (rs8887) <rs8887@att.com> | 2019-10-31 03:56:14 -0500 |
commit | f9e71ded2e39d6a21952bc1670ec4947d8c47d00 (patch) | |
tree | 2d56e16e8c29a283a8139a388ffa623b3a7db816 /feature-drools-init | |
parent | 21523fd8fcf5e266ace45988890ab9a8b3fab930 (diff) |
Provide a way to trigger Drools rules when an update occurs
An instance of 'DroolsInitFeature.Init' is inserted into a Drools
session when it is initialized, updated, or restored from
persistent data. This provides an opportunity to catch more
initialization scenarios than you can with an empty 'when' clause.
Updates:
1) Change 'DroolsInitFeature' to use Policy Engine scheduled executor
2) Add new test to 'DroolsInitFeatureTest' to verify that the 'Init'
object is inserted into and deleted from Drools memory
3) Remove trailing spaces
Issue-ID: POLICY-1948
Change-Id: I4748c2415c4563e98b4a53d573c9ebe1e96e8e34
Signed-off-by: Straubs, Ralph (rs8887) <rs8887@att.com>
Diffstat (limited to 'feature-drools-init')
5 files changed, 360 insertions, 0 deletions
diff --git a/feature-drools-init/pom.xml b/feature-drools-init/pom.xml new file mode 100644 index 00000000..6694d8a5 --- /dev/null +++ b/feature-drools-init/pom.xml @@ -0,0 +1,86 @@ +<!-- + ============LICENSE_START======================================================= + ONAP Policy Engine - Drools PDP + ================================================================================ + Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ============LICENSE_END========================================================= + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.onap.policy.drools-pdp</groupId> + <artifactId>drools-pdp</artifactId> + <version>1.6.0-SNAPSHOT</version> + </parent> + + <artifactId>feature-drools-init</artifactId> + <name>feature-drools-init</name> + + <build> + <plugins> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <executions> + <execution> + <id>zipfile</id> + <goals> + <goal>single</goal> + </goals> + <phase>package</phase> + <configuration> + <attach>true</attach> + <finalName>${project.artifactId}-${project.version}</finalName> + <descriptors> + <descriptor>src/assembly/assemble_zip.xml</descriptor> + </descriptors> + <appendAssemblyId>false</appendAssemblyId> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.onap.policy.drools-pdp</groupId> + <artifactId>policy-core</artifactId> + <version>${project.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.onap.policy.drools-pdp</groupId> + <artifactId>policy-management</artifactId> + <version>${project.version}</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>org.powermock</groupId> + <artifactId>powermock-api-mockito</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> diff --git a/feature-drools-init/src/assembly/assemble_zip.xml b/feature-drools-init/src/assembly/assemble_zip.xml new file mode 100644 index 00000000..948cb11c --- /dev/null +++ b/feature-drools-init/src/assembly/assemble_zip.xml @@ -0,0 +1,76 @@ +<!-- + ============LICENSE_START======================================================= + feature-drools-init + ================================================================================ + Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ============LICENSE_END========================================================= + --> + +<!-- Defines how we build the .zip file which is our distribution. --> + +<assembly + xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> + + <id>feature-drools-init-package</id> + <formats> + <format>zip</format> + </formats> + + <includeBaseDirectory>false</includeBaseDirectory> + + <fileSets> + <fileSet> + <directory>target</directory> + <outputDirectory>lib/feature</outputDirectory> + <includes> + <include>feature-drools-init-${project.version}.jar</include> + </includes> + </fileSet> + <fileSet> + <directory>target/assembly/lib</directory> + <outputDirectory>lib/dependencies</outputDirectory> + <includes> + <include>*.jar</include> + </includes> + </fileSet> + <fileSet> + <directory>src/main/feature/config</directory> + <outputDirectory>config</outputDirectory> + <fileMode>0644</fileMode> + <excludes/> + </fileSet> + <fileSet> + <directory>src/main/feature/bin</directory> + <outputDirectory>bin</outputDirectory> + <fileMode>0744</fileMode> + <excludes/> + </fileSet> + <fileSet> + <directory>src/main/feature/db</directory> + <outputDirectory>db</outputDirectory> + <fileMode>0744</fileMode> + <excludes/> + </fileSet> + <fileSet> + <directory>src/main/feature/install</directory> + <outputDirectory>install</outputDirectory> + <fileMode>0744</fileMode> + <excludes/> + </fileSet> + </fileSets> + +</assembly> diff --git a/feature-drools-init/src/main/java/org/onap/policy/drools/droolsinit/DroolsInitFeature.java b/feature-drools-init/src/main/java/org/onap/policy/drools/droolsinit/DroolsInitFeature.java new file mode 100644 index 00000000..b3b8485c --- /dev/null +++ b/feature-drools-init/src/main/java/org/onap/policy/drools/droolsinit/DroolsInitFeature.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * feature-drools-init + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.droolsinit; + +import java.io.Serializable; +import java.util.concurrent.TimeUnit; +import org.kie.api.runtime.rule.FactHandle; + +import org.onap.policy.drools.core.PolicySession; +import org.onap.policy.drools.core.PolicySessionFeatureApi; +import org.onap.policy.drools.system.PolicyEngineConstants; + +/** + * This feature inserts an object of class 'DroolsInitFeature.Init' into + * every newly-created or updated Drools session, including those that were + * initialized with persistent data. Rules matching on objects of this type + * can then do things like initialize global data. + */ +public class DroolsInitFeature implements PolicySessionFeatureApi { + // default delay is 10 minutes + private static final long DELAY = 600000L; + + /** + * {@inheritDoc}. + */ + @Override + public int getSequenceNumber() { + return 0; + } + + /** + * {@inheritDoc}. + */ + @Override + public PolicySession.ThreadModel selectThreadModel(PolicySession policySession) { + new Init(policySession); + return null; + } + + /** + * Instances of this class are inserted into Drools memory. + */ + public static class Init implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * Place this instance in Drools memory, and then remove it after + * one minute, if it is still there. + * + * @param policySession the associated session + */ + public Init(final PolicySession policySession) { + // insert this instance into Drools memory + final FactHandle factHandle = policySession.getKieSession().insert(this); + + // after 10 minutes, remove the object from Drools memory (if needed) + PolicyEngineConstants.getManager().getExecutorService().schedule( + new Runnable() { + @Override + public void run() { + if (policySession.getKieSession().getObject(factHandle) != null) { + // object has not been removed by application -- remove it here + policySession.getKieSession().delete(factHandle); + } + } + }, DELAY, TimeUnit.MILLISECONDS); + } + } +} diff --git a/feature-drools-init/src/main/resources/META-INF/services/org.onap.policy.drools.core.PolicySessionFeatureApi b/feature-drools-init/src/main/resources/META-INF/services/org.onap.policy.drools.core.PolicySessionFeatureApi new file mode 100644 index 00000000..9c088eee --- /dev/null +++ b/feature-drools-init/src/main/resources/META-INF/services/org.onap.policy.drools.core.PolicySessionFeatureApi @@ -0,0 +1 @@ +org.onap.policy.drools.droolsinit.DroolsInitFeature diff --git a/feature-drools-init/src/test/java/org/onap/policy/drools/droolsinit/DroolsInitFeatureTest.java b/feature-drools-init/src/test/java/org/onap/policy/drools/droolsinit/DroolsInitFeatureTest.java new file mode 100644 index 00000000..36e64960 --- /dev/null +++ b/feature-drools-init/src/test/java/org/onap/policy/drools/droolsinit/DroolsInitFeatureTest.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * feature-drools-init + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.droolsinit; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.kie.api.runtime.KieSession; +import org.kie.api.runtime.rule.FactHandle; +import org.onap.policy.drools.core.PolicySession; +import org.onap.policy.drools.system.PolicyEngineConstants; +import org.powermock.reflect.Whitebox; + +public class DroolsInitFeatureTest { + private static final String POLICY_ENGINE_EXECUTOR_FIELD = "executorService"; + private static ScheduledExecutorService saveExec; + private static PolicySession policySession; + private static KieSession kieSession; + + private DroolsInitFeature feature; + + /** + * Class-level initialization. + */ + @BeforeClass + public static void setUpBeforeClass() { + saveExec = Whitebox.getInternalState(PolicyEngineConstants.getManager(), POLICY_ENGINE_EXECUTOR_FIELD); + + policySession = mock(PolicySession.class); + kieSession = mock(KieSession.class); + when(policySession.getKieSession()).thenReturn(kieSession); + } + + /** + * Restore 'PolicyEngineConstants.manager'. + */ + @AfterClass + public static void cleanup() { + Whitebox.setInternalState(PolicyEngineConstants.getManager(), POLICY_ENGINE_EXECUTOR_FIELD, saveExec); + } + + @Before + public void setUp() { + feature = new DroolsInitFeature(); + } + + @Test + public void getSequenceNumberTest() { + assertEquals(0, feature.getSequenceNumber()); + } + + @Test + public void selectThreadModelTest() { + assertNull(feature.selectThreadModel(policySession)); + } + + @Test + public void initTest() { + FactHandle factHandle = mock(FactHandle.class); + when(kieSession.insert(any())).thenReturn(factHandle); + when(kieSession.getObject(factHandle)).thenReturn(new Object()); + + // dummy 'ScheduledExecutorService' -- 'schedule' runs immediately + ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(3) { + @Override + public ScheduledFuture<?> schedule(Runnable runnable, long delay, TimeUnit unit) { + runnable.run(); + return null; + } + }; + + Whitebox.setInternalState(PolicyEngineConstants.getManager(), POLICY_ENGINE_EXECUTOR_FIELD, executorService); + + // triggers creation of 'DroolsInitFeature.Init' + feature.selectThreadModel(policySession); + + // prove that the 'delete' code ran + verify(kieSession).delete(factHandle); + } +} |