summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/onap
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/onap')
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/api/ConformanceLevel.java25
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java454
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/api/Version.java48
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/config/Configuration.java16
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/config/ConfigurationManager.java124
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/config/ErrorConfiguration.java46
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/config/ErrorInfo.java59
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/config/JToscaValidationIssueInfo.java31
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/config/JtoscaValidationIssueConfiguration.java52
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/config/SdcToscaParserErrors.java31
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/exceptions/SdcToscaParserException.java20
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/impl/FilterType.java26
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/impl/JToscaValidationIssueType.java6
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java908
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/impl/SdcPropertyNames.java109
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/impl/SdcToscaParserFactory.java203
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/impl/SdcTypes.java46
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/utils/GeneralUtility.java53
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/utils/SdcToscaUtility.java19
-rw-r--r--src/main/java/org/onap/sdc/tosca/parser/utils/YamlToObjectConverter.java126
20 files changed, 2402 insertions, 0 deletions
diff --git a/src/main/java/org/onap/sdc/tosca/parser/api/ConformanceLevel.java b/src/main/java/org/onap/sdc/tosca/parser/api/ConformanceLevel.java
new file mode 100644
index 0000000..4b4d646
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/api/ConformanceLevel.java
@@ -0,0 +1,25 @@
+package org.onap.sdc.tosca.parser.api;
+
+public class ConformanceLevel {
+
+ private String minVersion;
+ private String maxVersion;
+
+ public String getMaxVersion() {
+ return maxVersion;
+ }
+
+ public void setMaxVersion(String maxVersion) {
+ this.maxVersion = maxVersion;
+ }
+
+ public String getMinVersion() {
+ return minVersion;
+ }
+
+ public void setMinVersion(String minVersion) {
+ this.minVersion = minVersion;
+ }
+
+
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java b/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java
new file mode 100644
index 0000000..76798d5
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java
@@ -0,0 +1,454 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * sdc-distribution-client
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.sdc.tosca.parser.api;
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.onap.sdc.tosca.parser.impl.SdcTypes;
+import org.onap.sdc.tosca.parser.impl.FilterType;
+import org.onap.sdc.toscaparser.api.*;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+import org.onap.sdc.toscaparser.api.parameters.Input;
+
+
+public interface ISdcCsarHelper {
+
+ /**
+ * Get all node templates by node_type for this CSAR service.
+ *
+ * @param nodeType - the TOSCA type of the node.
+ * @return service node templates of this type.
+ */
+ public List<NodeTemplate> getServiceNodeTemplatesByType(String nodeType);
+
+ /**
+ * Get all node templates for this CSAR service.
+ *
+ * @return service node templates.
+ */
+ public List<NodeTemplate> getServiceNodeTemplates();
+
+ /**
+ * Get groups of a VF with type "org.onap.groups.VfModule".
+ *
+ * @param vfCustomizationUuid - customizationUuid of VF instance.
+ * @return list of vfModule groups.
+ */
+ public List<Group> getVfModulesByVf(String vfCustomizationUuid);
+
+
+ /**
+ * Get any property leaf value for node template by full path separated by #.<br>
+ * For example, for node template with this property:<br><br>
+ * network_assignments:<br>
+ &nbsp;&nbsp;ecomp_generated_network_assignment: true<br>
+ &nbsp;&nbsp;is_shared_network: false<br>
+ &nbsp;&nbsp;is_external_network: false<br>
+ &nbsp;&nbsp;ipv4_subnet_default_assignments:<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;use_ipv4: true<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;ip_network_address_plan: 1.2.3.4<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;dhcp_enabled: true<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;ip_version: 4<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;cidr_mask: 24<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;min_subnets_count: 1<br>
+ &nbsp;&nbsp;ipv6_subnet_default_assignments:<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;use_ipv6: false<br><br>
+
+ * calling<br>
+ * getNodeTemplatePropertyLeafValue(nodeTemplate, "network_assignments#ipv6_subnet_default_assignments#use_ipv6")<br>
+ * will return "false".
+ * @param nodeTemplate - nodeTemplate where the property should be looked up.
+ * @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.
+ */
+ public String getNodeTemplatePropertyLeafValue(NodeTemplate nodeTemplate, String pathToPropertyLeafValue);
+
+ /**
+ * Get any property leaf value for node template by full path separated by #.<br>
+ * For example, for node template with this property:<br><br>
+ * network_assignments:<br>
+ &nbsp;&nbsp;ecomp_generated_network_assignment: true<br>
+ &nbsp;&nbsp;is_shared_network: false<br>
+ &nbsp;&nbsp;is_external_network: false<br>
+ &nbsp;&nbsp;ipv4_subnet_default_assignments:<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;use_ipv4: true<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;ip_network_address_plan: 1.2.3.4<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;dhcp_enabled: true<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;ip_version: 4<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;cidr_mask: 24<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;min_subnets_count: 1<br>
+ &nbsp;&nbsp;ipv6_subnet_default_assignments:<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;use_ipv6: false<br><br>
+
+ * calling<br>
+ * getNodeTemplatePropertyLeafValue(nodeTemplate, "network_assignments#ipv6_subnet_default_assignments#use_ipv6")<br>
+ * will return "false".
+ * @param nodeTemplate - nodeTemplate where the property should be looked up.
+ * @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.
+ */
+ public Object getNodeTemplatePropertyAsObject(NodeTemplate nodeTemplate, String pathToPropertyLeafValue);
+
+ /**
+ * Get any property leaf value for a group definition by full path separated by #.
+ * Same logic as in {@link #getNodeTemplatePropertyLeafValue(NodeTemplate, String) getNodeTemplatePropertyLeafValue}, only for a group.
+ * @param group - group where the property should be looked up.
+ * @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.
+ */
+ public String getGroupPropertyLeafValue(Group group, String propertyName);
+
+ /**
+ * Get any property value for a group definition by full path separated by #.
+ * Same logic as in {@link #getNodeTemplatePropertyLeafValue(NodeTemplate, String) getNodeTemplatePropertyLeafValue}, only for a group.
+ * @param group - group where the property should be looked up.
+ * @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.
+ */
+ public Object getGroupPropertyAsObject(Group group, String propertyName);
+
+ /**
+ * Get all VL node templates of the CSAR service.
+ * @return - all VL node templates.
+ */
+ public List<NodeTemplate> getServiceVlList();
+
+ /**
+ * Get all VF node templates of the CSAR service.
+ * @return - all VF node templates.
+ */
+ public List<NodeTemplate> getServiceVfList();
+
+
+ /**
+ *
+ * Get a property from a metadata object.<br>
+ * This is just sugaring method, same as calling metadata.getMetadataPropertyValue(metadataPropertyName).<br>
+ *
+ * For metadata object representing the below: <br><br>
+ *
+ * metadata:<br>
+ &nbsp;&nbsp;invariantUUID: 4598a404-00e1-42a6-8767-0bda343e2066<br>
+ &nbsp;&nbsp;UUID: e17940d6-42f8-4989-bad0-31de5addc619<br>
+ &nbsp;&nbsp;customizationUUID: 83d086b2-a861-4d3b-aa84-3bfbb9b2ec20<br>
+ &nbsp;&nbsp;version: '0.1'<br>
+ &nbsp;&nbsp;name: vIPR_ATM<br>
+ &nbsp;&nbsp;description: vIPR_ATM<br>
+ &nbsp;&nbsp;type: VF<br>
+ &nbsp;&nbsp;category: category1<br>
+ &nbsp;&nbsp;subcategory: subCategory1<br><br>
+
+ calling<br>
+ getMetadataPropertyValue(metadata,"invariantUUID")<br>
+ will return "4598a404-00e1-42a6-8767-0bda343e2066".
+
+ * @param metadata - metadata object.
+ * @param metadataPropertyName - the name of the metadata property.
+ * @return metadata property value
+ */
+ public String getMetadataPropertyValue(Metadata metadata, String metadataPropertyName);
+
+
+ /**
+ * Get input leaf value for the CSAR service, by full path separated by #.<br>
+ * Same logic as in {@link #getNodeTemplatePropertyLeafValue(NodeTemplate, String) getNodeTemplatePropertyLeafValue}, only for an input full path.
+ * The expected format is "input_name#default[optionally #rest_of_path]"
+ * @param inputLeafValuePath by full path separated by #.
+ * @return input leaf value for the service.
+ */
+ public String getServiceInputLeafValueOfDefault(String inputLeafValuePath);
+
+ /**
+ * Get input leaf value for the CSAR service, by full path separated by #.<br>
+ * Same logic as in {@link #getNodeTemplatePropertyLeafValue(NodeTemplate, String) getNodeTemplatePropertyLeafValue}, only for an input full path.
+ * The expected format is "input_name#default[optionally #rest_of_path]"
+ * @param inputLeafValuePath by full path separated by #.
+ * @return input value for the service as Object. It's up to the caller to cast it to a proper type.
+ */
+ public Object getServiceInputLeafValueOfDefaultAsObject(String inputLeafValuePath);
+
+ /**
+ * Get the type name of the CSAR service's substitution mappings element.<br>
+ *
+ * For the below:<br><br>
+ *
+ * substitution_mappings:<br>
+ &nbsp;&nbsp;type: org.onap.services.ViprATM<br>
+
+ calling<br>
+ getServiceSubstitutionMappingsTypeName()<br>
+ will return "org.onap.services.ViprATM"
+ * @return - the type name of the CSAR service's substitution mappings element
+ */
+ public String getServiceSubstitutionMappingsTypeName();
+
+ /**
+ * Get service Metadata object.<br>
+ * This object represents the "metadata" section of a CSAR service.
+ * @return - the service Metadata object.
+ */
+ public Metadata getServiceMetadata();
+
+ /**
+ * Get the CSAR service metadata as map.
+ * @return - the service metadata object as Map.
+ * @deprecated This function is deprecated since its not tosca compliant. <br>
+ * Tosca defines the Metadata section as map of string (not map of object).<br>
+ * This function is targeted to be removed as part of 1802.<br>
+ * Please use {@link #getServiceMetadataAllProperties() getServiceMetadataAllProperties()}.
+ */
+ @Deprecated
+ public Map<String, Object> getServiceMetadataProperties();
+
+ /**
+ * Get the CSAR service metadata as map
+ * @return - the service metadata object as Map
+ */
+ public Map<String, String> getServiceMetadataAllProperties();
+
+ /**
+ * Get all VFC node templates from a specified VF.
+ * @param vfCustomizationId - customizationUuid of the VF node template.
+ * @return all VFC node templates from a specified VF
+ */
+ public List<NodeTemplate> getVfcListByVf(String vfCustomizationId);
+
+ /**
+ * Get all CP node templates from a specified VF.
+ * @param vfCustomizationId - customizationUuid of the VF node template.
+ * @return all CP node templates from a specified VF
+ */
+ public List<NodeTemplate> getCpListByVf(String vfCustomizationId);
+
+ /**
+ * Get all members of this group definition.<br>
+ *
+ * For example, for this group definition:<br><br>
+ *
+ * ViprAtm..vIPR-ATM-Base..module-0:<br>
+ &nbsp;&nbsp;type: org.onap.groups.VfModule<br>
+ &nbsp;&nbsp;.................<br>
+ &nbsp;&nbsp;members: [vIPR_ATM_Ha_Two, vIPR_ATM_Ha_One, vIPR_ATM_OAM_SG, vIPR_ATM_HA_TWO_SG, vIPR_ATM_HA_ONE_SG]<br><br>
+
+ calling<br>
+ getMembersOfVfModule(NoteTemplate vfNodeTemplate, Group group)<br>
+ will return List of the following Node templates in the vfNodeTemplate: "vIPR_ATM_Ha_Two, vIPR_ATM_Ha_One, vIPR_ATM_OAM_SG, vIPR_ATM_HA_TWO_SG, vIPR_ATM_HA_ONE_SG"<br>
+ * @param vf - VF to return the node templates from.
+ * @param vfModule - group to return the members from.
+ * @return node templates from vf with the names as in members section.
+ *
+ */
+ public List<NodeTemplate> getMembersOfVfModule(NodeTemplate vf, Group vfModule);
+
+
+ /**
+ * Get list of node template pairs, where for each pair,<br>
+ * the left node template in pair has requirement with name reqName, <br>
+ * which should be satisfied with respective capability by the right node template in pair.<br>
+ *
+ * For example, if we have the below two node templates in the vIPR VF:<br><br>
+ *
+ * oam_extCP:<br>
+ &nbsp;&nbsp;type: org.onap.resources.cp.extCP<br>
+ &nbsp;&nbsp;requirements:<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;- virtualBinding: vipr_atm_firewall<br><br>
+ *
+ * vipr_atm_firewall: <br>
+ &nbsp;&nbsp;type: org.onap.resources.vfc.ViprAtm.abstract.nodes.heat.vipr_atm<br>
+ ........<br><br>
+ *
+
+ * calling<br>
+ * getNodeTemplatePairsByReqName(getCpListByVf(viprCustomUuid), getVfcListByVf(viprCustomUuid), "virtualBinding")<br>
+ * will return a list with one Pair - where left element of pair will be "oam_extCP" node template,<br>
+ * and right element will be "vipr_atm_firewall" node template.<br>
+ *
+ * @param listOfReqNodeTemplates - list of node templates in which the "reqName" requirement should be looked.
+ * @param listOfCapNodeTemplates - list of node templates in which the capability matching the "reqName" requirement should be looked.
+ * @param reqName - the name of a requirement definition to match by.
+ * @return pairs of node templates according to described above.
+ */
+ public List<Pair<NodeTemplate,NodeTemplate>> getNodeTemplatePairsByReqName(List<NodeTemplate> listOfReqNodeTemplates, List<NodeTemplate> listOfCapNodeTemplates, String reqName);
+
+ /**
+ * Get all allotted node templates from this service.
+ * @return all allotted node templates from this service.
+ */
+ public List<NodeTemplate> getAllottedResources();
+
+ /**
+ * Get node_type of a node template.<br>
+ *
+ * For this node template:<br>
+ *
+ * vipr_atm_firewall: <br>
+ &nbsp;&nbsp;type: org.onap.resources.vfc.ViprAtm.abstract.nodes.heat.vipr_atm<br>
+ ........<br><br>
+ *
+ * the function will return "org.onap.resources.vfc.ViprAtm.abstract.nodes.heat.vipr_atm"
+ *
+ * @param nodeTemplate - node template object
+ * @return - node type string.
+ */
+ public String getTypeOfNodeTemplate(NodeTemplate nodeTemplate);
+
+ /**
+ * Get the CSAR service inputs list.
+ * @return - the service inputs list.
+ */
+ public List<Input> getServiceInputs();
+
+
+ /**
+ * Get the conformance level of this CSAR. <br>
+ * The conformance level value of the CSAR is located in csar.meta file at the top level of the CSAR file.<br>
+ * For 1707 CSARs, the conformance level is 3.0.
+ * @return the conformance level of the CSAR.
+ */
+ public String getConformanceLevel();
+
+
+ /**
+ * Get the map of CP-related props from a VFC node template. <br>
+ * Let's say there are 5 CPs related to this VFC. Then the output will look like this: <br><br>
+ * {port_fe1_sigtran={ip_requirements#ip_count_required#count=1, ip_requirements#dhcp_enabled=true, ip_requirements#ip_version=4, subnetpoolid="subnet_1", network_role_tag="SIGNET_vrf_B1_direct"},<br>
+ * port_fe_cluster={ip_requirements#ip_count_required#count=2, ip_requirements#dhcp_enabled=true, ip_requirements#ip_version=4},<br>
+ * port_fe_slan={ip_requirements#ip_count_required#count=1, ip_requirements#dhcp_enabled=true, ip_requirements#ip_version=4},<br>
+ * port_fe_interce={ip_requirements#ip_count_required#count=1, ip_requirements#dhcp_enabled=true, ip_requirements#ip_version=4},<br>
+ * port_fe_oam={ip_requirements#ip_count_required#count=2, ip_requirements#dhcp_enabled=true, ip_requirements#ip_version=4, subnetpoolid="subnet_2", network_role_tag="Mobility_OAM_protected"}}<br><br>
+ * @param vfc - VFC node template to look for CP-related props.
+ * @return map <b>CP node template name</b> to a map of <b>full path to a property on this CP</b> - <b> value of this property on this CP</b>.
+ * @deprecated This function is deprecated since its flattened form doesn't provide solution for cp properties of type List.
+ * Will be removed in 1802.
+ */
+ @Deprecated
+ public Map<String, Map<String, Object>> getCpPropertiesFromVfc(NodeTemplate vfc);
+
+ /**
+ * Get the map of CP-related props from a VFC node template. <br>
+ * Let's say there are 2 CPs (ports) related to this VFC. Then the output will look like this: <br><br>
+ * {port_fe_sigtran={ip_requirements={ip_count_required: {count: 1}, dhcp_enabled: true, ip_version: 4}, subnetpoolid: "subnet_1", network_role_tag: "SIGNET_vrf_B1_direct"}<br>
+ * port_fe_cluster={ip_requirements={ip_count_required: {count: 2}, dhcp_enabled: true, ip_version: 4}}<br>
+ * @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>.
+ */
+ public Map<String, Map<String, Object>> getCpPropertiesFromVfcAsObject(NodeTemplate vfc);
+
+ /**
+ * Get customization UUID of a node template
+ * @param nt - node template
+ * @return customization UUID of a node template.
+ */
+ public String getNodeTemplateCustomizationUuid(NodeTemplate nt);
+
+ /**
+ * Filter Node Template property values by equals/contains operator and a pattern
+ * @param nodeTemplate Node Template to filter its properties
+ * @param filterType filter type - equals or contains
+ * @param pattern value to filter with it
+ * @return Map <b>full path to a property</b> mapped to <b>property value</b> filtered by type and pattern
+ */
+ public Map<String, String> filterNodeTemplatePropertiesByValue(NodeTemplate nodeTemplate, FilterType filterType, String pattern);
+
+ /**
+ * Get all node templates by sdcType for parent Node Template.
+ *
+ * @param parentNodeTemplate - parent node template
+ * @param sdcType - the SDC type of the node.
+ * @return node templates of this SDC type.
+ */
+ public List<NodeTemplate> getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType);
+
+ /**
+ * Get all node templates by SDC type enum for this CSAR service.
+ *
+ * @param sdcType - the SDC type of the node (for example, CP, VF...).
+ * @return service node templates of this SDC type.
+ */
+ public List<NodeTemplate> getServiceNodeTemplateBySdcType(SdcTypes sdcType);
+
+ /**
+ * Get all node templates for this CSAR service.
+ * @param vfCustomizationUuid - the Customization UUID of the node.
+ * @return VNF Configuration Node Template.
+ */
+ public NodeTemplate getVnfConfig(String vfCustomizationUuid);
+
+ /**
+ * Check if Node Template has Topology Template
+ * @param nodeTemplate - Node Template to check
+ * @return true if node template has topology template, false if not.
+ */
+ public boolean hasTopology(NodeTemplate nodeTemplate);
+
+ /**
+ * Get children node templates for node template.
+ * @param nodeTemplate - Node Template to get its children
+ * @return return list of children node templates for node template.
+ */
+ public List<NodeTemplate> getNodeTemplateChildren(NodeTemplate nodeTemplate);
+
+ /**
+ * Get node template on service level by node template name.
+ * @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.
+ */
+ public NodeTemplate getServiceNodeTemplateByNodeName(String nodeName);
+
+ /**
+ * Get node template Metadata object.<br>
+ * This object represents the "metadata" section of node template.
+ * @param nt - Node template to get its Metadata object.
+ * @return Metadata for this node template, or null if not found.
+ */
+ public Metadata getNodeTemplateMetadata(NodeTemplate nt);
+
+ /**
+ * Get CapabilityAssignments object for this node template.<br>
+ * This should be an entry point function for working with capability assignments of node template.<br>
+ * This object allows filtering capability assignments objects.<br>
+ * @param nt - Node Template to get its capability assignments.
+ * @return CapabilitiesAssignments that contains list of capability assignments for the node template.<br>
+ * If none found, an empty list will be returned.
+ */
+ public CapabilityAssignments getCapabilitiesOf(NodeTemplate nt);
+
+ /**
+ * Get RequirementAssignments object for this node template.<br>
+ * This should be an entry point function for working with requirement assignments of node template.<br>
+ * This object allows filtering requirement assignments objects.<br>
+ * @param nt - Node Template to get its requirement assignments.
+ * @return RequirementAssignments that contains list of requirement assignments for the node template.
+ * If none found, an empty list will be returned.
+ */
+ public RequirementAssignments getRequirementsOf(NodeTemplate nt);
+
+ /**
+ * Get any property leaf value for capability by full path separated by #.
+ * Same logic as in {@link #getNodeTemplatePropertyLeafValue(NodeTemplate, String) getNodeTemplatePropertyLeafValue}, only for a capability assignment.
+ * @param capability - capability assignment where the property should be looked up.
+ * @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.
+ */
+ public String getCapabilityPropertyLeafValue(CapabilityAssignment capability, String pathToPropertyLeafValue);
+
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/sdc/tosca/parser/api/Version.java b/src/main/java/org/onap/sdc/tosca/parser/api/Version.java
new file mode 100644
index 0000000..c485b18
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/api/Version.java
@@ -0,0 +1,48 @@
+package org.onap.sdc.tosca.parser.api;
+
+public class Version implements Comparable<Version> {
+
+ private String version;
+
+ public final String get() {
+ return this.version;
+ }
+
+ public Version(String version) {
+ if(version == null)
+ throw new IllegalArgumentException("Version can not be null");
+ if(!version.matches("[0-9]+(\\.[0-9]+)*"))
+ throw new IllegalArgumentException("Invalid version format");
+ this.version = version;
+ }
+
+ @Override public int compareTo(Version that) {
+ if(that == null)
+ return 1;
+ String[] thisParts = this.get().split("\\.");
+ String[] thatParts = that.get().split("\\.");
+ int length = Math.max(thisParts.length, thatParts.length);
+ for(int i = 0; i < length; i++) {
+ int thisPart = i < thisParts.length ?
+ Integer.parseInt(thisParts[i]) : 0;
+ int thatPart = i < thatParts.length ?
+ Integer.parseInt(thatParts[i]) : 0;
+ if(thisPart < thatPart)
+ return -1;
+ if(thisPart > thatPart)
+ return 1;
+ }
+ return 0;
+ }
+
+ @Override public boolean equals(Object that) {
+ if(this == that)
+ return true;
+ if(that == null)
+ return false;
+ if(this.getClass() != that.getClass())
+ return false;
+ return this.compareTo((Version) that) == 0;
+ }
+
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/config/Configuration.java b/src/main/java/org/onap/sdc/tosca/parser/config/Configuration.java
new file mode 100644
index 0000000..7135b6b
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/config/Configuration.java
@@ -0,0 +1,16 @@
+package org.onap.sdc.tosca.parser.config;
+
+import org.onap.sdc.tosca.parser.api.ConformanceLevel;
+
+public class Configuration {
+
+ private ConformanceLevel conformanceLevel;
+
+ public ConformanceLevel getConformanceLevel() {
+ return conformanceLevel;
+ }
+
+ public void setConformanceLevel(ConformanceLevel conformanceLevel) {
+ this.conformanceLevel = conformanceLevel;
+ }
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/config/ConfigurationManager.java b/src/main/java/org/onap/sdc/tosca/parser/config/ConfigurationManager.java
new file mode 100644
index 0000000..e0b9dc8
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/config/ConfigurationManager.java
@@ -0,0 +1,124 @@
+package org.onap.sdc.tosca.parser.config;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.Resources;
+import org.onap.sdc.tosca.parser.utils.YamlToObjectConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class ConfigurationManager {
+
+ private static Logger log = LoggerFactory.getLogger(ConfigurationManager.class.getName());
+
+ private static final String CONFIGURATION_DIR = "config/";
+ private static volatile ConfigurationManager instance;
+
+
+ Map<String, Object> configurations = new HashMap<String, Object>();
+
+ private ConfigurationManager() {
+ initialConfigObjectsFromFiles();
+ }
+
+ private void initialConfigObjectsFromFiles() {
+ loadConfigurationClass(ErrorConfiguration.class);
+ loadConfigurationClass(Configuration.class);
+ loadConfigurationClass(JtoscaValidationIssueConfiguration.class);
+ }
+
+ private <T> void loadConfigurationClass(Class<T> clazz) {
+ T object = getObjectFromYaml(clazz);
+ configurations.put(clazz.getSimpleName(), object);
+ }
+
+ private <T> void loadConfigurationClass(Class<T> clazz, String fileName) {
+ T object = getObjectFromYaml(clazz,fileName);
+ configurations.put(clazz.getSimpleName(), object);
+ }
+
+ public static <T> T getObjectFromYaml(Class<T> className) {
+ return getObjectFromYaml(className, null);
+ }
+
+ public static <T> T getObjectFromYaml(Class<T> className, String fileName) {
+
+
+ String configFileName = fileName != null ? fileName : calculateFileName(className); ;
+
+ URL url = Resources.getResource(CONFIGURATION_DIR + configFileName);
+ String configFileContents = null;
+ try {
+ configFileContents = Resources.toString(url, Charsets.UTF_8);
+ } catch (IOException e) {
+ log.error("ConfigurationManager - Failed to load configuration file {}", configFileName, e);
+ }
+ YamlToObjectConverter yamlToObjectConverter = new YamlToObjectConverter();
+ T object = yamlToObjectConverter.convertFromString(configFileContents, className);
+
+ return object;
+ }
+
+
+ public static ConfigurationManager getInstance() {
+ if (instance == null) {
+ synchronized (ConfigurationManager.class) {
+ if (instance == null) {
+ instance = new ConfigurationManager();
+ }
+ }
+ }
+ return instance;
+ }
+
+ private static <T> String calculateFileName(Class<T> className) {
+
+ String[] words = className.getSimpleName().split("(?=\\p{Upper})");
+
+ StringBuilder builder = new StringBuilder();
+
+ // There cannot be a null value returned from "split" - words != null is
+ // redundant
+ // if (words != null) {
+ boolean isFirst = true;
+ for (int i = 0; i < words.length; i++) {
+
+ String word = words[i];
+ if (word != null && !word.isEmpty()) {
+ if (!isFirst) {
+ builder.append("-");
+ } else {
+ isFirst = false;
+ }
+ builder.append(words[i].toLowerCase());
+ }
+ }
+ return builder.toString() + ".yaml";
+
+ /*
+ * } else { return className.getSimpleName().toLowerCase() + Constants.YAML_SUFFIX; }
+ */
+
+ }
+
+ public ErrorConfiguration getErrorConfiguration() {
+ return (ErrorConfiguration) configurations.get((ErrorConfiguration.class.getSimpleName()));
+ }
+ public JtoscaValidationIssueConfiguration getJtoscaValidationIssueConfiguration() {
+ return (JtoscaValidationIssueConfiguration) configurations.get((JtoscaValidationIssueConfiguration.class.getSimpleName()));
+ }
+ public void setJtoscaValidationIssueConfiguration(String fileName) {
+ loadConfigurationClass(JtoscaValidationIssueConfiguration.class, fileName);
+ }
+ public Configuration getConfiguration() {
+ return (Configuration) configurations.get((Configuration.class.getSimpleName()));
+ }
+ public void setErrorConfiguration(String fileName) {
+ loadConfigurationClass(ErrorConfiguration.class, fileName);
+ }
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/config/ErrorConfiguration.java b/src/main/java/org/onap/sdc/tosca/parser/config/ErrorConfiguration.java
new file mode 100644
index 0000000..1b1f2e2
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/config/ErrorConfiguration.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdc.tosca.parser.config;
+
+import java.util.Map;
+
+public class ErrorConfiguration {
+
+ private Map<String, ErrorInfo> errors;
+
+ public Map<String, ErrorInfo> getErrors() {
+ return errors;
+ }
+
+ public void setErrors(Map<String, ErrorInfo> errors) {
+ this.errors = errors;
+ }
+
+ public ErrorInfo getErrorInfo(String key) {
+ ErrorInfo clone = null;
+ ErrorInfo other = errors.get(key);
+ if (other != null) {
+ clone = new ErrorInfo();
+ clone.cloneData(other);
+ }
+ return clone;
+ }
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/config/ErrorInfo.java b/src/main/java/org/onap/sdc/tosca/parser/config/ErrorInfo.java
new file mode 100644
index 0000000..52a92c4
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/config/ErrorInfo.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdc.tosca.parser.config;
+
+public class ErrorInfo {
+
+ private String code;
+ private String message;
+ private boolean failOnError;
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean getFailOnError() {
+ return failOnError;
+ }
+
+ public void setFailOnError(boolean failOnError) {
+ this.failOnError = failOnError;
+ }
+
+ public void cloneData(ErrorInfo other) {
+ this.code = other.getCode();
+ this.message = other.getMessage();
+ this.failOnError = other.getFailOnError();
+ }
+
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/config/JToscaValidationIssueInfo.java b/src/main/java/org/onap/sdc/tosca/parser/config/JToscaValidationIssueInfo.java
new file mode 100644
index 0000000..0e76b29
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/config/JToscaValidationIssueInfo.java
@@ -0,0 +1,31 @@
+package org.onap.sdc.tosca.parser.config;
+
+public class JToscaValidationIssueInfo {
+
+ private String issueType;
+ private String sinceCsarConformanceLevel;
+
+ public JToscaValidationIssueInfo() {}
+
+ public String getIssueType() {
+ return issueType;
+ }
+
+ public void setIssueType(String issueType) {
+ this.issueType = issueType;
+ }
+
+ public String getSinceCsarConformanceLevel() {
+ return sinceCsarConformanceLevel;
+ }
+
+ public void setSinceCsarConformanceLevel(String sinceCsarConformanceLevel) {
+ this.sinceCsarConformanceLevel = sinceCsarConformanceLevel;
+ }
+
+ public void cloneData(JToscaValidationIssueInfo other) {
+ this.issueType = other.getIssueType();
+ this.sinceCsarConformanceLevel = other.getSinceCsarConformanceLevel();
+ }
+
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/config/JtoscaValidationIssueConfiguration.java b/src/main/java/org/onap/sdc/tosca/parser/config/JtoscaValidationIssueConfiguration.java
new file mode 100644
index 0000000..55912e6
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/config/JtoscaValidationIssueConfiguration.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdc.tosca.parser.config;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class JtoscaValidationIssueConfiguration {
+
+ private Map<String, List<JToscaValidationIssueInfo>> validationIssues;
+
+ public Map<String, List<JToscaValidationIssueInfo>> getValidationIssues() {
+ return validationIssues;
+ }
+
+ public void setValidationIssues(Map<String, List<JToscaValidationIssueInfo>> validationIssues) {
+ this.validationIssues = validationIssues;
+ }
+
+ public List<JToscaValidationIssueInfo> getJtoscaValidationIssueInfo(String key) {
+ List<JToscaValidationIssueInfo> clone = new ArrayList<>();
+ List<JToscaValidationIssueInfo> other = validationIssues.get(key);
+ if (other != null) {
+ for (JToscaValidationIssueInfo item: other) {
+ JToscaValidationIssueInfo cloneitem = new JToscaValidationIssueInfo();
+ cloneitem.cloneData(item);
+ clone.add(cloneitem);
+ }
+ }
+ return clone;
+ }
+
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/config/SdcToscaParserErrors.java b/src/main/java/org/onap/sdc/tosca/parser/config/SdcToscaParserErrors.java
new file mode 100644
index 0000000..730142c
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/config/SdcToscaParserErrors.java
@@ -0,0 +1,31 @@
+package org.onap.sdc.tosca.parser.config;
+
+import java.util.EnumMap;
+import java.util.Map;
+
+import org.onap.sdc.toscaparser.api.utils.JToscaErrorCodes;
+
+public enum SdcToscaParserErrors {
+
+ BAD_FORMAT, CONFORMANCE_LEVEL_ERROR, FILE_NOT_FOUND, GENERAL_ERROR;
+
+ private static final Map<JToscaErrorCodes, SdcToscaParserErrors> JTOSCA_ERRORS =
+ new EnumMap<JToscaErrorCodes, SdcToscaParserErrors>(JToscaErrorCodes.class) {{
+
+ put(JToscaErrorCodes.GENERAL_ERROR, GENERAL_ERROR);
+
+ put(JToscaErrorCodes.PATH_NOT_VALID, FILE_NOT_FOUND);
+ //CSAR contents problems
+ put(JToscaErrorCodes.MISSING_META_FILE, BAD_FORMAT);
+ put(JToscaErrorCodes.INVALID_META_YAML_CONTENT, BAD_FORMAT);
+ put(JToscaErrorCodes.ENTRY_DEFINITION_NOT_DEFINED, BAD_FORMAT);
+ put(JToscaErrorCodes.MISSING_ENTRY_DEFINITION_FILE, BAD_FORMAT);
+ put(JToscaErrorCodes.CSAR_TOSCA_VALIDATION_ERROR, BAD_FORMAT);
+ put(JToscaErrorCodes.INVALID_CSAR_FORMAT, BAD_FORMAT);
+ }};
+
+ public static SdcToscaParserErrors getSdcErrorByJToscaError(JToscaErrorCodes jToscaErrorCode) {
+ return JTOSCA_ERRORS.get(jToscaErrorCode);
+ }
+
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/exceptions/SdcToscaParserException.java b/src/main/java/org/onap/sdc/tosca/parser/exceptions/SdcToscaParserException.java
new file mode 100644
index 0000000..5576750
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/exceptions/SdcToscaParserException.java
@@ -0,0 +1,20 @@
+package org.onap.sdc.tosca.parser.exceptions;
+
+public class SdcToscaParserException extends Exception {
+
+ private static final long serialVersionUID = 626014844866501196L;
+ private String code;
+
+ public SdcToscaParserException(String string, String code) {
+ super(string);
+ this.code = code;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/impl/FilterType.java b/src/main/java/org/onap/sdc/tosca/parser/impl/FilterType.java
new file mode 100644
index 0000000..09c3c5c
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/impl/FilterType.java
@@ -0,0 +1,26 @@
+package org.onap.sdc.tosca.parser.impl;
+
+public enum FilterType {
+
+ CONTAINS("contains"){
+ @Override
+ public boolean isMatch(String value, String pattern) {
+ return value.contains(pattern);
+ }
+ },
+ EQUALS("equals"){
+ @Override
+ public boolean isMatch(String value, String pattern) {
+ return value.equals(pattern);
+ }
+ };
+
+ String filterName;
+
+ FilterType(String name) {
+ this.filterName = name;
+ }
+
+ public abstract boolean isMatch(String value, String pattern);
+
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/impl/JToscaValidationIssueType.java b/src/main/java/org/onap/sdc/tosca/parser/impl/JToscaValidationIssueType.java
new file mode 100644
index 0000000..fb13867
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/impl/JToscaValidationIssueType.java
@@ -0,0 +1,6 @@
+package org.onap.sdc.tosca.parser.impl;
+
+public enum JToscaValidationIssueType {
+ CRITICAL,
+ WARNING
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java
new file mode 100644
index 0000000..0c42a4f
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java
@@ -0,0 +1,908 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * sdc-distribution-client
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdc.tosca.parser.impl;
+
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
+import org.onap.sdc.tosca.parser.config.ConfigurationManager;
+import org.onap.sdc.tosca.parser.utils.GeneralUtility;
+import org.onap.sdc.tosca.parser.utils.SdcToscaUtility;
+import org.onap.sdc.toscaparser.api.*;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+import org.onap.sdc.toscaparser.api.elements.NodeType;
+import org.onap.sdc.toscaparser.api.functions.Function;
+import org.onap.sdc.toscaparser.api.parameters.Input;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SdcCsarHelperImpl implements ISdcCsarHelper {
+
+ private static final String PATH_DELIMITER = "#";
+ private static final String CUSTOMIZATION_UUID = "customizationUUID";
+ private ToscaTemplate toscaTemplate;
+ private ConfigurationManager configurationManager;
+ private static Logger log = LoggerFactory.getLogger(SdcCsarHelperImpl.class.getName());
+
+ public SdcCsarHelperImpl(ToscaTemplate toscaTemplate) {
+ this.toscaTemplate = toscaTemplate;
+ }
+
+ public SdcCsarHelperImpl(ToscaTemplate toscaTemplate, ConfigurationManager configurationManager) {
+ this.toscaTemplate = toscaTemplate;
+ this.configurationManager = configurationManager;
+ }
+
+ @Override
+ //Sunny flow - covered with UT, flat and nested
+ public String getNodeTemplatePropertyLeafValue(NodeTemplate nodeTemplate, String leafValuePath) {
+ if (nodeTemplate == null) {
+ log.error("getNodeTemplatePropertyLeafValue - nodeTemplate is null");
+ return null;
+ }
+ if (GeneralUtility.isEmptyString(leafValuePath)) {
+ log.error("getNodeTemplatePropertyLeafValue - leafValuePath is null or empty");
+ return null;
+ }
+ String[] split = getSplittedPath(leafValuePath);
+ LinkedHashMap<String, Property> properties = nodeTemplate.getProperties();
+ Object property = processProperties(split, properties);
+ return property == null || property instanceof Function ? null : String.valueOf(property);
+ }
+
+ @Override
+ public Object getNodeTemplatePropertyAsObject(NodeTemplate nodeTemplate, String leafValuePath) {
+ if (nodeTemplate == null) {
+ log.error("getNodeTemplatePropertyAsObject - nodeTemplate is null");
+ return null;
+ }
+ if (GeneralUtility.isEmptyString(leafValuePath)) {
+ log.error("getNodeTemplatePropertyAsObject - leafValuePath is null or empty");
+ return null;
+ }
+ String[] split = getSplittedPath(leafValuePath);
+ LinkedHashMap<String, Property> properties = nodeTemplate.getProperties();
+ return processProperties(split, properties);
+ }
+
+ public Map<String, Map<String, Object>> getCpPropertiesFromVfcAsObject(NodeTemplate vfc) {
+ if (vfc == null) {
+ log.error("getCpPropertiesFromVfc - vfc is null");
+ return new HashMap<>();
+ }
+
+ String presetProperty = "_ip_requirements";
+ Map<String, Map<String, Object>> cps = new HashMap<>();
+
+ Map<String, Property> props = vfc.getProperties();
+ if (props != null) {
+ // find all port names by pre-set property (ip_requirements)
+ for (Map.Entry<String, Property> entry : props.entrySet()) {
+ if (entry.getKey().endsWith(presetProperty)) {
+ String portName = entry.getKey().replaceAll(presetProperty, "");
+ cps.put(portName, new HashMap<>());
+ }
+ }
+
+ if (cps.size() > 0) {
+ // ports found - find all their properties
+ for (String portName : cps.keySet()) {
+ for (Map.Entry<String, Property> property: props.entrySet()) {
+ if (property.getKey().startsWith(portName)) {
+ String portProperty = property.getKey().replaceFirst(portName + "_", "");
+ if (property.getValue() != null) {
+ cps.get(portName).put(portProperty, property.getValue().getValue());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return cps;
+ }
+
+ public Map<String, Map<String, Object>> getCpPropertiesFromVfc(NodeTemplate vfc) {
+
+ if (vfc == null) {
+ log.error("getCpPropertiesFromVfc - vfc is null");
+ return new HashMap<>();
+ }
+
+ String presetProperty = "_ip_requirements";
+ Map<String, Map<String, Object>> cps = new HashMap<>();
+
+ Map<String, Property> props = vfc.getProperties();
+ if (props != null) {
+ // find all port names by pre-set property (ip_requirements)
+ for (Map.Entry<String, Property> entry : props.entrySet()) {
+ if (entry.getKey().endsWith(presetProperty)) {
+ String portName = entry.getKey().replaceAll(presetProperty, "");
+ cps.put(portName, new HashMap<>());
+ }
+ }
+
+ if (cps.size() > 0) {
+ // ports found - find all their properties
+ for (String portName : cps.keySet()) {
+ for (Map.Entry<String, Property> property: props.entrySet()) {
+ if (property.getKey().startsWith(portName)) {
+ Map<String, Object> portPaths = new HashMap<>();
+ String portProperty = property.getKey().replaceFirst(portName + "_", "");
+ buildPathMappedToValue(portProperty, property.getValue().getValue(), portPaths);
+
+ cps.get(portName).putAll(portPaths);
+ }
+ }
+ }
+ }
+ }
+
+ return cps;
+ }
+
+ @SuppressWarnings("unchecked")
+ private void buildPathMappedToValue(String path, Object property, Map<String, Object> pathsMap) {
+ if (property instanceof Map) {
+ for (Map.Entry<String, Object> item : ((Map<String, Object>) property).entrySet()) {
+ if (item.getValue() instanceof Map || item.getValue() instanceof List) {
+ buildPathMappedToValue(path + PATH_DELIMITER + item.getKey(), item.getValue(), pathsMap);
+ } else {
+ pathsMap.put(path + PATH_DELIMITER + item.getKey(), item.getValue());
+ }
+ }
+ } else if (property instanceof List) {
+ for (Object item: (List<Object>)property) {
+ buildPathMappedToValue(path, item, pathsMap);
+ }
+ } else {
+ pathsMap.put(path, property);
+ }
+
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public List<NodeTemplate> getServiceVlList() {
+ List<NodeTemplate> serviceVlList = getNodeTemplateBySdcType(toscaTemplate.getTopologyTemplate(), SdcTypes.VL);
+ return serviceVlList;
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public List<NodeTemplate> getServiceVfList() {
+ List<NodeTemplate> serviceVfList = getNodeTemplateBySdcType(toscaTemplate.getTopologyTemplate(), SdcTypes.VF);
+ return serviceVfList;
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public String getMetadataPropertyValue(Metadata metadata, String metadataPropertyName) {
+ if (GeneralUtility.isEmptyString(metadataPropertyName)) {
+ log.error("getMetadataPropertyValue - the metadataPropertyName is null or empty");
+ return null;
+ }
+ if (metadata == null) {
+ log.error("getMetadataPropertyValue - the metadata is null");
+ return null;
+ }
+ String metadataPropertyValue = metadata.getValue(metadataPropertyName);
+ return metadataPropertyValue;
+ }
+
+
+ @Override
+ //Sunny flow - covered with UT
+ public List<NodeTemplate> getServiceNodeTemplatesByType(String nodeType) {
+ if (GeneralUtility.isEmptyString(nodeType)) {
+ log.error("getServiceNodeTemplatesByType - nodeType - is null or empty");
+ return new ArrayList<>();
+ }
+
+ List<NodeTemplate> res = new ArrayList<>();
+ List<NodeTemplate> nodeTemplates = toscaTemplate.getNodeTemplates();
+ for (NodeTemplate nodeTemplate : nodeTemplates) {
+ if (nodeType.equals(nodeTemplate.getTypeDefinition().getType())) {
+ res.add(nodeTemplate);
+ }
+ }
+
+ return res;
+ }
+
+
+ @Override
+ public List<NodeTemplate> getServiceNodeTemplates() {
+ List<NodeTemplate> nodeTemplates = toscaTemplate.getNodeTemplates();
+ return nodeTemplates;
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public List<NodeTemplate> getVfcListByVf(String vfCustomizationId) {
+ if (GeneralUtility.isEmptyString(vfCustomizationId)) {
+ log.error("getVfcListByVf - vfCustomizationId - is null or empty");
+ return new ArrayList<>();
+ }
+
+ List<NodeTemplate> serviceVfList = getServiceVfList();
+ NodeTemplate vfInstance = getNodeTemplateByCustomizationUuid(serviceVfList, vfCustomizationId);
+ List<NodeTemplate> vfcs = getNodeTemplateBySdcType(vfInstance, SdcTypes.VFC);
+ vfcs.addAll(getNodeTemplateBySdcType(vfInstance, SdcTypes.CVFC));
+
+ return vfcs;
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public List<Group> getVfModulesByVf(String vfCustomizationUuid) {
+ List<NodeTemplate> serviceVfList = getServiceVfList();
+ NodeTemplate nodeTemplateByCustomizationUuid = getNodeTemplateByCustomizationUuid(serviceVfList, vfCustomizationUuid);
+ if (nodeTemplateByCustomizationUuid != null) {
+ /*SubstitutionMappings substitutionMappings = nodeTemplateByCustomizationUuid.getSubstitutionMappings();
+ if (substitutionMappings != null){
+ List<Group> groups = substitutionMappings.getGroups();
+ if (groups != null){
+ List<Group> collect = groups.stream().filter(x -> "org.openecomp.groups.VfModule".equals(x.getTypeDefinition().getType())).collect(Collectors.toList());
+ log.debug("getVfModulesByVf - VfModules are {}", collect);
+ return collect;
+ }
+ }*/
+ String name = nodeTemplateByCustomizationUuid.getName();
+ String normaliseComponentInstanceName = SdcToscaUtility.normaliseComponentInstanceName(name);
+ List<Group> serviceLevelGroups = toscaTemplate.getTopologyTemplate().getGroups();
+ log.debug("getVfModulesByVf - VF node template name {}, normalized name {}. Searching groups on service level starting with VF normalized name...", name, normaliseComponentInstanceName);
+ if (serviceLevelGroups != null) {
+ List<Group> collect = serviceLevelGroups
+ .stream()
+ .filter(x -> "org.openecomp.groups.VfModule".equals(x.getTypeDefinition().getType()) && x.getName().startsWith(normaliseComponentInstanceName))
+ .collect(Collectors.toList());
+ return collect;
+ }
+ }
+ return new ArrayList<>();
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public String getServiceInputLeafValueOfDefault(String inputLeafValuePath) {
+ if (GeneralUtility.isEmptyString(inputLeafValuePath)) {
+ log.error("getServiceInputLeafValueOfDefault - inputLeafValuePath is null or empty");
+ return null;
+ }
+
+ String[] split = getSplittedPath(inputLeafValuePath);
+ if (split.length < 2 || !split[1].equals("default")) {
+ log.error("getServiceInputLeafValue - inputLeafValuePath should be of format <input name>#default[optionally #<rest of path>] ");
+ return null;
+ }
+
+ List<Input> inputs = toscaTemplate.getInputs();
+ if (inputs != null) {
+ Optional<Input> findFirst = inputs.stream().filter(x -> x.getName().equals(split[0])).findFirst();
+ if (findFirst.isPresent()) {
+ Input input = findFirst.get();
+ Object current = input.getDefault();
+ Object property = iterateProcessPath(2, current, split);
+ return property == null || property instanceof Function? null : String.valueOf(property);
+ }
+ }
+ log.error("getServiceInputLeafValue - value not found");
+ return null;
+ }
+
+ @Override
+ public Object getServiceInputLeafValueOfDefaultAsObject(String inputLeafValuePath) {
+ if (GeneralUtility.isEmptyString(inputLeafValuePath)) {
+ log.error("getServiceInputLeafValueOfDefaultAsObject - inputLeafValuePath is null or empty");
+ return null;
+ }
+
+ String[] split = getSplittedPath(inputLeafValuePath);
+ if (split.length < 2 || !split[1].equals("default")) {
+ log.error("getServiceInputLeafValueOfDefaultAsObject - inputLeafValuePath should be of format <input name>#default[optionally #<rest of path>] ");
+ return null;
+ }
+
+ List<Input> inputs = toscaTemplate.getInputs();
+ if (inputs != null) {
+ Optional<Input> findFirst = inputs.stream().filter(x -> x.getName().equals(split[0])).findFirst();
+ if (findFirst.isPresent()) {
+ Input input = findFirst.get();
+ Object current = input.getDefault();
+ return iterateProcessPath(2, current, split);
+ }
+ }
+ log.error("getServiceInputLeafValueOfDefaultAsObject - value not found");
+ return null;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ private Object iterateProcessPath(Integer index, Object current, String[] split) {
+ if (current == null) {
+ log.error("iterateProcessPath - this input has no default");
+ return null;
+ }
+ if (split.length > index) {
+ for (int i = index; i < split.length; i++) {
+ if (current instanceof Map) {
+ current = ((Map<String, Object>) current).get(split[i]);
+ } else if (current instanceof List) {
+ current = ((List) current).get(0);
+ i--;
+ }
+ else {
+ log.error("iterateProcessPath - found an unexpected leaf where expected to find a complex type");
+ return null;
+ }
+ }
+ }
+ if (current != null) {
+ return current;
+ }
+ log.error("iterateProcessPath - Path not Found");
+ return null;
+ }
+
+ private String[] getSplittedPath(String inputLeafValuePath) {
+ return inputLeafValuePath.split(PATH_DELIMITER);
+ }
+
+
+ @Override
+ //Sunny flow - covered with UT
+ public String getServiceSubstitutionMappingsTypeName() {
+ SubstitutionMappings substitutionMappings = toscaTemplate.getTopologyTemplate().getSubstitutionMappings();
+ if (substitutionMappings == null) {
+ log.debug("getServiceSubstitutionMappingsTypeName - No Substitution Mappings defined");
+ return null;
+ }
+
+ NodeType nodeType = substitutionMappings.getNodeDefinition();
+ if (nodeType == null) {
+ log.debug("getServiceSubstitutionMappingsTypeName - No Substitution Mappings node defined");
+ return null;
+ }
+
+ return nodeType.getType();
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public Metadata getServiceMetadata() {
+ return toscaTemplate.getMetaData();
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public Map<String, Object> getServiceMetadataProperties() {
+ if (toscaTemplate.getMetaData() == null){
+ return null;
+ }
+ return new HashMap<>(toscaTemplate.getMetaData().getAllProperties());
+ }
+
+ @Override
+ public Map<String, String> getServiceMetadataAllProperties() {
+ if (toscaTemplate.getMetaData() == null){
+ return null;
+ }
+ return toscaTemplate.getMetaData().getAllProperties();
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public List<Input> getServiceInputs() {
+ return toscaTemplate.getInputs();
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public String getGroupPropertyLeafValue(Group group, String leafValuePath) {
+ if (group == null) {
+ log.error("getGroupPropertyLeafValue - group is null");
+ return null;
+ }
+
+ if (GeneralUtility.isEmptyString(leafValuePath)) {
+ log.error("getGroupPropertyLeafValue - leafValuePath is null or empty");
+ return null;
+ }
+
+ String[] split = getSplittedPath(leafValuePath);
+ LinkedHashMap<String, Property> properties = group.getProperties();
+ Object property = processProperties(split, properties);
+ return property == null || property instanceof Function? null : String.valueOf(property);
+ }
+
+ @Override
+ public Object getGroupPropertyAsObject(Group group, String leafValuePath) {
+ if (group == null) {
+ log.error("getGroupPropertyAsObject - group is null");
+ return null;
+ }
+
+ if (GeneralUtility.isEmptyString(leafValuePath)) {
+ log.error("getGroupPropertyAsObject - leafValuePath is null or empty");
+ return null;
+ }
+
+ String[] split = getSplittedPath(leafValuePath);
+ LinkedHashMap<String, Property> properties = group.getProperties();
+ return processProperties(split, properties);
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public List<NodeTemplate> getCpListByVf(String vfCustomizationId) {
+ List<NodeTemplate> cpList = new ArrayList<>();
+ if (GeneralUtility.isEmptyString(vfCustomizationId)) {
+ log.error("getCpListByVf vfCustomizationId string is empty");
+ return cpList;
+ }
+
+ List<NodeTemplate> serviceVfList = getServiceVfList();
+ if (serviceVfList == null || serviceVfList.size() == 0) {
+ log.error("getCpListByVf Vfs not exist for vfCustomizationId {}", vfCustomizationId);
+ return cpList;
+ }
+ NodeTemplate vfInstance = getNodeTemplateByCustomizationUuid(serviceVfList, vfCustomizationId);
+ if (vfInstance == null) {
+ log.debug("getCpListByVf vf list is null");
+ return cpList;
+ }
+ cpList = getNodeTemplateBySdcType(vfInstance, SdcTypes.CP);
+ if (cpList == null || cpList.size() == 0)
+ log.debug("getCpListByVf cps not exist for vfCustomizationId {}", vfCustomizationId);
+ return cpList;
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public List<NodeTemplate> getMembersOfVfModule(NodeTemplate vf, Group serviceLevelVfModule) {
+ if (vf == null) {
+ log.error("getMembersOfVfModule - vf is null");
+ return new ArrayList<>();
+ }
+
+ if (serviceLevelVfModule == null || serviceLevelVfModule.getMetadata() == null || serviceLevelVfModule.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID) == null) {
+ log.error("getMembersOfVfModule - vfModule or its metadata is null. Cannot match a VF group based on invariantUuid from missing metadata.");
+ return new ArrayList<>();
+ }
+
+
+ SubstitutionMappings substitutionMappings = vf.getSubMappingToscaTemplate();
+ if (substitutionMappings != null) {
+ List<Group> groups = substitutionMappings.getGroups();
+ if (groups != null) {
+ Optional<Group> findFirst = groups
+ .stream()
+ .filter(x -> (x.getMetadata() != null && serviceLevelVfModule.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID).equals(x.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID)))).findFirst();
+ if (findFirst.isPresent()) {
+ List<String> members = findFirst.get().getMembers();
+ if (members != null) {
+ List<NodeTemplate> collect = substitutionMappings.getNodeTemplates().stream().filter(x -> members.contains(x.getName())).collect(Collectors.toList());
+ return collect;
+ }
+ }
+ }
+ }
+ return new ArrayList<>();
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ @SuppressWarnings("unchecked")
+ public List<Pair<NodeTemplate, NodeTemplate>> getNodeTemplatePairsByReqName(
+ List<NodeTemplate> listOfReqNodeTemplates, List<NodeTemplate> listOfCapNodeTemplates, String reqName) {
+
+ if (listOfReqNodeTemplates == null) {
+ log.error("getNodeTemplatePairsByReqName - listOfReqNodeTemplates is null");
+ return new ArrayList<>();
+ }
+
+ if (listOfCapNodeTemplates == null) {
+ log.error("getNodeTemplatePairsByReqName - listOfCapNodeTemplates is null");
+ return new ArrayList<>();
+ }
+
+ if (GeneralUtility.isEmptyString(reqName)) {
+ log.error("getNodeTemplatePairsByReqName - reqName is null or empty");
+ return new ArrayList<>();
+ }
+
+ List<Pair<NodeTemplate, NodeTemplate>> pairsList = new ArrayList<>();
+
+ for (NodeTemplate reqNodeTemplate : listOfReqNodeTemplates) {
+ List<RequirementAssignment> requirements = reqNodeTemplate.getRequirements().getRequirementsByName(reqName).getAll();
+ for (RequirementAssignment reqEntry : requirements) {
+ String node = reqEntry.getNodeTemplateName();
+ if (node != null) {
+ Optional<NodeTemplate> findFirst = listOfCapNodeTemplates.stream().filter(x -> x.getName().equals(node)).findFirst();
+ if (findFirst.isPresent()) {
+ pairsList.add(new ImmutablePair<NodeTemplate, NodeTemplate>(reqNodeTemplate, findFirst.get()));
+ }
+ }
+ }
+ }
+
+ return pairsList;
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ //TODO constant strings
+ public List<NodeTemplate> getAllottedResources() {
+ List<NodeTemplate> nodeTemplates = null;
+ nodeTemplates = toscaTemplate.getTopologyTemplate().getNodeTemplates();
+ if (nodeTemplates.isEmpty()) {
+ log.error("getAllottedResources nodeTemplates not exist");
+ }
+ nodeTemplates = nodeTemplates.stream().filter(
+ x -> x.getMetaData() != null && x.getMetaData().getValue("category").equals("Allotted Resource"))
+ .collect(Collectors.toList());
+ if (nodeTemplates.isEmpty()) {
+ log.debug("getAllottedResources - allotted resources not exist");
+ } else {
+ }
+
+ return nodeTemplates;
+ }
+
+ @Override
+ //Sunny flow - covered with UT
+ public String getTypeOfNodeTemplate(NodeTemplate nodeTemplate) {
+ if (nodeTemplate == null) {
+
+ log.error("getTypeOfNodeTemplate nodeTemplate is null");
+ return null;
+ }
+ return nodeTemplate.getTypeDefinition().getType();
+ }
+
+ /**
+ * This methdd is returning the csarConformanceLevel for input CSAR
+ * When csarConformanceLevel is configured with failOnError as False in Error Configuration; it
+ * assigns the default value to csarConformanceLevel which is the max level provided in
+ * Configuration file
+ * @return csarConformanceLevel
+ */
+ @Override
+ public String getConformanceLevel() {
+ LinkedHashMap<String, Object> csarMeta = toscaTemplate.getMetaProperties("csar.meta");
+ if (csarMeta == null){
+ log.warn("No csar.meta file is found in CSAR - this file should hold the conformance level of the CSAR. This might be OK for older CSARs.");
+ if (configurationManager != null && !configurationManager.getErrorConfiguration()
+ .getErrorInfo("CONFORMANCE_LEVEL_ERROR").getFailOnError()){
+ String csarConLevel = configurationManager.getConfiguration().getConformanceLevel().getMaxVersion();
+ log.warn("csarConformanceLevel is not found in input csar; defaulting to max version {}" , csarConLevel);
+ return csarConLevel;
+ }
+ else {
+ log.warn("csarConformanceLevel is not found in input csar; returning null as no defaults defined in error configuration");
+ return null;
+ }
+ }
+
+ Object conformanceLevel = csarMeta.get("SDC-TOSCA-Definitions-Version");
+ if (conformanceLevel != null){
+ String confLevelStr = conformanceLevel.toString();
+ log.debug("CSAR conformance level is {}", confLevelStr);
+ return confLevelStr;
+ } else {
+ log.error("Invalid csar.meta file - no entry found for SDC-TOSCA-Definitions-Version key. This entry should hold the conformance level.");
+ return null;
+ }
+ }
+
+
+ @Override
+ public String getNodeTemplateCustomizationUuid(NodeTemplate nt) {
+ String res = null;
+ if (nt != null && nt.getMetaData() != null){
+ res = nt.getMetaData().getValue(CUSTOMIZATION_UUID);
+ } else {
+ log.error("Node template or its metadata is null");
+ }
+ return res;
+ }
+
+ public List<NodeTemplate> getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType) {
+ return getNodeTemplateBySdcType(parentNodeTemplate, sdcType, false);
+ }
+
+ private List<NodeTemplate> getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType, boolean isVNF) {
+
+ if (parentNodeTemplate == null) {
+ log.error("getNodeTemplateBySdcType - nodeTemplate is null or empty");
+ return new ArrayList<>();
+ }
+
+ if (sdcType == null) {
+ log.error("getNodeTemplateBySdcType - sdcType is null or empty");
+ return new ArrayList<>();
+ }
+
+ SubstitutionMappings substitutionMappings = parentNodeTemplate.getSubMappingToscaTemplate();
+
+ if (substitutionMappings != null) {
+ List<NodeTemplate> nodeTemplates = substitutionMappings.getNodeTemplates();
+ if (nodeTemplates != null && nodeTemplates.size() > 0) {
+ if (sdcType.equals(SdcTypes.VFC) && isVNF) {
+ return nodeTemplates.stream()
+ .filter(x -> (x.getMetaData() != null &&
+ sdcType.getValue().equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE))) && isVNFType(x))
+ .collect(Collectors.toList());
+ }
+ else {
+ return nodeTemplates.stream()
+ .filter(x -> (x.getMetaData() != null &&
+ sdcType.getValue().equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE))) && !isVNFType(x))
+ .collect(Collectors.toList());
+ }
+ }
+ else {
+ log.debug("getNodeTemplateBySdcType - SubstitutionMappings' node Templates not exist");
+ }
+ } else
+ log.debug("getNodeTemplateBySdcType - SubstitutionMappings not exist");
+
+ return new ArrayList<>();
+ }
+
+ public Map<String, String> filterNodeTemplatePropertiesByValue(NodeTemplate nodeTemplate, FilterType filterType, String pattern) {
+ Map<String, String> filterMap = new HashMap<>();
+
+ if (nodeTemplate == null) {
+ log.error("filterNodeTemplatePropertiesByValue nodeTemplate is null");
+ return filterMap;
+ }
+
+ if (filterType == null) {
+ log.error("filterNodeTemplatePropertiesByValue filterType is null");
+ return filterMap;
+ }
+
+ if (GeneralUtility.isEmptyString(pattern)) {
+ log.error("filterNodeTemplatePropertiesByValue pattern string is empty");
+ return filterMap;
+ }
+
+ Map<String, Property> ntProperties = nodeTemplate.getProperties();
+
+ if (ntProperties != null && ntProperties.size() > 0) {
+
+ for (Property current : ntProperties.values()) {
+ filterProperties(current.getValue(), current.getName(), filterType, pattern, filterMap);
+ }
+ }
+
+ log.trace("filterNodeTemplatePropertiesByValue - filterMap value: {}", filterMap);
+
+ return filterMap;
+ }
+
+ public NodeTemplate getVnfConfig(String vfCustomizationUuid) {
+
+ if (GeneralUtility.isEmptyString(vfCustomizationUuid)) {
+ log.error("getVnfConfig - vfCustomizationId - is null or empty");
+ return null;
+ }
+
+ List<NodeTemplate> serviceVfList = getServiceVfList();
+ NodeTemplate vfInstance = getNodeTemplateByCustomizationUuid(serviceVfList, vfCustomizationUuid);
+ NodeTemplate vnfConfig = getNodeTemplateBySdcType(vfInstance, SdcTypes.VFC, true).stream().findAny().orElse(null);
+ return vnfConfig;
+ }
+
+ @Override
+ public boolean hasTopology(NodeTemplate nodeTemplate) {
+ if (nodeTemplate == null) {
+ log.error("hasTopology - nodeTemplate - is null");
+ return false;
+ }
+
+ if (nodeTemplate.getMetaData() != null) {
+ String type = nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE);
+ log.debug("hasTopology - node template {} is a {} type", nodeTemplate.getName(), type);
+ return SdcTypes.isComplex(type);
+ }
+
+ return false;
+ }
+
+ @Override
+ public List<NodeTemplate> getNodeTemplateChildren(NodeTemplate nodeTemplate) {
+ if (nodeTemplate == null) {
+ log.error("getNodeTemplateChildren - nodeTemplate - is null");
+ return new ArrayList<>();
+ }
+
+ SubstitutionMappings substitutionMappings = nodeTemplate.getSubMappingToscaTemplate();
+ if (substitutionMappings != null) {
+ List<NodeTemplate> nodeTemplates = substitutionMappings.getNodeTemplates();
+ if (nodeTemplates != null && nodeTemplates.size() > 0) {
+
+ return nodeTemplates.stream()
+ .filter(x -> !isVNFType(x))
+ .collect(Collectors.toList());
+ }
+ else {
+ log.debug("getNodeTemplateChildren - SubstitutionMappings' node Templates not exist");
+ }
+ } else
+ log.debug("getNodeTemplateChildren - SubstitutionMappings not exist");
+
+ return new ArrayList<>();
+ }
+
+ @Override
+ public NodeTemplate getServiceNodeTemplateByNodeName(String nodeName) {
+ if (GeneralUtility.isEmptyString(nodeName)) {
+ log.error("getServiceNodeTemplateByNodeName - nodeName - is null or empty");
+ return null;
+ }
+
+ List<NodeTemplate> nodeTemplates = getServiceNodeTemplates();
+ Optional<NodeTemplate> findFirst = nodeTemplates.stream().filter(nt -> nt.getName().equals(nodeName)).findFirst();
+
+ return findFirst.isPresent() ? findFirst.get() : null;
+ }
+
+ @Override
+ public Metadata getNodeTemplateMetadata(NodeTemplate nt) {
+ if (nt == null) {
+ log.error("getNodeTemplateMetadata - nt (node template) - is null");
+ return null;
+ }
+
+ return nt.getMetaData();
+ }
+
+ @Override
+ public CapabilityAssignments getCapabilitiesOf(NodeTemplate nt) {
+ if (nt == null) {
+ log.error("getCapabilitiesOf - nt (node template) - is null");
+ return null;
+ }
+
+ return nt.getCapabilities();
+ }
+
+ @Override
+ public RequirementAssignments getRequirementsOf(NodeTemplate nt) {
+ if (nt == null) {
+ log.error("getRequirementsOf - nt (node template) - is null");
+ return null;
+ }
+
+ return nt.getRequirements();
+ }
+
+ @Override
+ public String getCapabilityPropertyLeafValue(CapabilityAssignment capability, String pathToPropertyLeafValue) {
+ if (capability == null) {
+ log.error("getCapabilityPropertyLeafValue - capability is null");
+ return null;
+ }
+
+ if (GeneralUtility.isEmptyString(pathToPropertyLeafValue)) {
+ log.error("getCapabilityPropertyLeafValue - pathToPropertyLeafValue is null or empty");
+ return null;
+ }
+
+ String[] split = getSplittedPath(pathToPropertyLeafValue);
+ LinkedHashMap<String, Property> properties = capability.getProperties();
+ Object property = processProperties(split, properties);
+ return property == null || property instanceof Function ? null : String.valueOf(property);
+ }
+
+ /************************************* helper functions ***********************************/
+ private boolean isVNFType(NodeTemplate nt) {
+ return nt.getType().endsWith("VnfConfiguration");
+ }
+
+ @SuppressWarnings("unchecked")
+ private Map<String, String> filterProperties(Object property, String path, FilterType filterType, String pattern, Map<String, String> filterMap) {
+
+ if (property instanceof Map) {
+ for (Map.Entry<String, Object> item: ((Map<String, Object>) property).entrySet()) {
+ String itemPath = path + PATH_DELIMITER + item.getKey();
+ filterProperties(item.getValue(), itemPath, filterType, pattern, filterMap);
+ }
+ } else if (property instanceof List) {
+ for (Object item: (List<Object>)property) {
+ filterProperties(item, path, filterType, pattern, filterMap);
+ }
+ } else {
+ if (filterType.isMatch(property.toString(), pattern)) {
+ filterMap.put(path, property.toString());
+ }
+ }
+
+ return filterMap;
+ }
+
+ public List<NodeTemplate> getServiceNodeTemplateBySdcType(SdcTypes sdcType) {
+ if (sdcType == null) {
+ log.error("getServiceNodeTemplateBySdcType - sdcType is null or empty");
+ return new ArrayList<>();
+ }
+
+ TopologyTemplate topologyTemplate = toscaTemplate.getTopologyTemplate();
+ return getNodeTemplateBySdcType(topologyTemplate, sdcType);
+ }
+
+
+ /************************************* helper functions ***********************************/
+ private List<NodeTemplate> getNodeTemplateBySdcType(TopologyTemplate topologyTemplate, SdcTypes sdcType) {
+ if (sdcType == null) {
+ log.error("getNodeTemplateBySdcType - sdcType is null or empty");
+ return new ArrayList<>();
+ }
+
+ if (topologyTemplate == null) {
+ log.error("getNodeTemplateBySdcType - topologyTemplate is null");
+ return new ArrayList<>();
+ }
+
+ List<NodeTemplate> nodeTemplates = topologyTemplate.getNodeTemplates();
+
+ if (nodeTemplates != null && nodeTemplates.size() > 0)
+ return nodeTemplates.stream().filter(x -> (x.getMetaData() != null && sdcType.getValue().equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)))).collect(Collectors.toList());
+
+ log.debug("getNodeTemplateBySdcType - topologyTemplate's nodeTemplates not exist");
+ return new ArrayList<>();
+ }
+
+ //Assumed to be unique property for the list
+ private NodeTemplate getNodeTemplateByCustomizationUuid(List<NodeTemplate> nodeTemplates, String customizationId) {
+ if (customizationId != null) {
+ Optional<NodeTemplate> findFirst = nodeTemplates.stream().filter(x -> (x.getMetaData() != null && customizationId.equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)))).findFirst();
+ return findFirst.isPresent() ? findFirst.get() : null;
+ }
+ else {
+ log.error("getNodeTemplateByCustomizationUuid - customizationId is null");
+ return null;
+ }
+ }
+
+ private Object processProperties(String[] split, LinkedHashMap<String, Property> properties) {
+ Optional<Entry<String, Property>> findFirst = properties.entrySet().stream().filter(x -> x.getKey().equals(split[0])).findFirst();
+ if (findFirst.isPresent()) {
+ Property property = findFirst.get().getValue();
+ Object current = property.getValue();
+ return iterateProcessPath(1, current, split);
+ }
+ String propName = (split != null && split.length > 0 ? split[0] : null);
+ log.error("processProperties - property {} not found", propName);
+ return null;
+ }
+
+
+
+
+
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/impl/SdcPropertyNames.java b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcPropertyNames.java
new file mode 100644
index 0000000..7235593
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcPropertyNames.java
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * sdc-distribution-client
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdc.tosca.parser.impl;
+
+public class SdcPropertyNames {
+ public static String PROPERTY_NAME_INVARIANTUUID = "invariantUUID";
+ public static String PROPERTY_NAME_UUID = "UUID";
+ public static String PROPERTY_NAME_CUSTOMIZATIONUUID = "customizationUUID";
+ public static String PROPERTY_NAME_VERSION = "version";
+
+ //Groups metadata
+ public static String PROPERTY_NAME_VFMODULEMODELINVARIANTUUID = "vfModuleModelInvariantUUID";
+ public static String PROPERTY_NAME_VFMODULEMODELUUID = "vfModuleModelUUID";
+ public static String PROPERTY_NAME_VFMODULECUSTOMIZATIONUUID = "vfModuleCustomizationUUID";
+ public static String PROPERTY_NAME_VFMODULEMODELVERSION = "vfModuleModelVersion";
+ public static String PROPERTY_NAME_VFMODULEMODELNAME = "vfModuleModelName";
+
+ //Groups properties
+ public static String PROPERTY_NAME_VFMODULETYPE = "vf_module_type";
+ public static String PROPERTY_NAME_VFMODULELABEL = "vf_module_label";
+ public static String PROPERTY_NAME_MINVFMODULEINSTANCES = "min_vf_module_instances";
+ public static String PROPERTY_NAME_MAXVFMODULEINSTANCES = "max_vf_module_instances";
+ public static String PROPERTY_NAME_INITIALCOUNT = "initial_count";
+
+
+ public static String PROPERTY_NAME_DESCRIPTION = "description";
+ public static String PROPERTY_NAME_TYPE = "type";
+ public static String PROPERTY_NAME_CATEGORY = "category";
+ public static String PROPERTY_NAME_SUBCATEGORY = "subcategory";
+ public static String PROPERTY_NAME_RESOURCEVENDOR = "resourceVendor";
+ public static String PROPERTY_NAME_RESOURCEVENDORRELEASE = "resourceVendorRelease";
+ //VFC
+ public static String PROPERTY_NAME_NFCCODE = "nfc_code";
+ public static String PROPERTY_NAME_VMTYPETAG = "vm_type_tag";
+ public static String PROPERTY_NAME_VMTYPE = "vm_type";
+ public static String PROPERTY_NAME_VFCNAMING_ECOMPGENERATEDNAMING="vfc_naming#ecomp_generated_naming";
+ public static String PROPERTY_NAME_VFCNAMING_NAMINGPOLICY="vfc_naming#naming_policy";
+ //VF
+ public static String PROPERTY_NAME_NFTYPE = "nf_type";
+ public static String PROPERTY_NAME_NFROLE = "nf_role";
+ public static String PROPERTY_NAME_NFFUNCTION = "nf_function";
+ public static String PROPERTY_NAME_NFCODE = "nf_code";
+ public static String PROPERTY_NAME_MININSTANCES = "min_instances";
+ public static String PROPERTY_NAME_MAXINSTANCES = "max_instances";
+ public static String PROPERTY_NAME_AVAILABILITYZONEMAXCOUNT = "availability_zone_max_count";
+ public static String PROPERTY_NAME_AVAILABILITYZONECOUNT = "availability_zone_count";
+ public static String PROPERTY_NAME_NAME = "name";
+ public static String PROPERTY_NAME_VNFECOMPNAMING_ECOMPGENERATEDNAMING="vnf_ecomp_naming#ecomp_generated_naming";
+ public static String PROPERTY_NAME_VNFECOMPNAMING_NAMINGPOLICY="vnf_ecomp_naming#naming_policy";
+ public static String PROPERTY_NAME_ECOMPGENERATEDVMASSIGNMENTS = "ecomp_generated_vm_assignments";
+ //Service
+ public static String PROPERTY_NAME_SERVICENAMING_DEFAULT_ECOMPGENERATEDNAMING="service_naming#default#ecomp_generated_naming";
+ public static String PROPERTY_NAME_SERVICENAMING_DEFAULT_NAMINGPOLICY="service_naming#default#naming_policy";
+ //VL
+ public static String PROPERTY_NAME_NETWORKTYPE="network_type";
+ public static String PROPERTY_NAME_NETWORKROLE="network_role";
+ public static String PROPERTY_NAME_NETWORKROLETAG="network_role_tag";
+ public static String PROPERTY_NAME_NETWORKTECHNOLOGY="network_technology";
+ public static String PROPERTY_NAME_NETWORKSCOPE="network_scope";
+ public static String PROPERTY_NAME_NETWORKECOMPNAMING_ECOMPGENERATEDNAMING="network_ecomp_naming#ecomp_generated_naming";
+ public static String PROPERTY_NAME_NETWORKECOMPNAMING_NAMINGPOLICY="network_ecomp_naming#naming_policy";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_ISSHAREDNETWORK="network_assignments#is_shared_network";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_ISEXTERNALNETWORK="network_assignments#is_external_network";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV4SUBNETDEFAULTASSIGNMENTS_ECOMPGENERATEDNETWORKASSIGNMENT="network_assignments#ecomp_generated_network_assignment";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV4SUBNETDEFAULTASSIGNMENTS_USEIPV4="network_assignments#ipv4_subnet_default_assignments#use_ipv4";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV4SUBNETDEFAULTASSIGNMENTS_IPNETWORKADDRESSPLAN="network_assignments#ipv4_subnet_default_assignments#ip_network_address_plan";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV4SUBNETDEFAULTASSIGNMENTS_DHCPENABLED="network_assignments#ipv4_subnet_default_assignments#dhcp_enabled";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV4SUBNETDEFAULTASSIGNMENTS_IPVERSION="network_assignments#ipv4_subnet_default_assignments#ip_version";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV4SUBNETDEFAULTASSIGNMENTS_CIDRMASK="network_assignments#ipv4_subnet_default_assignments#cidr_mask";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV4SUBNETDEFAULTASSIGNMENTS_MINSUBNETSCOUNT="network_assignments#ipv4_subnet_default_assignments#min_subnets_count";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV6SUBNETDEFAULTASSIGNMENTS_USEIPV6="network_assignments#ipv6_subnet_default_assignments#use_ipv6";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV6SUBNETDEFAULTASSIGNMENTS_IPNETWORKADDRESSPLAN="network_assignments#ipv6_subnet_default_assignments#ip_network_address_plan";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV6SUBNETDEFAULTASSIGNMENTS_DHCPENABLED="network_assignments#ipv6_subnet_default_assignments#dhcp_enabled";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV6SUBNETDEFAULTASSIGNMENTS_IPVERSION="network_assignments#ipv6_subnet_default_assignments#ip_version";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV6SUBNETDEFAULTASSIGNMENTS_CIDRMASK="network_assignments#ipv6_subnet_default_assignments#cidr_mask";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_IPV6SUBNETDEFAULTASSIGNMENTS_MINSUBNETSCOUNT="network_assignments#ipv6_subnet_default_assignments#min_subnets_count";
+
+ /*public static String PROPERTY_NAME_NETWORKASSIGNMENTS_PROVIDERNETWORK_ISPROVIDERNETWORK="network_assignments#provider_network#is_provider_network";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_PROVIDERNETWORK_PHYSICALNETWORKNAME="network_assignments#provider_network#physical_network_name";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_PROVIDERNETWORK_NUMA="network_assignments#provider_network#numa";
+ public static String PROPERTY_NAME_NETWORKASSIGNMENTS_PROVIDERNETWORK_PNICINSTANCE="network_assignments#provider_network#pnic_instance";
+ */
+
+ public static String PROPERTY_NAME_PROVIDERNETWORK_ISPROVIDERNETWORK="provider_network#is_provider_network";
+ public static String PROPERTY_NAME_PROVIDERNETWORK_PHYSICALNETWORKNAME="provider_network#physical_network_name";
+ public static String PROPERTY_NAME_PROVIDERNETWORK_NUMA="provider_network#numa";
+ public static String PROPERTY_NAME_PROVIDERNETWORK_PNICINSTANCE="provider_network#pnic_instance";
+
+ public static String PROPERTY_NAME_NETWORKFLOWS_ISBOUNDTOVPN="network_flows#is_bound_to_vpn";
+ public static String PROPERTY_NAME_NETWORKFLOWS_VPNBINDING="network_flows#vpn_binding";
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/impl/SdcToscaParserFactory.java b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcToscaParserFactory.java
new file mode 100644
index 0000000..bc8d1b1
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcToscaParserFactory.java
@@ -0,0 +1,203 @@
+package org.onap.sdc.tosca.parser.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.sdc.tosca.parser.api.ConformanceLevel;
+import org.onap.sdc.tosca.parser.config.ConfigurationManager;
+import org.onap.sdc.tosca.parser.config.ErrorInfo;
+import org.onap.sdc.tosca.parser.config.JToscaValidationIssueInfo;
+import org.onap.sdc.tosca.parser.config.SdcToscaParserErrors;
+import org.onap.sdc.tosca.parser.utils.GeneralUtility;
+import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
+import org.onap.sdc.tosca.parser.config.*;
+import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
+import org.onap.sdc.toscaparser.api.ToscaTemplate;
+import org.onap.sdc.toscaparser.api.common.JToscaValidationIssue;
+import org.onap.sdc.toscaparser.api.common.JToscaException;
+import org.onap.sdc.toscaparser.api.utils.JToscaErrorCodes;
+import org.onap.sdc.toscaparser.api.utils.ThreadLocalsHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SdcToscaParserFactory {
+ private static Logger log = LoggerFactory.getLogger(SdcToscaParserFactory.class.getName());
+
+ private static ConfigurationManager configurationManager;
+ private static volatile SdcToscaParserFactory instance;
+ private List<JToscaValidationIssue> criticalExceptions = new ArrayList<>();
+ private List<JToscaValidationIssue> warningExceptions = new ArrayList<>();
+ private List<JToscaValidationIssue> notAnalyzadExceptions = new ArrayList<>();
+ private SdcToscaParserFactory() {}
+
+ /**
+ * Get an SdcToscaParserFactory instance.
+ * @return SdcToscaParserFactory instance.
+ */
+ public static SdcToscaParserFactory getInstance() {
+ if (instance == null) {
+ synchronized (SdcToscaParserFactory.class) {
+ if (instance == null) {
+ instance = new SdcToscaParserFactory();
+ configurationManager = ConfigurationManager.getInstance();
+ }
+ }
+ }
+ return instance;
+ }
+
+ public static void setConfigurationManager(ConfigurationManager configurationManager) {
+ SdcToscaParserFactory.configurationManager = configurationManager;
+ }
+
+ /**
+ * Get an ISdcCsarHelper object for this CSAR file.
+ *
+ * @param csarPath - the absolute path to CSAR file.
+ * @return ISdcCsarHelper object.
+ * @throws SdcToscaParserException - in case the path or CSAR are invalid.
+ */
+ public ISdcCsarHelper getSdcCsarHelper(String csarPath) throws SdcToscaParserException {
+ return init(csarPath, true);
+ }
+
+ /**
+ * Get an ISdcCsarHelper object for this CSAR file.
+ *
+ * @param csarPath - the absolute path to CSAR file.
+ * @param resolveGetInput - resolve get_input properties
+ * @return ISdcCsarHelper object.
+ * @throws SdcToscaParserException - in case the path or CSAR are invalid.
+ */
+ public ISdcCsarHelper getSdcCsarHelper(String csarPath, boolean resolveGetInput) throws SdcToscaParserException {
+ return init(csarPath, resolveGetInput);
+ }
+
+ private ISdcCsarHelper init(String csarPath, boolean resolveGetInput) throws SdcToscaParserException {
+ synchronized (SdcToscaParserFactory.class) {
+ ToscaTemplate tosca = null;
+ try {
+ tosca = new ToscaTemplate(csarPath, null, true, null, resolveGetInput);
+ } catch (JToscaException e) {
+ throwSdcToscaParserException(e);
+ }
+ SdcCsarHelperImpl sdcCsarHelperImpl = new SdcCsarHelperImpl(tosca, configurationManager);
+ String cSarConformanceLevel = sdcCsarHelperImpl.getConformanceLevel();
+ validateCsarVersion(cSarConformanceLevel);
+ try {
+ handleErrorsByTypes(csarPath, cSarConformanceLevel);
+ } catch (JToscaException e) {
+ throwSdcToscaParserException(e);
+ }
+ return sdcCsarHelperImpl;
+ }
+ }
+
+ private void handleErrorsByTypes(String csarPath, String cSarConformanceLevel) throws JToscaException {
+ clearValidationIssuesLists();
+ for(JToscaValidationIssue toscaValidationIssue : ThreadLocalsHolder.getCollector().getValidationIssues().values()){
+ List<JToscaValidationIssueInfo> issueInfos = configurationManager.getJtoscaValidationIssueConfiguration().getValidationIssues().get(toscaValidationIssue.getCode());
+ if(issueInfos != null && !issueInfos.isEmpty()){
+ JToscaValidationIssueInfo issueInfo = null;
+ issueInfo = issueInfos.stream()
+ .filter(i-> isMatchConformanceLevel(cSarConformanceLevel,i.getSinceCsarConformanceLevel()))
+ .max((i1,i2) -> GeneralUtility.conformanceLevelCompare(i1.getSinceCsarConformanceLevel(), i2.getSinceCsarConformanceLevel()) )
+ .orElse(null);
+
+ if(issueInfo != null){
+ switch (JToscaValidationIssueType.valueOf(issueInfo.getIssueType())) {
+ case CRITICAL:
+ criticalExceptions.add(toscaValidationIssue);
+ break;
+ case WARNING:
+ warningExceptions.add(toscaValidationIssue);
+ break;
+ default:
+ break;
+ }
+ }else{
+ notAnalyzadExceptions.add(toscaValidationIssue);
+ }
+ }else{//notAnalyzed
+ notAnalyzadExceptions.add(toscaValidationIssue);
+ }
+ }
+ logErrors(csarPath);
+ }
+
+ private void clearValidationIssuesLists(){
+ notAnalyzadExceptions.clear();
+ criticalExceptions.clear();
+ warningExceptions.clear();
+ }
+
+ private void logErrors(String inputPath) throws JToscaException{
+ //Warnings
+ int warningsCount = warningExceptions.size();
+ if (warningsCount > 0) {
+ log.warn("####################################################################################################");
+ log.warn("CSAR Warnings found! CSAR name - {}", inputPath);
+ log.warn("ToscaTemplate - verifyTemplate - {} Parsing Warning{} occurred...", warningsCount, (warningsCount > 1 ? "s" : ""));
+ for (JToscaValidationIssue info : warningExceptions) {
+ log.warn("JTosca Exception [{}]: {}. CSAR name - {}", info.getCode(),info.getMessage(), inputPath);
+ }
+ log.warn("####################################################################################################");
+ }
+ //Criticals
+ int criticalsCount = criticalExceptions.size();
+ if (criticalsCount > 0) {
+ log.error("####################################################################################################");
+ log.error("ToscaTemplate - verifyTemplate - {} Parsing Critical{} occurred...", criticalsCount, (criticalsCount > 1 ? "s" : ""));
+ for (JToscaValidationIssue info : criticalExceptions) {
+ log.error("JTosca Exception [{}]: {}. CSAR name - {}", info.getCode(),info.getMessage(), inputPath);
+ }
+ throw new JToscaException(String.format("CSAR Validation Failed. CSAR name - {}. Please check logs for details.", inputPath), JToscaErrorCodes.CSAR_TOSCA_VALIDATION_ERROR.getValue());
+ }
+ }
+ public List<JToscaValidationIssue> getCriticalExceptions() {
+ return criticalExceptions;
+ }
+
+ public List<JToscaValidationIssue> getWarningExceptions() {
+ return warningExceptions;
+ }
+
+ public List<JToscaValidationIssue> getNotAnalyzadExceptions() {
+ return notAnalyzadExceptions;
+ }
+
+
+ private void validateCsarVersion(String cSarVersion) throws SdcToscaParserException {
+ ConformanceLevel level = configurationManager.getConfiguration().getConformanceLevel();
+ String minVersion = level.getMinVersion();
+ String maxVersion = level.getMaxVersion();
+ if (cSarVersion != null) {
+ if ((GeneralUtility.conformanceLevelCompare(cSarVersion, minVersion) < 0) || (GeneralUtility.conformanceLevelCompare(cSarVersion, maxVersion) > 0)) {
+ throwConformanceLevelException(minVersion, maxVersion);
+ }
+ } else {
+ throwConformanceLevelException(minVersion, maxVersion);
+ }
+ }
+
+ private boolean isMatchConformanceLevel(String ValidationIssueVersion, String cSarVersion){
+ if (ValidationIssueVersion != null && cSarVersion != null) {
+ if ((GeneralUtility.conformanceLevelCompare(ValidationIssueVersion, cSarVersion) >= 0)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ private void throwConformanceLevelException(String minVersion, String maxVersion) throws SdcToscaParserException {
+ ErrorInfo errorInfo = configurationManager.getErrorConfiguration().getErrorInfo(SdcToscaParserErrors.CONFORMANCE_LEVEL_ERROR.toString());
+ throw new SdcToscaParserException(String.format(errorInfo.getMessage(), minVersion, maxVersion), errorInfo.getCode());
+ }
+
+ private void throwSdcToscaParserException(JToscaException e) throws SdcToscaParserException {
+ ErrorInfo errorInfo = configurationManager.getErrorConfiguration().getErrorInfo(SdcToscaParserErrors.getSdcErrorByJToscaError(JToscaErrorCodes.getByCode(e.getCode())).toString());
+ throw new SdcToscaParserException(errorInfo.getMessage(), errorInfo.getCode());
+ }
+
+
+
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/sdc/tosca/parser/impl/SdcTypes.java b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcTypes.java
new file mode 100644
index 0000000..9daf0ef
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcTypes.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * sdc-distribution-client
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdc.tosca.parser.impl;
+
+import java.util.Arrays;
+import java.util.List;
+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");
+
+ private String value;
+
+ private static List<String> complexTypes = Arrays.asList(VF, PNF, CR, SERVICE, CVFC).stream().map(SdcTypes::getValue).collect(Collectors.toList());
+
+ private SdcTypes(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static boolean isComplex(String sdcType) {
+ return complexTypes.contains(sdcType);
+ }
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/utils/GeneralUtility.java b/src/main/java/org/onap/sdc/tosca/parser/utils/GeneralUtility.java
new file mode 100644
index 0000000..cddccd3
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/utils/GeneralUtility.java
@@ -0,0 +1,53 @@
+package org.onap.sdc.tosca.parser.utils;
+
+import java.util.Arrays;
+
+public class GeneralUtility {
+
+ public static boolean isEmptyString(String str) {
+ return str == null || str.trim().isEmpty();
+ }
+
+
+ /**
+ * Compares two version strings.
+ * <p>
+ * Use this instead of String.compareTo() for a non-lexicographical
+ * comparison that works for version strings. e.g. "1.10".compareTo("1.6").
+ *
+ * @param str1 a string of ordinal numbers separated by decimal points.
+ * @param str2 a string of ordinal numbers separated by decimal points.
+ * @return The result is a negative integer if str1 is _numerically_ less than str2.
+ * The result is a positive integer if str1 is _numerically_ greater than str2.
+ * The result is zero if the strings are _numerically_ equal.
+ * It does not work if "1.10" is supposed to be equal to "1.10.0".
+ */
+ public static int conformanceLevelCompare(String str1, String str2) {
+ String[] vals1 = str1.split("\\.");
+ String[] vals2 = str2.split("\\.");
+ int i = 0;
+ // set index to first non-equal ordinal or length of shortest version string
+ while (i < vals1.length && i < vals2.length && vals1[i].equals(vals2[i])) {
+ i++;
+ }
+ // compare first non-equal ordinal number
+ if (i < vals1.length && i < vals2.length) {
+ int diff = Integer.valueOf(vals1[i]).compareTo(Integer.valueOf(vals2[i]));
+ return Integer.signum(diff);
+ }
+ //in case of 0 after the . e.g: "3" = "3.0" or "3.0.0.0" = "3.0"
+ str2 = str2.substring(i).replace(".", "");
+ str1 = str1.substring(i).replace(".", "");
+ if ((!(str1.equals(""))) && Integer.valueOf(str1) == 0){
+ vals1 = Arrays.copyOf(vals1, i);
+ }
+ if ((!(str2.equals(""))) && Integer.valueOf(str2) == 0){
+ vals2 = Arrays.copyOf(vals2, i);
+ }
+
+ // the strings are equal or one string is a substring of the other
+ // e.g. "1.2.3" = "1.2.3" or "1.2.3" < "1.2.3.4"
+ return Integer.signum(vals1.length - vals2.length);
+ }
+
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/utils/SdcToscaUtility.java b/src/main/java/org/onap/sdc/tosca/parser/utils/SdcToscaUtility.java
new file mode 100644
index 0000000..57f4187
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/utils/SdcToscaUtility.java
@@ -0,0 +1,19 @@
+package org.onap.sdc.tosca.parser.utils;
+
+import java.util.regex.Pattern;
+
+public class SdcToscaUtility {
+
+ public final static Pattern COMPONENT_INSTANCE_NAME_DELIMETER_PATTERN = Pattern.compile("[\\.\\-]+");
+
+ public static String normaliseComponentInstanceName(String name) {
+ String normalizedName = name.toLowerCase();
+ normalizedName = COMPONENT_INSTANCE_NAME_DELIMETER_PATTERN.matcher(normalizedName).replaceAll(" ");
+ String[] split = normalizedName.split(" ");
+ StringBuffer sb = new StringBuffer();
+ for (String splitElement : split) {
+ sb.append(splitElement);
+ }
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/org/onap/sdc/tosca/parser/utils/YamlToObjectConverter.java b/src/main/java/org/onap/sdc/tosca/parser/utils/YamlToObjectConverter.java
new file mode 100644
index 0000000..89963d8
--- /dev/null
+++ b/src/main/java/org/onap/sdc/tosca/parser/utils/YamlToObjectConverter.java
@@ -0,0 +1,126 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * sdc-distribution-client
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdc.tosca.parser.utils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.Yaml;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+
+public class YamlToObjectConverter {
+
+ private static Logger log = LoggerFactory
+ .getLogger(YamlToObjectConverter.class.getName());
+
+ private static HashMap<String, Yaml> yamls = new HashMap<String, Yaml>();
+
+ private static Yaml defaultYaml = new Yaml();
+
+ private static <T> Yaml getYamlByClassName(Class<T> className) {
+
+ Yaml yaml = yamls.get(className.getName());
+ if (yaml == null) {
+ yaml = defaultYaml;
+ }
+
+ return yaml;
+ }
+
+ public <T> T convert(String dirPath, Class<T> className,
+ String configFileName) {
+
+ T config = null;
+
+ try {
+
+ String fullFileName = dirPath + File.separator + configFileName;
+
+ config = convert(fullFileName, className);
+
+ } catch (Exception e) {
+ log.error("Failed to convert yaml file " + configFileName
+ + " to object.", e);
+ }
+
+ return config;
+ }
+
+ public <T> T convert(String fullFileName, Class<T> className) {
+
+ T config = null;
+
+ Yaml yaml = getYamlByClassName(className);
+
+ InputStream in = null;
+ try {
+
+ File f = new File(fullFileName);
+ if (false == f.exists()) {
+ log.warn("The file " + fullFileName
+ + " cannot be found. Ignore reading configuration.");
+ return null;
+ }
+ in = Files.newInputStream(Paths.get(fullFileName));
+
+ config = yaml.loadAs(in, className);
+
+ // System.out.println(config.toString());
+ } catch (Exception e) {
+ log.error("Failed to convert yaml file " + fullFileName
+ + " to object.", e);
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return config;
+ }
+
+ public <T> T convertFromString(String yamlContents, Class<T> className) {
+
+ T config = null;
+ Yaml yaml = new Yaml();
+ try {
+ Object data = yaml.load(yamlContents);
+ // convert it manually with jackson instead of using snakeyaml auto converter,
+ // because of problematic complex objects like JtoscaValidationIssueConfiguration
+ ObjectMapper mapper = new ObjectMapper();
+ config = mapper.convertValue(data, className);
+ } catch (Exception e){
+ log.error("Failed to convert YAML {} to object." , yamlContents, e);
+ }
+
+ return config;
+ }
+}