Retaining context in APEX Engine based on policies received in PdpUpdate 13/98313/2
authora.sreekumar <ajith.sreekumar@est.tech>
Tue, 5 Nov 2019 14:37:09 +0000 (14:37 +0000)
committera.sreekumar <ajith.sreekumar@est.tech>
Thu, 14 Nov 2019 12:15:55 +0000 (12:15 +0000)
Change-Id: I73fad5bf76ed6b4979f5ab76013f204ea82da30b
Issue-ID: POLICY-2215
Signed-off-by: a.sreekumar <ajith.sreekumar@est.tech>
25 files changed:
context/context-management/src/main/java/org/onap/policy/apex/context/Distributor.java
context/context-management/src/main/java/org/onap/policy/apex/context/impl/distribution/AbstractDistributor.java
core/core-engine/pom.xml
core/core-engine/src/main/java/org/onap/policy/apex/core/engine/context/ApexInternalContext.java
core/core-engine/src/main/java/org/onap/policy/apex/core/engine/engine/ApexEngine.java
core/core-engine/src/main/java/org/onap/policy/apex/core/engine/engine/impl/ApexEngineImpl.java
core/core-engine/src/test/java/org/onap/policy/apex/core/engine/context/ApexInternalContextTest.java
core/core-engine/src/test/java/org/onap/policy/apex/core/engine/engine/impl/ApexEngineImplTest.java
examples/examples-aadm/src/test/java/org/onap/policy/apex/examples/aadm/AadmUseCaseTest.java
examples/examples-adaptive/src/test/java/org/onap/policy/apex/examples/adaptive/AnomalyDetectionTslUseCaseTest.java
examples/examples-adaptive/src/test/java/org/onap/policy/apex/examples/adaptive/AutoLearnTslUseCaseTest.java
examples/examples-myfirstpolicy/src/test/java/org/onap/policy/apex/examples/myfirstpolicy/MfpUseCaseTest.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexActivator.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/runtime/impl/EngineServiceImpl.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/runtime/impl/EngineWorker.java
services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameterHandler.java
services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/ApexEngineHandler.java
services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/PdpUpdateMessageHandler.java
testsuites/integration/integration-executor-test/pom.xml
testsuites/integration/integration-executor-test/src/test/java/org/onap/policy/apex/testsuites/integration/executor/engine/TestApexEngine.java
testsuites/integration/integration-executor-test/src/test/java/org/onap/policy/apex/testsuites/integration/executor/event/TestEventInstantiation.java
testsuites/integration/integration-executor-test/src/test/java/org/onap/policy/apex/testsuites/integration/executor/handling/TestContextUpdateDifferentModels.java
testsuites/integration/integration-executor-test/src/test/java/org/onap/policy/apex/testsuites/integration/executor/handling/TestContextUpdateModel.java
testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/adapt/restclient/TestExecutionPropertyRest.java

index a173138..4308323 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -75,10 +76,10 @@ public interface Distributor {
     /**
      * Remove a context album from a distributor.
      *
-     * @param contextAlbum The album to remove
+     * @param axContextAlbumKey The key of album to remove
      * @throws ContextException if the album cannot be removed
      */
-    void removeContextAlbum(AxContextAlbum contextAlbum) throws ContextException;
+    void removeContextAlbum(AxArtifactKey axContextAlbumKey) throws ContextException;
 
     /**
      * Flush all context albums owned by the distributor to the distribution mechanism.
index 49b0a66..1d73f58 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,7 +25,6 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-
 import org.onap.policy.apex.context.ContextAlbum;
 import org.onap.policy.apex.context.ContextException;
 import org.onap.policy.apex.context.Distributor;
@@ -210,16 +210,12 @@ public abstract class AbstractDistributor implements Distributor {
      * {@inheritDoc}.
      */
     @Override
-    public void removeContextAlbum(final AxContextAlbum contextAlbum) throws ContextException {
+    public void removeContextAlbum(final AxArtifactKey axContextAlbumKey) throws ContextException {
         synchronized (albumMaps) {
-            // Check if the map already exists, if not return
-            if (!albumMaps.containsKey(contextAlbum.getKey())) {
-                LOGGER.warn("map remove failed, supplied map is null");
+            // Remove the map from the distributor
+            if (null == albumMaps.remove(axContextAlbumKey)) {
                 throw new ContextException("map update failed, supplied map is null");
             }
-
-            // Remove the map from the distributor
-            albumMaps.remove(contextAlbum.getKey());
         }
     }
 
index fff6d52..b86fd50 100644 (file)
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <profiles>
index 3d6a724..0589e83 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 package org.onap.policy.apex.core.engine.context;
 
 import com.google.common.collect.Maps;
-
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NavigableMap;
 import java.util.Set;
 import java.util.TreeMap;
-
 import org.onap.policy.apex.context.ContextAlbum;
 import org.onap.policy.apex.context.ContextException;
 import org.onap.policy.apex.context.Distributor;
@@ -113,13 +112,24 @@ public class ApexInternalContext implements AxConceptGetter<ContextAlbum> {
      * in the new model.
      *
      * @param newPolicyModel The new incoming Apex model to use for context
+     * @param isSubsequentInstance if the current worker instance being updated is not the first one
      * @throws ContextException On errors on context setting
      */
-    public void update(final AxPolicyModel newPolicyModel) throws ContextException {
+    public void update(final AxPolicyModel newPolicyModel, boolean isSubsequentInstance) throws ContextException {
         if (newPolicyModel == null) {
             throw new ContextException("internal context update failed, supplied model is null");
         }
-
+        // context is shared between all the engine instances
+        // during model update context album only needs to be updated for the first instance.
+        // remaining engine instances can just copy the context
+        if (isSubsequentInstance) {
+            contextAlbums.clear();
+            for (AxArtifactKey contextAlbumKey : ModelService.getModel(AxContextAlbums.class).getAlbumsMap().keySet()) {
+                contextAlbums.put(contextAlbumKey, contextDistributor.createContextAlbum(contextAlbumKey));
+            }
+            key = newPolicyModel.getKey();
+            return;
+        }
         // Get the differences between the existing context and the new context
         final KeyedMapDifference<AxArtifactKey, AxContextAlbum> contextDifference =
                 new ContextComparer().compare(ModelService.getModel(AxContextAlbums.class), newPolicyModel.getAlbums());
@@ -143,11 +153,11 @@ public class ApexInternalContext implements AxConceptGetter<ContextAlbum> {
                         + newContextAlbum.getItemSchema().getId() + "\" on incoming model");
             }
         }
-        
+
         // Remove maps that are no longer used
         for (final Entry<AxArtifactKey, AxContextAlbum> removedContextAlbumEntry : contextDifference.getLeftOnly()
                 .entrySet()) {
-            contextDistributor.removeContextAlbum(removedContextAlbumEntry.getValue());
+            contextDistributor.removeContextAlbum(removedContextAlbumEntry.getKey());
             contextAlbums.remove(removedContextAlbumEntry.getKey());
         }
 
@@ -156,6 +166,11 @@ public class ApexInternalContext implements AxConceptGetter<ContextAlbum> {
 
         // Set up the new context albums
         for (final AxArtifactKey contextAlbumKey : contextDifference.getRightOnly().keySet()) {
+            // In case if a context album is part of previous and current model, but needs to be cleared
+            // for example, due to a major version change
+            if (contextAlbums.containsKey(contextAlbumKey)) {
+                contextDistributor.removeContextAlbum(contextAlbumKey);
+            }
             contextAlbums.put(contextAlbumKey, contextDistributor.createContextAlbum(contextAlbumKey));
         }
 
index 2c5167d..4c41663 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +22,6 @@
 package org.onap.policy.apex.core.engine.engine;
 
 import java.util.Map;
-
 import org.onap.policy.apex.core.engine.event.EnEvent;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
@@ -49,9 +49,10 @@ public interface ApexEngine {
      * transferred if there is common context in the old and new models.
      *
      * @param apexModel the apex model
+     * @param isSubsequentInstance if the current worker instance being updated is not the first one
      * @throws ApexException on model update errors
      */
-    void updateModel(AxPolicyModel apexModel) throws ApexException;
+    void updateModel(AxPolicyModel apexModel, boolean isSubsequentInstance) throws ApexException;
 
     /**
      * Starts an Apex engine so that it can receive events.
index 87ce123..9cbd205 100644 (file)
@@ -26,7 +26,6 @@ import static org.onap.policy.common.utils.validation.Assertions.argumentNotNull
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-
 import org.onap.policy.apex.context.ContextAlbum;
 import org.onap.policy.apex.context.ContextException;
 import org.onap.policy.apex.core.engine.context.ApexInternalContext;
@@ -105,7 +104,7 @@ public class ApexEngineImpl implements ApexEngine {
      * {@inheritDoc}.
      */
     @Override
-    public void updateModel(final AxPolicyModel apexModel) throws ApexException {
+    public void updateModel(final AxPolicyModel apexModel, final boolean isSubsequentInstance) throws ApexException {
         if (apexModel != null) {
             LOGGER.entry("updateModel()->" + key.getId() + ", apexPolicyModel=" + apexModel.getKey().getId());
         } else {
@@ -125,8 +124,8 @@ public class ApexEngineImpl implements ApexEngine {
                 /// New internal context
                 internalContext = new ApexInternalContext(apexModel);
             } else {
-                // Exiting internal context which must be updated
-                internalContext.update(apexModel);
+                // Existing internal context which must be updated
+                internalContext.update(apexModel, isSubsequentInstance);
             }
         } catch (final ContextException e) {
             LOGGER.warn(UPDATE_MODEL + key.getId() + ", error setting the context for engine \"" + key.getId() + "\"",
index a75ad37..3d0d377 100644 (file)
@@ -1,25 +1,27 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * 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.
- * 
+ *
  * SPDX-License-Identifier: Apache-2.0
  * ============LICENSE_END=========================================================
  */
 
 package org.onap.policy.apex.core.engine.context;
 
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -156,33 +158,23 @@ public class ApexInternalContextTest {
     @Test
     public void testAlbumUpdate() throws ContextException {
         ApexInternalContext context = new ApexInternalContext(policyModel);
-
-        try {
-            context.update(null);
-            fail("test should throw an exception");
-        } catch (ContextException ce) {
-            assertEquals("internal context update failed, supplied model is null", ce.getMessage());
-        }
+        assertThatThrownBy(() -> context.update(null, false))
+            .hasMessage("internal context update failed, supplied model is null");
 
         assertEquals(policyModel.getKey().getId(), context.getKey().getId());
         assertEquals(1, context.getContextAlbums().size());
 
-        try {
-            context.update(incompatiblePolicyModel);
-            fail("test should throw an exception here");
-        } catch (ContextException ce) {
-            assertEquals("internal context update failed on context album \"Album:0.0.1\" "
-                            + "in model \"PolicyModel:0.0.1\", "
-                            + "schema \"Schema:0.0.1\" on existing context model does not equal "
-                            + "schema \"IncompatibleSchema:0.0.1\" on incoming model", ce.getMessage());
-        }
+        assertThatThrownBy(() -> context.update(incompatiblePolicyModel, false)).hasMessage(
+            "internal context update failed on context album \"Album:0.0.1\" " + "in model \"PolicyModel:0.0.1\", "
+                + "schema \"Schema:0.0.1\" on existing context model does not equal "
+                + "schema \"IncompatibleSchema:0.0.1\" on incoming model");
 
         assertEquals(policyModel.getKey().getId(), context.getKey().getId());
 
-        context.update(newVersionPolicyModel);
+        context.update(newVersionPolicyModel, false);
         assertEquals(newVersionPolicyModel.getKey().getId(), context.getKey().getId());
 
-        context.update(newPolicyModel);
+        context.update(newPolicyModel, true);
         assertEquals(newPolicyModel.getKey().getId(), context.getKey().getId());
     }
 }
index 6d35adc..2663dfc 100644 (file)
@@ -1,25 +1,27 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * 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.
- * 
+ *
  * SPDX-License-Identifier: Apache-2.0
  * ============LICENSE_END=========================================================
  */
 
 package org.onap.policy.apex.core.engine.engine.impl;
 
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -30,7 +32,6 @@ import static org.junit.Assert.fail;
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.HashMap;
-
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -50,7 +51,6 @@ import org.onap.policy.apex.core.engine.event.EnEvent;
 import org.onap.policy.apex.core.engine.executor.StateMachineExecutor;
 import org.onap.policy.apex.core.engine.executor.exception.StateMachineException;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
-import org.onap.policy.apex.model.basicmodel.concepts.ApexRuntimeException;
 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
 import org.onap.policy.apex.model.basicmodel.concepts.AxReferenceKey;
 import org.onap.policy.apex.model.basicmodel.service.ModelService;
@@ -167,161 +167,79 @@ public class ApexEngineImplTest {
     }
 
     @Test
-    public void testSanity() {
+    public void testSanity() throws ApexException {
         AxArtifactKey engineKey = new AxArtifactKey("Engine:0.0.1");
         ApexEngineImpl engine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(engineKey);
         assertNotNull(engine);
         assertEquals(engineKey, engine.getKey());
 
-        try {
-            engine.start();
-            fail("test should throw an exception");
-        } catch (ApexException ae) {
-            assertEquals("start()<-Engine:0.0.1,STOPPED,  cannot start engine, "
-                            + "engine has not been initialized, its model is not loaded", ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.start()).hasMessage("start()<-Engine:0.0.1,STOPPED,  cannot start engine, "
+                            + "engine has not been initialized, its model is not loaded");
 
-        try {
-            engine.stop();
-            fail("test should throw an exception");
-        } catch (ApexException ae) {
-            assertEquals("stop()<-Engine:0.0.1,STOPPED, cannot stop engine, " + "engine is already stopped",
-                            ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.stop())
+            .hasMessage("stop()<-Engine:0.0.1,STOPPED, cannot stop engine, " + "engine is already stopped");
 
         assertEquals(AxEngineState.STOPPED, engine.getState());
         assertEquals(0, engine.getEngineContext().size());
         assertEquals(engineKey, engine.getEngineStatus().getKey());
         assertNull(engine.getInternalContext());
 
-        try {
-            engine.clear();
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.clear();
 
-        try {
-            engine.addEventListener(null, null);
-            fail("test should throw an exception");
-        } catch (ApexRuntimeException ae) {
-            assertEquals("addEventListener()<-Engine:0.0.1,STOPPED, listenerName is null", ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.addEventListener(null, null))
+            .hasMessage("addEventListener()<-Engine:0.0.1,STOPPED, listenerName is null");
 
-        try {
-            engine.addEventListener("myListener", null);
-            fail("test should throw an exception");
-        } catch (ApexRuntimeException ae) {
-            assertEquals("addEventListener()<-Engine:0.0.1,STOPPED, listener is null", ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.addEventListener("myListener", null))
+            .hasMessage("addEventListener()<-Engine:0.0.1,STOPPED, listener is null");
 
-        try {
-            engine.removeEventListener(null);
-            fail("test should throw an exception");
-        } catch (ApexRuntimeException ae) {
-            assertEquals("removeEventListener()<-Engine:0.0.1,STOPPED, listenerName is null", ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.removeEventListener(null))
+            .hasMessage("removeEventListener()<-Engine:0.0.1,STOPPED, listenerName is null");
 
-        try {
-            engine.addEventListener("myListener", new DummyListener());
-            engine.removeEventListener("myListener");
-        } catch (Exception e) {
-            fail("test should not throw an exception");
-        }
+        engine.addEventListener("myListener", new DummyListener());
+        engine.removeEventListener("myListener");
 
         assertNull(engine.createEvent(null));
 
         assertFalse(engine.handleEvent(null));
 
-        try {
-            engine.updateModel(null);
-            fail("test should throw an exception");
-        } catch (ApexException ae) {
-            assertEquals("updateModel()<-Engine:0.0.1, Apex model is not defined, it has a null value",
-                            ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.updateModel(null, false))
+            .hasMessage("updateModel()<-Engine:0.0.1, Apex model is not defined, it has a null value");
 
-        try {
-            engine.updateModel(policyModel);
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.updateModel(policyModel, false);
 
         // Force a context exception
         ModelService.registerModel(AxPolicyModel.class, new AxPolicyModel());
-        try {
-            engine.updateModel(incompatiblePolicyModel);
-            fail("test should throw an exception");
-        } catch (ApexException ae) {
-            assertEquals("updateModel()<-Engine:0.0.1, error setting the context for engine \"Engine:0.0.1\"",
-                            ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.updateModel(incompatiblePolicyModel, false))
+            .hasMessage("updateModel()<-Engine:0.0.1, error setting the context for engine \"Engine:0.0.1\"");
 
-        try {
-            engine.updateModel(policyModel);
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.updateModel(policyModel, false);
 
         assertNotNull(engine.getInternalContext());
         assertEquals(1, engine.getEngineContext().size());
 
-        try {
-            engine.start();
-            assertEquals(AxEngineState.READY, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.start();
+        assertEquals(AxEngineState.READY, engine.getState());
 
-        try {
-            engine.start();
-            fail("test should throw an exception");
-        } catch (ApexException ae) {
-            assertEquals("start()<-Engine:0.0.1,READY, cannot start engine, engine not in state STOPPED",
-                            ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.start())
+            .hasMessage("start()<-Engine:0.0.1,READY, cannot start engine, engine not in state STOPPED");
 
-        try {
-            engine.clear();
-            fail("test should throw an exception");
-        } catch (ApexException ae) {
-            assertEquals("clear()<-Engine:0.0.1,READY, cannot clear engine, engine is not stopped", ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.clear())
+            .hasMessage("clear()<-Engine:0.0.1,READY, cannot clear engine, engine is not stopped");
 
-        try {
-            engine.stop();
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.stop();
+        assertEquals(AxEngineState.STOPPED, engine.getState());
 
-        try {
-            engine.clear();
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.clear();
+        assertEquals(AxEngineState.STOPPED, engine.getState());
 
-        try {
-            engine.start();
-            fail("test should throw an exception");
-        } catch (ApexException ae) {
-            assertEquals("start()<-Engine:0.0.1,STOPPED,  cannot start engine, "
-                            + "engine has not been initialized, its model is not loaded", ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.start()).hasMessage("start()<-Engine:0.0.1,STOPPED,  cannot start engine, "
+            + "engine has not been initialized, its model is not loaded");
 
-        try {
-            engine.updateModel(policyModel);
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.updateModel(policyModel, false);
+        assertEquals(AxEngineState.STOPPED, engine.getState());
 
-        try {
-            engine.start();
-            assertEquals(AxEngineState.READY, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.start();
+        assertEquals(AxEngineState.READY, engine.getState());
 
         assertNull(engine.createEvent(null));
 
@@ -332,101 +250,52 @@ public class ApexEngineImplTest {
         assertTrue(engine.handleEvent(event));
         assertEquals(AxEngineState.READY, engine.getState());
 
-        try {
-            engine.stop();
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.stop();
+        assertEquals(AxEngineState.STOPPED, engine.getState());
 
-        try {
-            engine.addEventListener("myListener", new DummyListener());
-        } catch (Exception e) {
-            fail("test should not throw an exception");
-        }
+        engine.addEventListener("myListener", new DummyListener());
 
-        try {
-            engine.start();
-            assertEquals(AxEngineState.READY, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.start();
+        assertEquals(AxEngineState.READY, engine.getState());
 
-        try {
-            engine.updateModel(policyModel);
-            fail("test should throw an exception");
-        } catch (ApexException ae) {
-            assertEquals("updateModel()<-Engine:0.0.1, cannot update model, "
-                            + "engine should be stopped but is in state READY", ae.getMessage());
-        }
+        assertThatThrownBy(() -> engine.updateModel(policyModel, false)).hasMessage(
+            "updateModel()<-Engine:0.0.1, cannot update model, engine should be stopped but is in state READY");
 
         assertTrue(engine.handleEvent(event));
         assertEquals(AxEngineState.READY, engine.getState());
 
-        try {
-            engine.stop();
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.stop();
+        assertEquals(AxEngineState.STOPPED, engine.getState());
 
-        try {
-            engine.addEventListener("badListener", new DummyEnEventListener());
-        } catch (Exception e) {
-            fail("test should not throw an exception");
-        }
+        engine.addEventListener("badListener", new DummyEnEventListener());
 
-        try {
-            engine.start();
-            assertEquals(AxEngineState.READY, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.start();
+        assertEquals(AxEngineState.READY, engine.getState());
 
         assertFalse(engine.handleEvent(event));
         assertEquals(AxEngineState.READY, engine.getState());
-        try {
-            engine.stop();
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.stop();
+        assertEquals(AxEngineState.STOPPED, engine.getState());
 
-        try {
-            engine.removeEventListener("badListener");
-            engine.addEventListener("slowListener", new DummySlowEnEventListener());
-        } catch (Exception e) {
-            fail("test should not throw an exception");
-        }
+        engine.removeEventListener("badListener");
+        engine.addEventListener("slowListener", new DummySlowEnEventListener());
     }
 
     @Test
-    public void testState() throws InterruptedException {
+    public void testState() throws InterruptedException, ApexException {
         AxArtifactKey engineKey = new AxArtifactKey("Engine:0.0.1");
         ApexEngineImpl engine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(engineKey);
         assertNotNull(engine);
         assertEquals(engineKey, engine.getKey());
 
-        try {
-            engine.updateModel(policyModel);
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.updateModel(policyModel, false);
+        assertEquals(AxEngineState.STOPPED, engine.getState());
 
         DummySlowEnEventListener slowListener = new DummySlowEnEventListener();
-        try {
-            engine.addEventListener("slowListener", slowListener);
-        } catch (Exception e) {
-            fail("test should not throw an exception");
-        }
+        engine.addEventListener("slowListener", slowListener);
 
-        try {
-            engine.start();
-            assertEquals(AxEngineState.READY, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.start();
+        assertEquals(AxEngineState.READY, engine.getState());
 
         assertEquals(AxEngineState.READY, engine.getState());
 
@@ -437,6 +306,7 @@ public class ApexEngineImplTest {
         // 1 second is less than the 3 second wait on engine stopping
         slowListener.setWaitTime(1000);
         (new Thread() {
+            @Override
             public void run() {
                 assertTrue(engine.handleEvent(event));
                 assertEquals(AxEngineState.STOPPED, engine.getState());
@@ -466,6 +336,7 @@ public class ApexEngineImplTest {
         // 4 seconds is more than the 3 second wait on engine stopping
         slowListener.setWaitTime(4000);
         (new Thread() {
+            @Override
             public void run() {
                 assertTrue(engine.handleEvent(event));
                 assertEquals(AxEngineState.STOPPED, engine.getState());
@@ -492,30 +363,22 @@ public class ApexEngineImplTest {
 
     @Test
     public void testStateMachineError() throws InterruptedException, IllegalArgumentException, IllegalAccessException,
-                    NoSuchFieldException, SecurityException {
+                    NoSuchFieldException, SecurityException, ApexException {
 
         AxArtifactKey engineKey = new AxArtifactKey("Engine:0.0.1");
         ApexEngineImpl engine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(engineKey);
         assertNotNull(engine);
         assertEquals(engineKey, engine.getKey());
 
-        try {
-            engine.updateModel(policyModel);
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.updateModel(policyModel, false);
+        assertEquals(AxEngineState.STOPPED, engine.getState());
 
         final Field smHandlerField = engine.getClass().getDeclaredField("stateMachineHandler");
         smHandlerField.setAccessible(true);
         smHandlerField.set(engine, smHandlerMock);
 
-        try {
-            engine.start();
-            assertEquals(AxEngineState.READY, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.start();
+        assertEquals(AxEngineState.READY, engine.getState());
 
         assertEquals(AxEngineState.READY, engine.getState());
 
@@ -556,45 +419,29 @@ public class ApexEngineImplTest {
 
     @Test
     public void testStateMachineHandler() throws InterruptedException, IllegalArgumentException, IllegalAccessException,
-                    NoSuchFieldException, SecurityException {
+                    NoSuchFieldException, SecurityException, ApexException {
         AxArtifactKey engineKey = new AxArtifactKey("Engine:0.0.1");
         ApexEngineImpl engine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(engineKey);
         assertNotNull(engine);
         assertEquals(engineKey, engine.getKey());
 
-        try {
-            engine.updateModel(policyModelWithStates);
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.updateModel(policyModelWithStates, false);
+        assertEquals(AxEngineState.STOPPED, engine.getState());
 
-        try {
-            engine.start();
-            assertEquals(AxEngineState.READY, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        engine.start();
+        assertEquals(AxEngineState.READY, engine.getState());
 
         AxArtifactKey eventKey = new AxArtifactKey("Event:0.0.1");
         EnEvent event = engine.createEvent(eventKey);
         assertEquals(eventKey, event.getKey());
 
-        try {
-            engine.stop();
-            assertEquals(AxEngineState.STOPPED, engine.getState());
-        } catch (ApexException ae) {
-            fail("test should not throw an exception");
-        }
-        
+        engine.stop();
         assertEquals(AxEngineState.STOPPED, engine.getState());
 
-        try {
-            engine.start();
-            assertEquals(AxEngineState.READY, engine.getState());
-        } catch (ApexException e) {
-            fail("test should not throw an exception");
-        }
+        assertEquals(AxEngineState.STOPPED, engine.getState());
+
+        engine.start();
+        assertEquals(AxEngineState.READY, engine.getState());
 
         assertEquals(AxEngineState.READY, engine.getState());
 
index fbab071..1269d44 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -122,7 +123,7 @@ public class AadmUseCaseTest {
         final ApexEngineImpl apexEngine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(key);
         final TestApexActionListener listener = new TestApexActionListener("Test");
         apexEngine.addEventListener("listener", listener);
-        apexEngine.updateModel(apexPolicyModel);
+        apexEngine.updateModel(apexPolicyModel, false);
         apexEngine.start();
 
         final AxEvent axEvent = getTriggerEvent(apexPolicyModel);
index 40df82c..7ada6a7 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,7 +27,6 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.util.Random;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -73,12 +73,12 @@ public class AnomalyDetectionTslUseCaseTest {
     @Before
     public void beforeTest() {
         schemaParameters = new SchemaParameters();
-        
+
         schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
         schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
 
         ParameterService.register(schemaParameters);
-        
+
         contextParameters = new ContextParameters();
 
         contextParameters.setName(ContextParameterConstants.MAIN_GROUP_NAME);
@@ -90,7 +90,7 @@ public class AnomalyDetectionTslUseCaseTest {
         ParameterService.register(contextParameters.getDistributorParameters());
         ParameterService.register(contextParameters.getLockManagerParameters());
         ParameterService.register(contextParameters.getPersistorParameters());
-        
+
         engineParameters = new EngineParameters();
         engineParameters.getExecutorParameterMap().put("MVEL", new MvelExecutorParameters());
         engineParameters.getExecutorParameterMap().put("JAVA", new JavaExecutorParameters());
@@ -103,7 +103,7 @@ public class AnomalyDetectionTslUseCaseTest {
     @After
     public void afterTest() {
         ParameterService.deregister(engineParameters);
-        
+
         ParameterService.deregister(contextParameters.getDistributorParameters());
         ParameterService.deregister(contextParameters.getLockManagerParameters());
         ParameterService.deregister(contextParameters.getPersistorParameters());
@@ -135,7 +135,7 @@ public class AnomalyDetectionTslUseCaseTest {
 
         final TestApexActionListener listener1 = new TestApexActionListener("TestListener1");
         apexEngine1.addEventListener("listener", listener1);
-        apexEngine1.updateModel(apexPolicyModel);
+        apexEngine1.updateModel(apexPolicyModel, false);
         apexEngine1.start();
         final EnEvent triggerEvent =
                 apexEngine1.createEvent(new AxArtifactKey("AnomalyDetectionTriggerEvent", "0.0.1"));
@@ -191,7 +191,7 @@ public class AnomalyDetectionTslUseCaseTest {
 
         final TestApexActionListener listener1 = new TestApexActionListener("TestListener1");
         apexEngine1.addEventListener("listener1", listener1);
-        apexEngine1.updateModel(apexPolicyModel);
+        apexEngine1.updateModel(apexPolicyModel, false);
         apexEngine1.start();
 
         final EnEvent triggerEvent =
index bf6c08f..d40dcc6 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -134,7 +135,7 @@ public class AutoLearnTslUseCaseTest {
 
         final TestApexActionListener listener1 = new TestApexActionListener("TestListener1");
         apexEngine1.addEventListener("listener", listener1);
-        apexEngine1.updateModel(apexPolicyModel);
+        apexEngine1.updateModel(apexPolicyModel, false);
         apexEngine1.start();
         final EnEvent triggerEvent = apexEngine1.createEvent(new AxArtifactKey("AutoLearnTriggerEvent", "0.0.1"));
         final double rval = rand.nextGaussian();
@@ -189,7 +190,7 @@ public class AutoLearnTslUseCaseTest {
 
         final TestApexActionListener listener1 = new TestApexActionListener("TestListener1");
         apexEngine1.addEventListener("listener1", listener1);
-        apexEngine1.updateModel(apexPolicyModel);
+        apexEngine1.updateModel(apexPolicyModel, false);
         apexEngine1.start();
 
         final EnEvent triggerEvent = apexEngine1.createEvent(new AxArtifactKey("AutoLearnTriggerEvent", "0.0.1"));
index f957e7e..0d61929 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -134,7 +135,7 @@ public class MfpUseCaseTest {
 
         final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
         apexEngine.addEventListener("listener", listener);
-        apexEngine.updateModel(apexPolicyModel);
+        apexEngine.updateModel(apexPolicyModel, false);
         apexEngine.start();
 
         final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
@@ -182,7 +183,7 @@ public class MfpUseCaseTest {
 
         final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
         apexEngine.addEventListener("listener", listener);
-        apexEngine.updateModel(apexPolicyModel);
+        apexEngine.updateModel(apexPolicyModel, false);
         apexEngine.start();
 
         final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
index 2c3fac1..6c86c1e 100644 (file)
 
 package org.onap.policy.apex.service.engine.main;
 
+import java.io.IOException;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.stream.Stream;
 import lombok.Getter;
+import lombok.Setter;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
 import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
 import org.onap.policy.apex.model.basicmodel.service.ModelService;
@@ -59,8 +61,12 @@ public class ApexActivator {
 
     // The parameters of the Apex activator when running with multiple policies
     @Getter
+    @Setter
     private Map<ToscaPolicyIdentifier, ApexParameters> apexParametersMap;
 
+    @Getter
+    Map<ToscaPolicyIdentifier, AxPolicyModel> policyModelsMap;
+
     // Event unmarshalers are used to receive events asynchronously into Apex
     private final Map<String, ApexEventUnmarshaller> unmarshallerMap = new LinkedHashMap<>();
 
@@ -99,46 +105,7 @@ public class ApexActivator {
                 .mapToInt(p -> p.getEngineServiceParameters().getInstanceCount()).sum();
             apexParameters.getEngineServiceParameters().setInstanceCount(totalInstanceCount);
             instantiateEngine(apexParameters);
-            Map<ToscaPolicyIdentifier, AxPolicyModel> policyModelsMap = new LinkedHashMap<>();
-            Map<String, EventHandlerParameters> inputParametersMap = new LinkedHashMap<>();
-            Map<String, EventHandlerParameters> outputParametersMap = new LinkedHashMap<>();
-
-            for (Entry<ToscaPolicyIdentifier, ApexParameters> apexParamsEntry : apexParametersMap.entrySet()) {
-                ApexParameters apexParams = apexParamsEntry.getValue();
-                boolean duplicateInputParameterExist =
-                    apexParams.getEventInputParameters().keySet().stream().anyMatch(inputParametersMap::containsKey);
-                boolean duplicateOutputParameterExist =
-                    apexParams.getEventOutputParameters().keySet().stream().anyMatch(outputParametersMap::containsKey);
-                if (duplicateInputParameterExist || duplicateOutputParameterExist) {
-                    LOGGER.error("I/O Parameters for " + apexParamsEntry.getKey().getName() + ":"
-                        + apexParamsEntry.getKey().getVersion()
-                        + " has duplicates. So this policy is not executed");
-                    apexParametersMap.remove(apexParamsEntry.getKey());
-                    continue;
-                } else {
-                    inputParametersMap.putAll(apexParams.getEventInputParameters());
-                    outputParametersMap.putAll(apexParams.getEventOutputParameters());
-                }
-                // Check if a policy model file has been specified
-                if (apexParams.getEngineServiceParameters().getPolicyModelFileName() != null) {
-                    LOGGER.debug("deploying policy model in \""
-                        + apexParams.getEngineServiceParameters().getPolicyModelFileName()
-                        + "\" to the apex engines . . .");
-
-                    final String policyModelString = TextFileUtils
-                        .getTextFileAsString(apexParams.getEngineServiceParameters().getPolicyModelFileName());
-                    AxPolicyModel policyModel = EngineServiceImpl
-                        .createModel(apexParams.getEngineServiceParameters().getEngineKey(), policyModelString);
-                    policyModelsMap.put(apexParamsEntry.getKey(), policyModel);
-                }
-            }
-            AxPolicyModel finalPolicyModel = aggregatePolicyModels(policyModelsMap);
-            // Set the policy model in the engine
-            apexEngineService.updateModel(apexParameters.getEngineServiceParameters().getEngineKey(),
-                finalPolicyModel, true);
-            setUpMarshallerAndUnmarshaller(apexParameters.getEngineServiceParameters(), inputParametersMap,
-                outputParametersMap);
-            setUpmarshalerPairings(inputParametersMap);
+            setUpModelMarhsallerAndUnmarshaller(apexParameters);
         } catch (final Exception e) {
             LOGGER.debug(APEX_ENGINE_FAILED_MSG, e);
             throw new ApexActivatorException(APEX_ENGINE_FAILED_MSG, e);
@@ -147,8 +114,50 @@ public class ApexActivator {
         LOGGER.debug("Apex engine started as a service");
     }
 
+    private void setUpModelMarhsallerAndUnmarshaller(ApexParameters apexParameters) throws IOException, ApexException {
+        policyModelsMap = new LinkedHashMap<>();
+        Map<String, EventHandlerParameters> inputParametersMap = new LinkedHashMap<>();
+        Map<String, EventHandlerParameters> outputParametersMap = new LinkedHashMap<>();
+
+        for (Entry<ToscaPolicyIdentifier, ApexParameters> apexParamsEntry : apexParametersMap.entrySet()) {
+            ApexParameters apexParams = apexParamsEntry.getValue();
+            boolean duplicateInputParameterExist =
+                apexParams.getEventInputParameters().keySet().stream().anyMatch(inputParametersMap::containsKey);
+            boolean duplicateOutputParameterExist =
+                apexParams.getEventOutputParameters().keySet().stream().anyMatch(outputParametersMap::containsKey);
+            if (duplicateInputParameterExist || duplicateOutputParameterExist) {
+                LOGGER.error("I/O Parameters for {}:{} has duplicates. So this policy is not executed.",
+                    apexParamsEntry.getKey().getName(), apexParamsEntry.getKey().getVersion());
+                apexParametersMap.remove(apexParamsEntry.getKey());
+                continue;
+            }
+            inputParametersMap.putAll(apexParams.getEventInputParameters());
+            outputParametersMap.putAll(apexParams.getEventOutputParameters());
+            // Check if a policy model file has been specified
+            if (apexParams.getEngineServiceParameters().getPolicyModelFileName() != null) {
+                LOGGER.debug("deploying policy model in \"{}\" to the apex engines . . .",
+                    apexParams.getEngineServiceParameters().getPolicyModelFileName());
+
+                final String policyModelString =
+                    TextFileUtils.getTextFileAsString(apexParams.getEngineServiceParameters().getPolicyModelFileName());
+                AxPolicyModel policyModel = EngineServiceImpl
+                    .createModel(apexParams.getEngineServiceParameters().getEngineKey(), policyModelString);
+                policyModelsMap.put(apexParamsEntry.getKey(), policyModel);
+            }
+        }
+        AxPolicyModel finalPolicyModel = aggregatePolicyModels(policyModelsMap);
+        // Set the policy model in the engine
+        apexEngineService.updateModel(apexParameters.getEngineServiceParameters().getEngineKey(), finalPolicyModel,
+            true);
+        setUpMarshallerAndUnmarshaller(apexParameters.getEngineServiceParameters(), inputParametersMap,
+            outputParametersMap);
+        setUpMarshalerPairings(inputParametersMap);
+    }
+
     private AxPolicyModel aggregatePolicyModels(Map<ToscaPolicyIdentifier, AxPolicyModel> policyModelsMap) {
         Map.Entry<ToscaPolicyIdentifier, AxPolicyModel> firstEntry = policyModelsMap.entrySet().iterator().next();
+        ToscaPolicyIdentifier tempId = new ToscaPolicyIdentifier(firstEntry.getKey());
+        AxPolicyModel tempModel = new AxPolicyModel(firstEntry.getValue());
         Stream<Entry<ToscaPolicyIdentifier, AxPolicyModel>> policyModelStream =
             policyModelsMap.entrySet().stream().skip(1);
         Entry<ToscaPolicyIdentifier, AxPolicyModel> finalPolicyModelEntry =
@@ -157,13 +166,16 @@ public class ApexActivator {
                     entry1.setValue(
                         PolicyModelMerger.getMergedPolicyModel(entry1.getValue(), entry2.getValue(), true, true));
                 } catch (ApexModelException exc) {
-                    LOGGER.error("Policy model for " + entry2.getKey().getName() + ":" + entry2.getKey().getVersion()
-                        + " is having duplicates. So this policy is not executed", exc.getMessage());
+                    LOGGER.error("Policy model for {} : {} is having duplicates. So this policy is not executed.",
+                        entry2.getKey().getName(), entry2.getKey().getVersion(), exc);
                     apexParametersMap.remove(entry2.getKey());
+                    policyModelsMap.remove(entry2.getKey());
                 }
                 return entry1;
             }));
-        return finalPolicyModelEntry.getValue();
+        AxPolicyModel finalPolicyModel = new AxPolicyModel(finalPolicyModelEntry.getValue());
+        policyModelsMap.put(tempId, tempModel); // put back the original first entry into the policyModelsMap
+        return finalPolicyModel;
     }
 
     private void setUpMarshallerAndUnmarshaller(EngineServiceParameters engineServiceParameters,
@@ -215,7 +227,7 @@ public class ApexActivator {
      * paired marshaler
      * @param inputParametersMap the apex parameters
      */
-    private void setUpmarshalerPairings(Map<String, EventHandlerParameters> inputParametersMap) {
+    private void setUpMarshalerPairings(Map<String, EventHandlerParameters> inputParametersMap) {
         for (final Entry<String, EventHandlerParameters> inputParameters : inputParametersMap.entrySet()) {
             final ApexEventUnmarshaller unmarshaller = unmarshallerMap.get(inputParameters.getKey());
 
@@ -236,6 +248,23 @@ public class ApexActivator {
         }
     }
 
+    /**
+     * Updates the APEX Engine with the model created from new Policies.
+     *
+     * @param apexParamsMap  the apex parameters map for the Apex service
+     * @throws ApexException on errors
+     */
+    public void updateModel(Map<ToscaPolicyIdentifier, ApexParameters> apexParamsMap) throws ApexException {
+        try {
+            shutdownMarshallerAndUnmarshaller();
+            ApexParameters apexParameters = apexParamsMap.values().iterator().next();
+            setUpModelMarhsallerAndUnmarshaller(apexParameters);
+        } catch (final Exception e) {
+            LOGGER.debug(APEX_ENGINE_FAILED_MSG, e);
+            throw new ApexActivatorException(APEX_ENGINE_FAILED_MSG, e);
+        }
+    }
+
     /**
      * Terminate the Apex engine.
      *
@@ -243,15 +272,7 @@ public class ApexActivator {
      */
     public void terminate() throws ApexException {
         // Shut down all marshalers and unmarshalers
-        for (final ApexEventMarshaller marshaller : marshallerMap.values()) {
-            marshaller.stop();
-        }
-        marshallerMap.clear();
-
-        for (final ApexEventUnmarshaller unmarshaller : unmarshallerMap.values()) {
-            unmarshaller.stop();
-        }
-        unmarshallerMap.clear();
+        shutdownMarshallerAndUnmarshaller();
 
         // Check if the engine service handler has been shut down already
         if (engineServiceHandler != null) {
@@ -263,4 +284,14 @@ public class ApexActivator {
         ModelService.clear();
         ParameterService.clear();
     }
+
+    /**
+     * Shuts down all marshallers and unmarshallers.
+     */
+    private void shutdownMarshallerAndUnmarshaller() {
+        marshallerMap.values().forEach(ApexEventMarshaller::stop);
+        marshallerMap.clear();
+        unmarshallerMap.values().forEach(ApexEventUnmarshaller::stop);
+        unmarshallerMap.clear();
+    }
 }
index 4600690..14b57b2 100644 (file)
@@ -26,9 +26,15 @@ import java.util.Base64;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.TreeMap;
 import lombok.Getter;
 import lombok.Setter;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
+import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
+import org.onap.policy.apex.model.basicmodel.service.ModelService;
+import org.onap.policy.apex.model.contextmodel.concepts.AxContextAlbum;
+import org.onap.policy.apex.model.contextmodel.concepts.AxContextAlbums;
+import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
 import org.onap.policy.apex.service.parameters.ApexParameterHandler;
 import org.onap.policy.apex.service.parameters.ApexParameters;
 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters;
@@ -128,6 +134,67 @@ public class ApexMain {
         LOGGER.exit("Started Apex");
     }
 
+    /**
+     * Updates the APEX Engine with the model created from new Policies.
+     *
+     * @param policyArgsMap the map with command line arguments as value and policy-id as key
+     * @throws ApexException on errors
+     */
+    public void updateModel(Map<ToscaPolicyIdentifier, String[]> policyArgsMap) throws ApexException {
+        apexParametersMap.clear();
+        AxContextAlbums albums = ModelService.getModel(AxContextAlbums.class);
+        Map<AxArtifactKey, AxContextAlbum> albumsMap = new TreeMap<>();
+        for (Entry<ToscaPolicyIdentifier, String[]> policyArgsEntry : policyArgsMap.entrySet()) {
+            findAlbumsToHold(albumsMap, policyArgsEntry.getKey());
+            try {
+                apexParametersMap.put(policyArgsEntry.getKey(), populateApexParameters(policyArgsEntry.getValue()));
+            } catch (ApexException e) {
+                LOGGER.error("Invalid arguments specified for policy - {}:{}", policyArgsEntry.getKey().getName(),
+                    policyArgsEntry.getKey().getVersion(), e);
+            }
+        }
+        try {
+            if (albumsMap.isEmpty()) {
+                // clear context since none of the policies' context albums has to be retained
+                // this could be because all policies have a major version change,
+                // or a full set of new policies are received in the update message
+                activator.terminate();
+                // ParameterService is cleared when activator is terminated. Register the engine parameters in this case
+                new ApexParameterHandler().registerParameters(apexParametersMap.values().iterator().next());
+                activator = new ApexActivator(apexParametersMap);
+                activator.initialize();
+                setAlive(true);
+            } else {
+                albums.setAlbumsMap(albumsMap);
+                activator.setApexParametersMap(apexParametersMap);
+                activator.updateModel(apexParametersMap);
+            }
+        } catch (final ApexException e) {
+            LOGGER.error(APEX_SERVICE_FAILED_MSG, e);
+            activator.terminate();
+            throw new ApexException(e.getMessage());
+        }
+    }
+
+    /**
+     * Find the context albums which should be retained when updating the policies.
+     *
+     * @param albumsMap the albums which should be kept during model update
+     * @param policyId the policy id of current policy
+     */
+    private void findAlbumsToHold(Map<AxArtifactKey, AxContextAlbum> albumsMap, ToscaPolicyIdentifier policyId) {
+        for (Entry<ToscaPolicyIdentifier, AxPolicyModel> policyModelsEntry : activator.getPolicyModelsMap()
+            .entrySet()) {
+            // If a policy with the same major version is received in PDP_UPDATE,
+            // context for that policy has to be retained. For this, take such policies' albums
+            if (policyModelsEntry.getKey().getName().equals(policyId.getName())
+                && policyModelsEntry.getKey().getVersion().split("\\.")[0]
+                    .equals(policyId.getVersion().split("\\.")[0])) {
+                albumsMap.putAll(policyModelsEntry.getValue().getAlbums().getAlbumsMap());
+            }
+        }
+    }
+
     private ApexParameters populateApexParameters(String[] args) throws ApexException {
         // Check the arguments
         final ApexCommandLineArguments arguments = new ApexCommandLineArguments();
index 8247fd5..f5e36e8 100644 (file)
@@ -77,8 +77,8 @@ public final class EngineServiceImpl implements EngineService, EngineServiceEven
     private AxArtifactKey engineServiceKey = null;
 
     // The Apex engine workers this engine service is handling
-    private final Map<AxArtifactKey, EngineService> engineWorkerMap = Collections
-                    .synchronizedMap(new LinkedHashMap<AxArtifactKey, EngineService>());
+    private final Map<AxArtifactKey, EngineWorker> engineWorkerMap = Collections
+                    .synchronizedMap(new LinkedHashMap<AxArtifactKey, EngineWorker>());
 
     // Event queue for events being sent into the Apex engines, it used by all engines within a
     // group.
@@ -342,9 +342,17 @@ public final class EngineServiceImpl implements EngineService, EngineServiceEven
         }
 
         // Update the engines
-        for (final Entry<AxArtifactKey, EngineService> engineWorkerEntry : engineWorkerMap.entrySet()) {
+        boolean isSubsequentInstance = false;
+        for (final Entry<AxArtifactKey, EngineWorker> engineWorkerEntry : engineWorkerMap.entrySet()) {
             LOGGER.info("Registering apex model on engine {}", engineWorkerEntry.getKey().getId());
-            engineWorkerEntry.getValue().updateModel(engineWorkerEntry.getKey(), apexModel, forceFlag);
+            EngineWorker engineWorker = engineWorkerEntry.getValue();
+            if (isSubsequentInstance) {
+                // set subsequentInstance flag as true if the current engine worker instance is not the first one
+                // first engine instance will have this flag as false
+                engineWorker.setSubsequentInstance(true);
+            }
+            engineWorker.updateModel(engineWorkerEntry.getKey(), apexModel, forceFlag);
+            isSubsequentInstance = true;
         }
 
         // start all engines on this engine service if it was not stopped before the update
@@ -355,7 +363,7 @@ public final class EngineServiceImpl implements EngineService, EngineServiceEven
         }
         // Check if all engines are running
         final StringBuilder notRunningEngineIdBuilder = new StringBuilder();
-        for (final Entry<AxArtifactKey, EngineService> engineWorkerEntry : engineWorkerMap.entrySet()) {
+        for (final Entry<AxArtifactKey, EngineWorker> engineWorkerEntry : engineWorkerMap.entrySet()) {
             if (engineWorkerEntry.getValue().getState() != AxEngineState.READY
                             && engineWorkerEntry.getValue().getState() != AxEngineState.EXECUTING) {
                 notRunningEngineIdBuilder.append(engineWorkerEntry.getKey().getId());
@@ -387,7 +395,7 @@ public final class EngineServiceImpl implements EngineService, EngineServiceEven
         }
         // Check if all engines are stopped
         final StringBuilder notStoppedEngineIdBuilder = new StringBuilder();
-        for (final Entry<AxArtifactKey, EngineService> engineWorkerEntry : engineWorkerMap.entrySet()) {
+        for (final Entry<AxArtifactKey, EngineWorker> engineWorkerEntry : engineWorkerMap.entrySet()) {
             if (engineWorkerEntry.getValue().getState() != AxEngineState.STOPPED) {
                 notStoppedEngineIdBuilder.append(engineWorkerEntry.getKey().getId());
                 notStoppedEngineIdBuilder.append('(');
index a24d961..e00515b 100644 (file)
@@ -6,15 +6,15 @@
  * 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.
- * 
+ *
  * SPDX-License-Identifier: Apache-2.0
  * ============LICENSE_END=========================================================
  */
@@ -25,7 +25,6 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonParser;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.util.Arrays;
@@ -33,7 +32,7 @@ import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.BlockingQueue;
-
+import lombok.Setter;
 import org.onap.policy.apex.context.ContextException;
 import org.onap.policy.apex.context.ContextRuntimeException;
 import org.onap.policy.apex.context.SchemaHelper;
@@ -98,6 +97,9 @@ final class EngineWorker implements EngineService {
     // Converts ApexEvent instances to and from EnEvent instances
     private ApexEvent2EnEventConverter apexEnEventConverter = null;
 
+    @Setter
+    private boolean isSubsequentInstance;
+
     /**
      * Constructor that creates an Apex engine, an event processor for events to be sent to that engine, and an
      * {@link ApexModelReader} instance to read Apex models using JAXB.
@@ -236,9 +238,8 @@ final class EngineWorker implements EngineService {
                 }
             }
         }
-
         // Update the Apex model in the Apex engine
-        engine.updateModel(apexModel);
+        engine.updateModel(apexModel, isSubsequentInstance);
 
         LOGGER.debug("engine model {} added to the engine-{}", apexModel.getKey().getId(), engineWorkerKey);
         LOGGER.exit();
@@ -613,7 +614,7 @@ final class EngineWorker implements EngineService {
 
         /**
          * Debug the event if debug is enabled.
-         * 
+         *
          * @param event the event to debug
          */
         private void debugEventIfDebugEnabled(ApexEvent event) {
index c1ef50b..553ed18 100644 (file)
@@ -130,10 +130,10 @@ public class ApexParameterHandler {
 
     /**
      * Register all the incoming parameters with the parameter service.
-     * 
+     *
      * @param parameters The parameters to register
      */
-    private void registerParameters(ApexParameters parameters) {
+    public void registerParameters(ApexParameters parameters) {
         ParameterService.register(parameters);
         ParameterService.register(parameters.getEngineServiceParameters());
         ParameterService.register(parameters.getEngineServiceParameters().getEngineParameters());
index 1953939..6a5bb17 100644 (file)
@@ -56,6 +56,35 @@ public class ApexEngineHandler {
      * @throws ApexStarterException if the apex engine instantiation failed using the policies passed
      */
     public ApexEngineHandler(List<ToscaPolicy> policies)  throws ApexStarterException {
+        Map<ToscaPolicyIdentifier, String[]> policyArgsMap = createPolicyArgsMap(policies);
+        LOGGER.debug("Starting apex engine.");
+        try {
+            apexMain = new ApexMain(policyArgsMap);
+        } catch (ApexException e) {
+            throw new ApexStarterException(e);
+        }
+    }
+
+    /**
+     * Updates the Apex Engine with the policy model created from new list of policies.
+     *
+     * @param policies the list of policies
+     * @throws ApexStarterException if the apex engine instantiation failed using the policies passed
+     */
+    public void updateApexEngine(List<ToscaPolicy> policies) throws ApexStarterException {
+        if (null == apexMain || !apexMain.isAlive()) {
+            throw new ApexStarterException("Apex Engine not initialized.");
+        }
+        Map<ToscaPolicyIdentifier, String[]> policyArgsMap = createPolicyArgsMap(policies);
+        try {
+            apexMain.updateModel(policyArgsMap);
+        } catch (ApexException e) {
+            throw new ApexStarterException(e);
+        }
+    }
+
+    private Map<ToscaPolicyIdentifier, String[]> createPolicyArgsMap(List<ToscaPolicy> policies)
+        throws ApexStarterException {
         Map<ToscaPolicyIdentifier, String[]> policyArgsMap = new LinkedHashMap<>();
         for (ToscaPolicy policy : policies) {
             Object properties = policy.getProperties().get("content");
@@ -78,13 +107,7 @@ public class ApexEngineHandler {
             final String[] apexArgs = { "-c", apexConfigFilePath, "-m", modelFilePath };
             policyArgsMap.put(policy.getIdentifier(), apexArgs);
         }
-
-        LOGGER.debug("Starting apex engine.");
-        try {
-            apexMain = new ApexMain(policyArgsMap);
-        } catch (ApexException e) {
-            throw new ApexStarterException(e);
-        }
+        return policyArgsMap;
     }
 
     /**
index ecc0bec..33ac81f 100644 (file)
@@ -162,10 +162,11 @@ public class PdpUpdateMessageHandler {
         PdpResponseDetails pdpResponseDetails = null;
         try {
             if (null != apexEngineHandler && apexEngineHandler.isApexEngineRunning()) {
-                apexEngineHandler.shutdown();
+                apexEngineHandler.updateApexEngine(pdpUpdateMsg.getPolicies());
+            } else {
+                apexEngineHandler = new ApexEngineHandler(pdpUpdateMsg.getPolicies());
+                Registry.registerOrReplace(ApexStarterConstants.REG_APEX_ENGINE_HANDLER, apexEngineHandler);
             }
-            apexEngineHandler = new ApexEngineHandler(pdpUpdateMsg.getPolicies());
-            Registry.registerOrReplace(ApexStarterConstants.REG_APEX_ENGINE_HANDLER, apexEngineHandler);
             if (apexEngineHandler.isApexEngineRunning()) {
                 List<ToscaPolicyIdentifier> runningPolicies = apexEngineHandler.getRunningPolicies();
                 if (new HashSet<>(runningPolicies)
index bca0116..d6ef942 100644 (file)
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <profiles>
index cb51a8e..003f04f 100644 (file)
@@ -1,19 +1,20 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * 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.
- * 
+ *
  * SPDX-License-Identifier: Apache-2.0
  * ============LICENSE_END=========================================================
  */
@@ -65,7 +66,7 @@ public class TestApexEngine {
         final ApexEngine apexEngine = new ApexEngineFactory().createApexEngine(key);
         final TestApexActionListener listener = new TestApexActionListener("Test");
         apexEngine.addEventListener("listener", listener);
-        apexEngine.updateModel(apexPolicyModel);
+        apexEngine.updateModel(apexPolicyModel, false);
         apexEngine.start();
 
         for (final AxEvent axEvent : apexPolicyModel.getEvents().getEventMap().values()) {
index 1ae258b..fb58946 100644 (file)
@@ -1,19 +1,20 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * 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.
- * 
+ *
  * SPDX-License-Identifier: Apache-2.0
  * ============LICENSE_END=========================================================
  */
@@ -125,7 +126,7 @@ public class TestEventInstantiation {
         assertNotNull(apexPolicyModel);
 
         final ApexEngine apexEngine = new ApexEngineFactory().createApexEngine(apexPolicyModel.getKey());
-        apexEngine.updateModel(apexPolicyModel);
+        apexEngine.updateModel(apexPolicyModel, false);
         apexEngine.start();
 
         final EnEvent event = apexEngine.createEvent(new AxArtifactKey("Event0000", "0.0.1"));
index e8c45b2..ccf8762 100644 (file)
@@ -1,29 +1,30 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * 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.
- * 
+ *
  * SPDX-License-Identifier: Apache-2.0
  * ============LICENSE_END=========================================================
  */
 
 package org.onap.policy.apex.testsuites.integration.executor.handling;
 
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import java.io.IOException;
 
@@ -123,7 +124,7 @@ public class TestContextUpdateDifferentModels {
                 (ApexEngineImpl) new ApexEngineFactory().createApexEngine(new AxArtifactKey("TestApexEngine", "0.0.1"));
         final TestApexActionListener listener = new TestApexActionListener("Test");
         apexEngine.addEventListener("listener", listener);
-        apexEngine.updateModel(apexModelSample);
+        apexEngine.updateModel(apexModelSample, false);
         apexEngine.start();
 
         apexEngine.stop();
@@ -131,13 +132,8 @@ public class TestContextUpdateDifferentModels {
         final AxPolicyModel someSpuriousModel = new AxPolicyModel(new AxArtifactKey("SomeSpuriousModel", "0.0.1"));
         assertNotNull(someSpuriousModel);
 
-        try {
-            apexEngine.updateModel(null);
-            fail("null model should throw an exception");
-        } catch (final ApexException e) {
-            assertEquals("updateModel()<-TestApexEngine:0.0.1, Apex model is not defined, it has a null value",
-                    e.getMessage());
-        }
+        assertThatThrownBy(() -> apexEngine.updateModel(null, false))
+            .hasMessage("updateModel()<-TestApexEngine:0.0.1, Apex model is not defined, it has a null value");
         assertEquals(apexEngine.getInternalContext().getContextAlbums().size(),
                 apexModelSample.getAlbums().getAlbumsMap().size());
         for (final ContextAlbum contextAlbum : apexEngine.getInternalContext().getContextAlbums().values()) {
@@ -145,7 +141,7 @@ public class TestContextUpdateDifferentModels {
                     contextAlbum.getAlbumDefinition().equals(apexModelSample.getAlbums().get(contextAlbum.getKey())));
         }
 
-        apexEngine.updateModel(someSpuriousModel);
+        apexEngine.updateModel(someSpuriousModel, false);
         assertEquals(apexEngine.getInternalContext().getContextAlbums().size(),
                 someSpuriousModel.getAlbums().getAlbumsMap().size());
         for (final ContextAlbum contextAlbum : apexEngine.getInternalContext().getContextAlbums().values()) {
index 615781a..75f84b7 100644 (file)
@@ -1,19 +1,20 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * 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.
- * 
+ *
  * SPDX-License-Identifier: Apache-2.0
  * ============LICENSE_END=========================================================
  */
@@ -127,7 +128,7 @@ public class TestContextUpdateModel {
         assertNotNull(model1);
         assertEquals(2, model1.getPolicies().getPolicyMap().size());
 
-        apexEngine.updateModel(model1);
+        apexEngine.updateModel(model1, false);
         apexEngine.start();
         sendEvent(apexEngine, listener, "Event0000", true);
         sendEvent(apexEngine, listener, "Event0100", true);
@@ -137,7 +138,7 @@ public class TestContextUpdateModel {
         assertNotNull(model2);
         model2.getPolicies().getPolicyMap().remove(new AxArtifactKey("Policy0", "0.0.1"));
         assertEquals(1, model2.getPolicies().getPolicyMap().size());
-        apexEngine.updateModel(model2);
+        apexEngine.updateModel(model2, false);
         apexEngine.start();
         sendEvent(apexEngine, listener, "Event0000", false);
         sendEvent(apexEngine, listener, "Event0100", true);
@@ -147,7 +148,7 @@ public class TestContextUpdateModel {
         assertNotNull(model3);
         model3.getPolicies().getPolicyMap().remove(new AxArtifactKey("Policy1", "0.0.1"));
         assertEquals(1, model3.getPolicies().getPolicyMap().size());
-        apexEngine.updateModel(model3);
+        apexEngine.updateModel(model3, false);
         apexEngine.start();
         sendEvent(apexEngine, listener, "Event0000", true);
         sendEvent(apexEngine, listener, "Event0100", false);
@@ -156,7 +157,7 @@ public class TestContextUpdateModel {
         final AxPolicyModel model4 = new SampleDomainModelFactory().getSamplePolicyModel("MVEL");
         assertNotNull(model4);
         assertEquals(2, model4.getPolicies().getPolicyMap().size());
-        apexEngine.updateModel(model4);
+        apexEngine.updateModel(model4, false);
         apexEngine.start();
         sendEvent(apexEngine, listener, "Event0100", true);
         sendEvent(apexEngine, listener, "Event0000", true);
index 3ad6f98..6675d9f 100644 (file)
@@ -27,7 +27,6 @@ import java.io.PrintStream;
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.core.Response;
-
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -96,7 +95,7 @@ public class TestExecutionPropertyRest {
 
         server.start();
 
-        if (!NetworkUtil.isTcpPortOpen("localHost", PORT, 2000, 1L)) {
+        if (!NetworkUtil.isTcpPortOpen("localHost", PORT, 60, 500L)) {
             throw new IllegalStateException("port " + PORT + " is still not in use");
         }