Merge "SLI provider needs Dynamic-ImportPackage"
diff --git a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestSvcLogicLoader.java b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestSvcLogicLoader.java
index 8998382..2dd83e8 100644
--- a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestSvcLogicLoader.java
+++ b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestSvcLogicLoader.java
@@ -1,6 +1,7 @@
 package org.onap.ccsdk.sli.core.sli;
 
 import static org.junit.Assert.*;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
@@ -21,13 +22,12 @@
 
         SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(props);
 
-        URL graphUrl = TestSvcLogicLoader.class.getClassLoader().getResource("graphs");
+        File graphDirectory =  new File(getClass().getClassLoader().getResource("graphs").getFile());
 
-        if (graphUrl == null) {
+        if (graphDirectory == null) {
             fail("Cannot find graphs directory");
         }
-
-        SvcLogicLoader loader = new SvcLogicLoader(graphUrl.getPath(), store);
+        SvcLogicLoader loader = new SvcLogicLoader(graphDirectory.getAbsolutePath(), store);
         loader.loadAndActivate();
 
 
diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutor.java
index cd47897..758f203 100644
--- a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutor.java
+++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutor.java
@@ -37,6 +37,7 @@
 public class SetNodeExecutor extends SvcLogicNodeExecutor {
 
     private static final Logger LOG = LoggerFactory.getLogger(SetNodeExecutor.class);
+    protected final String arrayPattern = "\\[\\d*\\]";
 
     @Override
     public SvcLogicNode execute(SvcLogicService svc, SvcLogicNode node, SvcLogicContext ctx)
@@ -131,8 +132,14 @@
                         LinkedList<String> parmsToRemove = new LinkedList<String>();
                         String prefix = lhsVarName + ".";
                         for (String curCtxVarname : ctx.getAttributeKeySet()) {
-                            if (curCtxVarname.startsWith(prefix)) {
-                                LOG.debug("Unsetting " + curCtxVarname);
+                            String curCtxVarnameMatchingValue = curCtxVarname;
+                            //Special handling for reseting array values, strips out brackets and any numbers between the brackets
+                            //when testing if a context memory value starts with a prefix
+                            if(!prefix.contains("[") && curCtxVarnameMatchingValue.contains("[")) {
+                                curCtxVarnameMatchingValue = curCtxVarname.replaceAll(arrayPattern, "");
+                            }
+                            if (curCtxVarnameMatchingValue.startsWith(prefix)) {
+                                LOG.debug("Unsetting " + curCtxVarname + " because matching value " + curCtxVarnameMatchingValue + " starts with the prefix " + prefix);
                                 parmsToRemove.add(curCtxVarname);
                             }
                         }
diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutorTest.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutorTest.java
index 1333d07..c400bf5 100644
--- a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutorTest.java
+++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutorTest.java
@@ -1,56 +1,105 @@
-package org.onap.ccsdk.sli.core.sli.provider;

-

-import static org.junit.Assert.assertEquals;

-import static org.junit.Assert.assertNull;

-import java.util.LinkedList;

-import org.junit.Test;

-import org.onap.ccsdk.sli.core.sli.SvcLogicContext;

-import org.onap.ccsdk.sli.core.sli.SvcLogicGraph;

-import org.onap.ccsdk.sli.core.sli.SvcLogicNode;

-import org.onap.ccsdk.sli.core.sli.SvcLogicParser;

-

-public class SetNodeExecutorTest {

-    @Test

-    public void clearProperties() throws Exception {

-        SetNodeExecutor sne = new SetNodeExecutor();

-        SvcLogicContext ctx = new SvcLogicContext();

-

-        SvcLogicParser slp = new SvcLogicParser();

-        LinkedList<SvcLogicGraph> graph = slp.parse("src/test/resources/clearValues.xml");

-        SvcLogicNode root = graph.getFirst().getRootNode();

-        SvcLogicNode nodeOne = root.getOutcomeValue("1");

-        SvcLogicNode nodeTwo = root.getOutcomeValue("2");

-

-        sne.execute(nodeOne, ctx);

-        sne.execute(nodeTwo, ctx);

-

-        assertNull(ctx.getAttribute("si.field1"));

-        assertNull(ctx.getAttribute("si.field2"));

-        assertNull(ctx.getAttribute("si.field3"));

-        assertEquals("6", ctx.getAttribute("search1"));

-        assertEquals("KeepMe!", ctx.getAttribute("simonSays"));

-    }

-

-    @Test

-    public void subtreeCopy() throws Exception {

-        SetNodeExecutor sne = new SetNodeExecutor();

-        SvcLogicContext ctx = new SvcLogicContext();

-

-        SvcLogicParser slp = new SvcLogicParser();

-        LinkedList<SvcLogicGraph> graph = slp.parse("src/test/resources/copyValues.xml");

-        SvcLogicNode root = graph.getFirst().getRootNode();

-        SvcLogicNode nodeOne = root.getOutcomeValue("1");

-        SvcLogicNode nodeTwo = root.getOutcomeValue("2");

-

-        sne.execute(nodeOne, ctx);

-        sne.execute(nodeTwo, ctx);

-   

-        assertEquals("1",ctx.getAttribute("si.field1"));

-        assertEquals("2",ctx.getAttribute("si.field2"));

-        assertEquals("3",ctx.getAttribute("si.field3"));

-        assertEquals("1",ctx.getAttribute("rootTwo.field1"));

-        assertEquals("2",ctx.getAttribute("rootTwo.field2"));

-        assertEquals("3",ctx.getAttribute("rootTwo.field3"));

-    }

-

-}

+package org.onap.ccsdk.sli.core.sli.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import java.util.LinkedList;
+import org.junit.Test;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicGraph;
+import org.onap.ccsdk.sli.core.sli.SvcLogicNode;
+import org.onap.ccsdk.sli.core.sli.SvcLogicParser;
+
+public class SetNodeExecutorTest {
+    @Test
+    public void clearProperties() throws Exception {
+        SetNodeExecutor sne = new SetNodeExecutor();
+        SvcLogicContext ctx = new SvcLogicContext();
+
+        SvcLogicParser slp = new SvcLogicParser();
+        LinkedList<SvcLogicGraph> graph = slp.parse("src/test/resources/clearValues.xml");
+        SvcLogicNode root = graph.getFirst().getRootNode();
+        SvcLogicNode nodeOne = root.getOutcomeValue("1");
+        SvcLogicNode nodeTwo = root.getOutcomeValue("2");
+
+        sne.execute(nodeOne, ctx);
+        sne.execute(nodeTwo, ctx);
+
+        assertNull(ctx.getAttribute("si.field1"));
+        assertNull(ctx.getAttribute("si.field2"));
+        assertNull(ctx.getAttribute("si.field3"));
+        assertEquals("6", ctx.getAttribute("search1"));
+        assertEquals("KeepMe!", ctx.getAttribute("simonSays"));
+    }
+
+    @Test
+    public void clearMultipleArrayProperties() throws Exception {
+        SetNodeExecutor sne = new SetNodeExecutor();
+        SvcLogicContext ctx = new SvcLogicContext();
+
+        SvcLogicParser slp = new SvcLogicParser();
+        LinkedList<SvcLogicGraph> graph = slp.parse("src/test/resources/clearArrayValues.xml");
+        SvcLogicNode root = graph.getFirst().getRootNode();
+        SvcLogicNode nodeOne = root.getOutcomeValue("1");
+        SvcLogicNode nodeTwo = root.getOutcomeValue("2");
+
+        sne.execute(nodeOne, ctx);
+        sne.execute(nodeTwo, ctx);
+
+        assertNull(ctx.getAttribute("si[0].field1"));
+        assertNull(ctx.getAttribute("si[1].field2"));
+        assertNull(ctx.getAttribute("si[2].field3"));
+        assertEquals("6", ctx.getAttribute("search1"));
+        assertEquals("KeepMe!", ctx.getAttribute("simonSays"));
+    }
+    
+    @Test
+    public void clearSingleArrayProperties() throws Exception {
+        SetNodeExecutor sne = new SetNodeExecutor();
+        SvcLogicContext ctx = new SvcLogicContext();
+
+        SvcLogicParser slp = new SvcLogicParser();
+        LinkedList<SvcLogicGraph> graph = slp.parse("src/test/resources/clearSingleArrayValues.xml");
+        SvcLogicNode root = graph.getFirst().getRootNode();
+        SvcLogicNode nodeOne = root.getOutcomeValue("1");
+        SvcLogicNode nodeTwo = root.getOutcomeValue("2");
+
+        sne.execute(nodeOne, ctx);
+        sne.execute(nodeTwo, ctx);
+
+        assertNull(ctx.getAttribute("si[0].field1"));
+        assertEquals("2",ctx.getAttribute("si[1].field2"));
+        assertEquals("3", ctx.getAttribute("si[2].field3"));
+        assertEquals("6", ctx.getAttribute("search1"));
+        assertEquals("KeepMe!", ctx.getAttribute("simonSays"));
+    }
+
+    @Test
+    public void arrayPattern() {
+        SetNodeExecutor sne = new SetNodeExecutor();
+        String source = "one.two[0].three[0].four";
+        assertEquals("one.two.three.four", source.replaceAll(sne.arrayPattern, ""));
+    }
+
+    @Test
+    public void subtreeCopy() throws Exception {
+        SetNodeExecutor sne = new SetNodeExecutor();
+        SvcLogicContext ctx = new SvcLogicContext();
+
+        SvcLogicParser slp = new SvcLogicParser();
+        LinkedList<SvcLogicGraph> graph = slp.parse("src/test/resources/copyValues.xml");
+        SvcLogicNode root = graph.getFirst().getRootNode();
+        SvcLogicNode nodeOne = root.getOutcomeValue("1");
+        SvcLogicNode nodeTwo = root.getOutcomeValue("2");
+
+        sne.execute(nodeOne, ctx);
+        sne.execute(nodeTwo, ctx);
+
+        assertEquals("1", ctx.getAttribute("si.field1"));
+        assertEquals("2", ctx.getAttribute("si.field2"));
+        assertEquals("3", ctx.getAttribute("si.field3"));
+        assertEquals("1", ctx.getAttribute("rootTwo.field1"));
+        assertEquals("2", ctx.getAttribute("rootTwo.field2"));
+        assertEquals("3", ctx.getAttribute("rootTwo.field3"));
+    }
+
+}
diff --git a/sli/provider/src/test/resources/clearArrayValues.xml b/sli/provider/src/test/resources/clearArrayValues.xml
new file mode 100644
index 0000000..629322d
--- /dev/null
+++ b/sli/provider/src/test/resources/clearArrayValues.xml
@@ -0,0 +1,18 @@
+<service-logic

+    xmlns='http://www.onap.org/sdnc/svclogic'

+    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.onap.org/sdnc/svclogic ./svclogic.xsd' module='TEST-DG' version='1.0.0'>

+    <method rpc='test-dg' mode='sync'>

+        <block>

+            <set>

+                <parameter name='si[0].field1' value='1' />

+                <parameter name='si[1].field2' value='2' />

+                <parameter name='si[2].field3' value='3' />

+                <parameter name='search1' value='6' />

+                <parameter name='simonSays' value='KeepMe!' />

+            </set>

+            <set>

+                <parameter name='si.' value='' />

+            </set>

+        </block>

+    </method>

+</service-logic>
\ No newline at end of file
diff --git a/sli/provider/src/test/resources/clearSingleArrayValues.xml b/sli/provider/src/test/resources/clearSingleArrayValues.xml
new file mode 100644
index 0000000..3e4e5d9
--- /dev/null
+++ b/sli/provider/src/test/resources/clearSingleArrayValues.xml
@@ -0,0 +1,18 @@
+<service-logic

+    xmlns='http://www.onap.org/sdnc/svclogic'

+    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.onap.org/sdnc/svclogic ./svclogic.xsd' module='TEST-DG' version='1.0.0'>

+    <method rpc='test-dg' mode='sync'>

+        <block>

+            <set>

+                <parameter name='si[0].field1' value='1' />

+                <parameter name='si[1].field2' value='2' />

+                <parameter name='si[2].field3' value='3' />

+                <parameter name='search1' value='6' />

+                <parameter name='simonSays' value='KeepMe!' />

+            </set>

+            <set>

+                <parameter name='si[0].' value='' />

+            </set>

+        </block>

+    </method>

+</service-logic>
\ No newline at end of file