Initial commit for OpenECOMP SDN-C N-C core
[sdnc/core.git] / sli / provider / src / main / java / org / openecomp / sdnc / sli / provider / ForNodeExecutor.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * openECOMP : SDN-C
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
6  *                         reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.openecomp.sdnc.sli.provider;
23
24 import org.openecomp.sdnc.sli.SvcLogicContext;
25 import org.openecomp.sdnc.sli.SvcLogicException;
26 import org.openecomp.sdnc.sli.SvcLogicExpression;
27 import org.openecomp.sdnc.sli.SvcLogicNode;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 public class ForNodeExecutor extends SvcLogicNodeExecutor {
32
33         private static final Logger LOG = LoggerFactory
34                         .getLogger(ForNodeExecutor.class);
35
36         @Override
37         public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node,
38                         SvcLogicContext ctx) throws SvcLogicException {
39
40                 SvcLogicExpression atomicExpr = node.getAttribute("atomic");
41                 String atomicStr = SvcLogicExpressionResolver.evaluate(atomicExpr, node, ctx);
42                 boolean isAtomic = !("false".equalsIgnoreCase(atomicStr));
43                 
44                 int numOutcomes = node.getNumOutcomes();
45                 String idxVar = SvcLogicExpressionResolver.evaluate(
46                                 node.getAttribute("index"), node, ctx);
47                 String startVal = SvcLogicExpressionResolver.evaluate(
48                                 node.getAttribute("start"), node, ctx);
49                 String endVal = SvcLogicExpressionResolver.evaluate(
50                                 node.getAttribute("end"), node, ctx);
51
52                 LOG.debug("Executing "+ (isAtomic ? "atomic" : "non-atomic") + " for loop - for (int " + idxVar + " = " + startVal
53                                 + "; " + idxVar + " < " + endVal + "; " + idxVar + "++)");
54
55                 int startIdx = 0;
56                 int endIdx = 0;
57
58                 try {
59                         startIdx = Integer.parseInt(startVal);
60                         endIdx = Integer.parseInt(endVal);
61                 } catch (NumberFormatException e) {
62                         throw new SvcLogicException("Invalid index values [" + startVal
63                                         + "," + endVal + "]");
64                 }
65
66                 for (int ctr = startIdx; ctr < endIdx; ctr++) {
67
68                         ctx.setAttribute(idxVar, "" + ctr);
69
70                         for (int i = 0; i < numOutcomes; i++) {
71                                 
72                                 if ("failure".equals(ctx.getStatus()) && isAtomic) {
73                                         LOG.info("For - stopped executing nodes due to failure status");
74                                         return(null);
75                                 }
76                                 
77                                 SvcLogicNode nextNode = node.getOutcomeValue("" + (i + 1));
78                                 if (nextNode != null) {
79                                         if (LOG.isDebugEnabled()) {
80                                                 LOG.debug("For  - executing outcome " + (i + 1));
81                                         }
82                                         SvcLogicNode innerNextNode = nextNode;
83                                         while (innerNextNode != null) {
84                                                 innerNextNode = svc.executeNode(innerNextNode, ctx);
85                                         }
86
87                                 } else {
88                                         if (LOG.isDebugEnabled()) {
89                                                 LOG.debug("For - done: no outcome " + (i + 1));
90                                         }
91                                 }
92                         }
93                 }
94                 return (null);
95         }
96
97 }