SDC Tosca Parser getEntity API 37/74837/8
authorManzon, Inna (im453s) <im453s@intl.att.com>
Tue, 25 Dec 2018 15:41:33 +0000 (17:41 +0200)
committerManzon, Inna (im453s) <im453s@intl.att.com>
Mon, 7 Jan 2019 08:27:45 +0000 (10:27 +0200)
Change-Id: I4232c4ca85432bf9c81a81d717bee23b187182aa
Issue-ID: SDC-1967
Signed-off-by: Manzon, Inna (im453s) <im453s@intl.att.com>
24 files changed:
README.md
pom.xml
src/main/java/org/onap/sdc/tosca/parser/api/IEntityDetails.java
src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java
src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java
src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactory.java
src/main/java/org/onap/sdc/tosca/parser/elements/GroupEntityDetails.java
src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java
src/main/java/org/onap/sdc/tosca/parser/elements/PolicyEntityDetails.java
src/main/java/org/onap/sdc/tosca/parser/elements/queries/AllEntitiesQuery.java [new file with mode: 0644]
src/main/java/org/onap/sdc/tosca/parser/elements/queries/EntityQuery.java
src/main/java/org/onap/sdc/tosca/parser/elements/queries/GroupEntityQuery.java
src/main/java/org/onap/sdc/tosca/parser/elements/queries/NodeTemplateEntityQuery.java
src/main/java/org/onap/sdc/tosca/parser/elements/queries/PolicyEntityQuery.java
src/main/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQuery.java
src/main/java/org/onap/sdc/tosca/parser/enums/EntityTemplateType.java
src/main/java/org/onap/sdc/tosca/parser/enums/SdcTypes.java
src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java [new file with mode: 0644]
src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java
src/test/java/org/onap/sdc/impl/GetEntityTest.java
src/test/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactoryTest.java [new file with mode: 0644]
src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java [new file with mode: 0644]
src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java [new file with mode: 0644]
version.properties

index 9935a4e..68636f1 100644 (file)
--- a/README.md
+++ b/README.md
@@ -124,4 +124,19 @@ to use add the folowing depandency to your POM file:
 ## 1.4.7
 
 ### Bug fix:
-1. **validation fix**  Null value caused to NullPointerException in validate function in DataEntity
\ No newline at end of file
+1. **validation fix**  Null value caused to NullPointerException in validate function in DataEntity
+
+
+## 1.4.8
+
+### Features:
+1. A new API is declared:
+
+*List<IEntityDetails> getEntity(EntityQuery entityQuery, TopologyTemplateQuery topologyTemplateQuery, boolean isRecursive)*
+
+It is designed to retrieve details of one or more entity templates from corresponding topology template according to provided query parameters
+
+2. Mock-up version of **getEntity** API is implemented.
+
+### Note:
+This version is intended for SDN-C team usage only.
diff --git a/pom.xml b/pom.xml
index 341d126..9fd3232 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
        <artifactId>sdc-tosca</artifactId>
        <name>sdc-sdc-tosca</name>
        <description>SDC Tosca Parser JAR file for use by consumers</description>
-       <version>1.4.9-SNAPSHOT</version>
+       <version>1.4.10-SNAPSHOT</version>
        <packaging>jar</packaging>
 
        <properties>
                <dependency>
                        <groupId>org.onap.sdc.jtosca</groupId>
                        <artifactId>jtosca</artifactId>
-                       <version>1.4.9</version>
+                       <version>1.4.10-SNAPSHOT</version>
                </dependency>
 
 
index f8e8c6e..c4393cc 100644 (file)
@@ -1,20 +1,76 @@
 package org.onap.sdc.tosca.parser.api;
 
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.toscaparser.api.CapabilityAssignment;
 import org.onap.sdc.toscaparser.api.Property;
+import org.onap.sdc.toscaparser.api.RequirementAssignment;
 import org.onap.sdc.toscaparser.api.elements.Metadata;
 
 import java.util.List;
 import java.util.Map;
 
 public interface IEntityDetails {
+    /**
+     * Retrieves entity instance template type.
+     * @return {@link EntityTemplateType} enum entry describing given object type
+     */
     EntityTemplateType getType();
+
+    /**
+     * Retrieves entity instance name
+     */
     String getName();
+
+    /**
+     * Retrieves entity {@link Metadata} object
+     */
     Metadata getMetadata();
+
+    /**
+     * Retrieves entity instance properties
+     * @return map of entity property names and corresponding {@link Property} object instances
+     */
     Map<String, Property> getProperties();
-    List<Property> getPropertyList();
+
+    /**
+     * Retrieves member nodes of the entity instance
+     * @return List of member nodes entity objects
+     */
     List<IEntityDetails> getMemberNodes();
+
+    /**
+     * Retrieves node template containing the current entity instance.
+     * @return parent entity instance or null if the entity is contained by service
+     */
     IEntityDetails getParent();
+
+    /**
+     * Retrieves path to the searched entity instance in the model. It is based on the collection of the node templates names delimited by #.
+     * The entity instance may exist in the service node templates, in the VF node templates or in the nested of nested CVFC.
+     * The path will include the VF name, then the names of the CVFC recursively.
+     * If the entity instance is located in the service directly, the path is empty string
+     */
     String getPath();
 
-}
+    /**
+     * Retrieves map of requirements of the entity instance
+     * @return map of entity requirement names and corresponding {@link RequirementAssignment} object instances
+     */
+    Map<String, RequirementAssignment> getRequirements();
+
+    /**
+     * Retrieves map of capabilities of the entity instance
+     * @return map of entity capability names and corresponding {@link CapabilityAssignment} object instances
+     */
+    Map<String, CapabilityAssignment> getCapabilities();
+
+    /**
+     * Retrieves list of policy target names
+     */
+    List<String> getTargets();
+
+    /**
+     * Retrieves list of policy target entity instances (groups or node templates)
+     */
+    List<IEntityDetails> getTargetNodes();
+}
\ No newline at end of file
index b64d0de..129f7b4 100644 (file)
@@ -42,6 +42,7 @@ public interface ISdcCsarHelper {
         * @param nodeType - the TOSCA type of the node.
         * @return service node templates of this type.
         */
+       @Deprecated
        public List<NodeTemplate> getServiceNodeTemplatesByType(String nodeType);
 
        /**
@@ -49,6 +50,7 @@ public interface ISdcCsarHelper {
         *
         * @return service node templates.
         */
+       @Deprecated
        public List<NodeTemplate> getServiceNodeTemplates();
 
        /**
@@ -57,6 +59,7 @@ public interface ISdcCsarHelper {
         * @param vfCustomizationUuid - customizationUuid of VF instance.
         * @return list of vfModule groups.
         */
+       @Deprecated
        public List<Group> getVfModulesByVf(String vfCustomizationUuid);
 
 
@@ -84,6 +87,7 @@ public interface ISdcCsarHelper {
         * @param pathToPropertyLeafValue - the full path of the required property.
         * @return the leaf value as String, or null if there's no such property, or it's not a leaf.
         */
+       @Deprecated
        public String getNodeTemplatePropertyLeafValue(NodeTemplate nodeTemplate, String pathToPropertyLeafValue);
 
        /**
@@ -110,6 +114,7 @@ public interface ISdcCsarHelper {
         * @param pathToPropertyLeafValue - the full path of the required property.
         * @return the leaf value as Object, or null if there's no such property. It's up to the caller to cast it to a proper type.
         */
+       @Deprecated
        public Object getNodeTemplatePropertyValueAsObject(NodeTemplate nodeTemplate, String pathToPropertyLeafValue);
 
        /**
@@ -119,6 +124,7 @@ public interface ISdcCsarHelper {
         * @param propertyName - the name of the required property.
         * @return the leaf value as String, or null if there's no such property, or it's not a leaf.
         */
+       @Deprecated
        public String getGroupPropertyLeafValue(Group group, String propertyName);
 
        /**
@@ -128,18 +134,21 @@ public interface ISdcCsarHelper {
         * @param propertyName - the name of the required property.
         * @return the leaf value as Object, or null if there's no such property. It's up to the caller to cast it to a proper type.
         */
+       @Deprecated
        public Object getGroupPropertyAsObject(Group group, String propertyName);
 
        /**
         * Get all VL node templates of the CSAR service.
         * @return - all VL node templates.
         */
+       @Deprecated
        public List<NodeTemplate> getServiceVlList();
 
        /**
         * Get all VF node templates of the CSAR service.
         * @return - all VF node templates.
         */
+       @Deprecated
        public List<NodeTemplate> getServiceVfList();
 
 
@@ -169,6 +178,7 @@ public interface ISdcCsarHelper {
         * @param metadataPropertyName - the name of the metadata property.
         * @return metadata property value
         */
+       @Deprecated
        public String getMetadataPropertyValue(Metadata metadata, String metadataPropertyName);
        
        
@@ -234,6 +244,7 @@ public interface ISdcCsarHelper {
         * @param vfCustomizationId - customizationUuid of the VF node template.
         * @return all VFC node templates from a specified VF
         */
+       @Deprecated
        public List<NodeTemplate> getVfcListByVf(String vfCustomizationId);
        
        /**
@@ -241,6 +252,7 @@ public interface ISdcCsarHelper {
         * @param vfCustomizationId - customizationUuid of the VF node template.
         * @return all CP node templates from a specified VF
         */
+       @Deprecated
        public List<NodeTemplate> getCpListByVf(String vfCustomizationId);
        
        /**
@@ -261,6 +273,7 @@ public interface ISdcCsarHelper {
         * @return node templates from vf with the names as in members section.
      * 
         */
+       @Deprecated
        public List<NodeTemplate> getMembersOfVfModule(NodeTemplate vf, Group vfModule);
        
        
@@ -297,6 +310,7 @@ public interface ISdcCsarHelper {
         * Get all allotted node templates from this service.
         * @return all allotted node templates from this service.
         */
+       @Deprecated
        public List<NodeTemplate> getAllottedResources();
        
        /**
@@ -313,6 +327,7 @@ public interface ISdcCsarHelper {
         * @param nodeTemplate - node template object
         * @return - node type string.
         */
+       @Deprecated
        public String getTypeOfNodeTemplate(NodeTemplate nodeTemplate);
 
        /**
@@ -355,6 +370,7 @@ public interface ISdcCsarHelper {
     * @param vfc - VFC node template to look for CP-related props.
     * @return map <b>CP node template name</b>  to a map of <b>property name</b> - <b> property value as object</b>.
     */
+    @Deprecated
     public Map<String, Map<String, Object>> getCpPropertiesFromVfcAsObject(NodeTemplate vfc);
        
        /**
@@ -362,6 +378,7 @@ public interface ISdcCsarHelper {
         * @param nt - node template
         * @return customization UUID of a node template.
         */
+       @Deprecated
        public String getNodeTemplateCustomizationUuid(NodeTemplate nt);
 
     /**
@@ -380,6 +397,7 @@ public interface ISdcCsarHelper {
         * @param sdcType - the SDC type of the node.
         * @return node templates of this SDC type.
         */
+       @Deprecated
        public List<NodeTemplate> getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType);
 
        /**
@@ -388,6 +406,7 @@ public interface ISdcCsarHelper {
         * @param sdcType - the SDC type of the node (for example, CP, VF...).
         * @return service node templates of this SDC type.
         */
+       @Deprecated
        public List<NodeTemplate> getServiceNodeTemplateBySdcType(SdcTypes sdcType);
        
        /**
@@ -395,6 +414,7 @@ public interface ISdcCsarHelper {
         * @param vfCustomizationUuid - the Customization UUID of the node.
         * @return VNF Configuration Node Template.
         */
+       @Deprecated
        public NodeTemplate getVnfConfig(String vfCustomizationUuid);
 
        /**
@@ -402,6 +422,7 @@ public interface ISdcCsarHelper {
         * @param nodeTemplate - Node Template to check
         * @return true if node template has topology template, false if not.
         */
+       @Deprecated
        public boolean hasTopology(NodeTemplate nodeTemplate);
 
        /**
@@ -409,6 +430,7 @@ public interface ISdcCsarHelper {
         * @param nodeTemplate - Node Template to get its children
         * @return return list of children node templates for node template.
         */
+       @Deprecated
        public List<NodeTemplate> getNodeTemplateChildren(NodeTemplate nodeTemplate);
 
        /**
@@ -416,6 +438,7 @@ public interface ISdcCsarHelper {
         * @param nodeName - the name of the node template.
         * @return service-level node template with this name, or null if no such node template was found.
         */
+       @Deprecated
        public NodeTemplate getServiceNodeTemplateByNodeName(String nodeName);
 
        /**
@@ -424,6 +447,7 @@ public interface ISdcCsarHelper {
         * @param nt - Node template to get its Metadata object.
         * @return Metadata for this node template, or null if not found.
         */
+       @Deprecated
        public Metadata getNodeTemplateMetadata(NodeTemplate nt);
 
        /**
@@ -434,6 +458,7 @@ public interface ISdcCsarHelper {
         * @return CapabilitiesAssignments that contains list of capability assignments for the node template.<br>
         * If none found, an empty list will be returned.
         */
+       @Deprecated
        public CapabilityAssignments getCapabilitiesOf(NodeTemplate nt);
 
        /**
@@ -444,6 +469,7 @@ public interface ISdcCsarHelper {
         * @return RequirementAssignments that contains list of requirement assignments for the node template.
         * If none found, an empty list will be returned.
         */
+       @Deprecated
        public RequirementAssignments getRequirementsOf(NodeTemplate nt);
 
        /**
@@ -453,12 +479,14 @@ public interface ISdcCsarHelper {
         * @param pathToPropertyLeafValue - the full path of the required property.
         * @return the leaf value as String, or null if there's no such property, or it's not a leaf.
         */
+       @Deprecated
        public String getCapabilityPropertyLeafValue(CapabilityAssignment capability, String pathToPropertyLeafValue);
        
        /**
         * Get all the policies of the main topology template (either VF or service)
         * @return      the list of the policies
         */
+       @Deprecated
        public List<Policy> getPoliciesOfTopologyTemplate();
        
        /**
@@ -466,6 +494,7 @@ public interface ISdcCsarHelper {
         * @param policyTypeName        the name of the policy type
         * @return                                      the list of the policies                                                
         */
+       @Deprecated
        public List<Policy> getPoliciesOfTopologyTemplateByToscaPolicyType(String policyTypeName);
        
        /**
@@ -473,6 +502,7 @@ public interface ISdcCsarHelper {
         * @param nodeTemplate  the node template
         * @return                              the list of the policies
         */
+       @Deprecated
        public List<Policy> getPoliciesOfOriginOfNodeTemplate(NodeTemplate nodeTemplate);
        
        /**
@@ -481,6 +511,7 @@ public interface ISdcCsarHelper {
         * @param policyTypeName        the name of the policy type
         * @return                                      the list of the policies
         */
+       @Deprecated
        List<Policy> getPoliciesOfOriginOfNodeTemplateByToscaPolicyType(NodeTemplate nodeTemplate, String policyTypeName);
        
        /**
@@ -488,6 +519,7 @@ public interface ISdcCsarHelper {
         * @param policyName    the name of the policy
         * @return                              the list of the node templates
         */
+       @Deprecated
        List<NodeTemplate> getPolicyTargetsFromTopologyTemplate(String policyName);
        
        /**
@@ -496,6 +528,7 @@ public interface ISdcCsarHelper {
         * @param policyName    the name of the policy
         * @return                              the list of the node templates
         */
+       @Deprecated
        List<NodeTemplate> getPolicyTargetsFromOrigin(NodeTemplate nodeTemplate, String policyName);
        
        /**
@@ -503,6 +536,7 @@ public interface ISdcCsarHelper {
         * @param nodeTemplateName      the name of the node template
         * @return                                      the node template
         */
+       @Deprecated
        NodeTemplate getNodeTemplateByName(String nodeTemplateName);
     
     /**
@@ -510,6 +544,7 @@ public interface ISdcCsarHelper {
      * @param targetNode       the node template
      * @return                         the list of the policies
      */
+    @Deprecated
        List<Policy> getPoliciesOfTarget(NodeTemplate targetNode);
        
        /**
@@ -518,6 +553,7 @@ public interface ISdcCsarHelper {
         * @param policyTypeName        the name of the policy type
         * @return                                      the list of the policies
         */
+       @Deprecated
     List<Policy> getPoliciesOfTargetByToscaPolicyType(NodeTemplate nodeTemplate, String policyTypeName);
 
     /**
@@ -525,6 +561,7 @@ public interface ISdcCsarHelper {
      * @param               nodeTemplate  the node template
      * @return              the list of the groups
      */
+    @Deprecated
     ArrayList<Group> getGroupsOfOriginOfNodeTemplate(NodeTemplate nodeTemplate);
     
     /**
@@ -532,12 +569,14 @@ public interface ISdcCsarHelper {
      * @param groupType     the group type
      * @return              the list of the groups
      */
+    @Deprecated
     ArrayList<Group> getGroupsOfTopologyTemplateByToscaGroupType(String groupType);
     
     /**
      * Get all groups of this of the main topology template (either VF or service)
      * @return              the list of the groups
      */
+    @Deprecated
     ArrayList<Group> getGroupsOfTopologyTemplate();
     
     /**
@@ -546,6 +585,7 @@ public interface ISdcCsarHelper {
      * @param groupType     the group type
      * @return              the list of the groups
      */
+    @Deprecated
      ArrayList<Group> getGroupsOfOriginOfNodeTemplateByToscaGroupType(NodeTemplate nodeTemplate, String groupType);
     
     /**
@@ -553,6 +593,7 @@ public interface ISdcCsarHelper {
      * @param groupName     the name of the group
      * @return              the list of the node templates
      */
+    @Deprecated
     List<NodeTemplate> getGroupMembersFromTopologyTemplate(String groupName);
     
     /**
@@ -561,6 +602,7 @@ public interface ISdcCsarHelper {
      * @param groupName     the name of the group
      * @return              the list of the node templates
      */
+    @Deprecated
     List<NodeTemplate> getGroupMembersOfOriginOfNodeTemplate(NodeTemplate nodeTemplate, String groupName);
     
     /**
@@ -612,6 +654,7 @@ public interface ISdcCsarHelper {
         *        Path is based on the collection of the node templates names delimited by #.
         * @return List of property values. If none found, empty list will be returned.
         */
+       @Deprecated
        List<String> getPropertyLeafValueByPropertyNamePathAndNodeTemplatePath(String propertyNamePath, String nodeTemplatePath);
 
        boolean isNodeTypeSupported(NodeTemplate nodeTemplate);
@@ -622,7 +665,7 @@ public interface ISdcCsarHelper {
         *                    SDC (node template) type, tosca type as well as optional customizationUUID and UUID
         * @param topologyTemplateQuery parameters of the topology template containing the above entity.
         *                  Includes SDC type of the container and optional customizationUUID
-        * @param isRecursive indicates if the search is recursive or not
+        * @param isRecursive indicates if the search within the required topology template is recursive.
         * @return list of @{@link IEntityDetails} objects containing information about the found entities.
         * If either no entities found or the provided query is incorrect, an empty list is returned
         */
index 91c7144..2567700 100644 (file)
@@ -2,23 +2,24 @@ package org.onap.sdc.tosca.parser.elements;
 
 import org.onap.sdc.tosca.parser.api.IEntityDetails;
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.toscaparser.api.CapabilityAssignment;
 import org.onap.sdc.toscaparser.api.EntityTemplate;
-import org.onap.sdc.toscaparser.api.NodeTemplate;
 import org.onap.sdc.toscaparser.api.Property;
+import org.onap.sdc.toscaparser.api.RequirementAssignment;
 
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public abstract class EntityDetails implements IEntityDetails {
 
     private final EntityTemplate entityTemplate;
+    private final IEntityDetails parentNodeTemplate;
 
-    private final IEntityDetails parentNode;
-
-    EntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) {
+    EntityDetails(EntityTemplate entityTemplate) {
         this.entityTemplate = entityTemplate;
-        this.parentNode = EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, parentNode, null);
+        this.parentNodeTemplate = EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, entityTemplate.getParentNodeTemplate());
     }
 
     @Override
@@ -36,27 +37,54 @@ public abstract class EntityDetails implements IEntityDetails {
     }
 
     @Override
-    public List<Property> getPropertyList() {
-        return entityTemplate.getPropertiesObjects();
+    public List<IEntityDetails> getMemberNodes() {
+        return Collections.emptyList();
     }
 
     @Override
-    public List<IEntityDetails> getMemberNodes() {
-        List<IEntityDetails> ntList = new ArrayList<>();
-        ntList.add(getParent());
-        return ntList;
+    public IEntityDetails getParent() {
+        return parentNodeTemplate;
     }
 
     @Override
-    public IEntityDetails getParent() {
-        //todo - update after adding parent to the EntityTemplate class
-        return parentNode;
+    public Map<String, RequirementAssignment> getRequirements() {
+        return entityTemplate.getRequirements()
+                .getAll()
+                .stream()
+                .collect(Collectors.toMap(RequirementAssignment::getName, ra->ra));
+    }
+
+    @Override
+    public Map<String, CapabilityAssignment> getCapabilities() {
+        return entityTemplate.getCapabilities()
+                .getAll()
+                .stream()
+                .collect(Collectors.toMap(CapabilityAssignment::getName, ca->ca));
+    }
+
+    @Override
+    public List<String> getTargets() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<IEntityDetails> getTargetNodes() {
+        return Collections.emptyList();
     }
 
     @Override
     public String getPath() {
-        //todo - update after adding parent to the EntityTemplate class
-        return "jenny vTSBC vlan VNF 0#abstract_ssc#ssc_ssc_avpn_port_0";
+        StringBuilder pathBld = new StringBuilder("");
+        EntityTemplate currentEntityParent = entityTemplate.getParentNodeTemplate();
+
+        while (currentEntityParent != null) {
+            if (pathBld.length() != 0) {
+                pathBld.insert(0,"#");
+            }
+            pathBld.insert(0, currentEntityParent.getName());
+            currentEntityParent = currentEntityParent.getParentNodeTemplate();
+        }
+        return pathBld.toString();
     }
 
 
index 65968b8..e8477c6 100644 (file)
@@ -2,25 +2,25 @@ package org.onap.sdc.tosca.parser.elements;
 
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
 import org.onap.sdc.toscaparser.api.EntityTemplate;
-import org.onap.sdc.toscaparser.api.NodeTemplate;
 
 public class EntityDetailsFactory {
 
     private EntityDetailsFactory(){}
 
-    //TODO: the parent should be retrieved from the entityTemplate and not passed as a separate parameter
-    public static EntityDetails createEntityDetails(EntityTemplateType entityTemplateType, EntityTemplate entityTemplate, NodeTemplate parent) {
+    public static EntityDetails createEntityDetails(EntityTemplateType entityTemplateType, EntityTemplate entityTemplate) {
         EntityDetails entityDetails = null;
-        if (entityTemplate != null) {
+        if (entityTemplate != null && entityTemplateType != null) {
             switch (entityTemplateType) {
                 case NODE_TEMPLATE:
-                    entityDetails = new NodeTemplateEntityDetails(entityTemplate, parent);
+                    entityDetails = new NodeTemplateEntityDetails(entityTemplate);
                     break;
                 case POLICY:
-                    entityDetails = new PolicyEntityDetails(entityTemplate, parent);
+                    entityDetails = new PolicyEntityDetails(entityTemplate);
                     break;
                 case GROUP:
-                    entityDetails = new GroupEntityDetails(entityTemplate, parent);
+                    entityDetails = new GroupEntityDetails(entityTemplate);
+                    break;
+                default:
                     break;
             }
         }
index 82488a7..32a91aa 100644 (file)
@@ -4,18 +4,28 @@ import org.onap.sdc.tosca.parser.api.IEntityDetails;
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
 import org.onap.sdc.toscaparser.api.EntityTemplate;
 import org.onap.sdc.toscaparser.api.Group;
-import org.onap.sdc.toscaparser.api.NodeTemplate;
 import org.onap.sdc.toscaparser.api.elements.Metadata;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
 public class GroupEntityDetails extends EntityDetails {
     private final Group group;
+    private final List<IEntityDetails> memberNodes;
 
-    GroupEntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode)  {
-        super(entityTemplate,parentNode);
+    GroupEntityDetails(EntityTemplate entityTemplate)  {
+        super(entityTemplate);
         group = (Group)getEntityTemplate();
+        if (group.getMemberNodes() != null) {
+            memberNodes = group.getMemberNodes()
+                    .stream()
+                    .map(m->EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, m))
+                    .collect(Collectors.toList());
+        }
+        else {
+            memberNodes = Collections.emptyList();
+        }
     }
 
     @Override
@@ -25,10 +35,7 @@ public class GroupEntityDetails extends EntityDetails {
 
     @Override
     public List<IEntityDetails> getMemberNodes() {
-        return group.getMemberNodes()
-                .stream()
-                .map(m->EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, m, null))
-                .collect(Collectors.toList());
+        return memberNodes;
     }
 
     @Override
index c6dd69f..ad3b1a0 100644 (file)
@@ -9,8 +9,8 @@ public class NodeTemplateEntityDetails extends EntityDetails {
 
     private final NodeTemplate nodeTemplate;
 
-    NodeTemplateEntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) {
-        super(entityTemplate, parentNode);
+    NodeTemplateEntityDetails(EntityTemplate entityTemplate) {
+        super(entityTemplate);
         nodeTemplate = (NodeTemplate)getEntityTemplate();
     }
 
index 39027c3..7b97175 100644 (file)
@@ -1,17 +1,22 @@
 package org.onap.sdc.tosca.parser.elements;
 
+import org.onap.sdc.tosca.parser.api.IEntityDetails;
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
 import org.onap.sdc.toscaparser.api.EntityTemplate;
-import org.onap.sdc.toscaparser.api.NodeTemplate;
 import org.onap.sdc.toscaparser.api.Policy;
 import org.onap.sdc.toscaparser.api.elements.Metadata;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class PolicyEntityDetails extends EntityDetails {
 
+    private static final String NODE_TEMPLATES_TARGET_TYPE = "node_templates";
+
     private final Policy policy;
 
-    PolicyEntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) {
-        super(entityTemplate, parentNode);
+    PolicyEntityDetails(EntityTemplate entityTemplate) {
+        super(entityTemplate);
         policy = (Policy)getEntityTemplate();
     }
 
@@ -24,4 +29,26 @@ public class PolicyEntityDetails extends EntityDetails {
     public Metadata getMetadata() {
         return policy.getMetaDataObj();
     }
+
+    @Override
+    public List<String> getTargets() {
+        if (policy.getTargets() != null) {
+            return policy.getTargets();
+        }
+        return super.getTargets();
+    }
+
+    @Override
+    public List<IEntityDetails> getTargetNodes() {
+        if (policy.getTargetsType().equals(NODE_TEMPLATES_TARGET_TYPE)) {
+            return policy.getTargetsList()
+                    .stream()
+                    .map(o->EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, (EntityTemplate)o))
+                    .collect(Collectors.toList());
+        }
+        return policy.getTargetsList()
+                .stream()
+                .map(o->EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, (EntityTemplate)o))
+                .collect(Collectors.toList());
+    }
 }
diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/AllEntitiesQuery.java b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/AllEntitiesQuery.java
new file mode 100644 (file)
index 0000000..7c1cd25
--- /dev/null
@@ -0,0 +1,46 @@
+package org.onap.sdc.tosca.parser.elements.queries;
+
+import com.google.common.collect.Lists;
+import org.onap.sdc.tosca.parser.api.IEntityDetails;
+import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.ToscaTemplate;
+
+import java.util.List;
+
+/**
+ * Implements EntityQuery object for NodeTemplates, Groups and Policies
+ */
+
+public class AllEntitiesQuery extends EntityQuery {
+
+    AllEntitiesQuery() {
+        super(EntityTemplateType.ALL, null, null);
+    }
+
+    @Override
+    public List<IEntityDetails> getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate) {
+        List<IEntityDetails> allEntities = Lists.newArrayList();
+        if (nodeTemplate.getSubMappingToscaTemplate() != null) {
+            allEntities.addAll(GroupEntityQuery.convertGroupLisToEntityDetailsList(nodeTemplate.getSubMappingToscaTemplate().getGroups().stream()));
+            allEntities.addAll(NodeTemplateEntityQuery.convertNodeTemplatesListToEntityDetailsList(nodeTemplate.getSubMappingToscaTemplate().getNodeTemplates().stream()));
+        }
+        if (nodeTemplate.getOriginComponentTemplate() != null) {
+            allEntities.addAll(PolicyEntityQuery.convertPolicyLisToEntityDetailsList(nodeTemplate.getOriginComponentTemplate().getPolicies().stream()));
+        }
+        return allEntities;
+    }
+
+
+    @Override
+    public List<IEntityDetails> getEntitiesFromService(ToscaTemplate toscaTemplate) {
+        List<IEntityDetails> allEntities = Lists.newArrayList();
+        allEntities.addAll(GroupEntityQuery.convertGroupLisToEntityDetailsList(toscaTemplate.getGroups().stream()));
+        allEntities.addAll(NodeTemplateEntityQuery.convertNodeTemplatesListToEntityDetailsList(toscaTemplate.getNodeTemplates().stream()));
+        allEntities.addAll(PolicyEntityQuery.convertPolicyLisToEntityDetailsList(toscaTemplate.getPolicies().stream()));
+        return allEntities;
+    }
+
+}
+
+
index ba17423..167a568 100644 (file)
@@ -1,11 +1,17 @@
 package org.onap.sdc.tosca.parser.elements.queries;
 
-import org.apache.commons.lang3.StringUtils;
+import org.onap.sdc.tosca.parser.api.IEntityDetails;
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
 import org.onap.sdc.tosca.parser.enums.SdcTypes;
-import org.onap.sdc.toscaparser.api.EntityTemplate;
+import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.ToscaTemplate;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * This class describes an entity searched and retrieved by SDC Tosca Parser API
@@ -13,6 +19,8 @@ import java.util.List;
  */
 public abstract class EntityQuery {
 
+    private static final Logger logger = LoggerFactory.getLogger(EntityQuery.class.getName());
+
     private final EntityTemplateType entityType;
 
     private final SdcTypes nodeTemplateType;
@@ -37,9 +45,9 @@ public abstract class EntityQuery {
         this.customizationUUID = customizationUUID;
     }
 
-    public abstract List<EntityTemplate> searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery);
+    public abstract List<IEntityDetails> getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate);
 
-    public abstract EntityTemplateType getType();
+    public abstract List<IEntityDetails> getEntitiesFromService(ToscaTemplate toscaTemplate);
 
     public EntityTemplateType getEntityType() {
         return entityType;
@@ -61,8 +69,19 @@ public abstract class EntityQuery {
         return customizationUUID;
     }
 
-    public boolean searchAllEntities() {
-        return StringUtils.isEmpty(toscaType) && nodeTemplateType == null;
+    boolean isSearchCriteriaMatched(Metadata metadata, String toscaType, String uuidKeyName, String cuuidKeyName) {
+        return Objects.nonNull(metadata)
+                && isStringMatchingOrNull(metadata.getValue(uuidKeyName), getUUID())
+                && isStringMatchingOrNull(metadata.getValue(cuuidKeyName), getCustomizationUUID())
+                && isStringMatchingOrNull(toscaType, getToscaType());
+    }
+
+    boolean isSearchCriteriaMatched(Metadata metadata, String toscaType) {
+        return isSearchCriteriaMatched(metadata, toscaType, SdcPropertyNames.PROPERTY_NAME_UUID, SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);
+    }
+
+    static boolean isStringMatchingOrNull(String currentUid, String uidInQuery) {
+        return uidInQuery == null || uidInQuery.equals(currentUid);
     }
 
     public static EntityQueryBuilder newBuilder(EntityTemplateType entityTemplateType) {
@@ -73,6 +92,12 @@ public abstract class EntityQuery {
         return new EntityQueryBuilder(sdcType);
     }
 
+    @Override
+    public String toString() {
+        return String.format("EntityType=%s, nodeTemplateType=%s, toscaType=%s, uUID=%s, customizationUUID=%s",
+                entityType, nodeTemplateType, toscaType, uUID, customizationUUID);
+    }
+
     public static EntityQueryBuilder newBuilder(String toscaType) {
         return new EntityQueryBuilder(toscaType);
     }
@@ -97,8 +122,13 @@ public abstract class EntityQuery {
                 case POLICY:
                     entityQuery =  new PolicyEntityQuery();
                     break;
+                case ALL:
+                    entityQuery = new AllEntitiesQuery();
+                    break;
                 default:
-                    throw new IllegalArgumentException("Wrong entity query type: " + entityTemplateType);
+                    String wrongTypeMsg = (String.format("Wrong entity query type: %s", entityTemplateType));
+                    logger.error(wrongTypeMsg);
+                    throw new IllegalArgumentException(wrongTypeMsg);
             }
         }
 
index 37a3ccd..8b1cd25 100644 (file)
@@ -1,30 +1,55 @@
 package org.onap.sdc.tosca.parser.elements.queries;
 
+import com.google.common.collect.Lists;
+import org.onap.sdc.tosca.parser.api.IEntityDetails;
+import org.onap.sdc.tosca.parser.elements.EntityDetailsFactory;
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
-import org.onap.sdc.toscaparser.api.EntityTemplate;
+import org.onap.sdc.toscaparser.api.Group;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.ToscaTemplate;
 
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * Implements EntityQuery object for Groups
  */
 public class GroupEntityQuery extends EntityQuery {
 
-    public GroupEntityQuery() {
+    private static final String VF_MODULE_UUID = "vfModuleModelUUID";
+    private static final String VF_MODULE_CUSTOMIZATION_UUID = "vfModuleModelCustomizationUUID";
+
+    GroupEntityQuery() {
         super(EntityTemplateType.GROUP, null, null);
     }
 
     @Override
-    public List<EntityTemplate> searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery) {
-        return null;
+    public List<IEntityDetails> getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate) {
+        if (nodeTemplate.getSubMappingToscaTemplate() != null) {
+            return convertGroupLisToEntityDetailsList(filter(nodeTemplate.getSubMappingToscaTemplate().getGroups()));
+        }
+        return Lists.newArrayList();
     }
 
     @Override
-    public EntityTemplateType getType() {
-        return EntityTemplateType.GROUP;
+    public List<IEntityDetails> getEntitiesFromService(ToscaTemplate toscaTemplate) {
+        return convertGroupLisToEntityDetailsList(filter(toscaTemplate.getGroups()));
     }
 
-    public GroupEntityQuery(String toscaType) {
+    GroupEntityQuery(String toscaType) {
         super(EntityTemplateType.GROUP, null, toscaType);
     }
+
+    static List<IEntityDetails> convertGroupLisToEntityDetailsList(Stream<Group> groups) {
+        return groups.map(gr->EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, gr))
+            .collect(Collectors.toList());
+    }
+
+    private Stream<Group> filter(List<Group> groupList) {
+        return groupList.stream()
+            .filter(gr->isSearchCriteriaMatched(gr.getMetadata(), gr.getType()) ||
+                    isSearchCriteriaMatched(gr.getMetadata(), gr.getType(), VF_MODULE_UUID, VF_MODULE_CUSTOMIZATION_UUID));
+    }
+
 }
index 4e01bd8..b5a7a2e 100644 (file)
@@ -1,34 +1,61 @@
 package org.onap.sdc.tosca.parser.elements.queries;
 
+import com.google.common.collect.Lists;
+import org.onap.sdc.tosca.parser.api.IEntityDetails;
+import org.onap.sdc.tosca.parser.elements.EntityDetailsFactory;
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
 import org.onap.sdc.tosca.parser.enums.SdcTypes;
-import org.onap.sdc.toscaparser.api.EntityTemplate;
+import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.ToscaTemplate;
 
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * Implements EntityQuery object for NodeTemplates
  */
 public class NodeTemplateEntityQuery extends EntityQuery {
-    public NodeTemplateEntityQuery() {
+    NodeTemplateEntityQuery() {
         super(EntityTemplateType.NODE_TEMPLATE, null, null);
     }
 
+    NodeTemplateEntityQuery(SdcTypes nodeTemplateType) {
+        super(EntityTemplateType.NODE_TEMPLATE, nodeTemplateType, null);
+    }
+
+    NodeTemplateEntityQuery(String toscaType) {
+        super(EntityTemplateType.NODE_TEMPLATE, null, toscaType);
+    }
+
     @Override
-    public EntityTemplateType getType() {
-        return EntityTemplateType.NODE_TEMPLATE;
+    public List<IEntityDetails> getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate) {
+        if (nodeTemplate.getSubMappingToscaTemplate() != null) {
+            return convertNodeTemplatesListToEntityDetailsList(filter(nodeTemplate.getSubMappingToscaTemplate()
+                    .getNodeTemplates()));
+        }
+        return Lists.newArrayList();
     }
 
     @Override
-    public List<EntityTemplate> searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery) {
-        return null;
+    public List<IEntityDetails> getEntitiesFromService(ToscaTemplate toscaTemplate) {
+        return convertNodeTemplatesListToEntityDetailsList(filter(toscaTemplate.getNodeTemplates()));
     }
 
-    public NodeTemplateEntityQuery(SdcTypes nodeTemplateType) {
-        super(EntityTemplateType.NODE_TEMPLATE, nodeTemplateType, null);
+    static List<IEntityDetails> convertNodeTemplatesListToEntityDetailsList(Stream<NodeTemplate> nodeTemplates) {
+        return nodeTemplates
+            .map(nt->EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, nt))
+            .collect(Collectors.toList());
     }
 
-    public NodeTemplateEntityQuery(String toscaType) {
-        super(EntityTemplateType.NODE_TEMPLATE, null, toscaType);
+    private Stream<NodeTemplate> filter(List<NodeTemplate> nodeTemplateList) {
+        return nodeTemplateList.stream()
+                .filter(nt->isSearchCriteriaMatched(nt.getMetaData(), nt.getType()))
+                .filter(nt->getNodeTemplateType() == null ||
+                        isStringMatchingOrNull(nt.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE),
+                                getNodeTemplateType().getValue()));
     }
+
+
 }
index 8ab5e4c..2a0a0ab 100644 (file)
@@ -1,30 +1,52 @@
 package org.onap.sdc.tosca.parser.elements.queries;
 
+import com.google.common.collect.Lists;
+import org.onap.sdc.tosca.parser.api.IEntityDetails;
+import org.onap.sdc.tosca.parser.elements.EntityDetailsFactory;
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
-import org.onap.sdc.toscaparser.api.EntityTemplate;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.Policy;
+import org.onap.sdc.toscaparser.api.ToscaTemplate;
 
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * Implements EntityQuery object for Policies
  */
 public class PolicyEntityQuery extends EntityQuery {
 
-    public PolicyEntityQuery() {
+    PolicyEntityQuery() {
         super(EntityTemplateType.POLICY, null, null);
     }
 
+    PolicyEntityQuery(String toscaType) {
+        super(EntityTemplateType.POLICY, null, toscaType);
+    }
+
     @Override
-    public List<EntityTemplate> searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery) {
-        return null;
+    public List<IEntityDetails> getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate) {
+        if (nodeTemplate.getOriginComponentTemplate() != null) {
+            return convertPolicyLisToEntityDetailsList(filter(nodeTemplate.getOriginComponentTemplate().getPolicies()));
+        }
+        return Lists.newArrayList();
     }
 
     @Override
-    public EntityTemplateType getType() {
-        return EntityTemplateType.POLICY;
+    public List<IEntityDetails> getEntitiesFromService(ToscaTemplate toscaTemplate) {
+        return convertPolicyLisToEntityDetailsList(filter(toscaTemplate.getPolicies()));
     }
 
-    public PolicyEntityQuery(String toscaType) {
-        super(EntityTemplateType.POLICY, null, toscaType);
+    static List<IEntityDetails> convertPolicyLisToEntityDetailsList(Stream<Policy> policies) {
+        return policies
+            .map(p->EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, p))
+            .collect(Collectors.toList());
     }
+
+    private Stream<Policy> filter(List<Policy> policyList) {
+        return policyList.stream()
+                .filter(p->isSearchCriteriaMatched(p.getMetaDataObj(), p.getType()));
+    }
+
 }
index 47b10a8..668345c 100644 (file)
@@ -1,14 +1,22 @@
 package org.onap.sdc.tosca.parser.elements.queries;
 
 import org.onap.sdc.tosca.parser.enums.SdcTypes;
+import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Objects;
 
 /**
  * This class describes a node template instance containing an entity searched and retrieved by SDC Tosca Parser API
  * It is used as the API input parameter. See the {@link org.onap.sdc.tosca.parser.api.ISdcCsarHelper}
  */
 public class TopologyTemplateQuery {
+    private static final Logger logger = LoggerFactory.getLogger(TopologyTemplateQuery.class.getName());
 
-    public void setCustomizationUUID(String customizationUUID) {
+    void setCustomizationUUID(String customizationUUID) {
         this.customizationUUID = customizationUUID;
     }
 
@@ -21,6 +29,11 @@ public class TopologyTemplateQuery {
     }
 
     public static TopologyTemplateQueryBuilder newBuilder(SdcTypes sdcType) {
+        if (!SdcTypes.isComplex(sdcType.getValue())) {
+            String wrongTypeMsg = (String.format("Given type is not Topology template %s", sdcType));
+            logger.error(wrongTypeMsg);
+            throw new IllegalArgumentException(wrongTypeMsg);
+        }
         return new TopologyTemplateQueryBuilder(sdcType);
     }
 
@@ -32,6 +45,37 @@ public class TopologyTemplateQuery {
         return customizationUUID;
     }
 
+    public Boolean isMatchingSearchCriteria(NodeTemplate nodeTemplate) {
+        boolean isMatched = Objects.nonNull(nodeTemplate.getMetaData()) && isSearchedTemplate(nodeTemplate.getMetaData());
+        if(logger.isDebugEnabled()) {
+            logger.debug("Node template {} is{} matching search criteria", nodeTemplate.getName(), isMatched ? "" : " not");
+        }
+        return isMatched;
+    }
+
+    public boolean isSameSdcType(Metadata metadata) {
+        final String nodeType = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE);
+        return Objects.nonNull(nodeType) && (
+                sdcType.getValue().equals(nodeType) || isServiceSearched(nodeType));
+    }
+
+    private boolean isSearchedTemplate(Metadata metadata) {
+        return isSameSdcType(metadata) &&
+                (sdcType == SdcTypes.SERVICE ||
+                        //don't check customizationUUID for service
+                     EntityQuery.isStringMatchingOrNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID),
+                             getCustomizationUUID()));
+    }
+
+    private boolean isServiceSearched(String nodeType) {
+        return sdcType == SdcTypes.SERVICE && SdcTypes.isComplex(nodeType);
+    }
+
+    @Override
+    public String toString() {
+        return String.format("sdcType=%s, customizationUUID=%s", sdcType.getValue(), customizationUUID);
+    }
+
     public static class TopologyTemplateQueryBuilder {
         private TopologyTemplateQuery topologyTemplateQuery;
         private TopologyTemplateQueryBuilder(SdcTypes sdcType) { topologyTemplateQuery = new TopologyTemplateQuery(sdcType);}
index 7f85673..925d58b 100644 (file)
@@ -6,6 +6,7 @@ package org.onap.sdc.tosca.parser.enums;
 public enum EntityTemplateType {
     NODE_TEMPLATE,
     GROUP,
-    POLICY;
+    POLICY,
+    ALL;
 
 }
index 99bdd81..b041972 100644 (file)
@@ -26,7 +26,8 @@ import java.util.stream.Collectors;
 
 public enum SdcTypes {
 
-    CP("CP"), VL("VL"), VF("VF"), CR("CR"), VFC("VFC"), PNF("PNF"), SERVICE("Service"), CVFC("CVFC"), SERVICE_PROXY("Service Proxy"), CONFIGURATION("Configuration");
+    CP("CP"), VL("VL"), VF("VF"), CR("CR"), VFC("VFC"), PNF("PNF"), SERVICE("Service"), CVFC("CVFC"),
+    SERVICE_PROXY("Service Proxy"), CONFIGURATION("Configuration"), VFC_ALLOTTED_RESOURCE("AllottedResource") ;
 
     private String value;
 
diff --git a/src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java b/src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java
new file mode 100644 (file)
index 0000000..42b499b
--- /dev/null
@@ -0,0 +1,127 @@
+package org.onap.sdc.tosca.parser.impl;
+
+import com.google.common.collect.Lists;
+import org.onap.sdc.tosca.parser.api.IEntityDetails;
+import org.onap.sdc.tosca.parser.elements.queries.EntityQuery;
+import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery;
+import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.tosca.parser.enums.SdcTypes;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.ToscaTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Performs search for entity templates inside node template according to query criteria
+ */
+class QueryProcessor {
+    private static final Logger logger = LoggerFactory.getLogger(QueryProcessor.class.getName());
+
+    private final EntityQuery entityQuery;
+    private final TopologyTemplateQuery topologyTemplateQuery;
+    private final ToscaTemplate toscaTemplate;
+    private boolean isRecursive = false;
+
+    QueryProcessor(ToscaTemplate toscaTemplate, EntityQuery entityQuery, TopologyTemplateQuery topologyTemplateQuery, boolean isRecursive) {
+        this.toscaTemplate = toscaTemplate;
+        this.entityQuery = entityQuery == null ? EntityQuery.newBuilder(EntityTemplateType.ALL).build() : entityQuery;
+        this.topologyTemplateQuery = topologyTemplateQuery;
+        this.isRecursive = isRecursive;
+    }
+
+    List<IEntityDetails> doQuery() {
+        List<IEntityDetails> entityDetailsList = Lists.newArrayList();
+        if (isServiceSearch()) {
+            //search for entities inside the service
+            if (logger.isDebugEnabled()) {
+                logger.debug("Service {} is searched for {}", toscaTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME), entityQuery);
+            }
+            entityDetailsList.addAll(entityQuery.getEntitiesFromService(toscaTemplate));
+
+            if (!isRecursive) {
+                return entityDetailsList;
+            }
+        }
+
+        List<NodeTemplate> foundTopologyTemplates = getInternalTopologyTemplates(toscaTemplate.getNodeTemplates(), false);
+        if (isRecursive) {
+            if (logger.isDebugEnabled()) {
+                logger.debug("Search for entities recursively");
+            }
+            //go over internal topology templates of the found templates
+            // and search for instances of the same type
+            //if the queried topology template is "SERVICE",  search for all instances of templates in the service
+            List<NodeTemplate> internalTopologyTemplates = foundTopologyTemplates.stream()
+                    .filter(nt->nt.getSubMappingToscaTemplate() != null)
+                    .map(nt->getInternalTopologyTemplates(nt.getSubMappingToscaTemplate().getNodeTemplates(), true))
+                    .flatMap(List::stream)
+                    .collect(Collectors.toList());
+            foundTopologyTemplates.addAll(internalTopologyTemplates);
+        }
+        if (logger.isDebugEnabled()) {
+            logger.debug("Found topology templates {} matching following query criteria: {}",
+                    foundTopologyTemplates, topologyTemplateQuery);
+        }
+        //go over all node templates found according to query criteria and recursive flag and
+        // search for the requested entities.
+        entityDetailsList.addAll(searchEntitiesInsideTopologyTemplates(foundTopologyTemplates));
+
+        return entityDetailsList;
+    }
+
+    private Map<String, NodeTemplate> convertListToMap(List<NodeTemplate> nodeTemplateList) {
+        // we use map to avoid duplicate search through same node templates
+        return nodeTemplateList.stream()
+                .collect(Collectors.toMap(NodeTemplate::getName, nt->nt, (nt1, nt2)->nt1));
+    }
+
+    private List<IEntityDetails> searchEntitiesInsideTopologyTemplates(List<NodeTemplate> foundTopologyTemplates) {
+        return convertListToMap(foundTopologyTemplates)
+                .values()
+                .stream()
+                .map(entityQuery::getEntitiesFromTopologyTemplate)
+                .flatMap(List::stream)
+                .collect(Collectors.toList());
+    }
+
+    private boolean isServiceSearch() {
+        return topologyTemplateQuery.getNodeTemplateType() == SdcTypes.SERVICE;
+    }
+
+    private List<NodeTemplate> getInternalTopologyTemplates(List<NodeTemplate> nodeTemplateList, boolean searchTypeOnly) {
+        return nodeTemplateList
+            .stream()
+            .map(child->getTopologyTemplatesByQuery(child, searchTypeOnly))
+            .flatMap(List::stream)
+            .collect(Collectors.toList());
+    }
+
+    private List<NodeTemplate> getTopologyTemplatesByQuery(NodeTemplate current, boolean searchTypeOnly) {
+        List<NodeTemplate> topologyTemplateList = Lists.newArrayList();
+
+        boolean isTopologyTemplateFound = searchTypeOnly ?
+                topologyTemplateQuery.isSameSdcType(current.getMetaData()) : topologyTemplateQuery.isMatchingSearchCriteria(current);
+        if (isTopologyTemplateFound) {
+            topologyTemplateList.add(current);
+            if (!isServiceSearch()) {
+                //recursion stop condition
+                return topologyTemplateList;
+            }
+        }
+        if (SdcTypes.isComplex(current.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)) && current.getSubMappingToscaTemplate() != null) {
+            //search the node template inside a given topology template
+            topologyTemplateList.addAll(current.getSubMappingToscaTemplate().getNodeTemplates()
+                    .stream()
+                    .map(nt->getTopologyTemplatesByQuery(nt, searchTypeOnly))
+                    .flatMap(List::stream)
+                    .collect(Collectors.toList()));
+        }
+        return topologyTemplateList;
+    }
+
+
+}
index 06bf48a..1ae3471 100644 (file)
@@ -39,11 +39,8 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.onap.sdc.tosca.parser.api.IEntityDetails;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
 import org.onap.sdc.tosca.parser.config.ConfigurationManager;
-import org.onap.sdc.tosca.parser.elements.EntityDetailsFactory;
-import org.onap.sdc.tosca.parser.elements.NodeTemplateEntityDetails;
-import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery;
 import org.onap.sdc.tosca.parser.elements.queries.EntityQuery;
-import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery;
 import org.onap.sdc.tosca.parser.enums.FilterType;
 import org.onap.sdc.tosca.parser.enums.PropertySchemaType;
 import org.onap.sdc.tosca.parser.enums.SdcTypes;
@@ -1208,12 +1205,13 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper {
 
     @Override
     public List<IEntityDetails> getEntity(EntityQuery entityQuery, TopologyTemplateQuery topologyTemplateQuery, boolean isRecursive) {
-        List<IEntityDetails> foundEntities = new ArrayList<>();
-        List<NodeTemplate> vfcList = getVfcListByVf("05e77410-a1d8-44fe-8440-b9410c8f98ee");
-        NodeTemplate vfc = getNodeTemplateByCustomizationUuid(vfcList, "1fdc9625-dfec-48e1-aaf8-7b92f78ca854");
-        NodeTemplate cp = getChildNodeTemplateByName(vfc, "ssc_ssc_avpn_port_0");
-        foundEntities.add(EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, cp, vfc));
-        return foundEntities;
+
+        if (log.isDebugEnabled()) {
+            log.debug("getEntity request: EntityQuery <{}>, TopologyTemplateQuery <{}>,  isRecursive<{}>",
+                    entityQuery, topologyTemplateQuery, isRecursive);
+        }
+        return new QueryProcessor(toscaTemplate, entityQuery, topologyTemplateQuery, isRecursive).doQuery();
     }
 
+
 }
index 8a2067d..830e67a 100644 (file)
@@ -9,13 +9,17 @@ import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery;
 import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
 import org.onap.sdc.tosca.parser.enums.SdcTypes;
 import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
+import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
 import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
+import org.onap.sdc.toscaparser.api.CapabilityAssignment;
 import org.onap.sdc.toscaparser.api.Property;
 
+import java.net.URL;
 import java.util.List;
 import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 public class GetEntityTest {
@@ -25,64 +29,319 @@ public class GetEntityTest {
     @BeforeClass
     public static void setUpClass() {
         try {
-            String filePath = GetEntityTest.class.getClassLoader().getResource("csars/service-JennyVtsbcVlanSvc-csar.csar").getFile();
-            helper = SdcToscaParserFactory.getInstance().getSdcCsarHelper(filePath);
+            URL resource = GetEntityTest.class.getClassLoader().getResource("csars/service-JennyVtsbcVlanSvc-csar.csar");
+            if (resource != null) {
+                helper = SdcToscaParserFactory.getInstance().getSdcCsarHelper(resource.getFile());
+            }
+
         } catch (SdcToscaParserException e) {
             e.printStackTrace();
         }
     }
 
-    @Test
-    public void test1() {
-        //none recursive search for groups in the service
-        EntityQuery entityQuery1 = EntityQuery.newBuilder(EntityTemplateType.GROUP)
-                .uUID("1233456")
+        @Test
+    public void getCpEntitiesFromCVFC() {
+        EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP)
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .customizationUUID("1fdc9625-dfec-48e1-aaf8-7b92f78ca854")
                 .build();
 
-        TopologyTemplateQuery topologyTemplateQuery1 = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
+
+        assertEquals(6, entities.size());
+    }
+
+    @Test
+    public void getOneCpEntityFromCVFC() {
+        EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.resource.cp.v2.extNeutronCP")
+                .uUID("d5e13a34-c983-4a36-a44a-a53a6e850d73")
+                .customizationUUID("e97b3399-ab2d-4a34-b07a-9bd5f6461335")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .customizationUUID("1fdc9625-dfec-48e1-aaf8-7b92f78ca854")
                 .build();
-        List<IEntityDetails> entities = helper.getEntity(entityQuery1, topologyTemplateQuery1, false);
 
-        for (IEntityDetails entity: entities) {
-            List<IEntityDetails> members = entity.getMemberNodes();
-        }
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
 
-        //recursive search for CPs in a specific CVFC
-        EntityQuery entityQuery2 = EntityQuery.newBuilder(SdcTypes.CP)
-                .customizationUUID("345678903456")
+        assertEquals(1, entities.size());
+        assertEquals("ssc_ssc_avpn_port_0", entities.get(0).getName());
+        assertEquals(18, entities.get(0).getProperties().size());
+        assertEquals(1, entities.get(0).getRequirements().size());
+        assertEquals(13, entities.get(0).getCapabilities().entrySet().size());
+        Map<String, CapabilityAssignment> capAssignments = entities.get(0).getCapabilities();
+        CapabilityAssignment capabilityAssignment = capAssignments.get("network.outgoing.packets.rate");
+        assertEquals("org.openecomp.capabilities.metric.Ceilometer", capabilityAssignment.getDefinition().getType());
+
+    }
+
+    @Test
+    public void getCpsFromCVFCRecursively() {
+        EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP)
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
                 .build();
 
-        TopologyTemplateQuery topologyTemplateQuery2 = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
-                .customizationUUID("12346767676")
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, true);
+
+        assertEquals(16, entities.size());
+        assertEquals("jenny vTSBC vlan VNF 0#abstract_rtp_msc", entities.get(2).getPath());
+        assertEquals("jenny vTSBC vlan VNF 0#abstract_rtp_msc#rtp_msc_rtp_msc_avpn_port_0_vlan_subinterface_rtp_msc_avpn", entities.get(7).getPath());
+    }
+
+    @Test
+    public void getCpByUuidsFromCVFCRecursively() {
+        EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP)
+                .customizationUUID("d674b231-34ba-4777-b83a-78be33960a69")
+                .uUID("f511e1c8-1f21-4370-b7b6-f57a61c15211")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
                 .build();
-        entities = helper.getEntity(entityQuery2, topologyTemplateQuery2, true);
 
-        for (IEntityDetails entity: entities) {
-            Map<String, Property> properties = entity.getProperties();
-            Property property = properties.get("network_role");
-            String network_role_value = (String) property.getValue();
-        }
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, true);
 
+        assertEquals(1, entities.size());
+        assertEquals("rtp_msc_subint_mis_vmi_0", entities.get(0).getName());
+        assertEquals("ff9ae686-f030-4431-afb7-b65d1bf4733e", entities.get(0).getParent().getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+        assertTrue(entities.get(0).getMemberNodes().isEmpty());
     }
 
     @Test
-    public void getCpEntityMock() {
+    public void getCpByWrongUuidFromCVFCRecursively() {
         EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP)
+                .customizationUUID("d674b231-34ba-4777-b83a-78be33960a69")
+                .uUID("f511e1c8-1f21-4370-b7b6-f57a61c15213")
                 .build();
         TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
                 .build();
 
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, true);
+
+        assertEquals(0, entities.size());
+    }
+
+    @Test
+    public void getServiceGroups() {
+        EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP)
+               .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
+
+        assertEquals(4, entities.size());
+        assertTrue(entities.get(0).getRequirements().isEmpty());
+        assertTrue(entities.get(1).getCapabilities().isEmpty());
+        assertTrue(entities.get(0).getPath().isEmpty() && entities.get(1).getPath().isEmpty() &&
+                entities.get(2).getPath().isEmpty() && entities.get(3).getPath().isEmpty());
+    }
+
+    @Test
+    public void getVfGroupsByType1() {
+        EntityQuery entityQuery = EntityQuery.newBuilder("tosca.groups.Root")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
+
+        assertEquals(2, entities.size());
+        assertTrue(entities.get(0).getMemberNodes().get(0).getName().equals("abstract_rtp_msc") ||
+                entities.get(1).getMemberNodes().get(0).getName().equals("abstract_rtp_msc"));
+        assertTrue(entities.get(0).getMemberNodes().get(0).getName().equals("abstract_ssc") ||
+                entities.get(1).getMemberNodes().get(0).getName().equals("abstract_ssc"));
+
+    }
+
+    @Test
+    public void getVfGroupByType2() {
+        EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.groups.VfcInstanceGroup")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
+
+        assertEquals(1, entities.size());
+        assertTrue(entities.get(0).getName().equals("avpn_group"));
+        assertTrue(entities.get(0).getMemberNodes().get(0).getName().equals("abstract_ssc") ||
+                entities.get(0).getMemberNodes().get(1).getName().equals("abstract_ssc"));
+        assertTrue(entities.get(0).getMemberNodes().get(0).getName().equals("abstract_rtp_msc") ||
+                entities.get(0).getMemberNodes().get(1).getName().equals("abstract_rtp_msc"));
+        assertEquals(4, entities.get(0).getProperties().size());
+        assertTrue(entities.get(0).getRequirements().isEmpty());
+
+    }
+
+    @Test
+    public void getOneServiceGroup() {
+        EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP)
+                .customizationUUID("94d27f05-a116-4662-b330-8758c2b049d7")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+                .build();
+
         List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
 
         assertEquals(1, entities.size());
-        assertEquals(1, entities.get(0).getMemberNodes().size());
-        assertEquals(EntityTemplateType.NODE_TEMPLATE, entities.get(0).getType());
-        assertEquals("28.0", entities.get(0).getMetadata().getValue("version"));
-        assertEquals("CP", entities.get(0).getMetadata().getValue("type"));
-        assertEquals("extNeutronCP", entities.get(0).getMetadata().getValue("name"));
-        assertEquals("abstract_ssc", entities.get(0).getParent().getName());
-        assertEquals("jenny vTSBC vlan VNF 0#abstract_ssc#ssc_ssc_avpn_port_0", entities.get(0).getPath());
-        assertTrue(entities.get(0).getProperties() != null && entities.get(0).getProperties().size() == 18);
+        assertNull(entities.get(0).getParent());
+    }
 
+    @Test
+    public void getAllGroups() {
+        EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP)
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, true);
+
+        assertEquals(19, entities.size());
+        assertTrue(entities.get(9).getTargetNodes().isEmpty());
+        assertEquals("rtp_msc_subint_avpn_vmi_0", entities.get(5).getMemberNodes().get(0).getName());
     }
+
+    @Test
+    public void getAllPolicies() {
+        EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.POLICY)
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, true);
+
+        assertEquals(1, entities.size());
+        assertEquals("jennyvtsbcvlanvnf..External..0", entities.get(0).getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+        assertEquals(EntityTemplateType.GROUP, entities.get(0).getTargetNodes().get(0).getType());
+        assertEquals("jenny vTSBC vlan VNF 0", entities.get(0).getPath());
+    }
+
+    @Test
+    public void getServicePolicy() {
+        EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.POLICY)
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
+        assertEquals(0, entities.size());
+    }
+
+    @Test
+    public void getVfPolicyByUUID() {
+        EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.policies.External")
+                .uUID("0181f46a-3c68-47dd-9839-8692726356e5")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
+
+        assertEquals(1, entities.size());
+        assertEquals(EntityTemplateType.GROUP, entities.get(0).getTargetNodes().get(0).getType());
+        assertTrue(entities.get(0).getRequirements().isEmpty());
+        assertTrue(entities.get(0).getCapabilities().isEmpty());
+        assertEquals("jenny vTSBC vlan VNF 0", entities.get(0).getPath());
+   }
+
+    @Test
+    public void getVfPolicyByWrongToscaTypeAndUUID() {
+        EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.policies.External1")
+                .uUID("0181f46a-3c68-47dd-9839-8692726356e5")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
+        assertEquals(0, entities.size());
+    }
+
+    @Test
+    public void getCvfcPolicyByToscaTypeAndUUID() {
+        EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.policies.External")
+                .uUID("0181f46a-3c68-47dd-9839-8692726356e5")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, true);
+        assertEquals(0, entities.size());
+    }
+
+
+    @Test
+    public void getAllEntitiesInServiceOnly() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(null, topologyTemplateQuery, false);
+        assertEquals(5, entities.size());
+    }
+
+
+    @Test
+    public void getAllEntitiesInServiceRecursively() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(null, topologyTemplateQuery, true);
+        assertEquals(48, entities.size());
+    }
+
+    @Test
+    public void getAllEntitiesInCvfcByCUUID() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .customizationUUID("b90c9f8a-9c07-4507-913f-70b533f5934d")
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(null, topologyTemplateQuery, false);
+        assertEquals(2, entities.size());
+        assertTrue("ssc_subint_mis_vmi_0".equals(entities.get(0).getName()) || "ssc_subint_mis_vmi_0".equals(entities.get(1).getName()));
+    }
+
+    @Test
+    public void getAllEntitiesInCvfcByUuidRecursively() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .customizationUUID("1fdc9625-dfec-48e1-aaf8-7b92f78ca854")
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(null, topologyTemplateQuery, true);
+        assertEquals(13, entities.size());
+    }
+
+    @Test
+    public void getCpPropertyWhenCpIsInInternalCVFC() {
+        EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.resource.cp.nodes.heat.network.neutron.Port")
+                .customizationUUID("c03b7d04-5457-4ad2-9102-1edb7806c7b2")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, true);
+
+        assertEquals(1, entities.size());
+        Property p = entities.get(0).getProperties().get("ip_requirements");
+        List<String> valueList = p.getLeafPropertyValue("ip_version");
+        assertEquals(1, valueList.size());
+        assertEquals("4", valueList.get(0));
+    }
+
+    @Test
+    public void getCpPropertyOnCVFC() {
+        EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.resource.cp.v2.extNeutronCP")
+                .customizationUUID("e56919d1-b23f-4334-93b0-1daa507fd2a9")
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .customizationUUID("1fdc9625-dfec-48e1-aaf8-7b92f78ca854")
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, false);
+
+        assertEquals(1, entities.size());
+        Property p = entities.get(0).getProperties().get("mac_requirements");
+        List<String> valueList = p.getLeafPropertyValue("mac_count_required#is_required");
+        assertEquals(1, valueList.size());
+        assertEquals("false", valueList.get(0));
+    }
+
 }
diff --git a/src/test/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactoryTest.java b/src/test/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactoryTest.java
new file mode 100644 (file)
index 0000000..4ecce9d
--- /dev/null
@@ -0,0 +1,106 @@
+package org.onap.sdc.tosca.parser.elements;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.toscaparser.api.Group;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.Policy;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class EntityDetailsFactoryTest {
+
+    @Mock
+    private NodeTemplate nodeTemplate;
+
+    @Mock
+    private Group group;
+
+    @Mock
+    private Policy policy;
+
+
+    @Test
+    public void createNodeTemplateEntityDetailsWhenParentNodeIsNotNull() {
+        when(nodeTemplate.getParentNodeTemplate())
+                .thenReturn(nodeTemplate)
+                .thenReturn(null);
+        EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, nodeTemplate);
+        assertTrue(entityDetails instanceof NodeTemplateEntityDetails);
+        assertTrue(entityDetails.getParent() instanceof NodeTemplateEntityDetails);
+    }
+
+    @Test
+    public void createNodeTemplateEntityDetailsWhenParentNodeIsNull() {
+        EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, nodeTemplate);
+        assertTrue(entityDetails instanceof NodeTemplateEntityDetails);
+        assertEquals(null, entityDetails.getParent());
+    }
+
+    @Test
+    public void createNodeTemplateEntityDetailsWhenNnIsNull() {
+        assertEquals(null, EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, null));
+    }
+
+    @Test
+    public void createGroupEntityDetailsWhenParentNodeIsNotNull() {
+        when(group.getParentNodeTemplate())
+                .thenReturn(nodeTemplate)
+                .thenReturn(null);
+        EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, group);
+        assertTrue(entityDetails instanceof GroupEntityDetails);
+        assertTrue(entityDetails.getParent() instanceof NodeTemplateEntityDetails);
+    }
+
+    @Test
+    public void createGroupEntityDetailsWhenParentNodeIsNull() {
+        EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, group);
+        assertTrue(entityDetails instanceof GroupEntityDetails);
+        assertEquals(null, entityDetails.getParent());
+    }
+
+    @Test
+    public void createGroupEntityDetailsWhenNnIsNull() {
+        assertEquals(null, EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, null));
+    }
+
+    @Test
+    public void createPolicyEntityDetailsWhenParentNodeIsNotNull() {
+        when(policy.getParentNodeTemplate())
+                .thenReturn(nodeTemplate)
+                .thenReturn(null);
+        EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, policy);
+        assertTrue(entityDetails instanceof PolicyEntityDetails);
+        assertTrue(entityDetails.getParent() instanceof NodeTemplateEntityDetails);
+    }
+
+    @Test
+    public void createPolicyEntityDetailsWhenParentNodeIsNull() {
+        EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, policy);
+        assertTrue(entityDetails instanceof PolicyEntityDetails);
+        assertEquals(null, entityDetails.getParent());
+    }
+
+    @Test
+    public void createPolicyEntityDetailsWhenNnIsNull() {
+        assertEquals(null, EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, null));
+    }
+
+    @Test(expected = ClassCastException.class)
+    public void createWrongEntityDetails() {
+        EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, group);
+    }
+
+
+    @Test
+    public void createEntityDetailsWhenTypeIsNull() {
+        assertEquals(null, EntityDetailsFactory.createEntityDetails(null, group));
+    }
+
+}
diff --git a/src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java b/src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java
new file mode 100644 (file)
index 0000000..ecf764c
--- /dev/null
@@ -0,0 +1,163 @@
+package org.onap.sdc.tosca.parser.elements.queries;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class EntityQueryTest {
+    @Mock
+    private Metadata metadata;
+
+    @Test
+    public void findEntityWhenUuidAndCuudNotSetAndToscaTypeNotSet() {
+       EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.GROUP)
+               .build();
+       when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+       when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("12345");
+       assertTrue(entityQuery.isSearchCriteriaMatched(metadata, ""));
+    }
+
+    @Test
+    public void findEntityWhenMetadataIsNull() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.GROUP)
+                .build();
+        assertFalse(entityQuery.isSearchCriteriaMatched(null,"abc"));
+    }
+
+    @Test
+    public void findEntityWhenMetadataIsNullAndUuidsAreProvided() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.NODE_TEMPLATE)
+                .customizationUUID("2345")
+                .uUID("9700")
+                .build();
+        assertFalse(entityQuery.isSearchCriteriaMatched(null, ""));
+    }
+
+    @Test
+    public void findEntityWhenUuidIsSetAndMatchedAndToscaTypeNotSet() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.GROUP)
+                .uUID("123")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("12345");
+
+        assertTrue(entityQuery.isSearchCriteriaMatched(metadata, "abc"));
+    }
+
+    @Test
+    public void findEntityWhenUuidIsSetAndMatchedAndCuuidIsNullAndToscaTypeNotSet() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.GROUP)
+                .uUID("123")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn(null);
+
+        assertTrue(entityQuery.isSearchCriteriaMatched(metadata, ""));
+    }
+
+    @Test
+    public void findEntityWhenUuidAndCuuidAreSetAndMatchedAndCuuidIsNullAndToscaTypeNotSet() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.GROUP)
+                .uUID("123")
+                .customizationUUID("567")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn(null);
+
+        assertFalse(entityQuery.isSearchCriteriaMatched(metadata, ""));
+    }
+
+
+    @Test
+    public void findEntityWhenUIDsAreSetAndMatchedAndToscaTypeNotSet() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.POLICY)
+                .uUID("123")
+                .customizationUUID("345")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("345");
+
+        assertTrue(entityQuery.isSearchCriteriaMatched(metadata, "qwe"));
+    }
+
+    @Test
+    public void findEntityWhenUIDsAreSetAndMatchedPartiallyAndToscaTypeNotSet() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.POLICY)
+                .uUID("123")
+                .customizationUUID("345")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("444");
+
+        assertFalse(entityQuery.isSearchCriteriaMatched(metadata, ""));
+    }
+
+    @Test
+    public void findEntityWhenUuidIsSetAndDoesNotMatchAndToscaTypeNotSet() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.GROUP)
+                .uUID("7890")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("12345");
+
+        assertFalse(entityQuery.isSearchCriteriaMatched(metadata, ""));
+    }
+
+    @Test
+    public void findEntityWhenUIDsAreSetAndMatchedAndToscaTypeIsNull() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder(EntityTemplateType.POLICY)
+                .uUID("123")
+                .customizationUUID("345")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("345");
+
+        assertTrue(entityQuery.isSearchCriteriaMatched(metadata, null));
+    }
+
+    @Test
+    public void findEntityWhenUIDsAreSetAndMatchedAndToscaTypeIsNotMatched() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder("a.policies.b")
+                .uUID("123")
+                .customizationUUID("345")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("345");
+
+        assertFalse(entityQuery.isSearchCriteriaMatched(metadata, "abc"));
+    }
+
+    @Test
+    public void findEntityWhenUIDsAreSetAndMatchedAndToscaTypeIsMatched() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder("a.groups.b")
+                .uUID("123")
+                .customizationUUID("345")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("345");
+
+        assertTrue(entityQuery.isSearchCriteriaMatched(metadata, "a.groups.b"));
+    }
+
+    @Test
+    public void findEntityWhenUIDsAreNotMatchedAndToscaTypeIsMatched() {
+        EntityQuery entityQuery =  EntityQuery.newBuilder("a.groups.b")
+                .uUID("123")
+                .customizationUUID("345")
+                .build();
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("12345");
+        when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("3456");
+
+        assertFalse(entityQuery.isSearchCriteriaMatched(metadata, "a.groups.b"));
+    }
+}
diff --git a/src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java b/src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java
new file mode 100644 (file)
index 0000000..08d3708
--- /dev/null
@@ -0,0 +1,122 @@
+package org.onap.sdc.tosca.parser.elements.queries;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.sdc.tosca.parser.enums.SdcTypes;
+import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertFalse;
+
+@RunWith(MockitoJUnitRunner.class)
+public class TopologyTemplateQueryTest {
+
+    @Mock
+    private Metadata metadata;
+
+    @Mock
+    private NodeTemplate nodeTemplate;
+
+    @Test(expected=IllegalArgumentException.class)
+    public void objectIsNotTopologyTemplate() {
+       TopologyTemplateQuery.newBuilder(SdcTypes.CP)
+               .build();
+    }
+
+    @Test
+    public void templateIsFoundByTypeOnly() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+                .build();
+        when(nodeTemplate.getMetaData()).thenReturn(metadata);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345");
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.SERVICE.getValue());
+        assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate));
+    }
+
+    @Test
+    public void templateIsNotFoundWhenMetadataIsNull() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF)
+                .build();
+        when(nodeTemplate.getMetaData()).thenReturn(null);
+        assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate));
+    }
+
+    @Test
+    public void templateIsFoundIfItIsService() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+                .build();
+        when(nodeTemplate.getMetaData()).thenReturn(metadata);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.SERVICE.getValue());
+        assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate));
+    }
+
+    @Test
+    public void templateIsFoundByTypeAndCUUID() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .customizationUUID("345")
+                .build();
+        when(nodeTemplate.getMetaData()).thenReturn(metadata);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.CVFC.getValue());
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345");
+        assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate));
+    }
+
+    @Test
+    public void templateIsNotFoundWhenTypeIsNotMatchedAndCuuidIsNotSet() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .build();
+        when(nodeTemplate.getMetaData()).thenReturn(metadata);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.VF.getValue());
+        assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate));
+    }
+
+    @Test
+    public void templateIsFoundWhenTypeIsMatchedCuuidIsProvidedAndCuuidIsNullInMetadata() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF)
+                .customizationUUID("2345")
+                .build();
+        when(nodeTemplate.getMetaData()).thenReturn(metadata);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn(null);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.VF.getValue());
+        assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate));
+    }
+
+    @Test
+    public void templateIsFoundWhenTypeIsMatchedAndCuuidIsNullInMetadata() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF)
+                .build();
+        when(nodeTemplate.getMetaData()).thenReturn(metadata);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn(null);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.VF.getValue());
+        assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate));
+    }
+
+    @Test
+    public void templateIsNotFoundWhenTypeIsMatchedAndCuuidIsSet() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+                .customizationUUID("345")
+                .build();
+        when(nodeTemplate.getMetaData()).thenReturn(metadata);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.CVFC.getValue());
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345");
+        assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate));
+    }
+
+    @Test
+    public void templateIsNotFoundWhenTypeIsNotMatchedAndCuuidIsSet() {
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CR)
+                .customizationUUID("345")
+                .build();
+        when(nodeTemplate.getMetaData()).thenReturn(metadata);
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.CVFC.getValue());
+        when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345");
+        assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate));
+    }
+
+
+}
index 61bae76..3a44f58 100644 (file)
@@ -5,7 +5,7 @@
 
 major=1
 minor=4
-patch=9
+patch=10
 
 base_version=${major}.${minor}.${patch}