implement exit node 60/69860/1
authorSmokowski, Kevin (ks6305) <kevin.smokowski@att.com>
Thu, 4 Oct 2018 20:12:40 +0000 (20:12 +0000)
committerSmokowski, Kevin (ks6305) <kevin.smokowski@att.com>
Thu, 4 Oct 2018 20:12:40 +0000 (20:12 +0000)
exit node functions similar to a return statement in most programming languages

Change-Id: I2991590fb700b03a9f3d72ae0bc7b5dd9bb25f74
Issue-ID: CCSDK-611
Signed-off-by: Smokowski, Kevin (ks6305) <kevin.smokowski@att.com>
sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ExitNodeException.java [new file with mode: 0755]
sli/common/src/main/resources/svclogic.xsd
sli/common/src/test/resources/svclogic.xsd
sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExitNodeExecutor.java [new file with mode: 0755]
sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicServiceImpl.java

diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ExitNodeException.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ExitNodeException.java
new file mode 100755 (executable)
index 0000000..f119c18
--- /dev/null
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : CCSDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ *                                             reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.ccsdk.sli.core.sli;
+
+public class ExitNodeException extends SvcLogicException {
+       
+       /**
+        * 
+        */
+       private static final long serialVersionUID = 1L;
+
+       public ExitNodeException()
+       {
+               super();
+       }
+       
+       public ExitNodeException(String message)
+       {
+               super(message);
+       }
+       
+       public ExitNodeException(String message, Throwable t)
+       {
+               super(message, t);
+       }
+
+}
index 2704de8..c9beae8 100755 (executable)
-<?xml version = "1.0" encoding = "UTF-8"?>\r
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.onap.org/sdnc/svclogic" xmlns="http://www.onap.org/sdnc/svclogic">\r
-\r
-       <xsd:simpleType name="modeType">\r
-               <xsd:restriction base="xsd:string">\r
-                       <xsd:enumeration value="sync" />\r
-                       <xsd:enumeration value="async" />\r
-               </xsd:restriction>\r
-       </xsd:simpleType>\r
-\r
-       <xsd:group name="node">\r
-               <xsd:choice>\r
-                       <xsd:element ref="block" />\r
-                       <xsd:element ref="is-available" />\r
-                       <xsd:element ref="exists" />\r
-                       <xsd:element ref="reserve" />\r
-                       <xsd:element ref="release" />\r
-                       <xsd:element ref="allocate" />\r
-                       <xsd:element ref="get-resource" />\r
-                       <xsd:element ref="configure" />\r
-                       <xsd:element ref="return" />\r
-                       <xsd:element ref="switch" />\r
-                       <xsd:element ref="record" />\r
-                       <xsd:element ref="save" />\r
-                       <xsd:element ref="for" />\r
-                       <xsd:element ref="set" />\r
-                       <xsd:element ref="execute" />\r
-                       <xsd:element ref="delete" />\r
-                       <xsd:element ref="update" />\r
-                       <xsd:element ref="call" />\r
-                       <xsd:element ref="notify" />\r
-                       <xsd:element ref="break" />\r
-                       <xsd:element ref="while" />\r
-               </xsd:choice>\r
-       </xsd:group>\r
-\r
-       <xsd:element name="service-logic">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="method" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="module" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="version" use="required" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="method">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="rpc" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="mode" use="optional" type="modeType" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="block">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="atomic" use="optional" type="xsd:boolean" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="is-available">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="optional" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="exists">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="required" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="outcome">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="ref" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="value" use="required" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="reserve">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="select" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="release">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="record">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="allocate">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="pfx" use="required" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="get-resource">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="local-only" use="optional" type="xsd:boolean" />\r
-                       <xsd:attribute name="order-by" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
-                       <!-- force is retired and does not do anything -->\r
-                       <xsd:attribute name="force" use="optional" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="configure">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="adaptor" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="activate" use="optional" type="xsd:boolean" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-\r
-       <xsd:element name="parameter">\r
-               <xsd:complexType>\r
-                       <xsd:attribute name="name" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="value" use="required" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-\r
-       <xsd:element name="return">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="status" use="optional" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="switch">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="test" use="required" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="save">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="force" use="optional" type="xsd:boolean" />\r
-                       <xsd:attribute name="local-only" use="optional" type="xsd:boolean" />\r
-                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="delete">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="optional" type="xsd:string" />\r
-                       <!-- force is retired and does not do anything -->\r
-                       <xsd:attribute name="force" use="optional" type="xsd:string" />\r
-                       <!-- local-only is retired and does not do anything -->\r
-                       <xsd:attribute name="local-only" use="optional" type="xsd:string" />\r
-                       <!-- pfx is retired and does not do anything -->\r
-                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="for">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="atomic" use="optional" type="xsd:boolean" />\r
-                       <xsd:attribute name="index" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="start" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="end" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="silentFailure" use="optional" type="xsd:boolean" default="false" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="set">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="only-if-unset" use="optional"\r
-                               type="xsd:boolean" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="execute">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="method" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="emitsOutcome" use="optional" type="xsd:boolean" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="update">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="force" use="optional" type="xsd:boolean" />\r
-                       <xsd:attribute name="local-only" use="optional" type="xsd:boolean" />\r
-                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="call">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="module" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="rpc" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="version" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="mode" use="required" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="notify">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="plugin" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="resource" use="optional" type="xsd:string" />\r
-                       <xsd:attribute name="action" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="key" use="optional" type="xsd:string" />\r
-                       <!-- force is retired and does not do anything -->\r
-                       <xsd:attribute name="force" use="optional" type="xsd:string" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-       <xsd:element name="break">\r
-               <xsd:complexType />\r
-       </xsd:element>\r
-\r
-       <xsd:element name="while">\r
-               <xsd:complexType>\r
-                       <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
-                       </xsd:sequence>\r
-                       <xsd:attribute name="test" use="required" type="xsd:string" />\r
-                       <xsd:attribute name="do" use="optional" type="xsd:boolean" />\r
-               </xsd:complexType>\r
-       </xsd:element>\r
-\r
-</xsd:schema>\r
+<?xml version = "1.0" encoding = "UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.onap.org/sdnc/svclogic" xmlns="http://www.onap.org/sdnc/svclogic">
+
+       <xsd:simpleType name="modeType">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="sync" />
+                       <xsd:enumeration value="async" />
+               </xsd:restriction>
+       </xsd:simpleType>
+
+       <xsd:group name="node">
+               <xsd:choice>
+                       <xsd:element ref="block" />
+                       <xsd:element ref="is-available" />
+                       <xsd:element ref="exists" />
+                       <xsd:element ref="reserve" />
+                       <xsd:element ref="release" />
+                       <xsd:element ref="allocate" />
+                       <xsd:element ref="get-resource" />
+                       <xsd:element ref="configure" />
+                       <xsd:element ref="return" />
+                       <xsd:element ref="switch" />
+                       <xsd:element ref="record" />
+                       <xsd:element ref="save" />
+                       <xsd:element ref="for" />
+                       <xsd:element ref="set" />
+                       <xsd:element ref="execute" />
+                       <xsd:element ref="delete" />
+                       <xsd:element ref="update" />
+                       <xsd:element ref="call" />
+                       <xsd:element ref="notify" />
+                       <xsd:element ref="break" />
+                       <xsd:element ref="while" />
+                       <xsd:element ref="exit" />
+               </xsd:choice>
+       </xsd:group>
+
+       <xsd:element name="service-logic">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="method" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="module" use="required" type="xsd:string" />
+                       <xsd:attribute name="version" use="required" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="method">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="rpc" use="required" type="xsd:string" />
+                       <xsd:attribute name="mode" use="optional" type="modeType" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="block">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="atomic" use="optional" type="xsd:boolean" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="is-available">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="resource" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="optional" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="exists">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="resource" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="required" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="outcome">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="ref" use="optional" type="xsd:string" />
+                       <xsd:attribute name="value" use="required" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="reserve">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <!-- This node does not actually read from parameters -->
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="resource" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="optional" type="xsd:string" />
+                       <xsd:attribute name="select" use="optional" type="xsd:string" />
+                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="release">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="resource" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="optional" type="xsd:string" />
+                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="record">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="allocate">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <!-- This node does not actually read from parameters -->
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="resource" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="required" type="xsd:string" />
+                       <xsd:attribute name="pfx" use="required" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="get-resource">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <!-- This node does not actually read from parameters -->
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="resource" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="optional" type="xsd:string" />
+                       <xsd:attribute name="local-only" use="optional" type="xsd:boolean" />
+                       <xsd:attribute name="order-by" use="optional" type="xsd:string" />
+                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />
+                       <!-- force is retired and does not do anything -->
+                       <xsd:attribute name="force" use="optional" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="configure">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="adaptor" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="required" type="xsd:string" />
+                       <xsd:attribute name="activate" use="optional" type="xsd:boolean" />
+               </xsd:complexType>
+       </xsd:element>
+
+
+       <xsd:element name="parameter">
+               <xsd:complexType>
+                       <xsd:attribute name="name" use="required" type="xsd:string" />
+                       <xsd:attribute name="value" use="required" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+
+       <xsd:element name="return">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="status" use="optional" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="switch">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="test" use="required" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="save">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="resource" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="optional" type="xsd:string" />
+                       <xsd:attribute name="force" use="optional" type="xsd:boolean" />
+                       <xsd:attribute name="local-only" use="optional" type="xsd:boolean" />
+                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="delete">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <!-- This node does not actually read from parameters -->
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="resource" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="optional" type="xsd:string" />
+                       <!-- force is retired and does not do anything -->
+                       <xsd:attribute name="force" use="optional" type="xsd:string" />
+                       <!-- local-only is retired and does not do anything -->
+                       <xsd:attribute name="local-only" use="optional" type="xsd:string" />
+                       <!-- pfx is retired and does not do anything -->
+                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="for">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="atomic" use="optional" type="xsd:boolean" />
+                       <xsd:attribute name="index" use="required" type="xsd:string" />
+                       <xsd:attribute name="start" use="required" type="xsd:string" />
+                       <xsd:attribute name="end" use="required" type="xsd:string" />
+                       <xsd:attribute name="silentFailure" use="optional" type="xsd:boolean" default="false" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="set">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="only-if-unset" use="optional"
+                               type="xsd:boolean" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="execute">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="method" use="required" type="xsd:string" />
+                       <xsd:attribute name="emitsOutcome" use="optional" type="xsd:boolean" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="update">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="required" type="xsd:string" />
+                       <xsd:attribute name="resource" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="optional" type="xsd:string" />
+                       <xsd:attribute name="force" use="optional" type="xsd:boolean" />
+                       <xsd:attribute name="local-only" use="optional" type="xsd:boolean" />
+                       <xsd:attribute name="pfx" use="optional" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="call">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <!-- This node does not actually read from parameters -->
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="module" use="optional" type="xsd:string" />
+                       <xsd:attribute name="rpc" use="required" type="xsd:string" />
+                       <xsd:attribute name="version" use="optional" type="xsd:string" />
+                       <xsd:attribute name="mode" use="required" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="notify">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="plugin" use="optional" type="xsd:string" />
+                       <xsd:attribute name="resource" use="optional" type="xsd:string" />
+                       <xsd:attribute name="action" use="required" type="xsd:string" />
+                       <xsd:attribute name="key" use="optional" type="xsd:string" />
+                       <!-- force is retired and does not do anything -->
+                       <xsd:attribute name="force" use="optional" type="xsd:string" />
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="break">
+               <xsd:complexType />
+       </xsd:element>
+
+       <xsd:element name="exit">
+               <xsd:complexType />
+       </xsd:element>
+
+       <xsd:element name="while">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />
+                       </xsd:sequence>
+                       <xsd:attribute name="test" use="required" type="xsd:string" />
+                       <xsd:attribute name="do" use="optional" type="xsd:boolean" />
+               </xsd:complexType>
+       </xsd:element>
+
+</xsd:schema>
index 2704de8..3e109c7 100755 (executable)
                        <xsd:element ref="notify" />\r
                        <xsd:element ref="break" />\r
                        <xsd:element ref="while" />\r
+                       <xsd:element ref="exit" />\r
                </xsd:choice>\r
        </xsd:group>\r
 \r
        <xsd:element name="service-logic">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="method" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="method" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="module" use="required" type="xsd:string" />\r
                        <xsd:attribute name="version" use="required" type="xsd:string" />\r
@@ -47,7 +48,7 @@
        <xsd:element name="method">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="rpc" use="required" type="xsd:string" />\r
                        <xsd:attribute name="mode" use="optional" type="modeType" />\r
@@ -57,7 +58,7 @@
        <xsd:element name="block">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="atomic" use="optional" type="xsd:boolean" />\r
                </xsd:complexType>\r
@@ -66,7 +67,7 @@
        <xsd:element name="is-available">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
@@ -78,7 +79,7 @@
        <xsd:element name="exists">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="pfx" use="optional" type="xsd:string" />\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
@@ -90,7 +91,7 @@
        <xsd:element name="outcome">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="ref" use="optional" type="xsd:string" />\r
                        <xsd:attribute name="value" use="required" type="xsd:string" />\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
                                <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
                        <xsd:attribute name="resource" use="required" type="xsd:string" />\r
        <xsd:element name="release">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
                        <xsd:attribute name="resource" use="required" type="xsd:string" />\r
        <xsd:element name="record">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
                </xsd:complexType>\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
                                <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
                        <xsd:attribute name="resource" use="required" type="xsd:string" />\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
                                <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
                        <xsd:attribute name="resource" use="required" type="xsd:string" />\r
        <xsd:element name="configure">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="adaptor" use="required" type="xsd:string" />\r
                        <xsd:attribute name="key" use="required" type="xsd:string" />\r
        <xsd:element name="return">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="status" use="optional" type="xsd:string" />\r
                </xsd:complexType>\r
        <xsd:element name="switch">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="test" use="required" type="xsd:string" />\r
                </xsd:complexType>\r
        <xsd:element name="save">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
                        <xsd:attribute name="resource" use="required" type="xsd:string" />\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
                                <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
                        <xsd:attribute name="resource" use="required" type="xsd:string" />\r
        <xsd:element name="for">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="atomic" use="optional" type="xsd:boolean" />\r
                        <xsd:attribute name="index" use="required" type="xsd:string" />\r
        <xsd:element name="set">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="only-if-unset" use="optional"\r
                                type="xsd:boolean" />\r
        <xsd:element name="execute">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
                        <xsd:attribute name="method" use="required" type="xsd:string" />\r
        <xsd:element name="update">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="required" type="xsd:string" />\r
                        <xsd:attribute name="resource" use="required" type="xsd:string" />\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
                                <!-- This node does not actually read from parameters -->\r
-                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" />\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="parameter" minOccurs="0" maxOccurs="100" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="module" use="optional" type="xsd:string" />\r
                        <xsd:attribute name="rpc" use="required" type="xsd:string" />\r
        <xsd:element name="notify">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:element ref="outcome" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="plugin" use="optional" type="xsd:string" />\r
                        <xsd:attribute name="resource" use="optional" type="xsd:string" />\r
                <xsd:complexType />\r
        </xsd:element>\r
 \r
+       <xsd:element name="exit">\r
+               <xsd:complexType />\r
+       </xsd:element>\r
+\r
        <xsd:element name="while">\r
                <xsd:complexType>\r
                        <xsd:sequence>\r
-                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="100" />\r
                        </xsd:sequence>\r
                        <xsd:attribute name="test" use="required" type="xsd:string" />\r
                        <xsd:attribute name="do" use="optional" type="xsd:boolean" />\r
diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExitNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExitNodeExecutor.java
new file mode 100755 (executable)
index 0000000..fc667f4
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : CCSDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ *                                             reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.ccsdk.sli.core.sli.provider;
+
+import org.onap.ccsdk.sli.core.sli.ExitNodeException;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.onap.ccsdk.sli.core.sli.SvcLogicNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ExitNodeExecutor extends SvcLogicNodeExecutor {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ExitNodeExecutor.class);
+
+    @Override
+    public SvcLogicNode execute(SvcLogicService svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException {
+        String message = "ExitNodeExecutor encountered exit with nodeId " + node.getNodeId();
+        LOG.debug(message);
+        throw new ExitNodeException(message);
+    }
+
+}
index 000c287..0a28695 100755 (executable)
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Properties;
 import org.onap.ccsdk.sli.core.dblib.DbLibService;
 import org.onap.ccsdk.sli.core.sli.ConfigurationException;
+import org.onap.ccsdk.sli.core.sli.ExitNodeException;
 import org.onap.ccsdk.sli.core.sli.MetricLogger;
 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
 import org.onap.ccsdk.sli.core.sli.SvcLogicDblibStore;
@@ -70,7 +71,7 @@ public class SvcLogicServiceImpl implements SvcLogicService {
             put("update", new UpdateNodeExecutor());
             put("break", new BreakNodeExecutor());
             put("while", new WhileNodeExecutor());
-
+            put("exit", new ExitNodeExecutor());
         }
     };
 
@@ -151,14 +152,17 @@ public class SvcLogicServiceImpl implements SvcLogicService {
 
         SvcLogicNode curNode = graph.getRootNode();
         LOG.info("About to execute graph {}", graph.toString());
-
-        while (curNode != null) {
-            MDC.put("nodeId", curNode.getNodeId() + " (" + curNode.getNodeType() + ")");
-            LOG.info("About to execute node # {} ({})", curNode.getNodeId(), curNode.getNodeType());
-
-            SvcLogicNode nextNode = executeNode(curNode, ctx);
-            curNode = nextNode;
-        }
+               try {
+                       while (curNode != null) {
+                               MDC.put("nodeId", curNode.getNodeId() + " (" + curNode.getNodeType() + ")");
+                               LOG.info("About to execute node # {} ({})", curNode.getNodeId(), curNode.getNodeType());
+
+                               SvcLogicNode nextNode = executeNode(curNode, ctx);
+                               curNode = nextNode;
+                       }
+               } catch (ExitNodeException e) {
+            LOG.debug("SvcLogicServiceImpl caught ExitNodeException");
+               }
         MDC.remove("nodeId");
         MDC.remove("currentGraph");
 
@@ -181,7 +185,28 @@ public class SvcLogicServiceImpl implements SvcLogicService {
                     executor.getClass().getName());
             return (executor.execute(this, node, ctx));
         } else {
-            throw new SvcLogicException("Attempted to execute a node of type " + node.getNodeType() + ", but no executor was registered for this type");
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("{} node not implemented", node.getNodeType());
+            }
+            SvcLogicNode nextNode = node.getOutcomeValue("failure");
+            if (nextNode != null) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("about to execute failure branch");
+                }
+                return (nextNode);
+            }
+
+            nextNode = node.getOutcomeValue("Other");
+            if (nextNode != null) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("about to execute Other branch");
+                }
+            } else {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("no failure or Other branch found");
+                }
+            }
+            return (nextNode);
         }
     }