Tosca parser fails to parse csar
authorGal Grottas <gg6304@intl.att.com>
Mon, 20 Nov 2017 13:41:04 +0000 (15:41 +0200)
committerGal Grottas <gg6304@intl.att.com>
Mon, 20 Nov 2017 13:52:08 +0000 (15:52 +0200)
with get_attributes

Change-Id: Ibe6f0f9e35cf55fe3de6aa300b0cd09c000705f4
Issue-Id: SDC-682
Signed-off-by: Gal Grottas <gg6304@intl.att.com>
pom.xml
src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetAttribute.java
version.properties

diff --git a/pom.xml b/pom.xml
index 3b26cab..e3f8db6 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
 
        <groupId>org.openecomp.sdc.jtosca</groupId>
        <artifactId>jtosca</artifactId>
-       <version>1.1.14-SNAPSHOT</version>
+       <version>1.1.16-SNAPSHOT</version>
         <name>sdc-jtosca</name>
        <properties>
 
index 66e9320..5433aac 100644 (file)
@@ -40,89 +40,87 @@ public class GetAttribute extends Function {
        // * { get_attribute: [ HOST, private_address, 0 ] }
        // * { get_attribute: [ HOST, private_address, 0, some_prop] }
 
-       public GetAttribute(TopologyTemplate ttpl,Object context,String name,ArrayList<Object> args) {
-               super(ttpl,context,name,args);
+       public GetAttribute(TopologyTemplate ttpl, Object context, String name, ArrayList<Object> args) {
+               super(ttpl, context, name, args);
        }
-       
+
        @Override
        void validate() {
-               if(args.size() < 2) {
-               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE146", 
-                           "ValueError: Illegal arguments for function \"get_attribute\". Expected arguments: \"node-template-name\", \"req-or-cap\" (optional), \"property name.\"")); 
-                   return;
-               }
-               else if(args.size() == 2) {
-               _findNodeTemplateContainingAttribute();
+               if (args.size() < 2) {
+                       ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE146",
+                                       "ValueError: Illegal arguments for function \"get_attribute\". Expected arguments: \"node-template-name\", \"req-or-cap\" (optional), \"property name.\""));
+                       return;
+               } else if (args.size() == 2) {
+                       _findNodeTemplateContainingAttribute();
+               } else {
+                       NodeTemplate nodeTpl = _findNodeTemplate((String) args.get(0));
+                       if (nodeTpl == null) {
+                               return;
+                       }
+                       int index = 2;
+                       AttributeDef attr = nodeTpl.getTypeDefinition().getAttributeDefValue((String) args.get(1));
+                       if (attr != null) {
+                               // found
+                       } else {
+                               index = 3;
+                               // then check the req or caps
+                               if (!(args.get(1) instanceof String) || !(args.get(2) instanceof String)) {
+                                       ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE146", "ValueError: Illegal arguments for function \"get_attribute\". Expected a String argument"));
+                               }
+
+                               attr = _findReqOrCapAttribute(args.get(1).toString(), args.get(2).toString());
+                               if (attr == null) {
+                                       return;
+                               }
+                       }
+
+
+                       String valueType = (String) attr.getSchema().get("type");
+                       if (args.size() > index) {
+                               for (Object elem : args.subList(index, args.size())) {
+                                       if (valueType.equals("list")) {
+                                               if (!(elem instanceof Integer)) {
+                                                       ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE147", String.format(
+                                                                       "ValueError: Illegal arguments for function \"get_attribute\" \"%s\". Expected positive integer argument",
+                                                                       elem.toString())));
+                                               }
+                                               Object ob = attr.getSchema().get("entry_schema");
+                                               valueType = (String)
+                                                               ((LinkedHashMap<String, Object>) ob).get("type");
+                                       } else if (valueType.equals("map")) {
+                                               Object ob = attr.getSchema().get("entry_schema");
+                                               valueType = (String)
+                                                               ((LinkedHashMap<String, Object>) ob).get("type");
+                                       } else {
+                                               boolean bFound = false;
+                                               for (String p : Schema.PROPERTY_TYPES) {
+                                                       if (p.equals(valueType)) {
+                                                               bFound = true;
+                                                               break;
+                                                       }
+                                               }
+                                               if (bFound) {
+                                                       ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE148", String.format(
+                                                                       "ValueError: 'Illegal arguments for function \"get_attribute\". Unexpected attribute/index value \"%s\"",
+                                                                       elem)));
+                                                       return;
+                                               } else {  // It is a complex type
+                                                       DataType dataType = new DataType(valueType, null);
+                                                       LinkedHashMap<String, PropertyDef> props =
+                                                                       dataType.getAllProperties();
+                                                       PropertyDef prop = props.get((String) elem);
+                                                       if (prop != null) {
+                                                               valueType = (String) prop.getSchema().get("type");
+                                                       } else {
+                                                               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE149", String.format(
+                                                                               "KeyError: Illegal arguments for function \"get_attribute\". Attribute name \"%s\" not found in \"%\"",
+                                                                               elem, valueType)));
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
                }
-           else {
-               NodeTemplate nodeTpl = _findNodeTemplate((String)args.get(0));
-               if(nodeTpl == null) {
-                   return;
-               }
-               int index = 2;
-               AttributeDef attr = nodeTpl.getTypeDefinition().getAttributeDefValue((String)args.get(1));
-               if(attr != null) {
-                       // found
-               }
-               else {
-                   index = 3;
-                   // then check the req or caps
-                   attr = _findReqOrCapAttribute((String)args.get(1),(String)args.get(2));
-                   if(attr == null) {
-                       return;
-                   }
-               }
-               
-               String valueType = (String)attr.getSchema().get("type");
-            if(args.size() > index) {
-                       for(Object elem: args.subList(index,args.size())) {
-                               if(valueType.equals("list")) {
-                        if(!(elem instanceof Integer)) {
-                            ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE147", String.format(
-                                "ValueError: Illegal arguments for function \"get_attribute\" \"%s\". Expected positive integer argument",
-                                elem.toString()))); 
-                        } 
-                        Object ob = attr.getSchema().get("entry_schema");
-                        valueType = (String)
-                                       ((LinkedHashMap<String,Object>)ob).get("type");
-                               }
-                               else if(valueType.equals("map")) {
-                        Object ob = attr.getSchema().get("entry_schema");
-                        valueType = (String)
-                                       ((LinkedHashMap<String,Object>)ob).get("type");
-                               }
-                               else {
-                                       boolean bFound = false;
-                                       for(String p: Schema.PROPERTY_TYPES) {
-                                               if(p.equals(valueType)) {
-                                                       bFound = true;
-                                                       break;
-                                               }
-                                       }
-                                       if(bFound) {
-                               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE148", String.format(
-                                   "ValueError: 'Illegal arguments for function \"get_attribute\". Unexpected attribute/index value \"%s\"",
-                                   elem))); 
-                               return;
-                                       }
-                           else {  // It is a complex type
-                               DataType dataType = new DataType(valueType,null);
-                               LinkedHashMap<String,PropertyDef> props = 
-                                               dataType.getAllProperties();
-                               PropertyDef prop = props.get((String)elem);
-                               if(prop != null) {
-                                   valueType = (String)prop.getSchema().get("type");
-                               }
-                               else {
-                                   ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE149", String.format(
-                                       "KeyError: Illegal arguments for function \"get_attribute\". Attribute name \"%s\" not found in \"%\"",
-                                       elem,valueType))); 
-                               }
-                           }
-                               }
-                       }
-            }
-           }
        }
 
        @Override
@@ -131,48 +129,48 @@ public class GetAttribute extends Function {
        }
 
        private NodeTemplate getReferencedNodeTemplate() {
-           // Gets the NodeTemplate instance the get_attribute function refers to
-
-           // If HOST keyword was used as the node template argument, the node
-           // template which contains the attribute along the HostedOn relationship
-           // chain will be returned.
-           
-           return _findNodeTemplateContainingAttribute();
-               
+               // Gets the NodeTemplate instance the get_attribute function refers to
+
+               // If HOST keyword was used as the node template argument, the node
+               // template which contains the attribute along the HostedOn relationship
+               // chain will be returned.
+
+               return _findNodeTemplateContainingAttribute();
+
        }
 
        // Attributes can be explicitly created as part of the type definition
        // or a property name can be implicitly used as an attribute name 
        private NodeTemplate _findNodeTemplateContainingAttribute() {
-               NodeTemplate nodeTpl = _findNodeTemplate((String)args.get(0));
-               if(nodeTpl != null &&
-                       !_attributeExistsInType(nodeTpl.getTypeDefinition()) &&
-                       !nodeTpl.getProperties().keySet().contains(getAttributeName())) {
-               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE150", String.format(
-                   "KeyError: Attribute \"%s\" was not found in node template \"%s\"",
-                   getAttributeName(),nodeTpl.getName()))); 
+               NodeTemplate nodeTpl = _findNodeTemplate((String) args.get(0));
+               if (nodeTpl != null &&
+                               !_attributeExistsInType(nodeTpl.getTypeDefinition()) &&
+                               !nodeTpl.getProperties().keySet().contains(getAttributeName())) {
+                       ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE150", String.format(
+                                       "KeyError: Attribute \"%s\" was not found in node template \"%s\"",
+                                       getAttributeName(), nodeTpl.getName())));
                }
-           return nodeTpl;
+               return nodeTpl;
        }
 
        private boolean _attributeExistsInType(StatefulEntityType typeDefinition) {
-           LinkedHashMap<String,AttributeDef> attrsDef = typeDefinition.getAttributesDef();
-           return attrsDef.get(getAttributeName()) != null;
+               LinkedHashMap<String, AttributeDef> attrsDef = typeDefinition.getAttributesDef();
+               return attrsDef.get(getAttributeName()) != null;
        }
 
        private NodeTemplate _findHostContainingAttribute(String nodeTemplateName) {
                NodeTemplate nodeTemplate = _findNodeTemplate(nodeTemplateName);
-               if(nodeTemplate != null) {
-               LinkedHashMap<String,Object> hostedOnRel = 
-                               (LinkedHashMap<String,Object>)EntityType.TOSCA_DEF.get(HOSTED_ON);
-                       for(RequirementAssignment r: nodeTemplate.getRequirements().getAll()) {
+               if (nodeTemplate != null) {
+                       LinkedHashMap<String, Object> hostedOnRel =
+                                       (LinkedHashMap<String, Object>) EntityType.TOSCA_DEF.get(HOSTED_ON);
+                       for (RequirementAssignment r : nodeTemplate.getRequirements().getAll()) {
                                String targetName = r.getNodeTemplateName();
                                NodeTemplate targetNode = _findNodeTemplate(targetName);
-                               NodeType targetType = (NodeType)targetNode.getTypeDefinition();
-                               for(CapabilityTypeDef capability: targetType.getCapabilitiesObjects()) {
+                               NodeType targetType = (NodeType) targetNode.getTypeDefinition();
+                               for (CapabilityTypeDef capability : targetType.getCapabilitiesObjects()) {
 //                                                     if(((ArrayList<String>)hostedOnRel.get("valid_target_types")).contains(capability.getType())) {
-                                       if(capability.inheritsFrom((ArrayList<String>)hostedOnRel.get("valid_target_types"))) {
-                                               if(_attributeExistsInType(targetType)) {
+                                       if (capability.inheritsFrom((ArrayList<String>) hostedOnRel.get("valid_target_types"))) {
+                                               if (_attributeExistsInType(targetType)) {
                                                        return targetNode;
                                                }
                                                return _findHostContainingAttribute(targetName);
@@ -182,110 +180,109 @@ public class GetAttribute extends Function {
                }
                return null;
        }
-       
+
 
        private NodeTemplate _findNodeTemplate(String nodeTemplateName) {
-           if(nodeTemplateName.equals(HOST)) {
-               // Currently this is the only way to tell whether the function
-               // is used within the outputs section of the TOSCA template.
-               if(context instanceof ArrayList) {
-                   ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE151", 
-                       "ValueError: \"get_attribute: [ HOST, ... ]\" is not allowed in \"outputs\" section of the TOSCA template")); 
-                   return null;
-               }
-               NodeTemplate nodeTpl = _findHostContainingAttribute(SELF);
-               if(nodeTpl == null) {
-                   ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE152", String.format(
-                       "ValueError: \"get_attribute: [ HOST, ... ]\" was used in " +
-                       "node template \"%s\" but \"%s\" was not found in " +
-                       "the relationship chain",((NodeTemplate)context).getName(),HOSTED_ON))); 
-                   return null;
-               }
-               return nodeTpl;
-           }
-           if(nodeTemplateName.equals(TARGET)) {
-               if(!(((EntityTemplate)context).getTypeDefinition() instanceof RelationshipType)) {
-                   ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE153", 
-                       "KeyError: \"TARGET\" keyword can only be used in context " +
-                                  " to \"Relationships\" target node")); 
-                   return null;
-               }
-               return ((RelationshipTemplate)context).getTarget();
-           }
-           if(nodeTemplateName.equals(SOURCE)) {
-               if(!(((EntityTemplate)context).getTypeDefinition() instanceof RelationshipType)) {
-                   ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE154", 
-                       "KeyError: \"SOURCE\" keyword can only be used in context " +
-                                  " to \"Relationships\" source node")); 
-                   return null;
-               }
-               return ((RelationshipTemplate)context).getTarget();
-           }
-           String name;
-           if(nodeTemplateName.equals(SELF) && !(context instanceof ArrayList)) {
-               name = ((NodeTemplate)context).getName();
-           }
-           else {
-               name = nodeTemplateName;
-           }
-           for(NodeTemplate nt: toscaTpl.getNodeTemplates()) {
-               if(nt.getName().equals(name)) {
-                   return nt;
-               }
-           }
-           ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE155", String.format(
-               "KeyError: Node template \"%s\" was not found",nodeTemplateName))); 
-       return null;
-    }
-       
-       public AttributeDef _findReqOrCapAttribute(String reqOrCap,String attrName) {
-
-               NodeTemplate nodeTpl = _findNodeTemplate((String)args.get(0));
-           // Find attribute in node template's requirements
-               for(RequirementAssignment r: nodeTpl.getRequirements().getAll()) {
+               if (nodeTemplateName.equals(HOST)) {
+                       // Currently this is the only way to tell whether the function
+                       // is used within the outputs section of the TOSCA template.
+                       if (context instanceof ArrayList) {
+                               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE151",
+                                               "ValueError: \"get_attribute: [ HOST, ... ]\" is not allowed in \"outputs\" section of the TOSCA template"));
+                               return null;
+                       }
+                       NodeTemplate nodeTpl = _findHostContainingAttribute(SELF);
+                       if (nodeTpl == null) {
+                               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE152", String.format(
+                                               "ValueError: \"get_attribute: [ HOST, ... ]\" was used in " +
+                                                               "node template \"%s\" but \"%s\" was not found in " +
+                                                               "the relationship chain", ((NodeTemplate) context).getName(), HOSTED_ON)));
+                               return null;
+                       }
+                       return nodeTpl;
+               }
+               if (nodeTemplateName.equals(TARGET)) {
+                       if (!(((EntityTemplate) context).getTypeDefinition() instanceof RelationshipType)) {
+                               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE153",
+                                               "KeyError: \"TARGET\" keyword can only be used in context " +
+                                                               " to \"Relationships\" target node"));
+                               return null;
+                       }
+                       return ((RelationshipTemplate) context).getTarget();
+               }
+               if (nodeTemplateName.equals(SOURCE)) {
+                       if (!(((EntityTemplate) context).getTypeDefinition() instanceof RelationshipType)) {
+                               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE154",
+                                               "KeyError: \"SOURCE\" keyword can only be used in context " +
+                                                               " to \"Relationships\" source node"));
+                               return null;
+                       }
+                       return ((RelationshipTemplate) context).getTarget();
+               }
+               String name;
+               if (nodeTemplateName.equals(SELF) && !(context instanceof ArrayList)) {
+                       name = ((NodeTemplate) context).getName();
+               } else {
+                       name = nodeTemplateName;
+               }
+               for (NodeTemplate nt : toscaTpl.getNodeTemplates()) {
+                       if (nt.getName().equals(name)) {
+                               return nt;
+                       }
+               }
+               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE155", String.format(
+                               "KeyError: Node template \"%s\" was not found", nodeTemplateName)));
+               return null;
+       }
+
+       public AttributeDef _findReqOrCapAttribute(String reqOrCap, String attrName) {
+
+               NodeTemplate nodeTpl = _findNodeTemplate((String) args.get(0));
+               // Find attribute in node template's requirements
+               for (RequirementAssignment r : nodeTpl.getRequirements().getAll()) {
                        String nodeName = r.getNodeTemplateName();
-                       if(r.getName().equals(reqOrCap)) {
+                       if (r.getName().equals(reqOrCap)) {
                                NodeTemplate nodeTemplate = _findNodeTemplate(nodeName);
-                               return _getCapabilityAttribute(nodeTemplate,r.getName(),attrName);
+                               return _getCapabilityAttribute(nodeTemplate, r.getName(), attrName);
                        }
                }
-           // If requirement was not found, look in node template's capabilities
-           return _getCapabilityAttribute(nodeTpl,reqOrCap,attrName);
+               // If requirement was not found, look in node template's capabilities
+               return _getCapabilityAttribute(nodeTpl, reqOrCap, attrName);
        }
 
        private AttributeDef _getCapabilityAttribute(NodeTemplate nodeTemplate,
-                                                                                 String capabilityName,
-                                                                                 String attrName) {
-           // Gets a node template capability attribute
+                                                                                                String capabilityName,
+                                                                                                String attrName) {
+               // Gets a node template capability attribute
                CapabilityAssignment cap = nodeTemplate.getCapabilities().getCapabilityByName(capabilityName);
 
-           if(cap != null) {
-               AttributeDef attribute = null;
-               LinkedHashMap<String,AttributeDef> attrs =
-                               cap.getDefinition().getAttributesDef();
-               if(attrs != null && attrs.keySet().contains(attrName)) {
-                       attribute = attrs.get(attrName);
-               }
-               if(attribute == null) {
-                   ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE156", String.format(
-                       "KeyError: Attribute \"%s\" was not found in capability \"%s\" of node template \"%s\" referenced from node template \"%s\"",
-                       attrName,capabilityName,nodeTemplate.getName(),((NodeTemplate)context).getName()))); 
-               }
-               return attribute;
-           }
-           String msg = String.format(
-               "Requirement/CapabilityAssignment \"%s\" referenced from node template \"%s\" was not found in node template \"%s\"",
-               capabilityName,((NodeTemplate)context).getName(),nodeTemplate.getName());
-           ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE157", "KeyError: " + msg)); 
-               return null;                                                                      
+               if (cap != null) {
+                       AttributeDef attribute = null;
+                       LinkedHashMap<String, AttributeDef> attrs =
+                                       cap.getDefinition().getAttributesDef();
+                       if (attrs != null && attrs.keySet().contains(attrName)) {
+                               attribute = attrs.get(attrName);
+                       }
+                       if (attribute == null) {
+                               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE156", String.format(
+                                               "KeyError: Attribute \"%s\" was not found in capability \"%s\" of node template \"%s\" referenced from node template \"%s\"",
+                                               attrName, capabilityName, nodeTemplate.getName(), ((NodeTemplate) context).getName())));
+                       }
+                       return attribute;
+               }
+               String msg = String.format(
+                               "Requirement/CapabilityAssignment \"%s\" referenced from node template \"%s\" was not found in node template \"%s\"",
+                               capabilityName, ((NodeTemplate) context).getName(), nodeTemplate.getName());
+               ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE157", "KeyError: " + msg));
+               return null;
        }
 
        String getNodeTemplateName() {
-               return (String)args.get(0);
+               return (String) args.get(0);
        }
 
        String getAttributeName() {
-               return (String)args.get(1);
+               return (String) args.get(1);
        }
 
 }
index 2c02041..f7d411d 100644 (file)
@@ -5,7 +5,7 @@
 
 major=1
 minor=1
-patch=13
+patch=16
 
 base_version=${major}.${minor}.${patch}