aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smokowski <ks6305@att.com>2017-05-25 20:54:07 +0000
committerKevin Smokowski <ks6305@att.com>2017-05-25 21:21:01 +0000
commitdda3edb6257146ab6599bfd44658a9791037511d (patch)
tree00ec4db2bb8f4809d13ecb18d8b0b027f24efccd
parente69f794b32db291ace90ac7934e7938bc79d815e (diff)
SDNC-11 merge
Change-Id: I8ac404a2a13469d77f117fd1d90162e5b7c4f7a0 Signed-off-by: Kevin Smokowski <ks6305@att.com>
-rw-r--r--sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParser.java1182
-rwxr-xr-xsli/common/src/main/resources/svclogic.xsd11
-rw-r--r--sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/CallNodeExecutor.java13
-rw-r--r--sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicActivator.java438
-rw-r--r--sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/WhileNodeExecutor.java76
-rw-r--r--sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java1
6 files changed, 900 insertions, 821 deletions
diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParser.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParser.java
index 0e06b9e..3aa4068 100644
--- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParser.java
+++ b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParser.java
@@ -1,598 +1,598 @@
-/*-
+/*-
* ============LICENSE_START=======================================================
* openECOMP : SDN-C
* ================================================================================
* 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
+ * 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.openecomp.sdnc.sli;
-
-import java.io.File;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.LinkedList;
-
-import javax.xml.XMLConstants;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * @author dt5972
- *
- */
-public class SvcLogicParser {
-
- SvcLogicStore store = null;
- static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
- static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
- static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
- static final String JAXP_DYNAMIC_VALIDATION = "http://apache.org/xml/features/validation/dynamic";
- static final String JAXP_SCHEMA_VALIDATION = "http://apache.org/xml/features/validation/schema";
-
- private static final String LOAD_MESSAGE = "Getting SvcLogicGraph from database - ";
- private static final String LOAD_ERROR_MESSAGE = "SvcLogicGraph not found - ";
- private static final String ACTIVATION_ERROR_MESSAGE = "Could not activate SvcLogicGraph - ";
- private static final String PRINT_ERROR_MESSAGE = "Could not print SvcLogicGraph - ";
- private static final String SVC_LOGIC_STORE_ERROR = "Could not get service logic store";
-
- private static final Logger LOGGER = LoggerFactory.getLogger(SvcLogicParser.class);
- private static final String SLI_VALIDATING_PARSER = "org.openecomp.sdnc.sli.parser.validate";
- private static final String SVCLOGIC_XSD = "/svclogic.xsd";
-
- private class SvcLogicHandler extends DefaultHandler {
- private Locator locator = null;
- private String module = null;
- private String version = null;
- private LinkedList<SvcLogicGraph> graphs = null;
- private SvcLogicGraph curGraph = null;
- private SvcLogicNode curNode = null;
- private LinkedList<SvcLogicNode> nodeStack = null;
- private int curNodeId = 0;
- private String outcomeValue = null;
- private LinkedList<String> outcomeStack = null;
- private SvcLogicStore svcLogicStore = null;
-
- public SvcLogicHandler(LinkedList<SvcLogicGraph> graphs, SvcLogicStore store) {
- this.graphs = graphs;
- this.curNode = null;
- this.nodeStack = new LinkedList<>();
- this.outcomeStack = new LinkedList<>();
- this.curNodeId = 1;
- this.outcomeValue = null;
- this.svcLogicStore = store;
-
- }
-
- @Override
- public void setDocumentLocator(Locator locator) {
- this.locator = locator;
- }
-
- @Override
- public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-
- // Handle service-logic (graph) tag
- if ("service-logic".equalsIgnoreCase(qName)) {
-
- module = attributes.getValue("module");
- if (module == null || module.length() == 0) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'module' attribute from service-logic tag");
- }
-
- version = attributes.getValue("version");
- if (version == null || version.length() == 0) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'version' attribute from service-logic tag");
- }
-
- return;
- }
-
- if ("method".equalsIgnoreCase(qName)) {
- if (curGraph != null) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot nest module tags");
- }
- curGraph = new SvcLogicGraph();
- curGraph.setModule(module);
- curGraph.setVersion(version);
- this.curNodeId = 1;
-
- String attrValue = attributes.getValue("rpc");
- if (attrValue == null || attrValue.length() == 0) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'rpc' attribute for method tag");
- }
- curGraph.setRpc(attrValue);
-
- attrValue = attributes.getValue("mode");
- if (attrValue == null || attrValue.length() == 0) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'mode' attribute for method tag");
- }
- curGraph.setMode(attrValue);
-
- return;
-
- }
-
- // Handle outcome (edge) tag
- if ("outcome".equalsIgnoreCase(qName)) {
- String refValue = attributes.getValue("ref");
-
- if (refValue != null) {
- SvcLogicNode refNode = curGraph.getNamedNode(refValue);
-
- if (refNode != null) {
- try {
- curNode.addOutcome(attributes.getValue("value"), refNode);
- } catch (SvcLogicException e) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot add outcome", e);
- }
- } else {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "ref to unknown node " + refValue);
- }
- return;
- }
-
- if (outcomeValue != null) {
- outcomeStack.push(outcomeValue);
- }
- outcomeValue = attributes.getValue("value");
-
- return;
- }
-
- // Handle parameter tag
- if ("parameter".equalsIgnoreCase(qName)) {
- String parmName = attributes.getValue("name");
- String parmValue = attributes.getValue("value");
-
- if (parmName != null && parmName.length() > 0 && parmValue != null) {
- try {
-
- curNode.mapParameter(parmName, parmValue);
- } catch (Exception e) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + " cannot set parameter " + parmName + " to " + parmValue + " [" + e.getMessage() + "]");
- }
- }
-
- return;
- }
-
- // Handle node tags
-
- String nodeName = attributes.getValue("name");
- SvcLogicNode thisNode = null;
-
- try {
- if (!svcLogicStore.isValidNodeType(qName)) {
- throw new SAXNotRecognizedException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Unknown tag " + qName);
- }
- } catch (Exception e) {
- throw new SAXNotRecognizedException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot validate node type " + qName);
- }
-
- try {
- if (nodeName != null && nodeName.length() > 0) {
- thisNode = new SvcLogicNode(curNodeId++, qName, nodeName, curGraph);
- } else {
- thisNode = new SvcLogicNode(curNodeId++, qName, curGraph);
- }
-
- if (curGraph.getRootNode() == null) {
- curGraph.setRootNode(thisNode);
- }
- } catch (SvcLogicException e) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + e.getMessage());
-
- }
-
- int numAttributes = attributes.getLength();
-
- for (int i = 0; i < numAttributes; i++) {
- String attrName = attributes.getQName(i);
- if (!"name".equalsIgnoreCase(attrName)) {
- try {
-
- String attrValueStr = attributes.getValue(i);
- SvcLogicExpression attrValue = null;
- if (attrValueStr.trim().startsWith("`")) {
- int lastParen = attrValueStr.lastIndexOf("`");
- String evalExpr = attrValueStr.trim().substring(1, lastParen);
- attrValue = SvcLogicExpressionFactory.parse(evalExpr);
-
- } else {
- if (Character.isDigit(attrValueStr.charAt(0))) {
- attrValue = new SvcLogicAtom("NUMBER", attrValueStr);
- } else {
- attrValue = new SvcLogicAtom("STRING", attrValueStr);
- }
- }
- thisNode.setAttribute(attrName, attrValue);
- } catch (Exception e) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot set attribute " + attrName, e);
- }
- }
- }
-
- if (curNode != null) {
- try {
- if ("block".equalsIgnoreCase(curNode.getNodeType()) || "for".equalsIgnoreCase(curNode.getNodeType())) {
- curNode.addOutcome("" + (curNode.getNumOutcomes() + 1), thisNode);
- } else {
- if (outcomeValue == null) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + curNode.getNodeType() + " node expects outcome, instead found " + thisNode.getNodeType());
- }
- curNode.addOutcome(outcomeValue, thisNode);
- }
- } catch (SvcLogicException e) {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + e.getMessage());
- }
- nodeStack.push(curNode);
- }
- curNode = thisNode;
-
- }
-
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
-
- // Handle close of service-logic tag
- if ("service-logic".equalsIgnoreCase(qName)) {
- // Nothing more to do
- return;
- }
-
- // Handle close of method tag
- if ("method".equalsIgnoreCase(qName)) {
- graphs.add(curGraph);
- curGraph = null;
- return;
- }
-
- // Handle close of outcome tag
- if ("outcome".equalsIgnoreCase(qName)) {
- // Finished this outcome - pop the outcome stack
- if (outcomeStack.isEmpty()) {
- outcomeValue = null;
- } else {
- outcomeValue = outcomeStack.pop();
- }
- return;
- }
-
- // Handle close of parameter tag - do nothing
- if ("parameter".equalsIgnoreCase(qName)) {
- return;
- }
-
- // Handle close of a node tag
- if (nodeStack.isEmpty()) {
- curNode = null;
- } else {
- curNode = nodeStack.pop();
- }
- }
-
- @Override
- public void error(SAXParseException arg0) throws SAXException {
- throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + arg0.getMessage());
- }
-
- }
-
- public SvcLogicParser(SvcLogicStore store) {
- this.store = store;
- }
-
- public SvcLogicParser(String propFile) {
-
- try {
- this.store = SvcLogicStoreFactory.getSvcLogicStore(propFile);
- } catch (Exception e) {
- LOGGER.error(SVC_LOGIC_STORE_ERROR, e);
-
- }
-
- }
-
- public SvcLogicParser(InputStream propStr) {
-
- try {
- this.store = SvcLogicStoreFactory.getSvcLogicStore(propStr);
- } catch (Exception e) {
- LOGGER.error(SVC_LOGIC_STORE_ERROR, e);
-
- }
-
- }
-
- public LinkedList<SvcLogicGraph> parse(String fileName) throws SvcLogicException {
- LinkedList<SvcLogicGraph> graphs = null;
-
- URL xsdUrl = null;
- Schema schema = null;
- String validateSchema = System.getProperty(SLI_VALIDATING_PARSER, "true");
-
- if (validateSchema != null || validateSchema.equalsIgnoreCase("true")) {
- xsdUrl = getClass().getResource(SVCLOGIC_XSD);
-
- }
-
- if (xsdUrl != null) {
- try {
- SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- schema = schemaFactory.newSchema(xsdUrl);
- } catch (Exception e) {
- LOGGER.warn("Could not validate using schema " + xsdUrl.getPath(), e);
- }
- } else {
- LOGGER.warn("Could not find resource " + SVCLOGIC_XSD);
- }
-
- try {
- SAXParserFactory factory = SAXParserFactory.newInstance();
-
- if (schema != null) {
- factory.setNamespaceAware(true);
- factory.setSchema(schema);
- }
- SAXParser saxParser = factory.newSAXParser();
-
- if (saxParser.isValidating()) {
- LOGGER.info("Validating against schema " + xsdUrl.getPath());
- }
- graphs = new LinkedList<>();
-
- saxParser.parse(fileName, new SvcLogicHandler(graphs, store));
-
- } catch (Exception e) {
- String msg = e.getMessage();
- if (msg != null) {
- LOGGER.error(msg);
- throw new SvcLogicException("Compiler error: " + fileName + " @ " + msg);
- } else {
- LOGGER.info("Caught exception parsing " + fileName, e);
- throw new SvcLogicException("Compiler error: " + fileName, e);
- }
- }
-
- return graphs;
- }
-
- public static void main(String argv[]) {
-
- if (argv.length == 0) {
- SvcLogicParser.usage();
- }
-
- if ("load".equalsIgnoreCase(argv[0])) {
- if (argv.length == 3) {
- String xmlfile = argv[1];
- String propfile = argv[2];
-
- SvcLogicStore store = SvcLogicParser.getStore(propfile);
- try {
- SvcLogicParser.load(xmlfile, store);
- } catch (Exception e) {
- LOGGER.error(e.getMessage(), e);
- }
- } else {
- SvcLogicParser.usage();
- }
- } else if ("print".equalsIgnoreCase(argv[0])) {
- String version = null;
- String propfile = null;
-
- switch (argv.length) {
- case 6:
- version = argv[4];
- propfile = argv[5];
- case 5:
- if (propfile == null) {
- propfile = argv[4];
- }
- SvcLogicStore store = SvcLogicParser.getStore(propfile);
- SvcLogicParser.print(argv[1], argv[2], argv[3], version, store);
- break;
- default:
- SvcLogicParser.usage();
- }
- } else if ("get-source".equalsIgnoreCase(argv[0])) {
-
- switch (argv.length) {
- case 6:
- SvcLogicStore store = SvcLogicParser.getStore(argv[5]);
- SvcLogicParser.getSource(argv[1], argv[2], argv[3], argv[4], store);
- break;
- default:
- SvcLogicParser.usage();
- }
- } else if ("activate".equalsIgnoreCase(argv[0])) {
- if (argv.length == 6) {
- SvcLogicStore store = SvcLogicParser.getStore(argv[5]);
- SvcLogicParser.activate(argv[1], argv[2], argv[3], argv[4], store);
- } else {
- SvcLogicParser.usage();
- }
- } else if ("validate".equalsIgnoreCase(argv[0])) {
- if (argv.length == 3) {
- String xmlfile = argv[1];
- String propfile = argv[2];
-
- System.setProperty(SLI_VALIDATING_PARSER, "true");
- SvcLogicStore store = SvcLogicParser.getStore(propfile);
- try {
- SvcLogicParser.validate(xmlfile, store);
- } catch (Exception e) {
- LOGGER.error(e.getMessage(), e);
- }
- } else {
- SvcLogicParser.usage();
- }
- }
-
- System.exit(0);
- }
-
- private static SvcLogicStore getStore(String propfile) {
-
- SvcLogicStore store = null;
-
- try {
- store = SvcLogicStoreFactory.getSvcLogicStore(propfile);
- } catch (Exception e) {
- LOGGER.error(SVC_LOGIC_STORE_ERROR, e);
- System.exit(1);
- }
-
- return store;
-
- }
-
- public static void load(String xmlfile, SvcLogicStore store) throws SvcLogicException {
- File xmlFile = new File(xmlfile);
- if (!xmlFile.canRead()) {
- throw new ConfigurationException("Cannot read xml file (" + xmlfile + ")");
- }
-
- SvcLogicParser parser = new SvcLogicParser(store);
- LinkedList<SvcLogicGraph> graphs = null;
- try {
- graphs = parser.parse(xmlfile);
- } catch (Exception e) {
- throw new SvcLogicException(e.getMessage(), e);
- }
-
- if (graphs == null) {
- throw new SvcLogicException("Could not parse " + xmlfile);
- }
-
- for (SvcLogicGraph graph : graphs) {
-
- String module = graph.getModule();
- String rpc = graph.getRpc();
- String version = graph.getVersion();
- String mode = graph.getMode();
- try {
- LOGGER.info("Saving SvcLogicGraph to database (module:" + module + ",rpc:" + rpc + ",version:" + version + ",mode:" + mode + ")");
- store.store(graph);
- } catch (Exception e) {
- throw new SvcLogicException(e.getMessage(), e);
- }
-
- }
-
- }
-
- public static void validate(String xmlfile, SvcLogicStore store) throws SvcLogicException {
- File xmlFile = new File(xmlfile);
- if (!xmlFile.canRead()) {
- throw new ConfigurationException("Cannot read xml file (" + xmlfile + ")");
- }
-
- SvcLogicParser parser = new SvcLogicParser(store);
- LinkedList<SvcLogicGraph> graphs = null;
- try {
- LOGGER.info("Validating " + xmlfile);
- graphs = parser.parse(xmlfile);
- } catch (Exception e) {
- throw new SvcLogicException(e.getMessage(), e);
- }
-
- if (graphs == null) {
- throw new SvcLogicException("Could not parse " + xmlfile);
- } else {
- LOGGER.info("Compilation successful for " + xmlfile);
- }
-
- }
-
- private static void print(String module, String rpc, String mode, String version, SvcLogicStore store) {
- String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")";
-
- try {
- LOGGER.info(LOAD_MESSAGE + details);
-
- SvcLogicGraph graph = store.fetch(module, rpc, version, mode);
- if (graph == null) {
- LOGGER.error(LOAD_ERROR_MESSAGE + details);
- System.exit(1);
- }
- graph.printAsGv(System.out);
- } catch (Exception e) {
- LOGGER.error(PRINT_ERROR_MESSAGE + details, e);
- System.exit(1);
- }
-
- }
-
- private static void getSource(String module, String rpc, String mode, String version, SvcLogicStore store) {
- String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")";
-
- try {
- LOGGER.info(LOAD_MESSAGE + details);
-
- SvcLogicGraph graph = store.fetch(module, rpc, version, mode);
- if (graph == null) {
- LOGGER.error(LOAD_ERROR_MESSAGE + details);
- System.exit(1);
- }
- graph.printAsXml(System.out);
- } catch (Exception e) {
- LOGGER.error(PRINT_ERROR_MESSAGE + details, e);
- System.exit(1);
- }
-
- }
-
- private static void activate(String module, String rpc, String version, String mode, SvcLogicStore store) {
- String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")";
-
- try {
- LOGGER.info(LOAD_MESSAGE + details);
-
- SvcLogicGraph graph = store.fetch(module, rpc, version, mode);
- if (graph == null) {
- LOGGER.error(LOAD_ERROR_MESSAGE + details);
- System.exit(1);
- }
- store.activate(graph);
- } catch (Exception e) {
- LOGGER.error(ACTIVATION_ERROR_MESSAGE + details, e);
- System.exit(1);
- }
-
- }
-
- private static void usage() {
- System.err.println("Usage: SvcLogicParser load <xml-file> <prop-file>");
- System.err.println(" OR SvcLogicParser print <module> <rpc> <mode> [<version>] <prop-file>");
- System.err.println(" OR SvcLogicParser get-source <module> <rpc> <mode> <version> <prop-file>");
- System.err.println(" OR SvcLogicParser activate <module> <rpc> <version> <mode>");
- System.exit(1);
- }
-
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdnc.sli;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.LinkedList;
+
+import javax.xml.XMLConstants;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * @author dt5972
+ *
+ */
+public class SvcLogicParser {
+
+ SvcLogicStore store = null;
+ static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
+ static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
+ static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
+ static final String JAXP_DYNAMIC_VALIDATION = "http://apache.org/xml/features/validation/dynamic";
+ static final String JAXP_SCHEMA_VALIDATION = "http://apache.org/xml/features/validation/schema";
+
+ private static final String LOAD_MESSAGE = "Getting SvcLogicGraph from database - ";
+ private static final String LOAD_ERROR_MESSAGE = "SvcLogicGraph not found - ";
+ private static final String ACTIVATION_ERROR_MESSAGE = "Could not activate SvcLogicGraph - ";
+ private static final String PRINT_ERROR_MESSAGE = "Could not print SvcLogicGraph - ";
+ private static final String SVC_LOGIC_STORE_ERROR = "Could not get service logic store";
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SvcLogicParser.class);
+ private static final String SLI_VALIDATING_PARSER = "org.openecomp.sdnc.sli.parser.validate";
+ private static final String SVCLOGIC_XSD = "/svclogic.xsd";
+
+ private class SvcLogicHandler extends DefaultHandler {
+ private Locator locator = null;
+ private String module = null;
+ private String version = null;
+ private LinkedList<SvcLogicGraph> graphs = null;
+ private SvcLogicGraph curGraph = null;
+ private SvcLogicNode curNode = null;
+ private LinkedList<SvcLogicNode> nodeStack = null;
+ private int curNodeId = 0;
+ private String outcomeValue = null;
+ private LinkedList<String> outcomeStack = null;
+ private SvcLogicStore svcLogicStore = null;
+
+ public SvcLogicHandler(LinkedList<SvcLogicGraph> graphs, SvcLogicStore store) {
+ this.graphs = graphs;
+ this.curNode = null;
+ this.nodeStack = new LinkedList<>();
+ this.outcomeStack = new LinkedList<>();
+ this.curNodeId = 1;
+ this.outcomeValue = null;
+ this.svcLogicStore = store;
+
+ }
+
+ @Override
+ public void setDocumentLocator(Locator locator) {
+ this.locator = locator;
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+
+ // Handle service-logic (graph) tag
+ if ("service-logic".equalsIgnoreCase(qName)) {
+
+ module = attributes.getValue("module");
+ if (module == null || module.length() == 0) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'module' attribute from service-logic tag");
+ }
+
+ version = attributes.getValue("version");
+ if (version == null || version.length() == 0) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'version' attribute from service-logic tag");
+ }
+
+ return;
+ }
+
+ if ("method".equalsIgnoreCase(qName)) {
+ if (curGraph != null) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot nest module tags");
+ }
+ curGraph = new SvcLogicGraph();
+ curGraph.setModule(module);
+ curGraph.setVersion(version);
+ this.curNodeId = 1;
+
+ String attrValue = attributes.getValue("rpc");
+ if (attrValue == null || attrValue.length() == 0) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'rpc' attribute for method tag");
+ }
+ curGraph.setRpc(attrValue);
+
+ attrValue = attributes.getValue("mode");
+ if (attrValue == null || attrValue.length() == 0) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'mode' attribute for method tag");
+ }
+ curGraph.setMode(attrValue);
+
+ return;
+
+ }
+
+ // Handle outcome (edge) tag
+ if ("outcome".equalsIgnoreCase(qName)) {
+ String refValue = attributes.getValue("ref");
+
+ if (refValue != null) {
+ SvcLogicNode refNode = curGraph.getNamedNode(refValue);
+
+ if (refNode != null) {
+ try {
+ curNode.addOutcome(attributes.getValue("value"), refNode);
+ } catch (SvcLogicException e) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot add outcome", e);
+ }
+ } else {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "ref to unknown node " + refValue);
+ }
+ return;
+ }
+
+ if (outcomeValue != null) {
+ outcomeStack.push(outcomeValue);
+ }
+ outcomeValue = attributes.getValue("value");
+
+ return;
+ }
+
+ // Handle parameter tag
+ if ("parameter".equalsIgnoreCase(qName)) {
+ String parmName = attributes.getValue("name");
+ String parmValue = attributes.getValue("value");
+
+ if (parmName != null && parmName.length() > 0 && parmValue != null) {
+ try {
+
+ curNode.mapParameter(parmName, parmValue);
+ } catch (Exception e) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + " cannot set parameter " + parmName + " to " + parmValue + " [" + e.getMessage() + "]");
+ }
+ }
+
+ return;
+ }
+
+ // Handle node tags
+
+ String nodeName = attributes.getValue("name");
+ SvcLogicNode thisNode = null;
+
+ try {
+ if (!svcLogicStore.isValidNodeType(qName)) {
+ throw new SAXNotRecognizedException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Unknown tag " + qName);
+ }
+ } catch (Exception e) {
+ throw new SAXNotRecognizedException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot validate node type " + qName);
+ }
+
+ try {
+ if (nodeName != null && nodeName.length() > 0) {
+ thisNode = new SvcLogicNode(curNodeId++, qName, nodeName, curGraph);
+ } else {
+ thisNode = new SvcLogicNode(curNodeId++, qName, curGraph);
+ }
+
+ if (curGraph.getRootNode() == null) {
+ curGraph.setRootNode(thisNode);
+ }
+ } catch (SvcLogicException e) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + e.getMessage());
+
+ }
+
+ int numAttributes = attributes.getLength();
+
+ for (int i = 0; i < numAttributes; i++) {
+ String attrName = attributes.getQName(i);
+ if (!"name".equalsIgnoreCase(attrName)) {
+ try {
+
+ String attrValueStr = attributes.getValue(i);
+ SvcLogicExpression attrValue = null;
+ if (attrValueStr.trim().startsWith("`")) {
+ int lastParen = attrValueStr.lastIndexOf("`");
+ String evalExpr = attrValueStr.trim().substring(1, lastParen);
+ attrValue = SvcLogicExpressionFactory.parse(evalExpr);
+
+ } else {
+ if (Character.isDigit(attrValueStr.charAt(0))) {
+ attrValue = new SvcLogicAtom("NUMBER", attrValueStr);
+ } else {
+ attrValue = new SvcLogicAtom("STRING", attrValueStr);
+ }
+ }
+ thisNode.setAttribute(attrName, attrValue);
+ } catch (Exception e) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot set attribute " + attrName, e);
+ }
+ }
+ }
+
+ if (curNode != null) {
+ try {
+ if ("block".equalsIgnoreCase(curNode.getNodeType()) || "for".equalsIgnoreCase(curNode.getNodeType()) || "while".equalsIgnoreCase(curNode.getNodeType())) {
+ curNode.addOutcome("" + (curNode.getNumOutcomes() + 1), thisNode);
+ } else {
+ if (outcomeValue == null) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + curNode.getNodeType() + " node expects outcome, instead found " + thisNode.getNodeType());
+ }
+ curNode.addOutcome(outcomeValue, thisNode);
+ }
+ } catch (SvcLogicException e) {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + e.getMessage());
+ }
+ nodeStack.push(curNode);
+ }
+ curNode = thisNode;
+
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+
+ // Handle close of service-logic tag
+ if ("service-logic".equalsIgnoreCase(qName)) {
+ // Nothing more to do
+ return;
+ }
+
+ // Handle close of method tag
+ if ("method".equalsIgnoreCase(qName)) {
+ graphs.add(curGraph);
+ curGraph = null;
+ return;
+ }
+
+ // Handle close of outcome tag
+ if ("outcome".equalsIgnoreCase(qName)) {
+ // Finished this outcome - pop the outcome stack
+ if (outcomeStack.isEmpty()) {
+ outcomeValue = null;
+ } else {
+ outcomeValue = outcomeStack.pop();
+ }
+ return;
+ }
+
+ // Handle close of parameter tag - do nothing
+ if ("parameter".equalsIgnoreCase(qName)) {
+ return;
+ }
+
+ // Handle close of a node tag
+ if (nodeStack.isEmpty()) {
+ curNode = null;
+ } else {
+ curNode = nodeStack.pop();
+ }
+ }
+
+ @Override
+ public void error(SAXParseException arg0) throws SAXException {
+ throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + arg0.getMessage());
+ }
+
+ }
+
+ public SvcLogicParser(SvcLogicStore store) {
+ this.store = store;
+ }
+
+ public SvcLogicParser(String propFile) {
+
+ try {
+ this.store = SvcLogicStoreFactory.getSvcLogicStore(propFile);
+ } catch (Exception e) {
+ LOGGER.error(SVC_LOGIC_STORE_ERROR, e);
+
+ }
+
+ }
+
+ public SvcLogicParser(InputStream propStr) {
+
+ try {
+ this.store = SvcLogicStoreFactory.getSvcLogicStore(propStr);
+ } catch (Exception e) {
+ LOGGER.error(SVC_LOGIC_STORE_ERROR, e);
+
+ }
+
+ }
+
+ public LinkedList<SvcLogicGraph> parse(String fileName) throws SvcLogicException {
+ LinkedList<SvcLogicGraph> graphs = null;
+
+ URL xsdUrl = null;
+ Schema schema = null;
+ String validateSchema = System.getProperty(SLI_VALIDATING_PARSER, "true");
+
+ if (validateSchema != null || validateSchema.equalsIgnoreCase("true")) {
+ xsdUrl = getClass().getResource(SVCLOGIC_XSD);
+
+ }
+
+ if (xsdUrl != null) {
+ try {
+ SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ schema = schemaFactory.newSchema(xsdUrl);
+ } catch (Exception e) {
+ LOGGER.warn("Could not validate using schema " + xsdUrl.getPath(), e);
+ }
+ } else {
+ LOGGER.warn("Could not find resource " + SVCLOGIC_XSD);
+ }
+
+ try {
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+
+ if (schema != null) {
+ factory.setNamespaceAware(true);
+ factory.setSchema(schema);
+ }
+ SAXParser saxParser = factory.newSAXParser();
+
+ if (saxParser.isValidating()) {
+ LOGGER.info("Validating against schema " + xsdUrl.getPath());
+ }
+ graphs = new LinkedList<>();
+
+ saxParser.parse(fileName, new SvcLogicHandler(graphs, store));
+
+ } catch (Exception e) {
+ String msg = e.getMessage();
+ if (msg != null) {
+ LOGGER.error(msg);
+ throw new SvcLogicException("Compiler error: " + fileName + " @ " + msg);
+ } else {
+ LOGGER.info("Caught exception parsing " + fileName, e);
+ throw new SvcLogicException("Compiler error: " + fileName, e);
+ }
+ }
+
+ return graphs;
+ }
+
+ public static void main(String argv[]) {
+
+ if (argv.length == 0) {
+ SvcLogicParser.usage();
+ }
+
+ if ("load".equalsIgnoreCase(argv[0])) {
+ if (argv.length == 3) {
+ String xmlfile = argv[1];
+ String propfile = argv[2];
+
+ SvcLogicStore store = SvcLogicParser.getStore(propfile);
+ try {
+ SvcLogicParser.load(xmlfile, store);
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ }
+ } else {
+ SvcLogicParser.usage();
+ }
+ } else if ("print".equalsIgnoreCase(argv[0])) {
+ String version = null;
+ String propfile = null;
+
+ switch (argv.length) {
+ case 6:
+ version = argv[4];
+ propfile = argv[5];
+ case 5:
+ if (propfile == null) {
+ propfile = argv[4];
+ }
+ SvcLogicStore store = SvcLogicParser.getStore(propfile);
+ SvcLogicParser.print(argv[1], argv[2], argv[3], version, store);
+ break;
+ default:
+ SvcLogicParser.usage();
+ }
+ } else if ("get-source".equalsIgnoreCase(argv[0])) {
+
+ switch (argv.length) {
+ case 6:
+ SvcLogicStore store = SvcLogicParser.getStore(argv[5]);
+ SvcLogicParser.getSource(argv[1], argv[2], argv[3], argv[4], store);
+ break;
+ default:
+ SvcLogicParser.usage();
+ }
+ } else if ("activate".equalsIgnoreCase(argv[0])) {
+ if (argv.length == 6) {
+ SvcLogicStore store = SvcLogicParser.getStore(argv[5]);
+ SvcLogicParser.activate(argv[1], argv[2], argv[3], argv[4], store);
+ } else {
+ SvcLogicParser.usage();
+ }
+ } else if ("validate".equalsIgnoreCase(argv[0])) {
+ if (argv.length == 3) {
+ String xmlfile = argv[1];
+ String propfile = argv[2];
+
+ System.setProperty(SLI_VALIDATING_PARSER, "true");
+ SvcLogicStore store = SvcLogicParser.getStore(propfile);
+ try {
+ SvcLogicParser.validate(xmlfile, store);
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ }
+ } else {
+ SvcLogicParser.usage();
+ }
+ }
+
+ System.exit(0);
+ }
+
+ private static SvcLogicStore getStore(String propfile) {
+
+ SvcLogicStore store = null;
+
+ try {
+ store = SvcLogicStoreFactory.getSvcLogicStore(propfile);
+ } catch (Exception e) {
+ LOGGER.error(SVC_LOGIC_STORE_ERROR, e);
+ System.exit(1);
+ }
+
+ return store;
+
+ }
+
+ public static void load(String xmlfile, SvcLogicStore store) throws SvcLogicException {
+ File xmlFile = new File(xmlfile);
+ if (!xmlFile.canRead()) {
+ throw new ConfigurationException("Cannot read xml file (" + xmlfile + ")");
+ }
+
+ SvcLogicParser parser = new SvcLogicParser(store);
+ LinkedList<SvcLogicGraph> graphs = null;
+ try {
+ graphs = parser.parse(xmlfile);
+ } catch (Exception e) {
+ throw new SvcLogicException(e.getMessage(), e);
+ }
+
+ if (graphs == null) {
+ throw new SvcLogicException("Could not parse " + xmlfile);
+ }
+
+ for (SvcLogicGraph graph : graphs) {
+
+ String module = graph.getModule();
+ String rpc = graph.getRpc();
+ String version = graph.getVersion();
+ String mode = graph.getMode();
+ try {
+ LOGGER.info("Saving SvcLogicGraph to database (module:" + module + ",rpc:" + rpc + ",version:" + version + ",mode:" + mode + ")");
+ store.store(graph);
+ } catch (Exception e) {
+ throw new SvcLogicException(e.getMessage(), e);
+ }
+
+ }
+
+ }
+
+ public static void validate(String xmlfile, SvcLogicStore store) throws SvcLogicException {
+ File xmlFile = new File(xmlfile);
+ if (!xmlFile.canRead()) {
+ throw new ConfigurationException("Cannot read xml file (" + xmlfile + ")");
+ }
+
+ SvcLogicParser parser = new SvcLogicParser(store);
+ LinkedList<SvcLogicGraph> graphs = null;
+ try {
+ LOGGER.info("Validating " + xmlfile);
+ graphs = parser.parse(xmlfile);
+ } catch (Exception e) {
+ throw new SvcLogicException(e.getMessage(), e);
+ }
+
+ if (graphs == null) {
+ throw new SvcLogicException("Could not parse " + xmlfile);
+ } else {
+ LOGGER.info("Compilation successful for " + xmlfile);
+ }
+
+ }
+
+ private static void print(String module, String rpc, String mode, String version, SvcLogicStore store) {
+ String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")";
+
+ try {
+ LOGGER.info(LOAD_MESSAGE + details);
+
+ SvcLogicGraph graph = store.fetch(module, rpc, version, mode);
+ if (graph == null) {
+ LOGGER.error(LOAD_ERROR_MESSAGE + details);
+ System.exit(1);
+ }
+ graph.printAsGv(System.out);
+ } catch (Exception e) {
+ LOGGER.error(PRINT_ERROR_MESSAGE + details, e);
+ System.exit(1);
+ }
+
+ }
+
+ private static void getSource(String module, String rpc, String mode, String version, SvcLogicStore store) {
+ String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")";
+
+ try {
+ LOGGER.info(LOAD_MESSAGE + details);
+
+ SvcLogicGraph graph = store.fetch(module, rpc, version, mode);
+ if (graph == null) {
+ LOGGER.error(LOAD_ERROR_MESSAGE + details);
+ System.exit(1);
+ }
+ graph.printAsXml(System.out);
+ } catch (Exception e) {
+ LOGGER.error(PRINT_ERROR_MESSAGE + details, e);
+ System.exit(1);
+ }
+
+ }
+
+ private static void activate(String module, String rpc, String version, String mode, SvcLogicStore store) {
+ String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")";
+
+ try {
+ LOGGER.info(LOAD_MESSAGE + details);
+
+ SvcLogicGraph graph = store.fetch(module, rpc, version, mode);
+ if (graph == null) {
+ LOGGER.error(LOAD_ERROR_MESSAGE + details);
+ System.exit(1);
+ }
+ store.activate(graph);
+ } catch (Exception e) {
+ LOGGER.error(ACTIVATION_ERROR_MESSAGE + details, e);
+ System.exit(1);
+ }
+
+ }
+
+ private static void usage() {
+ System.err.println("Usage: SvcLogicParser load <xml-file> <prop-file>");
+ System.err.println(" OR SvcLogicParser print <module> <rpc> <mode> [<version>] <prop-file>");
+ System.err.println(" OR SvcLogicParser get-source <module> <rpc> <mode> <version> <prop-file>");
+ System.err.println(" OR SvcLogicParser activate <module> <rpc> <version> <mode>");
+ System.exit(1);
+ }
+
+}
diff --git a/sli/common/src/main/resources/svclogic.xsd b/sli/common/src/main/resources/svclogic.xsd
index 0743089..f74bd5d 100755
--- a/sli/common/src/main/resources/svclogic.xsd
+++ b/sli/common/src/main/resources/svclogic.xsd
@@ -30,6 +30,7 @@
<xsd:element ref="call" />
<xsd:element ref="notify" />
<xsd:element ref="break" />
+ <xsd:element ref="while" />
</xsd:choice>
</xsd:group>
@@ -320,4 +321,14 @@
<xsd:complexType />
</xsd:element>
+ <xsd:element name="while">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />
+ </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>
diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/CallNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/CallNodeExecutor.java
index b6fa374..a500b6f 100644
--- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/CallNodeExecutor.java
+++ b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/CallNodeExecutor.java
@@ -78,16 +78,7 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor {
{
rpc = SvcLogicExpressionResolver.evaluate(rpcExpr, node, ctx);
}
-
- if ((rpc == null) || (rpc.length() == 0))
- {
- if (myGraph != null)
- {
- rpc = myGraph.getRpc();
- LOG.debug("myGraph.getRpc() returned "+rpc);
- }
- }
-
+
String mode = null;
moduleExpr = node.getAttribute("mode");
@@ -122,8 +113,8 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor {
if (store != null) {
SvcLogicGraph calledGraph = store.fetch(module, rpc, version, mode);
if (calledGraph != null) {
- LOG.debug("Parent " + parentGraph + " is calling child " + calledGraph.toString());
svc.execute(calledGraph, ctx);
+ LOG.debug("Parent " + parentGraph + " is calling child " + calledGraph.toString());
ctx.setAttribute("currentGraph", calledGraph.toString());
outValue = ctx.getStatus();
} else {
diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicActivator.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicActivator.java
index 691ad40..8996095 100644
--- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicActivator.java
+++ b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicActivator.java
@@ -1,226 +1,226 @@
-/*-
+/*-
* ============LICENSE_START=======================================================
* openECOMP : SDN-C
* ================================================================================
* 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
+ * 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.openecomp.sdnc.sli.provider;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Properties;
-
-import org.openecomp.sdnc.sli.ConfigurationException;
-import org.openecomp.sdnc.sli.SvcLogicAdaptor;
-import org.openecomp.sdnc.sli.SvcLogicException;
-import org.openecomp.sdnc.sli.SvcLogicStore;
-import org.openecomp.sdnc.sli.SvcLogicStoreFactory;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.mysql.jdbc.Driver;
-
-public class SvcLogicActivator implements BundleActivator {
-
- private static final String SVCLOGIC_PROP_VAR = "SDNC_SLI_PROPERTIES";
- private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR";
-
- private static final Map<String, SvcLogicNodeExecutor> BUILTIN_NODES = new HashMap<String, SvcLogicNodeExecutor>() {
- {
- put("block", new BlockNodeExecutor());
- put("call", new CallNodeExecutor());
- put("configure", new ConfigureNodeExecutor());
- put("delete", new DeleteNodeExecutor());
- put("execute", new ExecuteNodeExecutor());
- put("exists", new ExistsNodeExecutor());
- put("for", new ForNodeExecutor());
- put("get-resource", new GetResourceNodeExecutor());
- put("is-available", new IsAvailableNodeExecutor());
- put("notify", new NotifyNodeExecutor());
- put("record", new RecordNodeExecutor());
- put("release", new ReleaseNodeExecutor());
- put("reserve", new ReserveNodeExecutor());
- put("return", new ReturnNodeExecutor());
- put("save", new SaveNodeExecutor());
- put("set", new SetNodeExecutor());
- put("switch", new SwitchNodeExecutor());
- put("update", new UpdateNodeExecutor());
- put("break", new BreakNodeExecutor());
-
- }
- };
-
- private static LinkedList<ServiceRegistration> registrations = new LinkedList<ServiceRegistration>();
-
- private static HashMap<String, SvcLogicAdaptor> adaptorMap = null;
-
- private static final Logger LOG = LoggerFactory
- .getLogger(SvcLogicActivator.class);
-
- private static Properties props = null;
-
- private static BundleContext bundleCtx = null;
-
- private static SvcLogicService svcLogicServiceImpl = null;
-
- @Override
- public void start(BundleContext ctx) throws Exception {
-
- LOG.info("Activating SLI");
-
- bundleCtx = ctx;
-
- // Read properties
- props = new Properties();
- String propPath = System.getenv(SVCLOGIC_PROP_VAR);
-
- if (propPath == null) {
- String propDir = System.getenv(SDNC_CONFIG_DIR);
- if (propDir == null) {
-
- propDir = "/opt/sdnc/data/properties";
- }
- propPath = propDir + "/svclogic.properties";
- LOG.warn("Environment variable "+SVCLOGIC_PROP_VAR+" unset - defaulting to "+propPath);
- }
-
- File propFile = new File(propPath);
-
- if (!propFile.exists()) {
-
- throw new ConfigurationException(
- "Missing configuration properties file : "
- + propFile);
- }
- try {
-
- props.load(new FileInputStream(propFile));
- } catch (Exception e) {
- throw new ConfigurationException(
- "Could not load properties file " + propPath, e);
-
- }
-
-
- if (registrations == null) {
-
- registrations = new LinkedList<ServiceRegistration>();
- }
-
- // Advertise SvcLogicService
- svcLogicServiceImpl = new SvcLogicServiceImpl();
-
- LOG.info("SLI: Registering service " + SvcLogicService.NAME
- + " in bundle " + ctx.getBundle().getSymbolicName());
- ServiceRegistration reg = ctx.registerService(SvcLogicService.NAME,
- svcLogicServiceImpl, null);
- registrations.add(reg);
-
- // Initialize SvcLogicStore
- try {
- SvcLogicStore store = getStore();
- registerNodeTypes(store);
- } catch (ConfigurationException e) {
- LOG.warn("Could not initialize SvcLogicScore", e);
- }
-
- LOG.info("SLI - done registering services");
- }
-
- @Override
- public void stop(BundleContext ctx) throws Exception {
-
- if (registrations != null) {
- for (ServiceRegistration reg : registrations) {
- ServiceReference regRef = reg.getReference();
- /* Don't bother to remove node types from table
- String nodeType = (String) regRef.getProperty("nodeType");
- if (nodeType != null) {
- LOG.info("SLI - unregistering node type " + nodeType);
- store.unregisterNodeType(nodeType);
- }
- */
- reg.unregister();
- }
- registrations = null;
- }
- }
-
- public static SvcLogicStore getStore() throws SvcLogicException {
- // Create and initialize SvcLogicStore object - used to access
- // saved service logic.
-
- SvcLogicStore store = null;
-
- try {
- Driver dvr = new Driver();
- store = SvcLogicStoreFactory.getSvcLogicStore(props);
- } catch (Exception e) {
- throw new ConfigurationException(
- "Could not get service logic store", e);
-
- }
-
- try {
- store.init(props);
- } catch (Exception e) {
- throw new ConfigurationException(
- "Could not get service logic store", e);
- }
-
- return(store);
- }
-
- private static void registerNodeTypes(SvcLogicStore store) throws SvcLogicException {
-
- if (store == null) {
- return;
- }
- // Advertise built-in node executors
- LOG.info("SLI : Registering built-in node executors");
- Hashtable propTable = new Hashtable();
-
- for (String nodeType : BUILTIN_NODES.keySet()) {
- LOG.info("SLI - registering node type " + nodeType);
- propTable.clear();
- propTable.put("nodeType", nodeType);
-
- ServiceRegistration reg = bundleCtx.registerService(SvcLogicNodeExecutor.class.getName(),
- BUILTIN_NODES.get(nodeType), propTable);
- registrations.add(reg);
-
- store.registerNodeType(nodeType);
-
- LOG.info("SLI - registering node executor");
-
- ((SvcLogicServiceImpl)svcLogicServiceImpl).registerExecutor(nodeType, BUILTIN_NODES.get(nodeType));
-
- }
-
- }
-
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdnc.sli.provider;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Properties;
+
+import org.openecomp.sdnc.sli.ConfigurationException;
+import org.openecomp.sdnc.sli.SvcLogicAdaptor;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.SvcLogicStore;
+import org.openecomp.sdnc.sli.SvcLogicStoreFactory;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.mysql.jdbc.Driver;
+
+public class SvcLogicActivator implements BundleActivator {
+
+ private static final String SVCLOGIC_PROP_VAR = "SDNC_SLI_PROPERTIES";
+ private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR";
+
+ private static final Map<String, SvcLogicNodeExecutor> BUILTIN_NODES = new HashMap<String, SvcLogicNodeExecutor>() {
+ {
+ put("block", new BlockNodeExecutor());
+ put("call", new CallNodeExecutor());
+ put("configure", new ConfigureNodeExecutor());
+ put("delete", new DeleteNodeExecutor());
+ put("execute", new ExecuteNodeExecutor());
+ put("exists", new ExistsNodeExecutor());
+ put("for", new ForNodeExecutor());
+ put("get-resource", new GetResourceNodeExecutor());
+ put("is-available", new IsAvailableNodeExecutor());
+ put("notify", new NotifyNodeExecutor());
+ put("record", new RecordNodeExecutor());
+ put("release", new ReleaseNodeExecutor());
+ put("reserve", new ReserveNodeExecutor());
+ put("return", new ReturnNodeExecutor());
+ put("save", new SaveNodeExecutor());
+ put("set", new SetNodeExecutor());
+ put("switch", new SwitchNodeExecutor());
+ put("update", new UpdateNodeExecutor());
+ put("break", new BreakNodeExecutor());
+ put("while", new WhileNodeExecutor());
+ }
+ };
+
+ private static LinkedList<ServiceRegistration> registrations = new LinkedList<ServiceRegistration>();
+
+ private static HashMap<String, SvcLogicAdaptor> adaptorMap = null;
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(SvcLogicActivator.class);
+
+ private static Properties props = null;
+
+ private static BundleContext bundleCtx = null;
+
+ private static SvcLogicService svcLogicServiceImpl = null;
+
+ @Override
+ public void start(BundleContext ctx) throws Exception {
+
+ LOG.info("Activating SLI");
+
+ bundleCtx = ctx;
+
+ // Read properties
+ props = new Properties();
+ String propPath = System.getenv(SVCLOGIC_PROP_VAR);
+
+ if (propPath == null) {
+ String propDir = System.getenv(SDNC_CONFIG_DIR);
+ if (propDir == null) {
+
+ propDir = "/opt/sdnc/data/properties";
+ }
+ propPath = propDir + "/svclogic.properties";
+ LOG.warn("Environment variable "+SVCLOGIC_PROP_VAR+" unset - defaulting to "+propPath);
+ }
+
+ File propFile = new File(propPath);
+
+ if (!propFile.exists()) {
+
+ throw new ConfigurationException(
+ "Missing configuration properties file : "
+ + propFile);
+ }
+ try {
+
+ props.load(new FileInputStream(propFile));
+ } catch (Exception e) {
+ throw new ConfigurationException(
+ "Could not load properties file " + propPath, e);
+
+ }
+
+
+ if (registrations == null) {
+
+ registrations = new LinkedList<ServiceRegistration>();
+ }
+
+ // Advertise SvcLogicService
+ svcLogicServiceImpl = new SvcLogicServiceImpl();
+
+ LOG.info("SLI: Registering service " + SvcLogicService.NAME
+ + " in bundle " + ctx.getBundle().getSymbolicName());
+ ServiceRegistration reg = ctx.registerService(SvcLogicService.NAME,
+ svcLogicServiceImpl, null);
+ registrations.add(reg);
+
+ // Initialize SvcLogicStore
+ try {
+ SvcLogicStore store = getStore();
+ registerNodeTypes(store);
+ } catch (ConfigurationException e) {
+ LOG.warn("Could not initialize SvcLogicScore", e);
+ }
+
+ LOG.info("SLI - done registering services");
+ }
+
+ @Override
+ public void stop(BundleContext ctx) throws Exception {
+
+ if (registrations != null) {
+ for (ServiceRegistration reg : registrations) {
+ ServiceReference regRef = reg.getReference();
+ /* Don't bother to remove node types from table
+ String nodeType = (String) regRef.getProperty("nodeType");
+ if (nodeType != null) {
+ LOG.info("SLI - unregistering node type " + nodeType);
+ store.unregisterNodeType(nodeType);
+ }
+ */
+ reg.unregister();
+ }
+ registrations = null;
+ }
+ }
+
+ public static SvcLogicStore getStore() throws SvcLogicException {
+ // Create and initialize SvcLogicStore object - used to access
+ // saved service logic.
+
+ SvcLogicStore store = null;
+
+ try {
+ Driver dvr = new Driver();
+ store = SvcLogicStoreFactory.getSvcLogicStore(props);
+ } catch (Exception e) {
+ throw new ConfigurationException(
+ "Could not get service logic store", e);
+
+ }
+
+ try {
+ store.init(props);
+ } catch (Exception e) {
+ throw new ConfigurationException(
+ "Could not get service logic store", e);
+ }
+
+ return(store);
+ }
+
+ private static void registerNodeTypes(SvcLogicStore store) throws SvcLogicException {
+
+ if (store == null) {
+ return;
+ }
+ // Advertise built-in node executors
+ LOG.info("SLI : Registering built-in node executors");
+ Hashtable propTable = new Hashtable();
+
+ for (String nodeType : BUILTIN_NODES.keySet()) {
+ LOG.info("SLI - registering node type " + nodeType);
+ propTable.clear();
+ propTable.put("nodeType", nodeType);
+
+ ServiceRegistration reg = bundleCtx.registerService(SvcLogicNodeExecutor.class.getName(),
+ BUILTIN_NODES.get(nodeType), propTable);
+ registrations.add(reg);
+
+ store.registerNodeType(nodeType);
+
+ LOG.info("SLI - registering node executor");
+
+ ((SvcLogicServiceImpl)svcLogicServiceImpl).registerExecutor(nodeType, BUILTIN_NODES.get(nodeType));
+
+ }
+
+ }
+
+}
diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/WhileNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/WhileNodeExecutor.java
new file mode 100644
index 0000000..7ec36e1
--- /dev/null
+++ b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/WhileNodeExecutor.java
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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.openecomp.sdnc.sli.provider;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.openecomp.sdnc.sli.BreakNodeException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.SvcLogicExpression;
+import org.openecomp.sdnc.sli.SvcLogicNode;
+
+public class WhileNodeExecutor extends SvcLogicNodeExecutor {
+
+ private static final Logger LOG = LoggerFactory.getLogger(WhileNodeExecutor.class);
+
+ @Override
+ public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException {
+
+ String testResult = evaluateNodeTest(node, ctx);
+ SvcLogicExpression silentFailureExpr = node.getAttribute("do");
+ String doWhile = SvcLogicExpressionResolver.evaluate(silentFailureExpr, node, ctx);
+ if ("true".equals(doWhile)) {
+ LOG.debug("While loop will execute once regardless of expression because do is set to true");
+ }
+
+ try {
+ while ("true".equals(testResult) || "true".equals(doWhile)) {
+ if (!"true".equals(doWhile)) {
+ LOG.debug("Test expression (" + node.getAttribute("test") + ") evaluates to true, executing loop.");
+ }
+ int numOutcomes = node.getNumOutcomes() + 1;
+ for (int i = 0; i < numOutcomes; i++) {
+ SvcLogicNode nextNode = node.getOutcomeValue("" + (i + 1));
+ if (nextNode != null) {
+ while (nextNode != null) {
+ nextNode = svc.executeNode(nextNode, ctx);
+ }
+ } else {
+ if ("true".equals(doWhile)) {
+ LOG.debug("Do executed, will only execute again if test expression is true.");
+ doWhile = "false";
+ }
+ testResult = evaluateNodeTest(node, ctx);
+ LOG.debug("test expression (" + node.getAttribute("test") + ") evaluates to " + testResult);
+ }
+ }
+ }
+ LOG.debug("testResult was " + testResult + " which is not equal to true, exiting while loop.");
+ } catch (BreakNodeException e) {
+ LOG.debug("WhileNodeExecutor caught break");
+ }
+ return (null);
+ }
+
+}
diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java
index 0acaf5f..3961271 100644
--- a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java
+++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java
@@ -88,6 +88,7 @@ public class DME2 implements SvcLogicJavaPlugin {
if (this.partner != null) {
sb.append("&dme2.partner=" + this.partner);
}
+ sb.append("&dme2.allowhttpcode=true");
return (sb.toString());
}