From 9e430cd9d4722c3e614c8a2fd822cff1604be1f2 Mon Sep 17 00:00:00 2001 From: Pavel Aharoni Date: Wed, 24 May 2017 13:23:12 +0300 Subject: [PATCH] [SDC-24] error handling Change-Id: Iac97052fab32f638d4cf52b094caad31f6d76902 Signed-off-by: Pavel Aharoni --- jtosca/pom.xml | 4 +- .../openecomp/sdc/toscaparser/api/DataEntity.java | 9 +- .../sdc/toscaparser/api/EntityTemplate.java | 15 +- .../org/openecomp/sdc/toscaparser/api/Group.java | 3 +- .../sdc/toscaparser/api/ImportsLoader.java | 41 ++-- .../sdc/toscaparser/api/NodeTemplate.java | 19 +- .../org/openecomp/sdc/toscaparser/api/Policy.java | 3 +- .../openecomp/sdc/toscaparser/api/Repository.java | 7 +- .../sdc/toscaparser/api/SubstitutionMappings.java | 15 +- .../sdc/toscaparser/api/TopologyTemplate.java | 7 +- .../sdc/toscaparser/api/ToscaTemplate.java | 104 +++++----- .../openecomp/sdc/toscaparser/api/Triggers.java | 5 +- .../sdc/toscaparser/api/UnsupportedType.java | 3 +- .../toscaparser/api/common/ExceptionCollector.java | 217 ++++++++++----------- .../toscaparser/api/common/JToscaException.java | 20 +- .../sdc/toscaparser/api/elements/GroupType.java | 7 +- .../toscaparser/api/elements/InterfacesDef.java | 3 +- .../sdc/toscaparser/api/elements/NodeType.java | 3 +- .../sdc/toscaparser/api/elements/PolicyType.java | 9 +- .../sdc/toscaparser/api/elements/PortSpec.java | 5 +- .../sdc/toscaparser/api/elements/PropertyDef.java | 7 +- .../toscaparser/api/elements/RelationshipType.java | 3 +- .../sdc/toscaparser/api/elements/ScalarUnit.java | 7 +- .../api/elements/StatefulEntityType.java | 5 +- .../toscaparser/api/elements/TypeValidation.java | 5 +- .../api/elements/constraints/Constraint.java | 9 +- .../api/elements/constraints/GreaterOrEqual.java | 5 +- .../api/elements/constraints/GreaterThan.java | 3 +- .../api/elements/constraints/InRange.java | 7 +- .../api/elements/constraints/Length.java | 3 +- .../api/elements/constraints/LessOrEqual.java | 3 +- .../api/elements/constraints/LessThan.java | 3 +- .../api/elements/constraints/MaxLength.java | 3 +- .../api/elements/constraints/MinLength.java | 3 +- .../api/elements/constraints/Pattern.java | 7 +- .../api/elements/constraints/Schema.java | 7 +- .../sdc/toscaparser/api/functions/Concat.java | 3 +- .../toscaparser/api/functions/GetAttribute.java | 31 ++- .../sdc/toscaparser/api/functions/GetInput.java | 7 +- .../api/functions/GetOperationOutput.java | 22 +-- .../sdc/toscaparser/api/functions/GetProperty.java | 31 ++- .../sdc/toscaparser/api/functions/Token.java | 7 +- .../sdc/toscaparser/api/parameters/Input.java | 5 +- .../sdc/toscaparser/api/parameters/Output.java | 7 +- .../openecomp/sdc/toscaparser/api/prereq/CSAR.java | 104 ++++++---- .../toscaparser/api/utils/JToscaErrorCodes.java | 32 +++ .../api/utils/TOSCAVersionProperty.java | 6 +- .../toscaparser/api/utils/ThreadLocalsHolder.java | 24 +++ .../sdc/toscaparser/api/utils/UrlUtils.java | 4 +- .../sdc/toscaparser/api/utils/ValidateUtils.java | 32 +-- .../resources/csars/service-ServiceFdnt-csar.csar | Bin 0 -> 40171 bytes pom.xml | 2 +- sdc-distribution-ci/pom.xml | 2 +- .../java/org/openecomp/test/CsarToscaTester.java | 100 ++++------ sdc-distribution-client/pom.xml | 2 +- .../org/openecomp/sdc/http/HttpAsdcClient.java | 2 +- sdc-tosca-parser/pom.xml | 4 +- .../tosca/parser/config/ConfigurationManager.java | 83 ++++++-- .../tosca/parser/config/ErrorConfiguration.java | 46 +++++ .../sdc/tosca/parser/config/ErrorInfo.java | 49 +++++ .../tosca/parser/config/SdcToscaParserErrors.java | 31 +++ .../parser/exceptions/SdcToscaParserException.java | 26 ++- .../sdc/tosca/parser/impl/SdcCsarHelperImpl.java | 48 +++-- .../tosca/parser/impl/SdcToscaParserFactory.java | 29 ++- .../main/resources/config/error-configuration.yaml | 18 ++ ...BasicTest.java => SdcToscaParserBasicTest.java} | 15 +- .../sdc/impl/ToscaParserConfigurationTest.java | 12 +- .../sdc/impl/ToscaParserErrorHandlingTest.java | 143 ++++++++++++++ .../sdc/impl/ToscaParserGeneralUtilTest.java | 2 +- .../openecomp/sdc/impl/ToscaParserGroupTest.java | 2 +- .../sdc/impl/ToscaParserMetadataTest.java | 2 +- .../sdc/impl/ToscaParserNodeTemplateTest.java | 23 ++- .../sdc/impl/ToscaParserServiceInputTest.java | 2 +- .../sdc/impl/ToscaParserSubsMappingsTest.java | 2 +- .../test/resources/config/error-configuration.yaml | 18 ++ .../src/test/resources/csars/csar-invalid-zip.zip | 2 + .../service-entry-definition-not-defined.csar | Bin 0 -> 45157 bytes .../csars/service-invalid-conformence-level.csar | Bin 0 -> 45194 bytes .../csars/service-invalid-input-args.csar | Bin 0 -> 106698 bytes .../csars/service-invalid-yaml-content-meta.csar | Bin 0 -> 45198 bytes .../csars/service-missing-entry-definition.csar | Bin 0 -> 42668 bytes .../resources/csars/service-missing-meta-file.csar | Bin 0 -> 44893 bytes 82 files changed, 1032 insertions(+), 527 deletions(-) create mode 100644 jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/JToscaErrorCodes.java create mode 100644 jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/ThreadLocalsHolder.java create mode 100644 jtosca/src/test/resources/csars/service-ServiceFdnt-csar.csar create mode 100644 sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ErrorConfiguration.java create mode 100644 sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ErrorInfo.java create mode 100644 sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/SdcToscaParserErrors.java create mode 100644 sdc-tosca-parser/src/main/resources/config/error-configuration.yaml rename sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/{BasicTest.java => SdcToscaParserBasicTest.java} (87%) create mode 100644 sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserErrorHandlingTest.java create mode 100644 sdc-tosca-parser/src/test/resources/config/error-configuration.yaml create mode 100644 sdc-tosca-parser/src/test/resources/csars/csar-invalid-zip.zip create mode 100644 sdc-tosca-parser/src/test/resources/csars/service-entry-definition-not-defined.csar create mode 100644 sdc-tosca-parser/src/test/resources/csars/service-invalid-conformence-level.csar create mode 100644 sdc-tosca-parser/src/test/resources/csars/service-invalid-input-args.csar create mode 100644 sdc-tosca-parser/src/test/resources/csars/service-invalid-yaml-content-meta.csar create mode 100644 sdc-tosca-parser/src/test/resources/csars/service-missing-entry-definition.csar create mode 100644 sdc-tosca-parser/src/test/resources/csars/service-missing-meta-file.csar diff --git a/jtosca/pom.xml b/jtosca/pom.xml index 3ef6a3c..8886012 100644 --- a/jtosca/pom.xml +++ b/jtosca/pom.xml @@ -5,11 +5,11 @@ org.openecomp.sdc.sdc-distribution-client sdc-main-distribution-client - 1.1.13-SNAPSHOT + 1.1.14-SNAPSHOT jtosca - 0.1.6-SNAPSHOT + 0.1.7-SNAPSHOT diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/DataEntity.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/DataEntity.java index a081f89..350068b 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/DataEntity.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/DataEntity.java @@ -11,6 +11,7 @@ import org.openecomp.sdc.toscaparser.api.elements.constraints.Constraint; import org.openecomp.sdc.toscaparser.api.elements.constraints.Schema; import org.openecomp.sdc.toscaparser.api.functions.Function; import org.openecomp.sdc.toscaparser.api.utils.TOSCAVersionProperty; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.openecomp.sdc.toscaparser.api.utils.ValidateUtils; public class DataEntity { @@ -49,7 +50,7 @@ public class DataEntity { else { if(!(value instanceof LinkedHashMap)) { //ERROR under investigation - ExceptionCollector.appendWarning(String.format( + ThreadLocalsHolder.getCollector().appendWarning(String.format( "TypeMismatchError: \"%s\" is not a map. The type is \"%s\"", value.toString(),dataType.getType())); @@ -85,7 +86,7 @@ public class DataEntity { for(String valueKey: valueDict.keySet()) { //1710 devlop JSON validation if(!("json").equals(dataType.getType()) && !allowedProps.contains(valueKey)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Data value of type \"%s\" contains unknown field \"%s\"", dataType.getType(),valueKey)); } @@ -108,7 +109,7 @@ public class DataEntity { } } if(missingProp.size() > 0) { - ExceptionCollector.appendWarning(String.format( + ThreadLocalsHolder.getCollector().appendWarning(String.format( "MissingRequiredFieldError: Data value of type \"%s\" is missing required field(s) \"%s\"", dataType.getType(),missingProp.toString())); } @@ -168,7 +169,7 @@ public class DataEntity { } else if (type == null) { //NOT ANALYZED - ExceptionCollector.appendWarning(String.format( + ThreadLocalsHolder.getCollector().appendWarning(String.format( "MissingType: Type is missing for value \"%s\"", value.toString())); return value; diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/EntityTemplate.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/EntityTemplate.java index 224d5df..e896905 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/EntityTemplate.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/EntityTemplate.java @@ -6,6 +6,7 @@ import java.util.Map; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.*; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public abstract class EntityTemplate { // Base class for TOSCA templates @@ -92,7 +93,7 @@ public abstract class EntityTemplate { if(type == null) { //msg = (_('Policy definition of "%(pname)s" must have' // ' a "type" ''attribute.') % dict(pname=name)) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValidationError: Policy definition of \"%s\" must have a \"type\" attribute",name)); } typeDefinition = new PolicyType(type, customDef); @@ -312,7 +313,7 @@ public abstract class EntityTemplate { // '"default_instances" value is not between ' // '"min_instances" and "max_instances".' % // self.name) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValidationError: \"properties\" of template \"%s\": \"default_instances\" value is not between \"min_instances\" and \"max_instances\"", name)); } @@ -343,7 +344,7 @@ public abstract class EntityTemplate { } // Required properties found without value or a default value if(!reqPropsNoValueOrDefault.isEmpty()) { - ExceptionCollector.appendWarning(String.format( + ThreadLocalsHolder.getCollector().appendWarning(String.format( "MissingRequiredFieldError: properties of template \"%s\" are missing field(s): %s", name,reqPropsNoValueOrDefault.toString())); } @@ -351,7 +352,7 @@ public abstract class EntityTemplate { else { // Required properties in schema, but not in template if(!requiredProps.isEmpty()) { - ExceptionCollector.appendWarning(String.format( + ThreadLocalsHolder.getCollector().appendWarning(String.format( "MissingRequiredFieldError2: properties of template \"%s\" are missing field(s): %s", name,requiredProps.toString())); } @@ -361,7 +362,7 @@ public abstract class EntityTemplate { @SuppressWarnings("unchecked") private void _validateField(LinkedHashMap template) { if(!(template instanceof LinkedHashMap)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredFieldError: Template \"%s\" is missing required field \"%s\"",name,TYPE)); return;//??? } @@ -379,7 +380,7 @@ public abstract class EntityTemplate { bBad = (template.get(TYPE) == null); } if(bBad) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredFieldError: Template \"%s\" is missing required field \"%s\"",name,TYPE)); } } @@ -394,7 +395,7 @@ public abstract class EntityTemplate { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Section \"%s\" of template \"%s\" contains unknown field \"%s\"",section,name,sname)); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Group.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Group.java index 58a3f87..8ed623f 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Group.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Group.java @@ -6,6 +6,7 @@ import java.util.Map; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.Metadata; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.openecomp.sdc.toscaparser.api.utils.ValidateUtils; public class Group extends EntityTemplate { @@ -69,7 +70,7 @@ public class Group extends EntityTemplate { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Groups \"%s\" contains unknown field \"%s\"", name,key)); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ImportsLoader.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ImportsLoader.java index 1ac334a..a97a360 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ImportsLoader.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ImportsLoader.java @@ -2,6 +2,7 @@ package org.openecomp.sdc.toscaparser.api; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.TypeValidation; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.openecomp.sdc.toscaparser.api.utils.UrlUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,7 +42,7 @@ public class ImportsLoader { if((_path == null || _path.isEmpty()) && tpl == null) { //msg = _('Input tosca template is not provided.') //log.warning(msg) - ExceptionCollector.appendException("ValidationError: Input tosca template is not provided"); + ThreadLocalsHolder.getCollector().appendException("ValidationError: Input tosca template is not provided"); } this.path = _path; @@ -77,7 +78,7 @@ public class ImportsLoader { if(importslist == null) { //msg = _('"imports" keyname is defined without including templates.') //log.error(msg) - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValidationError: \"imports\" keyname is defined without including templates"); return; } @@ -92,7 +93,7 @@ public class ImportsLoader { if(importNames.contains(importName)) { //msg = (_('Duplicate import name "%s" was found.') % import_name) //log.error(msg) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValidationError: Duplicate import name \"%s\" was found",importName)); } importNames.add(importName); //??? @@ -168,7 +169,7 @@ public class ImportsLoader { private void _validateImportKeys(String importName, LinkedHashMap importUri) { if(importUri.get(FILE) == null) { //log.warning(_('Missing keyname "file" in import "%(name)s".') % {'name': import_name}) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredFieldError: Import of template \"%s\" is missing field %s",importName,FILE)); } for(String key: importUri.keySet()) { @@ -183,7 +184,7 @@ public class ImportsLoader { //log.warning(_('Unknown keyname "%(key)s" error in ' // 'imported definition "%(def)s".') // % {'key': key, 'def': import_name}) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Import of template \"%s\" has unknown fiels %s",importName,key)); } } @@ -220,7 +221,7 @@ public class ImportsLoader { repository = (String)((LinkedHashMap)importUriDef).get(REPOSITORY); if(repository != null) { if(!repositories.keySet().contains(repository)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidPropertyValueError: Repository \"%s\" not found in \"%s\"", repository,repositories.keySet().toString())); } @@ -237,7 +238,7 @@ public class ImportsLoader { // 'definition "%(import_name)s".') // % {'import_name': import_name}) //log.error(msg) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValidationError: A template file name is not provided with import definition \"%s\"",importName)); al[0] = al[1] = null; return al; @@ -252,7 +253,7 @@ public class ImportsLoader { return al; } catch(IOException e) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ImportError: \"%s\" loading YAML import from \"%s\"",e.getClass().getSimpleName(),fileName)); al[0] = al[1] = null; return al; @@ -268,7 +269,7 @@ public class ImportsLoader { String msg = String.format( "ImportError: Absolute file name \"%s\" cannot be used in the URL-based input template \"%s\"", fileName,path); - ExceptionCollector.appendException(msg); + ThreadLocalsHolder.getCollector().appendException(msg); al[0] = al[1] = null; return al; } @@ -311,7 +312,7 @@ public class ImportsLoader { //log.error(msg) String msg = String.format( "ValueError: \"%s\" is not a valid file",importTemplate); - ExceptionCollector.appendException(msg); + ThreadLocalsHolder.getCollector().appendException(msg); log.debug("ImportsLoader - _loadImportTemplate - {}", msg); } } @@ -329,7 +330,7 @@ public class ImportsLoader { else { String msg = String.format( "Relative file name \"%s\" cannot be used in a pre-parsed input template",fileName); - ExceptionCollector.appendException("ImportError: " + msg); + ThreadLocalsHolder.getCollector().appendException("ImportError: " + msg); al[0] = al[1] = null; return al; } @@ -338,7 +339,7 @@ public class ImportsLoader { if(importTemplate == null || importTemplate.isEmpty()) { //log.error(_('Import "%(name)s" is not valid.') % // {'name': import_uri_def}) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ImportError: Import \"%s\" is not valid",importUriDef)); al[0] = al[1] = null; return al; @@ -347,7 +348,7 @@ public class ImportsLoader { // for now, this must be a file if(!aFile) { log.error("ImportsLoader - _loadImportTemplate - Error!! Expected a file. importUriDef = {}, importTemplate = {}", importUriDef, importTemplate); - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ImportError: Import \"%s\" is not a file",importName)); al[0] = al[1] = null; return al; @@ -360,13 +361,13 @@ public class ImportsLoader { return al; } catch(FileNotFoundException e) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ImportError: Failed to load YAML from \"%s\"",importName)); al[0] = al[1] = null; return al; } catch(Exception e) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ImportError: Exception from SnakeYAML file = \"%s\"",importName)); al[0] = al[1] = null; return al; @@ -375,7 +376,7 @@ public class ImportsLoader { if(shortImportNotation) { //log.error(_('Import "%(name)s" is not valid.') % import_uri_def) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ImportError: Import \"%s\" is not valid",importName)); al[0] = al[1] = null; return al; @@ -409,7 +410,7 @@ public class ImportsLoader { String msg = String.format( "referenced repository \"%s\" in import definition \"%s\" not found", repository,importName); - ExceptionCollector.appendException("ImportError: " + msg); + ThreadLocalsHolder.getCollector().appendException("ImportError: " + msg); al[0] = al[1] = null; return al; } @@ -423,7 +424,7 @@ public class ImportsLoader { return al; } catch(IOException e) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ImportError: Exception loading YAML import from \"%s\"",fullUrl)); al[0] = al[1] = null; return al; @@ -433,12 +434,12 @@ public class ImportsLoader { String msg = String.format( "repository URL \"%s\" in import definition \"%s\" is not valid", repoUrl,importName); - ExceptionCollector.appendException("ImportError: " + msg); + ThreadLocalsHolder.getCollector().appendException("ImportError: " + msg); } // if we got here something is wrong with the flow... log.error("ImportsLoader - _loadImportTemplate - got to dead end (importName {})", importName); - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ImportError: _loadImportTemplate got to dead end (importName %s)\n",importName)); al[0] = al[1] = null; return al; diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/NodeTemplate.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/NodeTemplate.java index 4d0baaf..c8af559 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/NodeTemplate.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/NodeTemplate.java @@ -7,6 +7,7 @@ import java.util.Map; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.*; import org.openecomp.sdc.toscaparser.api.utils.CopyUtils; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class NodeTemplate extends EntityTemplate { @@ -96,13 +97,13 @@ public class NodeTemplate extends EntityTemplate { } } if(bFound || customDef.get(node) != null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "NotImplementedError: Lookup by TOSCA types is not supported. Requirement for \"%s\" can not be full-filled", getName())); return null; } if(templates.get(node) == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Node template \"%s\" was not found",node)); return null; } @@ -117,7 +118,7 @@ public class NodeTemplate extends EntityTemplate { if(relationship == null) { ArrayList parentReqs = ((NodeType)typeDefinition).getAllRequirements(); if(parentReqs == null) { - ExceptionCollector.appendException("ValidationError: parent_req is null"); + ThreadLocalsHolder.getCollector().appendException("ValidationError: parent_req is null"); } else { for(String key: req.keySet()) { @@ -177,7 +178,7 @@ public class NodeTemplate extends EntityTemplate { } } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredFieldError: \"relationship\" used in template \"%s\" is missing required field \"type\"", relatedTpl.getName())); } @@ -286,7 +287,7 @@ public class NodeTemplate extends EntityTemplate { ArrayList requires = (ArrayList)((NodeType)typeDefinition).getValue(REQUIREMENTS, entityTpl, false); if(requires != null) { if(!(requires instanceof ArrayList)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "TypeMismatchError: \"requirements\" of template \"%s\" are not of type \"list\"",name)); } else { @@ -331,7 +332,7 @@ public class NodeTemplate extends EntityTemplate { if(occurrences.size() != 2 || !(0 <= (int)occurrences.get(0) && (int)occurrences.get(0) <= (int)occurrences.get(1)) || (int)occurrences.get(1) == 0) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidPropertyValueError: property has invalid value %s",occurrences.toString())); } } @@ -346,7 +347,7 @@ public class NodeTemplate extends EntityTemplate { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: \"requirements\" of template \"%s\" contains unknown field \"%s\"",name,key)); } } @@ -380,7 +381,7 @@ public class NodeTemplate extends EntityTemplate { _commonValidateField(value,_collectCustomIfaceOperations(iname),"interfaces"); } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: \"interfaces\" of template \"%s\" contains unknown field %s",name,iname)); } } @@ -432,7 +433,7 @@ public class NodeTemplate extends EntityTemplate { } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Node template \"%s\" has unknown field \"%s\"",name,ntname)); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Policy.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Policy.java index 1474d0b..a59d9d5 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Policy.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Policy.java @@ -5,6 +5,7 @@ import java.util.LinkedHashMap; import java.util.Map; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.openecomp.sdc.toscaparser.api.utils.ValidateUtils; public class Policy extends EntityTemplate { @@ -100,7 +101,7 @@ public class Policy extends EntityTemplate { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Policy \"%s\" contains unknown field \"%s\"", name,key)); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Repository.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Repository.java index 39699f3..92a90af 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Repository.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Repository.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api; import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.openecomp.sdc.toscaparser.api.utils.UrlUtils; public class Repository { @@ -23,7 +24,7 @@ public class Repository { if(reposit instanceof LinkedHashMap) { url = (String)((LinkedHashMap)reposit).get("url"); if(url == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredFieldError: Repository \"%s\" is missing required field \"url\"", name)); } @@ -44,7 +45,7 @@ public class Repository { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: repositories \"%s\" contains unknown field \"%s\"", keyname,key)); } @@ -54,7 +55,7 @@ public class Repository { if(repositUrl != null) { boolean urlVal = UrlUtils.validateUrl(repositUrl); if(!urlVal) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "URLException: repsositories \"%s\" Invalid Url",keyname)); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/SubstitutionMappings.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/SubstitutionMappings.java index 153bd89..b9c2238 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/SubstitutionMappings.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/SubstitutionMappings.java @@ -9,6 +9,7 @@ import org.openecomp.sdc.toscaparser.api.elements.NodeType; import org.openecomp.sdc.toscaparser.api.elements.PropertyDef; import org.openecomp.sdc.toscaparser.api.parameters.Input; import org.openecomp.sdc.toscaparser.api.parameters.Output; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class SubstitutionMappings { @@ -128,7 +129,7 @@ public class SubstitutionMappings { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: SubstitutionMappings contain unknown field \"%s\"", key)); } @@ -139,13 +140,13 @@ public class SubstitutionMappings { // validate the node_type of substitution mappings String nodeType = (String)subMappingDef.get(NODE_TYPE); if(nodeType == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredFieldError: SubstitutionMappings used in topology_template is missing required field \"%s\"", NODE_TYPE)); } Object nodeTypeDef = customDefs.get(nodeType); if(nodeTypeDef == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidNodeTypeError: \"%s\" is invalid",nodeType)); } } @@ -172,7 +173,7 @@ public class SubstitutionMappings { for(String property: requiredProperties) { // Check property which is 'required' and has no 'default' value if(!allInputs.contains(property)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredInputError: SubstitutionMappings with node_type \"%s\" is missing required input \"%s\"", getNodeType(),property)); } @@ -190,7 +191,7 @@ public class SubstitutionMappings { diffset.removeAll(allInputs); for(String parameter: diffset) { if(allProperties.contains(parameter)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredInputError: SubstitutionMappings with node_type \"%s\" is missing required input \"%s\"", getNodeType(),parameter)); } @@ -203,7 +204,7 @@ public class SubstitutionMappings { diffset = allInputs; diffset.removeAll(allProperties); if(diffset.contains(inp.getName()) && inp.getDefault() == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredInputError: SubstitutionMappings with node_type \"%s\" is missing rquired input \"%s\"", getNodeType(),inp.getName())); } @@ -276,7 +277,7 @@ public class SubstitutionMappings { for(Output output: outputs) { Object ado = getNodeDefinition().getAttributesDef(); if(ado != null && ((LinkedHashMap)ado).get(output.getName()) == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownOutputError: Unknown output \"%s\" in SubstitutionMappings with node_type \"%s\"", output.getName(),getNodeType())); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/TopologyTemplate.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/TopologyTemplate.java index 4050643..25f118b 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/TopologyTemplate.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/TopologyTemplate.java @@ -14,6 +14,7 @@ import org.openecomp.sdc.toscaparser.api.functions.GetAttribute; import org.openecomp.sdc.toscaparser.api.functions.GetInput; import org.openecomp.sdc.toscaparser.api.parameters.Input; import org.openecomp.sdc.toscaparser.api.parameters.Output; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class TopologyTemplate { @@ -232,7 +233,7 @@ public class TopologyTemplate { DataEntity.validateDatatype("list", memberNames,null,null,null); if(memberNames.size() < 1 || (new HashSet(memberNames)).size() != memberNames.size()) { - ExceptionCollector.appendWarning(String.format( + ThreadLocalsHolder.getCollector().appendWarning(String.format( "InvalidGroupTargetException: Member nodes \"%s\" should be >= 1 and not repeated", memberNames.toString())); } @@ -281,7 +282,7 @@ public class TopologyTemplate { } for(String member: members) { if(!nodeNames.contains(member)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidGroupTargetException: Target member \"%s\" is not found in \"nodeTemplates\"",member)); } } @@ -383,7 +384,7 @@ public class TopologyTemplate { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: TopologyTemplate contains unknown field \"%s\"",name)); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java index 9f2fd7a..b13a2a5 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java @@ -5,10 +5,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.common.JToscaException; @@ -18,6 +15,8 @@ import org.openecomp.sdc.toscaparser.api.extensions.ExtTools; import org.openecomp.sdc.toscaparser.api.parameters.Input; import org.openecomp.sdc.toscaparser.api.parameters.Output; import org.openecomp.sdc.toscaparser.api.prereq.CSAR; +import org.openecomp.sdc.toscaparser.api.utils.JToscaErrorCodes; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.Yaml; @@ -65,7 +64,6 @@ public class ToscaTemplate extends Object { private ArrayList VALID_TEMPLATE_VERSIONS; private LinkedHashMap> ADDITIONAL_SECTIONS; - private boolean bAbortOnParsingErrors = false; private boolean isFile; private String path; private String inputPath; @@ -96,6 +94,8 @@ public class ToscaTemplate extends Object { boolean aFile, LinkedHashMap yamlDictTpl) throws JToscaException { + ThreadLocalsHolder.setCollector(new ExceptionCollector(_path)); + VALID_TEMPLATE_VERSIONS = new ArrayList<>(); VALID_TEMPLATE_VERSIONS.add("tosca_simple_yaml_1_0"); VALID_TEMPLATE_VERSIONS.addAll(exttools.getVersions()); @@ -107,7 +107,6 @@ public class ToscaTemplate extends Object { //long startTime = System.nanoTime(); - //ExceptionCollector.start(); isFile = aFile; inputPath = null; @@ -158,7 +157,7 @@ public class ToscaTemplate extends Object { tpl = yamlDictTpl; } else { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValueError: No path or yaml_dict_tpl was provided. There is nothing to parse"); log.debug("ToscaTemplate ValueError: No path or yaml_dict_tpl was provided. There is nothing to parse"); @@ -190,14 +189,14 @@ public class ToscaTemplate extends Object { csarTempDir = null; } - //ExceptionCollector.stop(); verifyTemplate(); - } + } + private void _abort() throws JToscaException { // print out all exceptions caught verifyTemplate(); - throw new JToscaException("jtosca aborting"); + throw new JToscaException("jtosca aborting", JToscaErrorCodes.PATH_NOT_VALID.getValue()); } private TopologyTemplate _topologyTemplate() { return new TopologyTemplate( @@ -429,7 +428,7 @@ public class ToscaTemplate extends Object { private void _validateField() { String sVersion = _tplVersion(); if(sVersion == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredField: Template is missing required field \"%s\"",DEFINITION_VERSION)); } else { @@ -453,7 +452,7 @@ public class ToscaTemplate extends Object { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Template contains unknown field \"%s\"", sKey)); } @@ -469,7 +468,7 @@ public class ToscaTemplate extends Object { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTemplateVersion: \"%s\" is invalid. Valid versions are %s", sVersion,VALID_TEMPLATE_VERSIONS.toString())); } @@ -478,7 +477,7 @@ public class ToscaTemplate extends Object { } } - private String _getPath(String _path) { + private String _getPath(String _path) throws JToscaException { if (_path.toLowerCase().endsWith(".yaml") || _path.toLowerCase().endsWith(".yml")) { return _path; } @@ -501,49 +500,39 @@ public class ToscaTemplate extends Object { } } else { - ExceptionCollector.appendException("ValueError: " + _path + " is not a valid file"); + ThreadLocalsHolder.getCollector().appendException("ValueError: " + _path + " is not a valid file"); return null; } return null; } private void verifyTemplate() throws JToscaException { + ThreadLocalsHolder.getCollector().setWantTrace(false); + //Warnings - List warningsStrings = ExceptionCollector.getWarningsReport(); - if (warningsStrings != null && warningsStrings.size() > 0) { - int nexcw = ExceptionCollector.warningsCaught(); + int warningsCount = ThreadLocalsHolder.getCollector().warningsCaught(); + if (warningsCount > 0) { + List warningsStrings = ThreadLocalsHolder.getCollector().getWarningsReport(); log.warn("####################################################################################################"); - log.warn("ToscaTemplate - verifyTemplate - {} Parsing Warning{} occurred...", nexcw, (nexcw > 1 ? "s" : "")); + log.warn("CSAR Warnings found! CSAR name - {}", inputPath); + log.warn("ToscaTemplate - verifyTemplate - {} Parsing Warning{} occurred...", warningsCount, (warningsCount > 1 ? "s" : "")); for (String s : warningsStrings) { - if (s != null) { - log.debug("ToscaTemplate - verifyTemplate - {}", s); - } + log.warn("{}. CSAR name - {}", s, inputPath); } log.warn("####################################################################################################"); + } - - List exceptionStrings = ExceptionCollector.getCriticalsReport(); - if (exceptionStrings != null && exceptionStrings.size() > 0) { - int nexc = ExceptionCollector.errorsCaught(); - log.error("####################################################################################################"); - log.error("ToscaTemplate - verifyTemplate - {} Parsing Critical{} occurred...", nexc, (nexc > 1 ? "s" : "")); - for (String s : exceptionStrings) { - if (s != null) { - log.debug("ToscaTemplate - verifyTemplate - {}", s); - } - } - log.error("####################################################################################################"); - if(bAbortOnParsingErrors) { - throw new JToscaException("Aborting because of parsing errors"); - } - } - else { - if (inputPath != null) { - log.debug("ToscaTemplate - verifyTemplate - The input {} passed validation", inputPath); - } + //Criticals + int criticalsCount = ThreadLocalsHolder.getCollector().criticalsCaught(); + if (criticalsCount > 0) { + List criticalStrings = ThreadLocalsHolder.getCollector().getCriticalsReport(); + log.error("####################################################################################################"); + log.error("ToscaTemplate - verifyTemplate - {} Parsing Critical{} occurred...", criticalsCount, (criticalsCount > 1 ? "s" : "")); + for (String s : criticalStrings) { + log.error("{}. CSAR name - {}", s, inputPath); } - - } + throw new JToscaException(String.format("CSAR Validation Failed. CSAR name - {}. Please check logs for details.", inputPath), JToscaErrorCodes.CSAR_TOSCA_VALIDATION_ERROR.getValue()); + } } public String getPath() { @@ -648,10 +637,6 @@ public class ToscaTemplate extends Object { public ArrayList getNestedTemplates() { return nestedToscaTemplatesWithTopology; } - - public void setAbortOnParsingErrors(boolean b) { - bAbortOnParsingErrors = b; - } @Override public String toString() { @@ -659,7 +644,6 @@ public class ToscaTemplate extends Object { "exttools=" + exttools + ", VALID_TEMPLATE_VERSIONS=" + VALID_TEMPLATE_VERSIONS + ", ADDITIONAL_SECTIONS=" + ADDITIONAL_SECTIONS + - ", bAbortOnParsingErrors=" + bAbortOnParsingErrors + ", isFile=" + isFile + ", path='" + path + '\'' + ", inputPath='" + inputPath + '\'' + @@ -692,7 +676,7 @@ import logging import os from copy import deepcopy -from toscaparser.common.exception import ExceptionCollector +from toscaparser.common.exception import ExceptionCollector.collector from toscaparser.common.exception import InvalidTemplateVersion from toscaparser.common.exception import MissingRequiredFieldError from toscaparser.common.exception import UnknownFieldError @@ -744,7 +728,7 @@ class ToscaTemplate(object): def __init__(self, path=None, parsed_params=None, a_file=True, yaml_dict_tpl=None): - ExceptionCollector.start() + ExceptionCollector.collector.start() self.a_file = a_file self.input_path = None self.path = None @@ -765,7 +749,7 @@ class ToscaTemplate(object): if yaml_dict_tpl: self.tpl = yaml_dict_tpl else: - ExceptionCollector.appendException( + ExceptionCollector.collector.appendException( ValueError(_('No path or yaml_dict_tpl was provided. ' 'There is nothing to parse.'))) @@ -785,7 +769,7 @@ class ToscaTemplate(object): self._handle_nested_tosca_templates_with_topology() self.graph = ToscaGraph(self.nodetemplates) - ExceptionCollector.stop() + ExceptionCollector.collector.stop() self.verify_template() def _topology_template(self): @@ -921,7 +905,7 @@ class ToscaTemplate(object): def _validate_field(self): version = self._tpl_version() if not version: - ExceptionCollector.appendException( + ExceptionCollector.collector.appendException( MissingRequiredFieldError(what='Template', required=DEFINITION_VERSION)) else: @@ -931,12 +915,12 @@ class ToscaTemplate(object): for name in self.tpl: if (name not in SECTIONS and name not in self.ADDITIONAL_SECTIONS.get(version, ())): - ExceptionCollector.appendException( + ExceptionCollector.collector.appendException( UnknownFieldError(what='Template', field=name)) def _validate_version(self, version): if version not in self.VALID_TEMPLATE_VERSIONS: - ExceptionCollector.appendException( + ExceptionCollector.collector.appendException( InvalidTemplateVersion( what=version, valid_versions=', '. join(self.VALID_TEMPLATE_VERSIONS))) @@ -955,23 +939,23 @@ class ToscaTemplate(object): self.a_file = True # the file has been decompressed locally return os.path.join(csar.temp_dir, csar.get_main_template()) else: - ExceptionCollector.appendException( + ExceptionCollector.collector.appendException( ValueError(_('"%(path)s" is not a valid file.') % {'path': path})) def verify_template(self): - if ExceptionCollector.exceptionsCaught(): + if ExceptionCollector.collector.exceptionsCaught(): if self.input_path: raise ValidationError( message=(_('\nThe input "%(path)s" failed validation with ' 'the following error(s): \n\n\t') % {'path': self.input_path}) + - '\n\t'.join(ExceptionCollector.getExceptionsReport())) + '\n\t'.join(ExceptionCollector.collector.getExceptionsReport())) else: raise ValidationError( message=_('\nThe pre-parsed input failed validation with ' 'the following error(s): \n\n\t') + - '\n\t'.join(ExceptionCollector.getExceptionsReport())) + '\n\t'.join(ExceptionCollector.collector.getExceptionsReport())) else: if self.input_path: msg = (_('The input "%(path)s" successfully passed ' diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Triggers.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Triggers.java index d753f4b..0ec0b5a 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Triggers.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/Triggers.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api; import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.openecomp.sdc.toscaparser.api.utils.ValidateUtils; public class Triggers extends EntityTemplate { @@ -76,7 +77,7 @@ public class Triggers extends EntityTemplate { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Triggers \"%s\" contains unknown field \"%s\"", name,key)); } @@ -93,7 +94,7 @@ public class Triggers extends EntityTemplate { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Triggers \"%s\" contains unknown field \"%s\"", name,key)); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/UnsupportedType.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/UnsupportedType.java index 318b3d3..2bd0197 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/UnsupportedType.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/UnsupportedType.java @@ -1,6 +1,7 @@ package org.openecomp.sdc.toscaparser.api; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class UnsupportedType { @@ -26,7 +27,7 @@ public class UnsupportedType { public static boolean validateType(String entityType) { for(String ust: unsupportedTypes) { if(ust.equals(entityType)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnsupportedTypeError: Entity type \"%s\" is not supported",entityType)); return true; } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/common/ExceptionCollector.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/common/ExceptionCollector.java index b810e87..fa65ae4 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/common/ExceptionCollector.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/common/ExceptionCollector.java @@ -1,7 +1,9 @@ package org.openecomp.sdc.toscaparser.api.common; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,114 +12,111 @@ import org.slf4j.LoggerFactory; public class ExceptionCollector { - private static Logger log = LoggerFactory.getLogger(ExceptionCollector.class.getName()); - - //private static boolean isCollecting = false; - private static ArrayList exceptionStrings = new ArrayList<>(); - private static ArrayList exceptionTraceStrings = new ArrayList<>(); - private static ArrayList warningStrings = new ArrayList<>(); - private static ArrayList warningTraceStrings = new ArrayList<>(); - private static boolean bWantTrace = true; - - /*public static void start() { - if(exceptionStrings == null) { - exceptionStrings = new ArrayList(); - exceptionTraceStrings = new ArrayList(); - } - isCollecting = true; - }*/ - - /*public static void stop() { - isCollecting = false; - }*/ - - public static void clear() { - exceptionStrings = new ArrayList<>(); - exceptionTraceStrings = new ArrayList<>(); - warningStrings = new ArrayList<>(); - warningTraceStrings = new ArrayList<>(); - } - - public static void appendException(String strExc) { // throws Exception { - - /*if(!isCollecting) { - // throw new Exception("Can't append exception " + strExc); - log.error("ExceptionCollector - appendException - Can't append exception {}", strExc); - }*/ - - if(!exceptionStrings.contains(strExc)) { - exceptionStrings.add(strExc); - // get stack trace - StackTraceElement[] ste = Thread.currentThread().getStackTrace(); - StringBuilder sb = new StringBuilder(); - // skip the last 2 (getStackTrace and this) - for(int i=2; i getCriticalsReport() { - - List res = new ArrayList<>(); - if(exceptionStrings.size() > 0) { - for(int i=0; i getWarningsReport() { - - List res = new ArrayList<>(); - if(warningStrings.size() > 0) { - for(int i=0; i notAnalyzedExceptions = new HashMap<>(); + private Map criticalExceptions = new HashMap<>(); + private Map warningExceptions = new HashMap<>(); + + private boolean bWantTrace = true; + private String filePath; + + public enum ReportType {WARNING, CRITICAL, NOT_ANALYZED} + + public ExceptionCollector(String filePath) { + this.filePath = filePath; + } + + public void appendException(String exception) { + + addException(exception, ReportType.NOT_ANALYZED); + } + + public void appendCriticalException(String exception) { + + addException(exception, ReportType.CRITICAL); + } + + public void appendWarning(String exception) { + + addException(exception, ReportType.WARNING); + } + + private void addException(String exception, ReportType type) { + + Map exceptions = getExceptionCollection(type); + + if (!exceptions.containsKey(exception)) { + // get stack trace + StackTraceElement[] ste = Thread.currentThread().getStackTrace(); + StringBuilder sb = new StringBuilder(); + // skip the last 2 (getStackTrace and this) + for (int i = 2; i < ste.length; i++) { + sb.append(String.format(" %s(%s:%d)%s", ste[i].getClassName(), ste[i].getFileName(), + ste[i].getLineNumber(), i == ste.length - 1 ? " " : "\n")); + } + exceptions.put(exception, sb.toString()); + } + } + + public List getCriticalsReport() { + + return getReport(ReportType.CRITICAL); + } + + public List getNotAnalyzedExceptionsReport() { + + return getReport(ReportType.NOT_ANALYZED); + } + + public List getWarningsReport() { + + return getReport(ReportType.WARNING); + } + + private List getReport(ReportType type) { + Map collectedExceptions = getExceptionCollection(type); + + List report = new ArrayList<>(); + if (collectedExceptions.size() > 0) { + for (Map.Entry exception : collectedExceptions.entrySet()) { + report.add(exception.getKey()); + if (bWantTrace) { + report.add(exception.getValue()); + } + } + } + + return report; + } + + private Map getExceptionCollection(ReportType type) { + switch (type) { + case WARNING: + return warningExceptions; + case CRITICAL: + return criticalExceptions; + case NOT_ANALYZED: + return notAnalyzedExceptions; + default: + return notAnalyzedExceptions; + } + } + + public int errorsNotAnalyzedCaught() { + return notAnalyzedExceptions.size(); + } + + public int criticalsCaught() { + return criticalExceptions.size(); + } + + public int warningsCaught() { + return warningExceptions.size(); + } + + public void setWantTrace(boolean b) { + bWantTrace = b; + } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/common/JToscaException.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/common/JToscaException.java index 0046aa1..6cd5872 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/common/JToscaException.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/common/JToscaException.java @@ -3,9 +3,25 @@ package org.openecomp.sdc.toscaparser.api.common; public class JToscaException extends Exception { private static final long serialVersionUID = 1L; - - public JToscaException(String message) { + private String code; + + public JToscaException(String message, String code) { super(message); + this.code = code; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; } + //JT1001 - Meta file missing + //JT1002 - Invalid yaml content + //JT1003 - Entry-Definition not defined in meta file + //JT1004 - Entry-Definition file missing + //JT1005 - General Error + //JT1006 - General Error/Path not valid } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/GroupType.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/GroupType.java index 9a343b7..d226b78 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/GroupType.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/GroupType.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api.elements; import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class GroupType extends StatefulEntityType { @@ -91,7 +92,7 @@ public class GroupType extends StatefulEntityType { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Group Type \"%s\" contains unknown field \"%s\"", groupType,name)); } @@ -103,7 +104,7 @@ public class GroupType extends StatefulEntityType { private void _validateMetadata(LinkedHashMap metadata) { String mtt = (String) metadata.get("type"); if(mtt != null && !mtt.equals("map") && !mtt.equals("tosca:map")) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTypeError: \"%s\" defined in group for metadata is invalid", mtt)); } @@ -112,7 +113,7 @@ public class GroupType extends StatefulEntityType { if(estob instanceof LinkedHashMap) { String est = (String)((LinkedHashMap)estob).get("type"); if(!est.equals("string")) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTypeError: \"%s\" defined in group for metadata \"%s\" is invalid", est,entrySchema)); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/InterfacesDef.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/InterfacesDef.java index c8c1518..8a2b4dd 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/InterfacesDef.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/InterfacesDef.java @@ -6,6 +6,7 @@ import java.util.Map; import org.openecomp.sdc.toscaparser.api.EntityTemplate; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class InterfacesDef extends StatefulEntityType { @@ -90,7 +91,7 @@ public class InterfacesDef extends StatefulEntityType { inputs = (LinkedHashMap)me.getValue(); } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: \"interfaces\" of template \"%s\" contain unknown field \"%s\"", nodeTemplate.getName(),me.getKey())); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/NodeType.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/NodeType.java index e7dc464..d5f1a18 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/NodeType.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/NodeType.java @@ -6,6 +6,7 @@ import java.util.Map; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.InterfacesDef; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class NodeType extends StatefulEntityType { // TOSCA built-in node type @@ -314,7 +315,7 @@ public class NodeType extends StatefulEntityType { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Nodetype \"%s\" has unknown field \"%s\"",ntype,key)); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PolicyType.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PolicyType.java index d894b04..c60bed1 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PolicyType.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PolicyType.java @@ -5,6 +5,7 @@ import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.utils.TOSCAVersionProperty; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class PolicyType extends StatefulEntityType { @@ -134,7 +135,7 @@ public class PolicyType extends StatefulEntityType { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Policy \"%s\" contains unknown field \"%s\"", type,key)); } @@ -145,7 +146,7 @@ public class PolicyType extends StatefulEntityType { LinkedHashMap _customDef) { for(String nodetype: _targetsList) { if(_customDef.get(nodetype) == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTypeError: \"%s\" defined in targets for policy \"%s\"", nodetype,type)); @@ -156,7 +157,7 @@ public class PolicyType extends StatefulEntityType { private void _validateMetadata(LinkedHashMap _metaData) { String mtype = (String)_metaData.get("type"); if(mtype != null && !mtype.equals("map") && !mtype.equals("tosca:map")) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTypeError: \"%s\" defined in policy for metadata", mtype)); } @@ -166,7 +167,7 @@ public class PolicyType extends StatefulEntityType { String est = (String) ((LinkedHashMap)estob).get("type"); if(!est.equals("string")) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTypeError: \"%s\" defined in policy for metadata \"%s\"", est,entrySchema)); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PortSpec.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PortSpec.java index dcb14f9..8d490ee 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PortSpec.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PortSpec.java @@ -4,6 +4,7 @@ import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.DataEntity; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.openecomp.sdc.toscaparser.api.utils.ValidateUtils; public class PortSpec { @@ -52,7 +53,7 @@ public class PortSpec { // verify one of the specified values is set if(source == null && sourceRange == null && target == null && targetRange == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTypeAdditionalRequirementsError: Additional requirements for type \"%s\" not met", TYPE_URI)); } @@ -74,7 +75,7 @@ public class PortSpec { } } catch(Exception e) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" do not meet requirements for type \"%s\"", _properties.toString(),SHORTNAME)); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PropertyDef.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PropertyDef.java index 5e6b47d..c139eb6 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PropertyDef.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/PropertyDef.java @@ -4,6 +4,7 @@ import java.util.LinkedHashMap; import java.util.Map; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class PropertyDef { @@ -45,7 +46,7 @@ public class PropertyDef { if(schema.get("type") == null) { //msg = (_('Schema definition of "%(pname)s" must have a "type" ' // 'attribute.') % dict(pname=self.name)) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidSchemaError: Schema definition of \"%s\" must have a \"type\" attribute",name)); } _loadRequiredAttrFromSchema(); @@ -83,7 +84,7 @@ public class PropertyDef { // attr, // value, // valid_values) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "Schema definition of \"%s\" has \"required\" attribute with an invalid value", name)); } @@ -116,7 +117,7 @@ public class PropertyDef { // attr, // value, // valid_values) - ExceptionCollector.appendWarning(String.format( + ThreadLocalsHolder.getCollector().appendWarning(String.format( "Schema definition of \"%s\" has \"status\" attribute with an invalid value", name)); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/RelationshipType.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/RelationshipType.java index 15930ed..3903941 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/RelationshipType.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/RelationshipType.java @@ -5,6 +5,7 @@ import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.EntityType; import org.openecomp.sdc.toscaparser.api.elements.StatefulEntityType; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class RelationshipType extends StatefulEntityType { @@ -53,7 +54,7 @@ public class RelationshipType extends StatefulEntityType { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Relationshiptype \"%s\" has unknown field \"%s\"",type,key)); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/ScalarUnit.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/ScalarUnit.java index 42e94eb..de18cd6 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/ScalarUnit.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/ScalarUnit.java @@ -5,6 +5,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.openecomp.sdc.toscaparser.api.utils.ValidateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,7 +52,7 @@ public abstract class ScalarUnit { return key; } } - ExceptionCollector.appendWarning(String.format( + ThreadLocalsHolder.getCollector().appendWarning(String.format( "'The unit \"%s\" is not valid. Valid units are \n%s", inputUnit,SCALAR_UNIT_DICT.keySet().toString())); return inputUnit; @@ -67,7 +68,7 @@ public abstract class ScalarUnit { value = matcher.group(1) + " " + scalarUnit; } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a valid scalar-unit",value.toString())); } return value; @@ -135,7 +136,7 @@ public abstract class ScalarUnit { if(type.equals(SCALAR_UNIT_FREQUENCY)) { return (new ScalarUnitFrequency(value)).getNumFromScalarUnit(unit); } - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "TypeError: \"%s\" is not a valid scalar-unit type",type)); return 0.0; } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/StatefulEntityType.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/StatefulEntityType.java index 04836ff..5ab816f 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/StatefulEntityType.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/StatefulEntityType.java @@ -9,6 +9,7 @@ import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.AttributeDef; import org.openecomp.sdc.toscaparser.api.elements.EntityType; import org.openecomp.sdc.toscaparser.api.elements.PropertyDef; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class StatefulEntityType extends EntityType { @@ -48,7 +49,7 @@ public class StatefulEntityType extends EntityType { } else{ defs = null; - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTypeError: \"%s\" is not a valid type",entityType)); } } @@ -66,7 +67,7 @@ public class StatefulEntityType extends EntityType { Object to = me.getValue(); if(to == null || !(to instanceof LinkedHashMap)) { String s = to == null ? "null" : to.getClass().getSimpleName(); - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "Unexpected type error: property \"%s\" has type \"%s\" (expected dict)",pdname,s)); continue; } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/TypeValidation.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/TypeValidation.java index c951540..2caf5c4 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/TypeValidation.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/TypeValidation.java @@ -5,6 +5,7 @@ import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.extensions.ExtTools; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class TypeValidation { @@ -70,7 +71,7 @@ public class TypeValidation { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Template \"%s\" contains unknown field \"%s\"", importDef.toString(),name)); } @@ -88,7 +89,7 @@ public class TypeValidation { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTemplateVersion: version \"%s\" in \"%s\" is not supported\n" + "Allowed versions: [%s]", sVersion,importDef.toString(),allowed)); diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Constraint.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Constraint.java index 60b756f..3c60a66 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Constraint.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Constraint.java @@ -5,6 +5,7 @@ import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.ScalarUnit; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public abstract class Constraint { @@ -34,7 +35,7 @@ public abstract class Constraint { if(!(constraint instanceof LinkedHashMap) || ((LinkedHashMap)constraint).size() != 1) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "InvalidSchemaError: Invalid constraint schema " + constraint.toString()); } @@ -72,7 +73,7 @@ public abstract class Constraint { return new Pattern(propname,proptype,constraint); } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidSchemaError: Invalid property \"%s\"",constraintClass)); return null; } @@ -116,7 +117,7 @@ public abstract class Constraint { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidSchemaError: Property \"%s\" is not valid for data type \"%s\"", constraintKey,propertyType)); } @@ -152,7 +153,7 @@ public abstract class Constraint { value = ScalarUnit.getScalarunitValue(propertyType,value,null); } if(!_isValid(value)) { - ExceptionCollector.appendWarning("ValidationError: " + _errMsg(value)); + ThreadLocalsHolder.getCollector().appendWarning("ValidationError: " + _errMsg(value)); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/GreaterOrEqual.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/GreaterOrEqual.java index 168fd92..021bed3 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/GreaterOrEqual.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/GreaterOrEqual.java @@ -4,6 +4,7 @@ import java.util.Date; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.functions.Function; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class GreaterOrEqual extends Constraint { // Constraint class for "greater_or_equal" @@ -37,7 +38,7 @@ public class GreaterOrEqual extends Constraint { super(name,type,c); if(!validTypes.contains(constraintValue.getClass().getSimpleName())) { - ExceptionCollector.appendException("InvalidSchemaError: The property \"greater_or_equal\" expects comparable values"); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: The property \"greater_or_equal\" expects comparable values"); } } @@ -90,7 +91,7 @@ def __init__(self, property_name, property_type, constraint): super(GreaterOrEqual, self).__init__(property_name, property_type, constraint) if not isinstance(self.constraint_value, self.valid_types): - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( InvalidSchemaError(message=_('The property ' '"greater_or_equal" expects ' 'comparable values.'))) diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/GreaterThan.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/GreaterThan.java index 2803bb4..d23d7ce 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/GreaterThan.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/GreaterThan.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api.elements.constraints; import java.util.Date; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class GreaterThan extends Constraint { @@ -34,7 +35,7 @@ public class GreaterThan extends Constraint { super(name,type,c); if(!validTypes.contains(constraintValue.getClass().getSimpleName())) { - ExceptionCollector.appendException("InvalidSchemaError: The property \"greater_than\" expects comparable values"); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: The property \"greater_than\" expects comparable values"); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/InRange.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/InRange.java index 6a5432c..282267d 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/InRange.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/InRange.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api.elements.constraints; import java.util.Date; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import java.util.ArrayList; @@ -45,7 +46,7 @@ public class InRange extends Constraint { super(name,type,c); if(!(constraintValue instanceof ArrayList) || ((ArrayList)constraintValue).size() != 2) { - ExceptionCollector.appendException("InvalidSchemaError: The property \"in_range\" expects a list"); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: The property \"in_range\" expects a list"); } @@ -53,11 +54,11 @@ public class InRange extends Constraint { String msg = "The property \"in_range\" expects comparable values"; for(Object vo: alcv) { if(!validTypes.contains(vo.getClass().getSimpleName())) { - ExceptionCollector.appendException("InvalidSchemaError: " + msg); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: " + msg); } // The only string we allow for range is the special value 'UNBOUNDED' if((vo instanceof String) && !((String)vo).equals(UNBOUNDED)) { - ExceptionCollector.appendException("InvalidSchemaError: " + msg); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: " + msg); } } min = alcv.get(0); diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Length.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Length.java index 939cb2a..4cfd1c0 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Length.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Length.java @@ -1,6 +1,7 @@ package org.openecomp.sdc.toscaparser.api.elements.constraints; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class Length extends Constraint { // Constraint class for "length" @@ -22,7 +23,7 @@ public class Length extends Constraint { super(name,type,c); if(!validTypes.contains(constraintValue.getClass().getSimpleName())) { - ExceptionCollector.appendException("InvalidSchemaError: The property \"length\" expects an integer"); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: The property \"length\" expects an integer"); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/LessOrEqual.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/LessOrEqual.java index f7778b6..00cba36 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/LessOrEqual.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/LessOrEqual.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api.elements.constraints; import java.util.Date; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class LessOrEqual extends Constraint { // Constraint class for "less_or_equal" @@ -36,7 +37,7 @@ public class LessOrEqual extends Constraint { super(name,type,c); if(!validTypes.contains(constraintValue.getClass().getSimpleName())) { - ExceptionCollector.appendException("InvalidSchemaError: The property \"less_or_equal\" expects comparable values"); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: The property \"less_or_equal\" expects comparable values"); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/LessThan.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/LessThan.java index 2432e82..eb5a41d 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/LessThan.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/LessThan.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api.elements.constraints; import java.util.Date; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class LessThan extends Constraint { @@ -34,7 +35,7 @@ public class LessThan extends Constraint { super(name,type,c); if(!validTypes.contains(constraintValue.getClass().getSimpleName())) { - ExceptionCollector.appendException("InvalidSchemaError: The property \"less_than\" expects comparable values"); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: The property \"less_than\" expects comparable values"); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/MaxLength.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/MaxLength.java index d50fd1a..278ae85 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/MaxLength.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/MaxLength.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api.elements.constraints; import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class MaxLength extends Constraint { // Constraint class for "min_length" @@ -25,7 +26,7 @@ public class MaxLength extends Constraint { super(name,type,c); if(!validTypes.contains(constraintValue.getClass().getSimpleName())) { - ExceptionCollector.appendException("InvalidSchemaError: The property \"max_length\" expects an integer"); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: The property \"max_length\" expects an integer"); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/MinLength.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/MinLength.java index 50fe7a1..480c878 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/MinLength.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/MinLength.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api.elements.constraints; import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class MinLength extends Constraint { // Constraint class for "min_length" @@ -25,7 +26,7 @@ public class MinLength extends Constraint { super(name,type,c); if(!validTypes.contains(constraintValue.getClass().getSimpleName())) { - ExceptionCollector.appendException("InvalidSchemaError: The property \"min_length\" expects an integer"); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: The property \"min_length\" expects an integer"); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Pattern.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Pattern.java index 2fa5a2f..444a73c 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Pattern.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Pattern.java @@ -4,6 +4,7 @@ import java.util.regex.Matcher; import java.util.regex.PatternSyntaxException; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class Pattern extends Constraint { @@ -23,7 +24,7 @@ public class Pattern extends Constraint { super(name,type,c); if(!validTypes.contains(constraintValue.getClass().getSimpleName())) { - ExceptionCollector.appendException("InvalidSchemaError: The property \"pattern\" expects a string"); + ThreadLocalsHolder.getCollector().appendException("InvalidSchemaError: The property \"pattern\" expects a string"); } } @@ -31,7 +32,7 @@ public class Pattern extends Constraint { protected boolean _isValid(Object value) { try { if(!(value instanceof String)) { - ExceptionCollector.appendException(String.format("ValueError: Input value \"%s\" to \"pattern\" property \"%s\" must be a string", + ThreadLocalsHolder.getCollector().appendException(String.format("ValueError: Input value \"%s\" to \"pattern\" property \"%s\" must be a string", value.toString(),propertyName)); return false; } @@ -45,7 +46,7 @@ public class Pattern extends Constraint { return false; } catch(PatternSyntaxException pse) { - ExceptionCollector.appendException(String.format("ValueError: Invalid regex \"%s\" in \"pattern\" property \"%s\"", + ThreadLocalsHolder.getCollector().appendException(String.format("ValueError: Invalid regex \"%s\" in \"pattern\" property \"%s\"", constraintValue.toString(),propertyName)); return false; } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Schema.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Schema.java index eb4b6ce..ca721e6 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Schema.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/elements/constraints/Schema.java @@ -6,6 +6,7 @@ import java.util.LinkedHashMap; import java.util.Map; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class Schema { @@ -70,14 +71,14 @@ public class Schema { if(!(_schemaDict instanceof LinkedHashMap)) { //msg = (_('Schema definition of "%(pname)s" must be a dict.') // % dict(pname=name)) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidSchemaError: Schema definition of \"%s\" must be a dict",name)); } if(_schemaDict.get("type") == null) { //msg = (_('Schema definition of "%(pname)s" must have a "type" ' // 'attribute.') % dict(pname=name)) - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidSchemaError: Schema definition of \"%s\" must have a \"type\" attribute",name)); } @@ -121,7 +122,7 @@ public class Schema { } else { // error - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Constraint type \"%s\" for property \"%s\" is not supported", cClass,name)); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/Concat.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/Concat.java index 9f29dd2..6dc7deb 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/Concat.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/Concat.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import org.openecomp.sdc.toscaparser.api.TopologyTemplate; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class Concat extends Function { // Validate the function and provide an instance of the function @@ -36,7 +37,7 @@ public class Concat extends Function { @Override void validate() { if(args.size() < 1) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValueError: Invalid arguments for function \"concat\". " + "Expected at least one argument"); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetAttribute.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetAttribute.java index 5536dc5..549073b 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetAttribute.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetAttribute.java @@ -3,11 +3,7 @@ package org.openecomp.sdc.toscaparser.api.functions; import java.util.ArrayList; import java.util.LinkedHashMap; -import org.openecomp.sdc.toscaparser.api.Capability; -import org.openecomp.sdc.toscaparser.api.EntityTemplate; -import org.openecomp.sdc.toscaparser.api.NodeTemplate; -import org.openecomp.sdc.toscaparser.api.RelationshipTemplate; -import org.openecomp.sdc.toscaparser.api.TopologyTemplate; +import org.openecomp.sdc.toscaparser.api.*; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.AttributeDef; import org.openecomp.sdc.toscaparser.api.elements.CapabilityTypeDef; @@ -18,6 +14,7 @@ import org.openecomp.sdc.toscaparser.api.elements.PropertyDef; import org.openecomp.sdc.toscaparser.api.elements.RelationshipType; import org.openecomp.sdc.toscaparser.api.elements.StatefulEntityType; import org.openecomp.sdc.toscaparser.api.elements.constraints.Schema; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class GetAttribute extends Function { // Get an attribute value of an entity defined in the service template @@ -49,7 +46,7 @@ public class GetAttribute extends Function { @Override void validate() { if(args.size() < 2) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValueError: Illegal arguments for function \"get_attribute\". Expected arguments: \"node-template-name\", \"req-or-cap\" (optional), \"property name.\""); return; } @@ -80,7 +77,7 @@ public class GetAttribute extends Function { for(Object elem: args.subList(index,args.size())) { if(valueType.equals("list")) { if(!(elem instanceof Integer)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: Illegal arguments for function \"get_attribute\" \"%s\". Expected positive integer argument", elem.toString())); } @@ -102,7 +99,7 @@ public class GetAttribute extends Function { } } if(bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: 'Illegal arguments for function \"get_attribute\". Unexpected attribute/index value \"%d\"", elem)); return; @@ -116,7 +113,7 @@ public class GetAttribute extends Function { valueType = (String)prop.getSchema().get("type"); } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Illegal arguments for function \"get_attribute\". Attribute name \"%s\" not found in \"%\"", elem,valueType)); } @@ -150,7 +147,7 @@ public class GetAttribute extends Function { if(nodeTpl != null && !_attributeExistsInType(nodeTpl.getTypeDefinition()) && !nodeTpl.getProperties().keySet().contains(getAttributeName())) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Attribute \"%s\" was not found in node template \"%s\"", getAttributeName(),nodeTpl.getName())); } @@ -196,13 +193,13 @@ public class GetAttribute extends Function { // Currently this is the only way to tell whether the function // is used within the outputs section of the TOSCA template. if(context instanceof ArrayList) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValueError: \"get_attribute: [ HOST, ... ]\" is not allowed in \"outputs\" section of the TOSCA template"); return null; } NodeTemplate nodeTpl = _findHostContainingAttribute(SELF); if(nodeTpl == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"get_attribute: [ HOST, ... ]\" was used in " + "node template \"%s\" but \"%s\" was not found in " + "the relationship chain",((NodeTemplate)context).getName(),HOSTED_ON)); @@ -212,7 +209,7 @@ public class GetAttribute extends Function { } if(nodeTemplateName.equals(TARGET)) { if(!(((EntityTemplate)context).getTypeDefinition() instanceof RelationshipType)) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "KeyError: \"TARGET\" keyword can only be used in context " + " to \"Relationships\" target node"); return null; @@ -221,7 +218,7 @@ public class GetAttribute extends Function { } if(nodeTemplateName.equals(SOURCE)) { if(!(((EntityTemplate)context).getTypeDefinition() instanceof RelationshipType)) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "KeyError: \"SOURCE\" keyword can only be used in context " + " to \"Relationships\" source node"); return null; @@ -240,7 +237,7 @@ public class GetAttribute extends Function { return nt; } } - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Node template \"%s\" was not found",nodeTemplateName)); return null; } @@ -279,7 +276,7 @@ public class GetAttribute extends Function { attribute = attrs.get(attrName); } if(attribute == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Attribute \"%s\" was not found in capability \"%s\" of node template \"%s\" referenced from node template \"%s\"", attrName,capabilityName,nodeTemplate.getName(),((NodeTemplate)context).getName())); } @@ -288,7 +285,7 @@ public class GetAttribute extends Function { String msg = String.format( "Requirement/Capability \"%s\" referenced from node template \"%s\" was not found in node template \"%s\"", capabilityName,((NodeTemplate)context).getName(),nodeTemplate.getName()); - ExceptionCollector.appendException("KeyError: " + msg); + ThreadLocalsHolder.getCollector().appendException("KeyError: " + msg); return null; } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetInput.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetInput.java index df32699..4332f70 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetInput.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetInput.java @@ -7,6 +7,7 @@ import org.openecomp.sdc.toscaparser.api.DataEntity; import org.openecomp.sdc.toscaparser.api.TopologyTemplate; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.parameters.Input; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class GetInput extends Function { @@ -18,8 +19,8 @@ public class GetInput extends Function { @Override void validate() { if(args.size() != 1) { - //ERROR under investigation - ExceptionCollector.appendWarning(String.format( + //PA - changed to WARNING from CRITICAL after talking to Renana, 22/05/2017 + ThreadLocalsHolder.getCollector().appendWarning(String.format( "ValueError: Expected one argument for function \"get_input\" but received \"%s\"", args.toString())); } @@ -31,7 +32,7 @@ public class GetInput extends Function { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownInputError: Unknown input \"%s\"",args.get(0))); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetOperationOutput.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetOperationOutput.java index f2231a1..22f2cd7 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetOperationOutput.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetOperationOutput.java @@ -2,14 +2,12 @@ package org.openecomp.sdc.toscaparser.api.functions; import java.util.ArrayList; -import org.openecomp.sdc.toscaparser.api.EntityTemplate; -import org.openecomp.sdc.toscaparser.api.NodeTemplate; -import org.openecomp.sdc.toscaparser.api.RelationshipTemplate; -import org.openecomp.sdc.toscaparser.api.TopologyTemplate; +import org.openecomp.sdc.toscaparser.api.*; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.InterfacesDef; import org.openecomp.sdc.toscaparser.api.elements.RelationshipType; import org.openecomp.sdc.toscaparser.api.elements.StatefulEntityType; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class GetOperationOutput extends Function { @@ -25,7 +23,7 @@ public class GetOperationOutput extends Function { _findOperationName(interfaceName,(String)args.get(2)); } else { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValueError: Illegal arguments for function \"get_operation_output\". " + "Expected arguments: \"template_name\",\"interface_name\"," + "\"operation_name\",\"output_variable_name\""); @@ -44,7 +42,7 @@ public class GetOperationOutput extends Function { return _interfaceName; } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: invalid interface name \"%s\" in \"get_operation_output\"", _interfaceName)); return null; @@ -66,7 +64,7 @@ public class GetOperationOutput extends Function { return operationName; } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: Invalid operation of Configure interface \"%s\" in \"get_operation_output\"", operationName)); return null; @@ -85,14 +83,14 @@ public class GetOperationOutput extends Function { return operationName; } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: Invalid operation of Configure interface \"%s\" in \"get_operation_output\"", operationName)); return null; } } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: Invalid interface name \"%s\" in \"get_operation_output\"", interfaceName)); return null; @@ -102,7 +100,7 @@ public class GetOperationOutput extends Function { private NodeTemplate _findNodeTemplate(String nodeTemplateName) { if(nodeTemplateName.equals(TARGET)) { if(!(((EntityTemplate)context).getTypeDefinition() instanceof RelationshipType)) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "KeyError: \"TARGET\" keyword can only be used in context " + " to \"Relationships\" target node"); return null; @@ -111,7 +109,7 @@ public class GetOperationOutput extends Function { } if(nodeTemplateName.equals(SOURCE)) { if(!(((EntityTemplate)context).getTypeDefinition() instanceof RelationshipType)) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "KeyError: \"SOURCE\" keyword can only be used in context " + " to \"Relationships\" source node"); return null; @@ -130,7 +128,7 @@ public class GetOperationOutput extends Function { return nt; } } - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Node template \"%s\" was not found",nodeTemplateName)); return null; } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetProperty.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetProperty.java index e55250c..3550542 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetProperty.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/GetProperty.java @@ -3,11 +3,7 @@ package org.openecomp.sdc.toscaparser.api.functions; import java.util.ArrayList; import java.util.LinkedHashMap; -import org.openecomp.sdc.toscaparser.api.Capability; -import org.openecomp.sdc.toscaparser.api.NodeTemplate; -import org.openecomp.sdc.toscaparser.api.Property; -import org.openecomp.sdc.toscaparser.api.RelationshipTemplate; -import org.openecomp.sdc.toscaparser.api.TopologyTemplate; +import org.openecomp.sdc.toscaparser.api.*; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.CapabilityTypeDef; import org.openecomp.sdc.toscaparser.api.elements.EntityType; @@ -15,6 +11,7 @@ import org.openecomp.sdc.toscaparser.api.elements.NodeType; import org.openecomp.sdc.toscaparser.api.elements.PropertyDef; import org.openecomp.sdc.toscaparser.api.elements.RelationshipType; import org.openecomp.sdc.toscaparser.api.elements.StatefulEntityType; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class GetProperty extends Function { // Get a property value of an entity defined in the same service template @@ -50,7 +47,7 @@ public class GetProperty extends Function { @Override void validate() { if(args.size() < 2) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValueError: Illegal arguments for function \"get_property\". Expected arguments: \"node-template-name\", \"req-or-cap\" (optional), \"property name.\""); return; } @@ -139,14 +136,14 @@ public class GetProperty extends Function { property = ((Property)props.get(propertyName)).getValue(); } if(property == null && throwErrors) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Property \"%s\" was not found in capability \"%s\" of node template \"%s\" referenced from node template \"%s\"", propertyName,capabilityName,nodeTemplate.getName(),((NodeTemplate)context).getName())); } return property; } if(throwErrors) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Requirement/Capability \"%s\" referenced from node template \"%s\" was not found in node template \"%s\"", capabilityName,((NodeTemplate)context).getName(),nodeTemplate.getName())); } @@ -162,7 +159,7 @@ public class GetProperty extends Function { LinkedHashMap props = nodeTpl.getProperties(); Property found = props.get(propertyName); if(found == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Property \"%s\" was not found in node template \"%s\"", propertyName,nodeTpl.getName())); } @@ -177,7 +174,7 @@ public class GetProperty extends Function { if(nodeTemplateName.equals(HOST)) { NodeTemplate node = _findHostContainingProperty(null); if(node == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Property \"%s\" was not found in capability \"%s\" of node template \"%s\" referenced from node template \"%s\"", (String)args.get(2),(String)args.get(1),((NodeTemplate)context).getName())); return null; @@ -186,7 +183,7 @@ public class GetProperty extends Function { } if(nodeTemplateName.equals(TARGET)) { if(!(((RelationshipTemplate)context).getTypeDefinition() instanceof RelationshipType)) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "KeyError: \"TARGET\" keyword can only be used in context to \"Relationships\" target node"); return null; } @@ -194,7 +191,7 @@ public class GetProperty extends Function { } if(nodeTemplateName.equals(SOURCE)) { if(!(((RelationshipTemplate)context).getTypeDefinition() instanceof RelationshipType)) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "KeyError: \"SOURCE\" keyword can only be used in context to \"Relationships\" target node"); return null; } @@ -208,7 +205,7 @@ public class GetProperty extends Function { return nodeTemplate; } } - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Node template \"%s\" was not found. Referenced from Node Template \"%s\"", nodeTemplateName,((NodeTemplate)context).getName())); @@ -222,14 +219,14 @@ public class GetProperty extends Function { return ((ArrayList)value).get(index); } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Property \"%s\" found in capability \"%s\" referenced from node template \"%s\" must have an element with index %d", args.get(2),args.get(1),((NodeTemplate)context).getName(),index)); } } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Property \"%s\" found in capability \"%s\" referenced from node template \"%s\" must be a list", args.get(2),args.get(1),((NodeTemplate)context).getName())); } @@ -244,13 +241,13 @@ public class GetProperty extends Function { return ov; } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Property \"%s\" found in capability \"%s\" referenced from node template \"%s\" must have an attribute named \"%s\"", args.get(2),args.get(1),((NodeTemplate)context).getName(),attribute)); } } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "KeyError: Property \"%s\" found in capability \"%s\" referenced from node template \"%s\" must be a dict", args.get(2),args.get(1),((NodeTemplate)context).getName())); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/Token.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/Token.java index e282d8a..4438908 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/Token.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/functions/Token.java @@ -6,6 +6,7 @@ import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.NodeTemplate; import org.openecomp.sdc.toscaparser.api.TopologyTemplate; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class Token extends Function { // Validate the function and provide an instance of the function @@ -41,19 +42,19 @@ public class Token extends Function { @Override void validate() { if(args.size() < 3) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValueError: Invalid arguments for function \"token\". " + "Expected at least three arguments"); } else { if(!(args.get(1) instanceof String) || ((String)args.get(1)).length() != 1) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValueError: Invalid arguments for function \"token\". " + "Expected single char value as second argument"); } if(!(args.get(2) instanceof Integer)) { - ExceptionCollector.appendException( + ThreadLocalsHolder.getCollector().appendException( "ValueError: Invalid arguments for function \"token\"" + "Expected integer value as third argument"); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Input.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Input.java index 96958ce..7b3e64f 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Input.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Input.java @@ -9,6 +9,7 @@ import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.EntityType; import org.openecomp.sdc.toscaparser.api.elements.constraints.Constraint; import org.openecomp.sdc.toscaparser.api.elements.constraints.Schema; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class Input { @@ -88,7 +89,7 @@ public class Input { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Input \"%s\" contains unknown field \"%s\"", name,key)); } @@ -111,7 +112,7 @@ public class Input { } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: Invalid type \"%s\"",inputType)); } } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Output.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Output.java index e987996..34ecf12 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Output.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Output.java @@ -3,6 +3,7 @@ package org.openecomp.sdc.toscaparser.api.parameters; import java.util.LinkedHashMap; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class Output { @@ -33,13 +34,13 @@ public class Output { private void _validateField() { if(!(attrs instanceof LinkedHashMap)) { //TODO wrong error message... - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValidationError: Output \"%s\" has wrong type. Expecting a dict", name)); } if(getValue() == null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "MissingRequiredFieldError: Output \"%s\" is missing required \"%s\"", name,VALUE)); } @@ -52,7 +53,7 @@ public class Output { } } if(!bFound) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "UnknownFieldError: Output \"%s\" contains unknown field \"%s\"", name,key)); } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/prereq/CSAR.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/prereq/CSAR.java index 2ab5d26..85b54ee 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/prereq/CSAR.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/prereq/CSAR.java @@ -18,8 +18,9 @@ import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import org.openecomp.sdc.toscaparser.api.ImportsLoader; -import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; -import org.openecomp.sdc.toscaparser.api.elements.Metadata; +import org.openecomp.sdc.toscaparser.api.common.JToscaException; +import org.openecomp.sdc.toscaparser.api.utils.JToscaErrorCodes; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.openecomp.sdc.toscaparser.api.utils.UrlUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,7 +53,7 @@ public class CSAR { } @SuppressWarnings("unchecked") - public boolean validate() { + public boolean validate() throws JToscaException { isValidated = true; //validate that the file or URL exists @@ -60,7 +61,7 @@ public class CSAR { if(isFile) { File f = new File(path); if (!f.isFile()) { - ExceptionCollector.appendException(String.format("\"%s\" is not a file", path)); + ThreadLocalsHolder.getCollector().appendException(String.format("\"%s\" is not a file", path)); return false; } else { @@ -69,7 +70,7 @@ public class CSAR { } else { if(!UrlUtils.validateUrl(path)) { - ExceptionCollector.appendException(String.format("ImportError: \"%s\" does not exist",path)); + ThreadLocalsHolder.getCollector().appendException(String.format("ImportError: \"%s\" does not exist",path)); return false; } // get it to a local file @@ -81,7 +82,7 @@ public class CSAR { Files.copy(in,ptf,StandardCopyOption.REPLACE_EXISTING); } catch(Exception e) { - ExceptionCollector.appendException("ImportError: failed to load CSAR from " + path); + ThreadLocalsHolder.getCollector().appendException("ImportError: failed to load CSAR from " + path); return false; } @@ -102,7 +103,7 @@ public class CSAR { } - private void _parseAndValidateMetaProperties() { + private void _parseAndValidateMetaProperties() throws JToscaException { ZipFile zf = null; @@ -114,16 +115,21 @@ public class CSAR { raf.close(); // check if Zip's magic number if (n != 0x504B0304) { - throw new IOException(String.format("\"%s\" is not a valid zip file", csar)); + String errorString = String.format("\"%s\" is not a valid zip file", csar); + log.error(errorString); + throw new JToscaException(errorString , JToscaErrorCodes.INVALID_CSAR_FORMAT.getValue()); } // validate that it contains the metadata file in the correct location zf = new ZipFile(csar); ZipEntry ze = zf.getEntry("TOSCA-Metadata/TOSCA.meta"); if (ze == null) { - throw new IOException(String.format( + + String errorString = String.format( "\"%s\" is not a valid CSAR as it does not contain the " + - "required file \"TOSCA.meta\" in the folder \"TOSCA-Metadata\"", csar)); + "required file \"TOSCA.meta\" in the folder \"TOSCA-Metadata\"", csar); + log.error(errorString); + throw new JToscaException(errorString, JToscaErrorCodes.MISSING_META_FILE.getValue()); } //Going over expected metadata files and parsing them @@ -134,22 +140,31 @@ public class CSAR { if (ze != null) { InputStream inputStream = zf.getInputStream(ze); n = inputStream.read(ba, 0, 4096); - String md = new String(ba); md = md.substring(0, (int) n); - Yaml yaml = new Yaml(); - Object mdo = yaml.load(md); - if (!(mdo instanceof LinkedHashMap)) { - throw new IOException(String.format( - "The file \"%s\" in the" + - " CSAR \"%s\" does not contain valid YAML content", ze.getName(), csar)); + + String errorString = String.format( + "The file \"%s\" in the" + + " CSAR \"%s\" does not contain valid YAML content", ze.getName(), csar); + + try { + Yaml yaml = new Yaml(); + Object mdo = yaml.load(md); + if (!(mdo instanceof LinkedHashMap)) { + log.error(errorString); + throw new JToscaException(errorString, JToscaErrorCodes.INVALID_META_YAML_CONTENT.getValue()); + } + + String[] split = ze.getName().split("/"); + String fileName = split[split.length - 1]; + + if (!metaProperties.containsKey(fileName)) { + metaProperties.put(fileName, (LinkedHashMap) mdo); + } } - - String[] split = ze.getName().split("/"); - String fileName = split[split.length - 1]; - - if (!metaProperties.containsKey(fileName)) { - metaProperties.put(fileName, (LinkedHashMap) mdo); + catch(Exception e) { + log.error(errorString); + throw new JToscaException(errorString, JToscaErrorCodes.INVALID_META_YAML_CONTENT.getValue()); } } } @@ -157,9 +172,11 @@ public class CSAR { // verify it has "Entry-Definition" String edf = _getMetadata("Entry-Definitions"); if (edf == null) { - throw new IOException(String.format( + String errorString = String.format( "The CSAR \"%s\" is missing the required metadata " + - "\"Entry-Definitions\" in \"TOSCA-Metadata/TOSCA.meta\"", csar)); + "\"Entry-Definitions\" in \"TOSCA-Metadata/TOSCA.meta\"", csar); + log.error(errorString); + throw new JToscaException(errorString, JToscaErrorCodes.ENTRY_DEFINITION_NOT_DEFINED.getValue()); } //validate that "Entry-Definitions' metadata value points to an existing file in the CSAR @@ -173,11 +190,16 @@ public class CSAR { } } if (!foundEDF) { - throw new IOException(String.format( - "The \"Entry-Definitions\" file defined in the CSAR \"%s\" does not exist", csar)); + String errorString = String.format( + "The \"Entry-Definitions\" file defined in the CSAR \"%s\" does not exist", csar); + log.error(errorString); + throw new JToscaException(errorString, JToscaErrorCodes.MISSING_ENTRY_DEFINITION_FILE.getValue()); } + } catch (JToscaException e) { + //ThreadLocalsHolder.getCollector().appendCriticalException(e.getMessage()); + throw e; } catch (Exception e) { - ExceptionCollector.appendException("ValidationError: " + e.getMessage()); + ThreadLocalsHolder.getCollector().appendException("ValidationError: " + e.getMessage()); errorCaught = true; } @@ -199,7 +221,7 @@ public class CSAR { } } - private String _getMetadata(String key) { + private String _getMetadata(String key) throws JToscaException { if(!isValidated) { validate(); } @@ -207,11 +229,11 @@ public class CSAR { return value != null ? value.toString() : null; } - public String getAuthor() { + public String getAuthor() throws JToscaException { return _getMetadata("Created-By"); } - public String getVersion() { + public String getVersion() throws JToscaException { return _getMetadata("CSAR-Version"); } @@ -223,7 +245,7 @@ public class CSAR { return metaProperties.get(propertiesFile); } - public String getMainTemplate() { + public String getMainTemplate() throws JToscaException { String entryDef = _getMetadata("Entry-Definitions"); ZipFile zf; boolean ok = false; @@ -246,7 +268,7 @@ public class CSAR { } @SuppressWarnings("unchecked") - public LinkedHashMap getMainTemplateYaml() { + public LinkedHashMap getMainTemplateYaml() throws JToscaException { String mainTemplate = tempDir + File.separator + getMainTemplate(); if(mainTemplate != null) { try { @@ -259,7 +281,7 @@ public class CSAR { return (LinkedHashMap)data; } catch(Exception e) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "The file \"%s\" in the CSAR \"%s\" does not " + "contain valid TOSCA YAML content", mainTemplate,csar)); @@ -268,7 +290,7 @@ public class CSAR { return null; } - public String getDescription() { + public String getDescription() throws JToscaException { String desc = _getMetadata("Description"); if(desc != null) { return desc; @@ -283,7 +305,7 @@ public class CSAR { return tempDir; } - public void decompress() throws IOException { + public void decompress() throws IOException, JToscaException { if(!isValidated) { validate(); } @@ -292,7 +314,7 @@ public class CSAR { } - private void _validateExternalReferences() { + private void _validateExternalReferences() throws JToscaException { // Extracts files referenced in the main template // These references are currently supported: // * imports @@ -339,7 +361,7 @@ public class CSAR { } } else { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: Unexpected artifact definition for \"%s\"", artifactKey)); errorCaught = true; @@ -407,12 +429,12 @@ public class CSAR { return; } else { - ExceptionCollector.appendException(msg); + ThreadLocalsHolder.getCollector().appendException(msg); errorCaught = true; } } catch (Exception e) { - ExceptionCollector.appendException(msg); + ThreadLocalsHolder.getCollector().appendException(msg); } } @@ -424,7 +446,7 @@ public class CSAR { } if(raiseExc) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: The resource \"%s\" does not exist",resourceFile)); } errorCaught = true; diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/JToscaErrorCodes.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/JToscaErrorCodes.java new file mode 100644 index 0000000..354fef0 --- /dev/null +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/JToscaErrorCodes.java @@ -0,0 +1,32 @@ +package org.openecomp.sdc.toscaparser.api.utils; + + +public enum JToscaErrorCodes { + MISSING_META_FILE("JT1001"), + INVALID_META_YAML_CONTENT("JT1002"), + ENTRY_DEFINITION_NOT_DEFINED("JT1003"), + MISSING_ENTRY_DEFINITION_FILE ("JT1004"), + GENERAL_ERROR("JT1005"), + PATH_NOT_VALID("JT1006"), + CSAR_TOSCA_VALIDATION_ERROR("JT1007"), + INVALID_CSAR_FORMAT("JT1008"); + + private String value; + + private JToscaErrorCodes(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public static JToscaErrorCodes getByCode(String code) { + for(JToscaErrorCodes v : values()){ + if( v.getValue().equals(code)){ + return v; + } + } + return null; + } +} \ No newline at end of file diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/TOSCAVersionProperty.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/TOSCAVersionProperty.java index 7c6b62f..6b3c1ce 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/TOSCAVersionProperty.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/TOSCAVersionProperty.java @@ -35,7 +35,7 @@ public class TOSCAVersionProperty {// test with functions/test_concat.yaml Pattern pattern = Pattern.compile(versionRe); Matcher matcher = pattern.matcher(version); if(!matcher.find()) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTOSCAVersionPropertyException: " + "Value of TOSCA version property \"%s\" is invalid", version)); @@ -77,7 +77,7 @@ public class TOSCAVersionProperty {// test with functions/test_concat.yaml if((fixVersion == null && value != null) || (minorVersion.equals("0") && majorVersion.equals("0") && fixVersion.equals("0") && value != null)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTOSCAVersionPropertyException: " + "Value of TOSCA version property \"%s\" is invalid", version)); @@ -92,7 +92,7 @@ public class TOSCAVersionProperty {// test with functions/test_concat.yaml // Eg: version = 18.0.0-1 is invalid. if(qualifier == null && value != null) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "InvalidTOSCAVersionPropertyException: " + "Value of TOSCA version property \"%s\" is invalid", version)); diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/ThreadLocalsHolder.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/ThreadLocalsHolder.java new file mode 100644 index 0000000..47ba972 --- /dev/null +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/ThreadLocalsHolder.java @@ -0,0 +1,24 @@ +package org.openecomp.sdc.toscaparser.api.utils; + +import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; + +public class ThreadLocalsHolder { + + private static final ThreadLocal exceptionCollectorThreadLocal = new ThreadLocal<>(); + + private ThreadLocalsHolder(){} + + public static ExceptionCollector getCollector() { + return exceptionCollectorThreadLocal.get(); + } + + public static void setCollector(ExceptionCollector exceptionCollector) { + cleanup(); + exceptionCollectorThreadLocal.set(exceptionCollector); + } + + public static void cleanup(){ + exceptionCollectorThreadLocal.remove(); + } + +} diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/UrlUtils.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/UrlUtils.java index 0aadcfe..092f827 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/UrlUtils.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/UrlUtils.java @@ -34,7 +34,7 @@ public class UrlUtils { // relative_path: heat-translator // - joined: http://www.githib.com/openstack/heat-translator if(!validateUrl(sUrl)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: The URL \"%s\" is malformed",sUrl)); } try { @@ -42,7 +42,7 @@ public class UrlUtils { return (new URL(base,relativePath)).toString(); } catch(MalformedURLException e) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: Joining URL \"%s\" and relative path \"%s\" caused an exception",sUrl,relativePath)); return sUrl; } diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/ValidateUtils.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/ValidateUtils.java index 675ab16..291316f 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/ValidateUtils.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/utils/ValidateUtils.java @@ -34,7 +34,7 @@ public class ValidateUtils { public static Object validateNumeric(Object value) { if(!(value instanceof Number)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a numeric",value.toString())); } return value; @@ -46,7 +46,7 @@ public class ValidateUtils { if(value instanceof Boolean) { return (Boolean)value ? 1 : 0; } - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not an integer",value.toString())); } return value; @@ -54,7 +54,7 @@ public class ValidateUtils { public static Object validateFloat(Object value) { if(!(value instanceof Float || value instanceof Double)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a float",value.toString())); } return value; @@ -62,7 +62,7 @@ public class ValidateUtils { public static Object validateString(Object value) { if(!(value instanceof String)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \'%s\' is not a string",value.toString())); } return value; @@ -70,7 +70,7 @@ public class ValidateUtils { public static Object validateList(Object value) { if(!(value instanceof ArrayList)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a list",value.toString())); } return value; @@ -83,7 +83,7 @@ public class ValidateUtils { validateList(range); // validate range list has a min and max if(range instanceof ArrayList && ((ArrayList)range).size() != 2) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a valid range",range.toString())); // too dangerous to continue... return range; @@ -96,7 +96,7 @@ public class ValidateUtils { if(!(r0 instanceof Integer) && !(r0 instanceof Float) || !(r1 instanceof Integer) && !(r1 instanceof Float)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a valid range",range.toString())); // too dangerous to continue... return range; @@ -121,7 +121,7 @@ public class ValidateUtils { if(!minTest && !maxTest) { // Note: min == max is allowed if(min > max) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError:\"%s\" is not a valid range",range.toString())); } } @@ -132,7 +132,7 @@ public class ValidateUtils { public static Object validateValueInRange(Object value,Object range,String propName) { // verify all 3 are numeric and convert to Floats if(!(value instanceof Integer || value instanceof Float)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: validateInRange: \"%s\" is not a number",range.toString())); return value; } @@ -144,7 +144,7 @@ public class ValidateUtils { // better safe than sorry... // validate that range list has a min and max if(range instanceof ArrayList && ((ArrayList)range).size() != 2) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a valid range",range.toString())); // too dangerous to continue... return value; @@ -157,7 +157,7 @@ public class ValidateUtils { if(!(r0 instanceof Integer) && !(r0 instanceof Float) || !(r1 instanceof Integer) && !(r1 instanceof Float)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a valid range",range.toString())); // too dangerous to continue... return value; @@ -182,7 +182,7 @@ public class ValidateUtils { if(!minTest && !maxTest) { // Note: min == max is allowed if(min > max) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError:\"%s\" is not a valid range",range.toString())); } } @@ -201,7 +201,7 @@ public class ValidateUtils { } } if(bError) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "RangeValueError: Property \"%s\", \"%s\" not in range [\"%s\" - \"%s\"", propName,value.toString(),r0.toString(),r1.toString())); } @@ -210,7 +210,7 @@ public class ValidateUtils { public static Object validateMap(Object ob) { if(!(ob instanceof LinkedHashMap)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError\"%s\" is not a map.",ob.toString())); } return ob; @@ -226,7 +226,7 @@ public class ValidateUtils { return normalized.equals("true"); } } - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a boolean",value.toString())); return value; } @@ -249,7 +249,7 @@ public class ValidateUtils { // timestamps are loaded as Date objects by the YAML parser if(!(value instanceof Date)) { - ExceptionCollector.appendException(String.format( + ThreadLocalsHolder.getCollector().appendException(String.format( "ValueError: \"%s\" is not a valid timestamp", value.toString())); diff --git a/jtosca/src/test/resources/csars/service-ServiceFdnt-csar.csar b/jtosca/src/test/resources/csars/service-ServiceFdnt-csar.csar new file mode 100644 index 0000000000000000000000000000000000000000..983dc9b6a6133068f89aaeefbcbd16ecd07a0010 GIT binary patch literal 40171 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 qwqHo;Ts+7Wq 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 z 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.openecomp.sdc.sdc-distribution-client sdc-main-distribution-client - 1.1.13-SNAPSHOT + 1.1.14-SNAPSHOT pom diff --git a/sdc-distribution-ci/pom.xml b/sdc-distribution-ci/pom.xml index 68cbd9c..6a6b80f 100644 --- a/sdc-distribution-ci/pom.xml +++ b/sdc-distribution-ci/pom.xml @@ -6,7 +6,7 @@ org.openecomp.sdc.sdc-distribution-client sdc-main-distribution-client - 1.1.13-SNAPSHOT + 1.1.14-SNAPSHOT sdc-distribution-ci diff --git a/sdc-distribution-ci/src/main/java/org/openecomp/test/CsarToscaTester.java b/sdc-distribution-ci/src/main/java/org/openecomp/test/CsarToscaTester.java index b07de08..08688fa 100644 --- a/sdc-distribution-ci/src/main/java/org/openecomp/test/CsarToscaTester.java +++ b/sdc-distribution-ci/src/main/java/org/openecomp/test/CsarToscaTester.java @@ -8,80 +8,66 @@ import java.util.Arrays; import java.util.Date; import java.util.List; -import org.openecomp.sdc.tosca.parser.api.ISdcCsarHelper; +import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.openecomp.sdc.tosca.parser.impl.SdcPropertyNames; import org.openecomp.sdc.tosca.parser.impl.SdcToscaParserFactory; -import org.openecomp.sdc.toscaparser.api.NodeTemplate; -import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; -import org.openecomp.sdc.toscaparser.api.parameters.Input; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; public class CsarToscaTester { public static void main(String[] args) throws Exception { - ClassLoader loader = CsarToscaTester.class.getClassLoader(); System.out.println("CsarToscaParser - path to CSAR's Directory is " + Arrays.toString(args)); SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); - - File folder = new File(args[0].toString()); + + File folder = new File(args[0]); File[] listOfFiles = folder.listFiles(); - FileWriter fw; - Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("d-MM-y-HH_mm_ss"); String time = dateFormat.format(now); - String csarsDir = args[1].toString() + "/csar-reports-" + time; + String csarsDir = args[1] + "/csar-reports-" + time; File dir = new File(csarsDir); dir.mkdir(); - - + + for (File file : listOfFiles) { if (file.isFile()) { - System.out.println("File " + file.getAbsolutePath()); - ExceptionCollector.clear(); - String name = file.getName(); - String currentCsarDir = csarsDir+"/"+name+"-"+time; + System.out.println("File " + file.getAbsolutePath()); + String name = file.getName(); + String currentCsarDir = csarsDir+"/"+name+"-"+time; dir = new File(currentCsarDir); dir.mkdir(); - ISdcCsarHelper csarHelper = factory.getSdcCsarHelper(file.getAbsolutePath()); - List vflist = csarHelper.getServiceVfList(); - List inputs = csarHelper.getServiceInputs(); - List exceptionReport = ExceptionCollector.getCriticalsReport(); - //System.out.println("CRITICALS during CSAR parsing are: " + (exceptionReport != null ? exceptionReport.toString() : "none")); - List warningsReport = ExceptionCollector.getWarningsReport(); - //System.out.println("WARNINGS during CSAR parsing are: " + (warningsReport != null ? warningsReport.toString() : "none")); - - - - if (!exceptionReport.isEmpty()) { - - try { - fw = new FileWriter(new File(currentCsarDir + "/" + exceptionReport.size() / 2 + "-critical-" + name +"-"+time + ".txt")); - for (String exception : exceptionReport) { - fw.write(exception); - fw.write("\r\n"); - } - fw.close(); - - fw = new FileWriter(new File(currentCsarDir + "/" + warningsReport.size() / 2 + "-warning-" + name +"-"+time + ".txt")); - for (String warning : warningsReport) { - fw.write(warning); - fw.write("\r\n"); - } - fw.close(); - - - //TODO - fw = new FileWriter(new File(currentCsarDir + "/" + exceptionReport.size() / 2 + "-critical-" + name +"-"+time + ".txt")); - for (String critical : exceptionReport) { - fw.write(critical); - fw.write("\r\n"); - } - fw.close(); - - } catch (IOException ex) { - ex.printStackTrace(); - } + try { + factory.getSdcCsarHelper(file.getAbsolutePath()); + } catch (SdcToscaParserException e){ + System.out.println("SdcToscaParserException caught. Code: "+e.getCode()+", message: "+ e.getMessage()); } - } - + List notAnalyzedReport = ThreadLocalsHolder.getCollector().getNotAnalyzedExceptionsReport(); + System.out.println("NOT ANALYZED during CSAR parsing are: " + (notAnalyzedReport != null ? notAnalyzedReport.toString() : "none")); + List warningsReport = ThreadLocalsHolder.getCollector().getWarningsReport(); + //System.out.println("WARNINGS during CSAR parsing are: " + (warningsReport != null ? warningsReport.toString() : "none")); + List criticalsReport = ThreadLocalsHolder.getCollector().getCriticalsReport(); + System.out.println("CRITICALS during CSAR parsing are: " + (criticalsReport != null ? criticalsReport.toString() : "none")); + + try { + generateReport(time, name, currentCsarDir, criticalsReport, "critical"); + generateReport(time, name, currentCsarDir, warningsReport, "warning"); + generateReport(time, name, currentCsarDir, notAnalyzedReport, "notAnalyzed"); + + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } } + + private static void generateReport(String time, String name, String currentCsarDir, List criticalsReport, String type) + throws IOException { + FileWriter fw; + fw = new FileWriter(new File(currentCsarDir + "/" + criticalsReport.size() + "-"+type+"-" + name +"-"+time + ".txt")); + for (String exception : criticalsReport) { + fw.write(exception); + fw.write("\r\n"); + } + fw.close(); + } } diff --git a/sdc-distribution-client/pom.xml b/sdc-distribution-client/pom.xml index 2047ff3..9681dd6 100644 --- a/sdc-distribution-client/pom.xml +++ b/sdc-distribution-client/pom.xml @@ -6,7 +6,7 @@ org.openecomp.sdc.sdc-distribution-client sdc-main-distribution-client - 1.1.13-SNAPSHOT + 1.1.14-SNAPSHOT sdc-distribution-client diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/HttpAsdcClient.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/HttpAsdcClient.java index 6eb2ebd..7ace38f 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/HttpAsdcClient.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/HttpAsdcClient.java @@ -70,7 +70,7 @@ public class HttpAsdcClient implements IHttpAsdcClient { private static final String TLS = "TLSv1.2"; private static final String AUTHORIZATION_HEADER = "Authorization"; private static final String HTTPS = "https://"; - private static Logger log = LoggerFactory.getLogger(DistributionClientImpl.class.getName()); + private static Logger log = LoggerFactory.getLogger(HttpAsdcClient.class.getName()); private CloseableHttpClient httpClient = null; private String serverFqdn = null; private String authHeaderValue = ""; diff --git a/sdc-tosca-parser/pom.xml b/sdc-tosca-parser/pom.xml index d6b0bb8..c56b471 100644 --- a/sdc-tosca-parser/pom.xml +++ b/sdc-tosca-parser/pom.xml @@ -6,7 +6,7 @@ org.openecomp.sdc.sdc-distribution-client sdc-main-distribution-client - 1.1.13-SNAPSHOT + 1.1.14-SNAPSHOT sdc-tosca-parser @@ -78,7 +78,7 @@ org.openecomp.sdc.sdc-distribution-client jtosca - 0.1.6-SNAPSHOT + 0.1.7-SNAPSHOT diff --git a/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ConfigurationManager.java b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ConfigurationManager.java index 7cd9ed2..e83e6aa 100644 --- a/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ConfigurationManager.java +++ b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ConfigurationManager.java @@ -8,18 +8,44 @@ 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_FILE = "config/configuration.yaml"; + private static final String CONFIGURATION_DIR = "config/"; private static volatile ConfigurationManager instance; - private Configuration configuration; +// private Configuration configuration; +// private ErrorConfiguration errorConfiguration; + + Map configurations = new HashMap(); + + + private ConfigurationManager() { + initialConfigObjectsFromFiles(); + } + + private void initialConfigObjectsFromFiles() { + loadConfigurationClass(ErrorConfiguration.class); + loadConfigurationClass(Configuration.class); + } - private ConfigurationManager() { - URL url = Resources.getResource(CONFIGURATION_FILE); + private void loadConfigurationClass(Class clazz) { + T object = getObjectFromYaml(clazz); + configurations.put(clazz.getSimpleName(), object); + } + + + public T getObjectFromYaml(Class className) { + + + String configFileName = calculateFileName(className); + + URL url = Resources.getResource(CONFIGURATION_DIR + configFileName); String configFileContents = null; try { configFileContents = Resources.toString(url, Charsets.UTF_8); @@ -27,17 +53,16 @@ public class ConfigurationManager { log.error("ConfigurationManager - Failed to load configuration file"); } YamlToObjectConverter yamlToObjectConverter = new YamlToObjectConverter(); - this.configuration = yamlToObjectConverter.convertFromString(configFileContents, Configuration.class); - } + T object = yamlToObjectConverter.convertFromString(configFileContents, className); - public Configuration getConfiguration() { - return configuration; + return object; } + public static ConfigurationManager getInstance() { if (instance == null) { - synchronized (ConfigurationManager.class){ - if (instance == null){ + synchronized (ConfigurationManager.class) { + if (instance == null) { instance = new ConfigurationManager(); } } @@ -45,7 +70,41 @@ public class ConfigurationManager { return instance; } - public void setConfiguration(Configuration configuration) { - this.configuration = configuration; + private static String calculateFileName(Class 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 Configuration getConfiguration() { + return (Configuration) configurations.get((Configuration.class.getSimpleName())); } } diff --git a/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ErrorConfiguration.java b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ErrorConfiguration.java new file mode 100644 index 0000000..59e8c6d --- /dev/null +++ b/sdc-tosca-parser/src/main/java/org/openecomp/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.openecomp.sdc.tosca.parser.config; + +import java.util.Map; + +public class ErrorConfiguration { + + private Map errors; + + public Map getErrors() { + return errors; + } + + public void setErrors(Map 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/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ErrorInfo.java b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ErrorInfo.java new file mode 100644 index 0000000..01df115 --- /dev/null +++ b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/ErrorInfo.java @@ -0,0 +1,49 @@ +/*- + * ============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.openecomp.sdc.tosca.parser.config; + +public class ErrorInfo { + + private String code; + private String message; + + 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 void cloneData(ErrorInfo other) { + this.code = other.getCode(); + this.message = other.getMessage(); + } + +} diff --git a/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/SdcToscaParserErrors.java b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/SdcToscaParserErrors.java new file mode 100644 index 0000000..ce84a9c --- /dev/null +++ b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/config/SdcToscaParserErrors.java @@ -0,0 +1,31 @@ +package org.openecomp.sdc.tosca.parser.config; + +import java.util.EnumMap; +import java.util.Map; + +import org.openecomp.sdc.toscaparser.api.utils.JToscaErrorCodes; + +public enum SdcToscaParserErrors { + + BAD_FORMAT, CONFORMANCE_LEVEL_ERROR, FILE_NOT_FOUND, GENERAL_ERROR; + + private static final Map JTOSCA_ERRORS = + new EnumMap(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/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/exceptions/SdcToscaParserException.java b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/exceptions/SdcToscaParserException.java index f41141f..a7fd99d 100644 --- a/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/exceptions/SdcToscaParserException.java +++ b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/exceptions/SdcToscaParserException.java @@ -1,12 +1,20 @@ package org.openecomp.sdc.tosca.parser.exceptions; -public class SdcToscaParserException extends Exception{ - /** - * - */ - private static final long serialVersionUID = 626014844866501196L; - - public SdcToscaParserException(String string) { - super(string); - } +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/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcCsarHelperImpl.java b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcCsarHelperImpl.java index df1d470..c53dcec 100644 --- a/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcCsarHelperImpl.java +++ b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcCsarHelperImpl.java @@ -22,6 +22,8 @@ package org.openecomp.sdc.tosca.parser.impl; import java.util.*; import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; @@ -49,7 +51,8 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { private static final String PATH_DELIMITER = "#"; private static final String PREFIX = "port_"; - private static final String[] SUFFIX = new String[]{"_network_role_tag", "_ip_requirements", "_subnetpoolid"}; + Pattern SUFFIX = Pattern.compile("(_network_role_tag|_ip_requirements|_subnetpoolid)$"); +// private static final String[] SUFFIX = new String[]{"_network_role_tag", "_ip_requirements", "_subnetpoolid"}; private ToscaTemplate toscaTemplate; private static Logger log = LoggerFactory.getLogger(SdcCsarHelperImpl.class.getName()); @@ -91,6 +94,11 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { public Map> getCpPropertiesFromVfc(NodeTemplate vfc) { + if (vfc == null) { + log.error("getCpPropertiesFromVfc - vfc is null"); + return new HashMap<>(); + } + List paths = new ArrayList<>(); paths.add("network_role_tag"); paths.add("ip_requirements#ip_count_required#count"); @@ -102,22 +110,25 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { Map> cps = new HashMap<>(); - for (Map.Entry entry : props.entrySet()) { - String fullCpName = entry.getKey(); - - if (fullCpName.startsWith(PREFIX) && - Arrays.stream(SUFFIX).parallel().anyMatch(fullCpName::endsWith)) - { - //this is CP - get all it's properties according to paths list - String cpName = fullCpName.replaceAll("^("+PREFIX+")", "").replaceAll("("+String.join("|", SUFFIX)+")$", ""); - cps.put(cpName, new HashMap<>()); - for (String path: paths) { - String fullPathToSearch = PREFIX + cpName + "_" + path; - String value = getNodeTemplatePropertyLeafValue(vfc, fullPathToSearch); - if (value != null) { - value = StringUtils.stripStart(value, "["); - value = StringUtils.stripEnd(value, "]"); - cps.get(cpName).put(path, value); + if (props != null) { + for (Map.Entry entry : props.entrySet()) { + String fullCpName = entry.getKey(); + Matcher matcher = SUFFIX.matcher(fullCpName); + + if (fullCpName.startsWith(PREFIX) && matcher.find()) { + //this is CP - get all it's properties according to paths list + String cpName = fullCpName.replaceAll("^(" + PREFIX + ")", "").replaceAll(matcher.group(1), ""); + + List propertiesToSearch = paths.stream().filter(i -> i.contains(StringUtils.stripStart(matcher.group(1), "_"))).collect(Collectors.toList()); + for (String item : propertiesToSearch) { + String fullPathToSearch = PREFIX + cpName + "_" + item; + Object value = getNodeTemplatePropertyAsObject(vfc, fullPathToSearch); + if (value != null) { + if (!cps.containsKey(cpName)) + cps.put(cpName, new HashMap<>()); + } + + cps.get(cpName).put(item, value); } } } @@ -569,7 +580,8 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { Object current = property.getValue(); return iterateProcessPath(1, current, split); } - log.error("processProperties - property not found"); + String propName = (split != null && split.length > 0 ? split[0] : null); + log.error("processProperties - property {} not found", propName); return null; } } diff --git a/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcToscaParserFactory.java b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcToscaParserFactory.java index 14c332c..2ddde1f 100644 --- a/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcToscaParserFactory.java +++ b/sdc-tosca-parser/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcToscaParserFactory.java @@ -2,17 +2,18 @@ package org.openecomp.sdc.tosca.parser.impl; import org.openecomp.sdc.tosca.parser.api.ConformanceLevel; import org.openecomp.sdc.tosca.parser.api.ISdcCsarHelper; -import org.openecomp.sdc.tosca.parser.config.Configuration; -import org.openecomp.sdc.tosca.parser.config.ConfigurationManager; +import org.openecomp.sdc.tosca.parser.config.*; import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException; import org.openecomp.sdc.tosca.parser.utils.GeneralUtility; import org.openecomp.sdc.toscaparser.api.ToscaTemplate; import org.openecomp.sdc.toscaparser.api.common.JToscaException; +import org.openecomp.sdc.toscaparser.api.utils.JToscaErrorCodes; public class SdcToscaParserFactory { private static volatile SdcToscaParserFactory instance; private static Configuration configuration; + private static ErrorConfiguration errorConfiguration; private SdcToscaParserFactory() { @@ -28,6 +29,7 @@ public class SdcToscaParserFactory { if (instance == null) { instance = new SdcToscaParserFactory(); configuration = ConfigurationManager.getInstance().getConfiguration(); + errorConfiguration = ConfigurationManager.getInstance().getErrorConfiguration(); } } } @@ -40,11 +42,15 @@ public class SdcToscaParserFactory { * @param csarPath - the absolute path to CSAR file. * @return ISdcCsarHelper object. * @throws SdcToscaParserException - in case the path or CSAR are invalid. - * @throws JToscaException - in case the path or CSAR are invalid. */ - public ISdcCsarHelper getSdcCsarHelper(String csarPath) throws JToscaException, SdcToscaParserException { + public ISdcCsarHelper getSdcCsarHelper(String csarPath) throws SdcToscaParserException { synchronized (SdcToscaParserFactory.class) { - ToscaTemplate tosca = new ToscaTemplate(csarPath, null, true, null); + ToscaTemplate tosca = null; + try { + tosca = new ToscaTemplate(csarPath, null, true, null); + } catch (JToscaException e) { + throwSdcToscaParserException(e); + } SdcCsarHelperImpl sdcCsarHelperImpl = new SdcCsarHelperImpl(tosca); validateCsarVersion(sdcCsarHelperImpl.getConformanceLevel()); return sdcCsarHelperImpl; @@ -57,11 +63,20 @@ public class SdcToscaParserFactory { String maxVersion = level.getMaxVersion(); if (cSarVersion != null) { if ((GeneralUtility.conformanceLevelCompare(cSarVersion, minVersion) < 0) || (GeneralUtility.conformanceLevelCompare(cSarVersion, maxVersion) > 0)) { - throw new SdcToscaParserException("Model is not supported. Parser supports versions " + minVersion + " to " + maxVersion); + throwConformanceLevelException(minVersion, maxVersion); } } else { - throw new SdcToscaParserException("Model is not supported. Parser supports versions " + minVersion + " to " + maxVersion); + throwConformanceLevelException(minVersion, maxVersion); } } + private void throwConformanceLevelException(String minVersion, String maxVersion) throws SdcToscaParserException { + ErrorInfo errorInfo = errorConfiguration.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 = errorConfiguration.getErrorInfo(SdcToscaParserErrors.getSdcErrorByJToscaError(JToscaErrorCodes.getByCode(e.getCode())).toString()); + throw new SdcToscaParserException(errorInfo.getMessage(), errorInfo.getCode()); + } } \ No newline at end of file diff --git a/sdc-tosca-parser/src/main/resources/config/error-configuration.yaml b/sdc-tosca-parser/src/main/resources/config/error-configuration.yaml new file mode 100644 index 0000000..3febd33 --- /dev/null +++ b/sdc-tosca-parser/src/main/resources/config/error-configuration.yaml @@ -0,0 +1,18 @@ +# Errors +errors: + FILE_NOT_FOUND: { + code: TP0001, + message: "Error: CSAR file not found." + } + BAD_FORMAT: { + code: TP0002, + message: "Error: CSAR file bad format. Check the log for details." + } + CONFORMANCE_LEVEL_ERROR: { + code: TP0003, + message: "Error: CSAR version is unsupported. Parser supports versions %s to %s." + } + GENERAL_ERROR: { + code: TP0004, + message: "Error: an unexpected internal error occured." + } \ No newline at end of file diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/BasicTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/SdcToscaParserBasicTest.java similarity index 87% rename from sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/BasicTest.java rename to sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/SdcToscaParserBasicTest.java index 0eb58f8..6746df7 100644 --- a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/BasicTest.java +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/SdcToscaParserBasicTest.java @@ -11,13 +11,13 @@ import java.util.Map; import org.openecomp.sdc.tosca.parser.api.ISdcCsarHelper; import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException; import org.openecomp.sdc.tosca.parser.impl.SdcToscaParserFactory; -import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.common.JToscaException; +import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; -public abstract class BasicTest { +public abstract class SdcToscaParserBasicTest { public static final String VF_CUSTOMIZATION_UUID = "56179cd8-de4a-4c38-919b-bbc4452d2d73"; static SdcToscaParserFactory factory; @@ -97,18 +97,11 @@ public abstract class BasicTest { }; }; - private static ISdcCsarHelper getCsarHelper(String path) throws JToscaException, IOException, SdcToscaParserException { + protected static ISdcCsarHelper getCsarHelper(String path) throws SdcToscaParserException { System.out.println("Parsing CSAR "+path+"..."); - String fileStr1 = BasicTest.class.getClassLoader().getResource(path).getFile(); + String fileStr1 = SdcToscaParserBasicTest.class.getClassLoader().getResource(path).getFile(); File file1 = new File(fileStr1); ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(file1.getAbsolutePath()); - List exceptionReport = ExceptionCollector.getCriticalsReport(); - if (!exceptionReport.isEmpty()){ - System.out.println("TOSCA Errors found in CSAR - failing the tests..."); - System.out.println(exceptionReport.toString()); - ExceptionCollector.clear(); - //throw new SdcToscaParserException("CSAR didn't pass validation"); - } return sdcCsarHelper; } diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserConfigurationTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserConfigurationTest.java index 0e6387d..8c96303 100644 --- a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserConfigurationTest.java +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserConfigurationTest.java @@ -1,5 +1,6 @@ package org.openecomp.sdc.impl; +import org.openecomp.sdc.tosca.parser.config.ErrorConfiguration; import org.testng.annotations.Test; import org.openecomp.sdc.tosca.parser.config.Configuration; import org.openecomp.sdc.tosca.parser.config.ConfigurationManager; @@ -8,7 +9,7 @@ import java.io.IOException; import static org.testng.Assert.assertNotNull; -public class ToscaParserConfigurationTest extends BasicTest { +public class ToscaParserConfigurationTest extends SdcToscaParserBasicTest { @Test public void testConfigurationConformanceLevel() throws IOException { @@ -18,4 +19,13 @@ public class ToscaParserConfigurationTest extends BasicTest { assertNotNull(config.getConformanceLevel().getMaxVersion()); assertNotNull(config.getConformanceLevel().getMinVersion()); } + + + @Test + public void testErrorConfigurations() throws IOException { + ErrorConfiguration errorConfig = ConfigurationManager.getInstance().getErrorConfiguration(); + assertNotNull(errorConfig); + assertNotNull(errorConfig.getErrors()); + } + } diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserErrorHandlingTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserErrorHandlingTest.java new file mode 100644 index 0000000..8451a58 --- /dev/null +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserErrorHandlingTest.java @@ -0,0 +1,143 @@ +package org.openecomp.sdc.impl; + +import org.testng.annotations.Test; +import static org.testng.Assert.*; + +import java.io.File; + +import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.openecomp.sdc.toscaparser.api.utils.JToscaErrorCodes; + + +/*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); + + MISSING_META_FILE("JT1001"), +/* INVALID_META_YAML_CONTENT("JT1002"), +/* ENTRY_DEFINITION_NOT_DEFINED("JT1003"), +/* MISSING_ENTRY_DEFINITION_FILE("JT1004"), +/* GENERAL_ERROR("JT1005"), +/* PATH_NOT_VALID("JT1006"), +/* CSAR_TOSCA_VALIDATION_ERROR("JT1007"); + +*/ + +/* + * + * # Errors +errors: + FILE_NOT_FOUND: { + code: TP0001, + message: "Error: CSAR file not found." + } + BAD_FORMAT: { + code: TP0002, + message: "Error: CSAR file bad format. Check the log for details." + } + CONFORMANCE_LEVEL_ERROR: { + code: TP0003, + message: "Error: CSAR version is unsupported. Parser supports versions %s to %s." + } + GENERAL_ERROR: { + code: TP0004, + message: "Error: an unexpected internal error occured." + } + * + */ + +public class ToscaParserErrorHandlingTest extends SdcToscaParserBasicTest { + + + @Test + public void testMissingMetadata(){ + String csarPath = "csars/service-missing-meta-file.csar"; + String fileLocationString = ToscaParserErrorHandlingTest.class.getClassLoader().getResource(csarPath).getFile(); + File file = new File(fileLocationString); + Throwable captureThrowable = captureThrowable(file.getAbsolutePath()); + testThrowable(captureThrowable, "TP0002"); + } + + + @Test + public void testInvalidYamlContentMeta(){ + String csarPath = "csars/service-invalid-yaml-content-meta.csar"; + String fileLocationString = ToscaParserErrorHandlingTest.class.getClassLoader().getResource(csarPath).getFile(); + File file = new File(fileLocationString); + Throwable captureThrowable = captureThrowable(file.getAbsolutePath()); + testThrowable(captureThrowable, "TP0002"); + } + + @Test + public void testEntryDefinitionNotDefined(){ + String csarPath = "csars/service-entry-definition-not-defined.csar"; + String fileLocationString = ToscaParserErrorHandlingTest.class.getClassLoader().getResource(csarPath).getFile(); + File file = new File(fileLocationString); + Throwable captureThrowable = captureThrowable(file.getAbsolutePath()); + testThrowable(captureThrowable, "TP0002"); + } + + @Test + public void testMissingEntryDefinitionFile(){ + String csarPath = "csars/service-missing-entry-definition.csar"; + String fileLocationString = ToscaParserErrorHandlingTest.class.getClassLoader().getResource(csarPath).getFile(); + File file = new File(fileLocationString); + Throwable captureThrowable = captureThrowable(file.getAbsolutePath()); + testThrowable(captureThrowable, "TP0002"); + } + + //@Test - PA - there are currently no critical erros in JTosca + public void tesValidationError(){ + String csarPath = "csars/service-invalid-input-args.csar"; + String fileLocationString = ToscaParserErrorHandlingTest.class.getClassLoader().getResource(csarPath).getFile(); + File file = new File(fileLocationString); + Throwable captureThrowable = captureThrowable(file.getAbsolutePath()); + testThrowable(captureThrowable, "TP0002"); + } + + @Test + public void testInValidConformanceLevelError(){ + String csarPath = "csars/service-invalid-conformence-level.csar"; + String fileLocationString = ToscaParserErrorHandlingTest.class.getClassLoader().getResource(csarPath).getFile(); + File file = new File(fileLocationString); + Throwable captureThrowable = captureThrowable(file.getAbsolutePath()); + testThrowable(captureThrowable, "TP0003"); + } + + @Test + public void testFileNotFound(){ + Throwable captureThrowable = captureThrowable("csars/XXX.csar"); + testThrowable(captureThrowable, "TP0001"); + } + + @Test + public void testInvalidCsarFormat(){ + String csarPath = "csars/csar-invalid-zip.zip"; + String fileLocationString = ToscaParserErrorHandlingTest.class.getClassLoader().getResource(csarPath).getFile(); + File file = new File(fileLocationString); + Throwable captureThrowable = captureThrowable(file.getAbsolutePath()); + testThrowable(captureThrowable, "TP0002"); + } + + private static void testThrowable(Throwable captureThrowable, String expectedCode) { + assertNotNull(captureThrowable); + assertTrue(captureThrowable instanceof SdcToscaParserException, "Error thrown is of type "+captureThrowable.getClass().getSimpleName()); + assertEquals(((SdcToscaParserException)captureThrowable).getCode(), expectedCode); + } + + public static Throwable captureThrowable(String csarPath) { + Throwable result = null; + try { + factory.getSdcCsarHelper(csarPath); + } catch( Throwable throwable ) { + result = throwable; + } + return result; + } +} diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserGeneralUtilTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserGeneralUtilTest.java index b903867..9f349ae 100644 --- a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserGeneralUtilTest.java +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserGeneralUtilTest.java @@ -5,7 +5,7 @@ import org.openecomp.sdc.tosca.parser.utils.GeneralUtility; import static org.testng.Assert.assertTrue; -public class ToscaParserGeneralUtilTest extends BasicTest { +public class ToscaParserGeneralUtilTest extends SdcToscaParserBasicTest { @Test public void testVersionCompare() { diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserGroupTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserGroupTest.java index 58e967a..01c888f 100644 --- a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserGroupTest.java +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserGroupTest.java @@ -10,7 +10,7 @@ import java.util.List; import static org.testng.Assert.*; -public class ToscaParserGroupTest extends BasicTest{ +public class ToscaParserGroupTest extends SdcToscaParserBasicTest{ //region getVfModulesByVf @Test diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserMetadataTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserMetadataTest.java index 802d5b8..4fbc9c3 100644 --- a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserMetadataTest.java +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserMetadataTest.java @@ -7,7 +7,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; -public class ToscaParserMetadataTest extends BasicTest { +public class ToscaParserMetadataTest extends SdcToscaParserBasicTest { //region getServiceMetadata @Test diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java index c9215a2..dd895c3 100644 --- a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java @@ -14,7 +14,7 @@ import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException; import org.openecomp.sdc.toscaparser.api.Group; import org.openecomp.sdc.toscaparser.api.NodeTemplate; -public class ToscaParserNodeTemplateTest extends BasicTest { +public class ToscaParserNodeTemplateTest extends SdcToscaParserBasicTest { //region getServiceVfList @Test @@ -311,13 +311,22 @@ public class ToscaParserNodeTemplateTest extends BasicTest { List vfcs = complexCps.getVfcListByVf(VF_CUSTOMIZATION_UUID); Map> cps = complexCps.getCpPropertiesFromVfc(vfcs.get(0)); - assertEquals("1", cps.get("port_fe1_sigtran").get("ip_requirements#ip_count_required#count")); - assertEquals("true", cps.get("port_fe1_sigtran").get("ip_requirements#dhcp_enabled")); - assertEquals("4", cps.get("port_fe1_sigtran").get("ip_requirements#ip_version")); + assertEquals(5, cps.size()); - assertEquals("2", cps.get("port_fe_cluster").get("ip_requirements#ip_count_required#count")); - assertEquals("true", cps.get("port_fe_cluster").get("ip_requirements#dhcp_enabled")); - assertEquals("4", cps.get("port_fe_cluster").get("ip_requirements#ip_version")); + assertEquals(1, cps.get("port_fe1_sigtran").get("ip_requirements#ip_count_required#count")); + assertEquals(true, cps.get("port_fe1_sigtran").get("ip_requirements#dhcp_enabled")); + assertEquals(4, cps.get("port_fe1_sigtran").get("ip_requirements#ip_version")); + + assertEquals(2, cps.get("port_fe_cluster").get("ip_requirements#ip_count_required#count")); + assertEquals(true, cps.get("port_fe_cluster").get("ip_requirements#dhcp_enabled")); + assertEquals(4, cps.get("port_fe_cluster").get("ip_requirements#ip_version")); + } + + @Test + public void testGetCpPropertiesFromVfcForNullVFC() { + Map> cps = complexCps.getCpPropertiesFromVfc(null); + assertNotNull(cps); + assertEquals(0, cps.size()); } //endregion diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserServiceInputTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserServiceInputTest.java index 0599dcc..0b172f5 100644 --- a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserServiceInputTest.java +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserServiceInputTest.java @@ -9,7 +9,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; -public class ToscaParserServiceInputTest extends BasicTest { +public class ToscaParserServiceInputTest extends SdcToscaParserBasicTest { //region getServiceInputs @Test diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserSubsMappingsTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserSubsMappingsTest.java index c61f465..6461a92 100644 --- a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserSubsMappingsTest.java +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserSubsMappingsTest.java @@ -20,7 +20,7 @@ import org.openecomp.sdc.toscaparser.api.Property; //import static org.junit.Assert.assertEquals; //import static org.junit.Assert.assertNull; -public class ToscaParserSubsMappingsTest extends BasicTest { +public class ToscaParserSubsMappingsTest extends SdcToscaParserBasicTest { //region getServiceSubstitutionMappingsTypeName @Test diff --git a/sdc-tosca-parser/src/test/resources/config/error-configuration.yaml b/sdc-tosca-parser/src/test/resources/config/error-configuration.yaml new file mode 100644 index 0000000..3febd33 --- /dev/null +++ b/sdc-tosca-parser/src/test/resources/config/error-configuration.yaml @@ -0,0 +1,18 @@ +# Errors +errors: + FILE_NOT_FOUND: { + code: TP0001, + message: "Error: CSAR file not found." + } + BAD_FORMAT: { + code: TP0002, + message: "Error: CSAR file bad format. Check the log for details." + } + CONFORMANCE_LEVEL_ERROR: { + code: TP0003, + message: "Error: CSAR version is unsupported. Parser supports versions %s to %s." + } + GENERAL_ERROR: { + code: TP0004, + message: "Error: an unexpected internal error occured." + } \ No newline at end of file diff --git a/sdc-tosca-parser/src/test/resources/csars/csar-invalid-zip.zip b/sdc-tosca-parser/src/test/resources/csars/csar-invalid-zip.zip new file mode 100644 index 0000000..04de055 --- /dev/null +++ b/sdc-tosca-parser/src/test/resources/csars/csar-invalid-zip.zip @@ -0,0 +1,2 @@ +SDC-TOSCA-Meta-File-Version: 1.0 +SDC-TOSCA-Definitions-Version: 2.0 diff --git a/sdc-tosca-parser/src/test/resources/csars/service-entry-definition-not-defined.csar b/sdc-tosca-parser/src/test/resources/csars/service-entry-definition-not-defined.csar new file mode 100644 index 0000000000000000000000000000000000000000..47e65b6af72e9b9313015b641d26eaac5b6a26f0 GIT binary patch literal 45157 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 lsRP?w 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

0Nc)|(_qGgah3+2IX^{ZTtU9Y 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 JZ(w9Z`#)_E#Ag5i literal 0 HcmV?d00001 diff --git a/sdc-tosca-parser/src/test/resources/csars/service-invalid-yaml-content-meta.csar b/sdc-tosca-parser/src/test/resources/csars/service-invalid-yaml-content-meta.csar new file mode 100644 index 0000000000000000000000000000000000000000..f77af6fb5f4d7aa42054a4359fb0221070afbdc1 GIT binary patch literal 45198 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 VG{DRI;V+OQIRgVaW9pBy{{cE@KVkp? literal 0 HcmV?d00001 diff --git a/sdc-tosca-parser/src/test/resources/csars/service-missing-meta-file.csar b/sdc-tosca-parser/src/test/resources/csars/service-missing-meta-file.csar new file mode 100644 index 0000000000000000000000000000000000000000..79348dbb57410fb2c82deb343f17f862b84c0ce7 GIT binary patch literal 44893 zcmZ^~V~{S*vamh&8r!yQ+qUkpZQHiB#qRsYB< zE3-07Q3ezY73g0VjBl~@f4uzH4d$Pxkduq08Nk@ZnL+Wtow#(wDri15iBpbw@th*`wMxpnRPJ{xcEq< zK#`MS6l*}rgfxcoVNS2YW;otX%P7{F0l)v>gAauMpU1NU*7dDV%3P0wO{ZPkRqJoQ zkB`4w$4G8{BYZAaIJF+9dzf9VPW(%n?y09U~coptMG7798!$+q@ zCg)B3eBJtAt?QM%ou{t>5R>cBMx*Hlp(srNTjr> z;rVLk@nQvGXeK{ylDI-#;y#q?% zFr}eoaXn2*Fr>_PHK*TlRWdQ1uCR}uk>LFco8~MBWOzO_mohQc+Alb8l7DU~LHw5z z(1A0HO9>ez%~^NO&Ai1r^d~CDhK0{iQ7i@JzR3Y{aGHd|hB0s{t+>+efQB$mrvwxP zT+V4vzmlKg9Z+7|x0E07|EZxVChoAdpg=(Mgg`(7|5rmz>|E&SjR4N32F@U?ZC#KYJ8vH(u)j0l!yBmZ9{`OLC-cA+i83z~Y)nLr3 zMOS+En^|;?9S-!;>~+uNmr0Jh>uPkE1yHBKES!&{GL|4imC&x2lW5L{5YaLsT{o^H zd>IcPIL4ZW`*vM`nB8F<5$GeVzbJ$W#QwG&>#)kck+rDdScFW7v>2~)+V>?!EScz| zLYeH9Wb6&N+sr0u?Xa29x8IrI78a^1TcA?C5Q0!xzccKq48lA@5IKR zk~`XxLt&zi-kUbwuP&LBI-srS<}TT&$W1ylQ2xuwv(i-JL;7N5q#E9`rSAUIqAjBL zg2J>Oor}*NW)xCLXAsdrD}F^a#8-E`rjmitCosz4gNxC+zEXXb8aIoQzwq#ZuiG=g zOeN6{4F^X84E6;7mU`}!| zuK)4g$?+$3T$|~#yJb?g5=%VpF;ZkA7!^NaPW1(|PeM$RL}J?h_kW<7V(Gy~ih>1- zp8Bygbla8*L(e3uzxg=_IrIO@h5tKzl9TZ2iF(3T;!6k4r8*4}Y)jNlrlBDHx%;O@uk=^Ub6D(VX{mlP7fyp>JUnlWpMA z6nzupkQ-SM-alxf+DLSTqsE+%Mg~s~4zG@6)lH1P0}bii)SoptE+xBdyw7@i!gB=s zj3?se-AnBc@;^zQf`B9W7s<^3kSy~5L-Ie=8o1g18)SC_2Y{35zX<;?nwkC&%~Op_ zjBqpQW+U@@FlQ)Rxph>&@W*Mzjlu5R^=Q-<>F1?bR z-k-kw*6IYiz89S*pGBI@`4rJ)?3fr&C&Qm!${aX0onoK5Hrrj7Gdh2IL_u~QY;UsR zFIAzZT29FWmMMj#M+Z#l`a6mdd!Ru^nmOVAq50M`QZ2e_q%&4>w=c%u!?s?p2lJct zwUzJ8Yr)1`nq8cr8sfqeLTW0w9}P6zBGjGISHP0M&1HFXuHjEcmK`(E(2`kiW&Zgk zmA|+4A9VNE7r4Nsh(6)(*1@Q|8Q*2D1M1e7#;sldhdbLcBZn|&?M3*eC3uE61Rv}# zhzWQ6)>_X~0ge39k-!I0hiBVL9D%B?Gpn7Dkxr?M(h>Vpeuw47v0{frRsGz>^W|Bo z2Zjni+}z6%W&T7jCdSH<%sutDOPQV!tsd-%0io;rdVW+Cm*`6jrZO>mKJ)e+X+Qo@ z$A@rZpOG^^K(g=7W=*p@{(Fr4T-!qvo4S@axee_=8f_45Fk~kTVa%X%(Tse`-)-Oh z_KmU;nuAW_?c|=eb+iF=EpZiQXmL)jmN3MAZ2NvM+tjo{v9VjY*JezG21`eXlClv= zJfHJZj|75FPde&P#NSCo!cgLiw=7}~vM`Jr4u4pF7k9Fx*1^5~a$U;QygbLXu*S?4 zC#IM%f$(sODXFO}>Sb9+*!gD+5sn`@(?Xe1C&dJr5h1hG{;H(F$Vm#csSK0${~Ccs z5q6jye;_@p-z-VRT@-Wk3U)U3n7YBo{9iod?j?ErYZwH~ikQ>!^J+}jB0KZOymDM* zufmQ0`Ob7Es@ z*my%vtaI1m3LS>w*J)BqP=;SktMLq-3nOkq?exRT#)g1a?k>qcqb)`HO6Z2p#SCj% zjySB&=W`a*u^`q^B#=xG0f9pq67GNE&%Gg>w)E5lfc_`VcJ4W-i2rzwn6N-V)c=QO z6;mfSOJh^Q|L`E4|FiRN2eLDuB6P_rHt*VtP+?z~#SM+53XBwFrqHV~6IovF`i-@` zww+rC0G5AbR*=VTQ)Hi)b69-8oBC5&_PA(Pn2mf!`g@5!?mu`_E-ZFJRghm6@)8` zDlpB@NT^a6ix#o_*(tEOV74zsmK?D4RB^E*ewH zv6T2UtGVKGPKF~v&$#By!u&^+`Um6eC+z>9Udic&N!McK-SPjUPon=c=zp5AGr)=7 z*3<|JQfqGmxfnLzEqB+^+pHjq=Oi=G3`}EkT$SoA(wZ4qJG%!@}hS zcC-(JR{gTMu3F=m4)WiV{NL~h?q8FcnpxUex>(xV{r3RrJfX_UAj_@+6;U=D}E zvULhXOtGd_?(}MAI=kU6_I3d$xA7rI$(Gp-)u~jgMA^qRN#@V^thM#I<6{E7C}2Bs zG@0UlemzTiC7~hEYR;jM&(?Kdcu%<RY!u1c6DnHkSzywLeMzklRxHgpFJ+!p*V zjKWs7SMi`E(3k?guq#_GK76>SSaYOnm*s-hpNs5|CXDElXh=a^TmFoo9*Qvo>zjnD zQX(}qMGc&O+U3A%k``w;t$L96eV2JNcd1>wAtA1?blK1S=Tdmz7WsWk|02W0u)+r$ zsi%{SyxFv;6EYv4tU7%?f6axmjnB8H5vy+_skOU{jhDj@AGSXI{R^@g^!$q#pNFp` zO_CrHJQ~O^5M>!WuH+)ROa&ktTi9`poXZ;d#Pp37tFh)LZ#Rew#gW=&{mu(uhTwGJ zbnbFOdp~&?fcS4i-^x`i`<4YI`yP8}N3oi5SW114O4`-w2C?`F?MPzXcrR&J^Qv%EE%?a;N8Z+; zyGO|l3c0nyF5Sq|hYHFf#Fg|QdYtF-7Op)$?7y|n0@d$jMQZC6167q0QsrGXaZWy# zhlfTl__FqGGGlH9UvsJk*~zjKre#>kimt00TQcB4D2cM{470{(yUr{WN z4P>A_BjVyL=Z8mI&|xU7y;xWLQ! zOhA?-1K2`$$1c@%?7=dzu?L9IKR<%k&X2>u_Y&kXZfEl!^mZV2UAW1smfDnD z8EwI%^{?_Y?F-@^r>jM5fB8u9*(0t(xhyq|-|Kw0efadsDvYOrSb1EEfoEaA=H-Je z-Q5b?a@Z{g+*hAV=x4bDW^2vjQOAO(N0hvtDB0TeJSWIByfr12y4xzm`L$%KJrXS_ zhjCdZWW)le@sX|V*)wu+=fI^oV+Gb*#$wsMKTSC$T&fAgpTqiYg~^~^CIsQYQ#Hya zagaSOHdr&pb})URB6XJBhylZ6UZ(AAWrY@h@U{-$l08V+ z+KP7$WsRZ49A+z@q%5ZHSGCApTj!@92SmaQ~NyGX^*Sj4W;bF^#6q|FUu` z+P2O|tcc&c28GZBo72ZWxQzX%VVSx*ghLB%S?FO3SS#wtfwovucGzJAb4^J$V^Z7g z?x6?V9DF+ZHF>@ZR_-ebar}Tg6Iv${WcAa?`DuD^91Px3|AVQBzr@Xn)aLnO`Hd*V zm>~+m2ORtL>SR;zStpZ?i%|6mVKb)G86GiWfXr#F>PF&J-gs~wsV*?N83B;!JrGz| zd#-Y>bJ*?~jtk5-39$9Qv^8|{27UT9>PYSuBqbPiDhihRec3sBy7CPAzzx~X>1BhM zr6c(z%Ly-jGagC-IeVaHlNz#?qZr!z*=k@OB_*jJM#C{#TWD(_y2zH*X>TPp%_~6^ za?yf9F*(0RRoFA(*S8*AnDGL~>XNqz>Tc~e>W;FrA5LzLjV5dD);Cs8K91d-TqE1= zHr^jOUYCv^eTGAZVX(buS?^IKrMys~scfl5Vf%GG1xpbda;7kyPNI_-z;wzX3!Ni| zUvwS|E zpC`*|<~d9$Gz2(@=9m*F^u+-hyfcH+85g)^B1=y_zR3SPzehBX+^cS8E&bMr;Y1=5 zkH4I_%GARE*~>J?X<6T;G<|>;h-7R?3w7PLpJ0247Yz~YmZjraD8Osns=C<7$X&VK zpj&Sex0*gkdtfzmDv=HuLXSwsQp$IWY>T!Zy&oZV^=e_yj$l!dsGxUtBsy#M9NwB50vXOC-EF+|M#R zvgoB$l*QutN=4dgMC8JzEm5b!epZ3B!U-K)KP1!(e2XT+I;8DY`V5ES={30kjUI#0;D__Tu!>$Fz`oP)XrMXN=E}}N?{DAUFdez#yl>WL!K+9 zs{?`AaUheNts5fs5^@VWh+@#EPWoL^waJgm*B847An^5`URJpO4Jo{1P$Xmgu8ODi zj}7Gret@J`ai7*igU>~@bN=g`upYfp7I=W1r9#u6iA4oMNlYI z`uyhz&CQ>%dpubNmt|;K}*A>qUaX=I{|Z00P(q z2}*8wx0a@1y9fiV!3C*qx*JY={t)B{wJtd%;eFmfu!>QNPWQrzji5kdarq-g@-_67 z(MYX&5uSjrG#Lt7vW3Um%Z-=>DOTIqBcPQa{Dn&8$s`uvL)NoKsC;hi+KL-+_l`aA z6Rlye;xo-?gb|Mm116td8@FxGV&u$g@6f`;p9<{&FlQ2rW~@e+%nC05o-JYi_|dU1d)&9BskAa&+~2M@Jzc?Aa;% zv~dw8-+A55^uGt7>zYl~Ec(KoG#U`s4lDFCmd39L!ri@*C@Ex!r*fm;c_;AStCF*P z(fbnC_Obe86HUDcudgZ+RW7d*koqz%+(pTl=Y|V3&Uzjk#3Kdz0>r&HfZj2mv!qaY_ z9r_$h#x|BGU6w*v7Q0HVKQug~E=ozxgvl|j9K1s&m7aHYOPE|`@~AbrJ(cwte5~}8 z%Z)A-qlPs?(XLKfrZMXaGu>8;4-K6a%R|BfXKv>S6KB9i$d*Ne;mnz+#ADN;1~&PC z4!$a9Cm8yQp;_imXmxkSpdg-AJhClM9D8A^TU2W8`ADr1mK)w z>Lvj1P|j@2HpkCE_m0 zSc8s*J2BrtE8;qDAs|m?)2`!w$3yES&Q36gU@MaTqcI$w5o*$e>x`!I0 z#xCiJG*zh|K<6uL@P)p;P}xo17rQ(|0YLB(HurI&*!5^!8g$I7ePiI*n~=l<>X=MD zs1*pkZ>DxrZz!p^dYvWP6eet@G;SJ0dRMO3>z30M2J0NiKQuZkFX%(FKD*>4qWXu7 zMcy-UyuMWoacA{@zJ&*dOCPzZSW{QlAz63m-w6ujVD>a6d+mD_cZ%C;=I;fFXrklD z@Ve}*5_j3s>fi6mjgMnL9o2ySg6^@SZhCp^j$AmMH^rk*+TjmN3@@q0q4LFGr0=^DmhR6@yLl zKkjN{Y>V__0*+Yg5m+wQK%H3kD^@iTxyu-TXPnA~c|#8TjWCrLV7EQHyYV`g^$)$n zH}CE%ZnpR@{E5VFYu6p?*%%mlmb_l8&bxQZA`+{73M>w?cs&GYnv#&WAbInnmy6_{ zKp8M z5dlGdc6@yNjr*?O72YGAyH)~Yyh-4gQBo}ymc(+Xz~$8Eu>?8=FWh+5LijNzEN+E@ z1Vuh^L>VIq&L7brMl!8IAP9x=q|caoiF7fl17OD?xnpPS_88uKmtUr`pd=v=O+iTX z$}l5TsuBB^TC|cDFk%hO?^$DUZcd(jxd!`N6i;tR;|j@Lb$y=)abK*xJ$MRty10zVP}2%UsUkC`(ziov z!K-3wF||V9XyFSaNR1xCD8^U85T6la<~VpusCp}3tw}B3Uv(@q+Ls^JlOT0bU2jWV zbP+$Ogr+l|L^*n$Pkka>cQ@)&yjV*x)?*T40_@hop-IpgQ(~6beqTUpnmji@h*5#Q z_B1Vo-}U@OC$jGg1Lnd4N6ns8f)0EEKI9}HB>?%!yTBaRZr2YMSj3w@R)OXGlk&iyX(NmJj7#(0 zh(deiQU+B7y^W2!ScYKmJ$``}{*DVMXYwqLPL!!XPK7>` z)X(Ek6s8pASa1aaq@6ID@fqvawDs@OdG#EokKVyegZTTSI*Ed6{BuVbS(!D~RPu-< zs;NaxRmC>?P2sAddO~cQW6ML`0_v>?CBYb@{0)A?KA6*X*S9Ko`*JqtyvHT21j1QU#k7N!K z7H`kt*-Xk~;7uUvLoZFFV$7k(fSH|^g5N}Oh1duM^GQK;28;r5>J#PjAt4iiK!clI z09+OWCvsF$ z&F`?Z24#u=(QF}``BGh&5>L96BVdV=e!2zq1T^dP7o?XQR9uF*1l2P1b!Dask)WHd z147US-&rT-&4aR*q)8^PricZK@il#ybjYj(&qoD4-(gX~Q$#@VzcpTXnmw4Q zV^}A$grmc;&Dj+>kjxekvA##x$>=!xMe%`=dZRI6T0bGB2DX4@VJRCW5>5mDh!A$P zt)qH5VL@0t`4k~7`Lb|Iyb>ZCd|cl~(K7oa^al{SUS6Tw~kiT_QJ zT#j;5>i_c5oSuX1|Jnv|#-X85!df1Gplq|w3t#$05%e+iO=4AX*Jd+e1hI<$^5w;h zv)BLpxb=YQRmtnPLOCD~y&g@A)Wjr4B*uXIG$~!a^|WetTn}XKqL0xcT&$D2r#Y0A zsJ9f71At@)OiQ8;h9E;_Evd{UY)Z&kpB){&&G}zZx^hBiO+PnFe?Ug%bVg0}tZ&R8 z$GfT4Y@tf0!~QurzDyHD;TmJ-bwJg?X+)@obg}{Zw z#T}_eFAY_Y-W7bkFN>Bh0yHj7)mOQ#QPELH2D5iY4|8ZylANt);;~Q8LW+pI$)<1$ zfRW9*D-K44_5{eD>@obk2S9n}VtUib&Z(s5{a(4clzVOrGgXDeR*idR7SV-+Pl{OzWO3U!`JP}_P)j+nI*fp}G}Ug$1SQ0Z~t z&K0A9jg6FJH=xTuiB8xk@lNoJPYV81f)Cdrp-Ap3;q7E_G~PoFMbXOkE1w$uM zMXWT&aGQ9>6ZNFPbOe2?`^|WV$dHjdT0ufQwxu_ae(#C0f{@gizPpQ<)$E2odVxzT zF{ZEHUUk5Fb)CDcW$N0z8a0AcZZDgmi-hzj(}G%127lz;LtLd{c^>8$jEjAlF^F8K z7%~8cUt?t$7PB0SU5dOCIsA%C@>H}4`-{Bv??XW>aB2CPZJ)cyfjZ;U#f&fE#Qa3jlf0pm_xIpm-?ffLFMBO(*3_(N@+M6M0 zvXUX7;Jz^yzDrh?e_?yWSdE2)T4$8h9ccKGa%v`&T&g8_W%dN`YQ2KU2k)0TfqB`w z29E-yOlv3CWD8aBm~>581F^AZ)oPr~ZOd^D!K~}WrMfMk&Atie@=`NjtPAJVQMx?Z znuT(vzW*}2eCJ{2U0ERK7+wu~Gv0it({*ebJ${JCDP0lBTq<{`U0T3d^0Sk(9;O-I z_&Z%u=@8o^Qr%_*K&Nw=$l&9meLSD}{N(!#Wd!r4e8u_|3{K27Jh_KF(h&Lz5gUva zhzm^Dt(=UfjgnF_UYWC7KBO}pfRVJWNJk)2P+8=SGwNSoHXL;;tpoR0p=F9j5Qg433%p=%w+kybM91dJ0x#DiFpMiMJzprZISXt1luq>b4Nw&s+O!i+Za z!JRgCCg!m{-YWRvi;zQ)6vSag()^z#gmKi?R{^MnHtL^GQl{)zeJ=6fO-~N!!%CMx+ignxPdmm3Z~YON(3(S3EmzM@{*A( z_Ulw6?fBfMEF!HOM@RL8MYP|&$V-ZzZA3;us zV3jh%96cyhsB#F?hA{orvkY&kAIOv`0c6)Pqh{3=ghrf#=9nfpekaK<7T8|FXfg50 zTQbthm9suU5bX0;6KR8d!3%4`MI_|muD%fA{KIF8-H0!5z-{S?JMiqC&tLg|r+NSK zR0M#3;0u$aD@@fq^9Z(b7cYc=B7PAGqQLfnmF7a>Zww>V*E|1DIF4Fv!#@wHiKU!R z8y5IooYw`CFW5FP0O|^<8XCw&X--M__i6$pDvC%wNFuVh2+-)CD@^t=WXPl$`Eud* z4y1*vejMBxdYis8N0++UNe;!*6~L{q;tlI6Pc+GvNwx2VKm!ZO%dSGrn#h*MVkhgm*t<0Q8MRbu z!F76aFtoFE5>iZB8gGFy3RK@XXv$)@myCH}dT0+-^R{9hwVv&?EOsHJIV+n5OPP#oy zIEkJ{AQqL3$j%-&k+iF#E?Aj(kQoEmm0j#Kv2~COJs^+?w2MjdgFCUFLyT*ERBlc+ zFd3*Eg67aND12U3r=Lz&6K zVxZ-T@b3*WN|Hx?YqP%zgUZQ`4*)%Q+1j1@W+0wn!|0+=FOeLjG_tYww*BLc72U%X z&WUeJx?=*RR2jSaodT2E;Z2>Aa6X5XMuS2JYxmd1U}>6_x{hCK1Uh^;`(FA`!!ox@ zwN23lc-%D}P=i9?4oq8o!9C|Atk++9yM`+s_u|L{XFWD!^vMrSzr?HRlz$7q(fZHCg^QQw7ZEDglpN`!F^BuP4*Odc`)doKIqJHzEc@b zFRa2oyt6uvtIeaEwIn#^!!3yhxM8MUQSDG~FqY1V1`1tJ8R%%i1Ot7ffe&SU(ChBx z1tMVdq)nL(fz=X~FYr0gf#Nann%NRV^o;VOjR7&aQeeq7omS!MdX< ziJL!73^WtouGZB7h?vtu;n99B^Ve4od7<;6b8w#>|3J;kmsO~RVCzQX=M5KTEJV-p zl;whL^qQ(%82K5=BH5l4OHJq3GE#J^FUwQ4*Gk8>tWvNXh_ZNSY6KewJTW zohwOL%e>>e7uo(>37?8>LC^5i=Jch*;-i{y>7aSd_Ivnxt%l3Y!NAWEp?D_+))K7= zkwk4#@_xKs$~QI$Sk?TO6SpvkI&P59GDQi1o6T^5H}|Ic5=l!zBAU0Z{!`~;JiKXc z2a3jxW*U68Ex^Uwt*|7x=nKgfhsmI2`{zKcLq+(YEeX)6OqDwivT+7bPZt%gg1dZ; zyB$H>S}3v&!0v~pB$zG`H^&hWRHyU+iR4vIZt(a@UBE1g@#|xQaNw26B7u-L2Z0)DlJxH9D&0E*!6NSbPjA$SmKbsHo-vwjC1?TiI0+{p5|nGd5IdZX4+{ zX72W0UvRLHegjm`7KhXCFK&}Okt;FGN@afu;p^0zDjY$Tk8SWyF^l@0!rCQkG3h#u zt3Xu`9#?|(N+41nD7`#5V75NC3FW*8HVwyAZ<2*iq<|$8uD0J-AY(?^Zg1e0uu@vS zL=bxN{^6EY)+M-V0S6BpFA;JK(eq2yHpVZDn{Fm&I2%E9a-?#aSHrtW;2msGmXj!o zAO@Qp_dCUe&s8v&et6bq)=6YqAd<8X(^thbRkFQyD28YN1W(sqwUNRphco zgk82m9AQO~ker1@NN`JHwrPr&Le9_>k}| z(4qCf%4G&Y6!)-Y`I`G9_E(v9{mI$HX$EY|5xhH7F!3zoZf%AXkA&<1)(1AA?TkXh z?%t%71yC)~6R*6m@G59OoN0&+UX?QisG$p;2oa2bwIj@MM@3)9FoQE~Y5|DN3m2Z#_ z=o|x@gG9=2FDKQ6zudb})-FpQF!Z&!x%^VGNp0B@{YE>#0`;8?Up_-?5Kb7Nhvw*et21DDb810w z=^hw68FOZdzIIScBs?x)YCrty0gP=;+j!}fST`HPq!v+$M! z(AlZs<`qkG0ygUNq230HUFi!*#Or=&TRG0ke>2-&D{w{S-T2gVJR^277xLhLo3{8n z)QYebQu+s&lyO|gbo-iq&hY5hraQFY*E%H_A63`1osdWIll#80C;PmGzZ7Pt{w4Rw zS-J!GG@R9|1H>&jj;(Jna*Da2WjNDaocE@NX1BC52L+a#$!fuJv>ZGD=3X z_(6Tq(w))n%}g!5m*F0;`jZ2>O2jwvHUd9P`%6IvLq^ZQ&z%J)k%UwZnz$&sVSR}- zc?<`7{=;n3xce*li?buCUyT>#Teyr-+8ik2f)8$w-x)kgZ5%>jVR)jPO?8b9e~l0~ z>G)3)SoYSjY3$)kZ&FAQ3?~k{JK;(7zEtG-O_`|cT}WwO#(H05uEpYzwa>S78;x4! z(#dY)B>v@w6nkEJ<(2?D#4V%)aNRw`z?#eohmhu;-<81s%kpa*220P%RSgCHQ^;if zPazZf|JtQAcd~bN_>cU4jrx||rXZs48IAaJVNFU#bNqAU>0(i=yrGD6H#e8doZkFzc$4*%@4^MJ_A$ zE(OMY*ssnR^|u?y$9i^P=>`Z}Ua;_EVQ$J|;r?(q8U$q#vq@>GLY9!!XV}J#cZKnh z_|eczPodSIYZ@;aw;RECc+j}H!OzOQs~YtxQPJkehNrwrI=#EA`$sR)##GI~2EtQx%Q+l~?#4wKJ^@g3m_B6m2^sp_HYaqS>>7#t zVs8_}h_J9*L%1PF41W00p$Dvwb^>|+J-__^zx%g#j9GAXV-DVs>21HO4op0FirR26 zWBmHl56&;)6qUhbJgaFB%oCEHBDg4QW8R?z0ak*wgRGEUuZT0;50aN_Xp0cbeo3Qq zxlDQJ7ZVGn>gxQR*$xUyl6F2WpK>6>Svf~ss9f=+Hgef3Hnf9{g zg9mXvzd_aMsg71tq~PdUBy=KZ52NFsQVamjUiSE5d-nDAHz>AFvMIETI_5CRj?Qs$ zN-`9s!m+%3bUT(0Gsi-J=PjTK74b!Z=_w&?EA$MBC|J_kWli$+7|9xRW*wjw?uH7S z$S8;6;Q;vl!t*OV?z50$l>#@^%A8d-qMFw?f28Kv#FB?_|=io5x1UD~AeX7FC7%ce$w> z7DZJ~I^I}({&zyuuVJHe${mt~%$jVns5by`U#qK8p{UW$krRZ|=^D zn%9V?qVtamRyT)y!BeZQg$OzkI~YN1S-DDIRG9Lhnivu8XNY7^kR2SEt+O@myGB~q zIt%rq3|;D?h}O?nEMDn~B|3}>&#+b!SI&cR3KJ~p^>yUqu0d@?|3m^!G&Q!?=<&Y9sDs)0Gozw9l--`mN}O7f zqOG;@R0qeS*Ah?{emGexVWCOO{^rkDoTMMRKt9qnBju#um9teCsI6y3ZO7eRT2quV zo^m2J#1=_vD*q%ETslCj4}rC}(Q^!kVR?;?b+zrX#CBS4kNvrcz^3EC)`v_XBOf#U z>>K$wUm1H-d(8BUg`Sxs!PwukpT=m1`<-}nK4w2;k?;sPhw@_j{19CJYd>egq+4EA zZxgDs?UzflyFxoeyxU7(T{xzn`$g#C5AgppT4m9G(nKxEas2-r8Swq55)}J?87)gY z7gMKy&b0k!VNyw&oPD++V%XhRl#-JL4HxIl0$+z^Ws!QT$+kLQAsgJQWW9_#q{_Fi zIj}!jT!`{i68PsV&)hV8wSBP8yF8UuIMy<^2yC}Vh6Z(NKEM=2V1b(%n?L03eiha( ztR&l=V5E?ZEu|9N7Sk%+NC@7E8u8vf3Jug!Qcer4*d=Nn@lMqF8DZq`%@Dv|Em|XL zFrnsG3px@AdCSjpYQ>(*E{9SX$Ij};L+4eJ?H7-akMVGni|EcI;1W0+I3mENRpGi6 zR7ss!6>ErI32ZE6OE-y)gRre>w73P$ne6Vgeu089OVibd+Qdl^(;PZx)Z_BR?;)~C1`zedhpcYsK2>q zVp3UzhDXY&CK<`4^6A%~ff+)5$GoWIHPq3^zD@*SZDfs;s8yMy=i)+D$dDf?tiNZ} zqUdd=25I8_?03W8?1KcqVoW(;Z~MDk8uu~N9CQk4h3_!(K5AkBS_uka^ew86=3TES zR0al_%Y~Og2Q_FnJemwg;asASu$s{vIaaBNBLz_)F?*3!P841;-Wx#HlZ@@7C30Z^ zA+AzeZ9~kaXZ?+85xkD(BG43J^4?AY!!%PzzeK;5iCW4r$F!d>&GE(0nrm)6 zvWfNwD-dWMc;(9cE*)+8Y0>|tU6;cUz)$>G^WJZ|v;%lY6(A?4Trm?@uuKHr=g!1- zRVErdBUxJH>fEh8$4SsW%DY5V=T^mFie{-r{#16rO`(6Vo%$ZDI3K;Uog=eH>ABPe zrq?q)Q%{L|Pjbn5dWUWDeSJ5p1$+7%2Rj*gm~+j%7Mr~I$i{n0v|XmSOFB<_120}n zn#JYlvK72W!T3w}g)n-MUC7JxOp6;oW1We zuTL>_;XwTSx6=L*-$-fx@)PA?QXn7}RA3;q|3#ghy~%$9cdfVO^u&tTd#7Sy7)Fq> ziW_!N1UD4YDgfqHWC;iWFxUPjg&2cxT|$QE=mxRxXR{x;C+3CTt0g5c9&YSF%tT8xHdh;m*_^dprpI*2!+Jgh+N>A2aC|8}C}PX!!9^m;6L>2=G3>(A%w zdz|12YC^y=HKh+C7&SzY3brR=cIBZy@<_}YAN(1FHgle9@s)^@;K(bI1=$0Mm}86B z=WkWo6#wAL8{Kdkj6;9|d~?JeeLPs#@$vI(vm0B39~`qOq{is;+~w!!!OzA8Fs*ew z@nMM(r|i*hBl`9jz|N|Uw|hoh}ouu z-}w}?DNhxdi**7AaT&s3c!nqv@DS?W!+C}b4|ve}c^#_i(s|IjJ1uqh+!DZvsKRk{ za`oKoyD`u^yy!UB^P}g#HORw4CR zZ#|0)5SL%;Y9q;9jaDRaAz(BFFg5|Ubri>N~3iJaOOva%Nu`pfan?bu5=gACT2Tp9;V*s%UTN|oiU3$XP+RXjckDHf9O)f7$Xf4go znPEzb>do>)LP5l&NAU_};TgrihnXVmR~QQ_EftsmNa=Q9E8wRVyN7J8C(Bnu(^67SXu}^;%C8WAV4c-!Fo%l+y@4b40Ld1*}_XmoJp4=MoM_%z^rc+!l0nV9+Wl zPO%K;%_ks6Njbw{fer=gf`HZ2_8|CBWq1l_vZ7<<0Vncud5Q7Lm&7Y4G!+m7HKsI= z@WSD5BSBOC4EzGk$1G2~1|rZ<(S39m(Kh-)EzzzYoE|V9@UiuNCK?;>RAMoXd)jZt z9G^hN)}l_$#;e>#O4R$aZ)jezdz_`S+OP7{Za+qLV9b9uoJN&~VOka==yF2g3Noe@ zLZrx?tCrE5_u=dQ@x8KhaWLP z`13Ybw>y^22OojWMj7w)5nQko+(lDu0xV75qK^|v;;lQ5+ix6I#Df|BE$o8_J-06 zZcynL4w!Q&xCUZrP-fRQtetdN6~%m3BKb{oijecQVOaIJbpFJrex)9+J>}Tb{3LE_y@YxRpkp>`s%N?L zCc<^e;h>2v9fW}K1*?_}Vidh7t|`Dj6& zR&`CQ7iox+rx`TA&QMUeFj==!u@JLwbW&w-l?_{!`ITF{yIVvVY=R{#W_aVTN0li@WaQNz{b1fuCMS!P_I06>18or3x|lJ;_spp;qOmmtQw zhskIG$L?doI{Dvmg;^^f%R{V}VI3nQAgvEcmW0!*sZjiGVtvJ!cj44nPDs9iO%ZQa z;y&>g-NGam9^EYLB7Zs;vSvA!kX$YpcLvQEcPL*gIQY_jLMU+a<|fH zjJJRl2=m%|g`(>z%;-H1*Ksd9(L6Ag&Qj?pn$6ip2!*X-Y7(RvNZMK!ThCn)+tSA- z5To-+UQf_GnDn7>Ats#zb#(ILh^F~gR_WD}KU)&cnIr9TXXRgg4d!e8(VZ^}^#31a z?-Zn26m093ZFSkUZQHhO+qP|^%Vt-XZQE6U*~aO;@4=39V@KTkvfkH<%$&Jqj`8I; zjjPbN$4yg7kuo0?l3p|#?RwY)gSh7xsgb-y+zAzR}LWS8Z#bBXD`BF$Rd zYMwssV3Kg4HAemm@CS}vW}BuDnl08g#J270WwKg6c@DiE_7u#QY^M)m46#Wb$jwaL zZin+olkaL+3wUm}TX`NEjN3VkcTLTFIXV2d0p;Z)gTrzD4!d^&4@}L+P{AnIVUW1*Ii$M5!hLhJtAVb zCe-^mQVzlG<{zmoiaAmID>J(9a>a6jyp07o<}7|WNt2|!<@)|paX4u`V-5+dpl{I3v%@C4M~@KfQYEko-b?6uK`LO?hsSpsN?k$>=$ArtLN zZf;GZPG6-Aq%_{G-XEmIklTe4}7lAuotvz;|exdJ^y*uac2 z4-gI*!vjGaQY$pD(>z8yi-tJFY6wY{-R?{ZBUB=`FiNr2r;GT}bS1pBW1myH*5~Eu z)9KanT5!tlxS_YtMWDLwVgB4E17s!%h`^InB0c*B%`O6kaou-60cql#>~6 zy=Z;ODP@!vg{2@!uM1W?K6mIf6oDpKdl76X?QDeK!>G@%~z~WX_zMaHc86XYJ1ylfN zU$gKn8@z{Q6M0kX#H&0JN5kI~C~Yi;A$--Z17lnL)!+J6gs!*xUX?k9N$E4nWcwmM z$O?B^9Sr07R3!FzOFjqk$>P=C4K(vg?i5u*c85|EP#H}o)+LWI7PHZC%j|y(`Jn>t z{2%6g4v{`^fNEfQ!FG(vYpyE3snDW+uUA?Fsnj}Hf(mx;>O~?DLKz?Fa_O?rfEfTv zYsCBbA~py#N_e0sjeci+*%Uev*~w={4MOYvUR72)k93YFEqQ7p7Rm7c9gAnpVNG&O z@ziz%1 z;t@tBZeiez%X>FHufPJ`@+t?SU1ir1YIfvh2s$BI>U8V9hiS*j=NB)#0<8P68sqi$f>8aHq#yD z-Ib*bgF_-GBQvPpDV#K)QyF8}++C9%MnSaX^bX6E{VS^^fu0zATi%CvzV=hYB0V;! ztKVnMoGkZvkyJ%*mD~Djl3@Vt^1Xb8)_CJm#yMOJD`{|Nb&L#yKlB3h)*QvAF}yO% zSvc2t$^E!3UUjqHrn=Xka)%Sm;a~R_%mQ=ppru0bbD@{_NyFScRT>qJ?VE;{?o>Y4 zZQ5!Ar1hO*UA{|!zsJ~bY28Ky9*=S-b7^uSKd~5o438_L`xaQx5UW+VfE}20uSiWM zX`;Nyje?b%(@mC{ujVRG2G6q;!P=u1%2T#wd1bNhEE@IQI`MFFKCwCrxGkL{^U@*n z7R#<5#2vrRpv}{q(mr50jw|Y`F{3~Aisl+C%pv~t#1HC`S_(81z~%%L>>Pn`;&gVP zN(=R~6{1RC5v0jZNXDf7Mq=?^I+v%~C|D3usZol5gBdQsbBII#3I3>!b1$g14jz^; zXR?X|5IPKo=~m+~4ED__%=^=5G4 z;O&Gu+bc-b*~^-pdA&%@nV!GzVwpf?bZfSRV>IqIKuC-?YA|)Jg)B*taq>V5gr}f{ z;{_%b(=YapQX_L4I2G{TqbB_s|MM+S>ymh*v@7gotv$#1U>J*JxImGG1fJSnjlf?Qg&O= z%KAB+2Qj&vfu4y3gl6o#LdxpFlLvbieKmp+!n01Wmz7=2)NQN)!**Kr zutGSnZFG371#u5=I7C|twKT08Mlv~~MFqbW37&aHE~%JL1Z>Kv628XOWu4{yomT5N z4`GM!bLO?jMpz-m#4doImQn zkHZa{2`XPP%`Mr5i_yAEZgfm9~K_^H9n(r1_ehWM4#1N*qYkttlo~3Mu)3fsAHVE&-8IIUzvzxE7 zJ>h;Xvo@GNdjz*1{&m68 z+>0|+!gtlh{Q%@VjIXs}zAK{4`2bG2Km7ddme&#Zm&d-R{y~5T`b;p2FBe!AlABHL znhkufM6j&FtMD`kd=-FCEg~B$W~%VqaH9zmahvP)vHEa{CJB1tBMqq!6D!`a>KsUQ zM~bjKw6+V5;_URpormSchWNZDJ~ekBrL^M_5mXF(kneL&IV~Gr0j|tz=(M&fRhYRq z9@bU=Y&`FDYsy0U=*e6RCzO8)peVquY*@v2M>q1*CO^WL$U#F?#DJuTyCMLNgnwR3 znd5|hdGu;#-7=q>XrNY>dV-e~@tYoT44zI{yCEM%4+&)`Qr#qw(<{1wsneP8zDSSO zNs6nhS18gL8)za3c2u+WzUnX6*{odzTXP9cQ_!v_ZpEs1-gXxE0Tw^~r?@_%JBs>- z|IO+~u}Cyy>H+9amo_q>ZsQs}y1%v%@d$rvyZ#)8&0+V7YRTmi8Njo{!x}FAfwBE; zEMbw3kY}tGjF7%Ny=sG(M#?p^RZwq_LD@pl>n)=^ul(>=qi%z}A$3iWmTx7 zmA}(`lDFAi=6R@eoBGk^ZshB5CUiy4U^hFJpjg-01S3+~L^G>f1~Q)~*n7+j^-lT4 zHtD=iXLO!x1MCRD?DWoOb6h1Or2&>eS$<;}xNy5;y>6Y@&W5mGq(IUi=gyP!`%!ev zN0}8zYYd1})?SUP`ER&P`K4jW7z(mUM$vp}=#a&Ei#HtrE@&Fn%qE)V>oEzgiPT@J z`r8~CJc)VOcJj^S@pE)avssIG&=jk2fYyy@p8Yt$qq6QI@~=zUgLw10XU@(U{nefR z=W3NiKq}rsgaF^HI>4A@IZsE6w++S5($(7RFvT4zfuiPN{M>f2)31d)s=NBg?LY*Z zI|{SQ-jf^=?`3D-J>oY`6*aMWJTCu_1R}?hWY5oRo>S#*;x2$`gIdj!Rhx%+(@i9$ zdHxL%jX*o#Mih`dII=H%%Ym;~zyDWpI*=WK#Mx32aq;$}zg~5iRCa>6-WTF_!v;5+b(w>~%XGH0yVH(32i2MAXW{9Ns^}JXz~mr~&xJO|eN{ zRFQyvhO*7ztsmOj3KAKt#{^?wYq~=E!&Te%{$4dxAn$3nOjXnpdHuYLm<&01KhyzwQgz{dnB-atY(E(WcpBf^qmEZ<(GjWr zye9MTu9sqH6)~y*^k{jpw+<$pb&?%c0n%Mk*YloGabqj$C!f{e6kKqntX|yJ z1_deD)MngG?nKi#c^uYj+9_So*I_(vKj33ETv=)!sOnW`vJ22^Y&Mx?YPI1zdk1iH z4Rr9E(uO*#(3cQk+S?Y?tg*j1rP{|em8|}j{iF?sa-1Y%cGl5Q+VJlG%*?D&%UW== z=5GEwAJgTrr4Jq{D0L2pC{y~Z02gX?^Ma7>sthsIMjG2wbB9gy;G#G-qIrAuP|%q? ze%PWwP1ombR9#Y`twvBpmQAKMq0TZdUN_7+``sg0c=Uwo=YrWJ2@aKePK$F6>h2Yb zE4AYaQR&Se{VrU30wvzotP3UM(EIc(Q~*rihDwgp=_5I#ncu70?B_Bh^gH=_6@NUo z%amzI&TKsR?Ao0Lk*-$hH7J{LPG!FEEV2c%M|&2!bzJ7_p4!VUt!p+f=u~9RNs+(l z4-&5-=ii^plPOu2)Hs045u>=uadua}$K=eU@C!uzOhEbfq*qI^{7m+P>wC^P6{IEG zGX=azJvj2P--|a73Gioy}2iJ$8ny9G@YL%BF>{VlGskXGMy~W4aFUNw7?!Wsf zn_cMMSW!Lq*}Rz}*}9`D=uF89OSrseVs8$ITs0B#d~Q=Sd|9YSDV2Sui39kqyP7^4 z?7X5cB!lN2_X7?g6ZpT0uXWL-6wQX;a)d2jh-V!+KqaaWQw=fYsa+z~u!<&9?I9id zb#%0Vv9rD!a=*^~E${k4;Nf!?z-=v_eN9X^=`>=+C&|tQerMP;t%jSbCdEGdjr(Rl zVSaU61R+%ygg1taEkpV$aQvXwh#PlzNUhKMmtnck_06xz@?eN=R;l)RoKC zVO`J+l0N)Bf(}Il>A*bQ_haW zFv2fAxj%=#bwm4SXVHNU@eHz|TB>Q+DuN79P$$~9;3XZf z8!Dj6yt<=!7^Q!0p7Q)cq_4N1arR2jNfPU);n;izyNLJihAzH=e;6laf4#ZY98IY=?My=rWj(MX%J^R<}AiL16dart(vaiI~{$b%IxDWJPemWNX*149p;FZ)*bQLLC08(0LlXI;g$ zo^lCPe2=Lvms;&m58fXxA2vlI$&5JLZ*$5nAO0xt*%DtA?DPp$zp1FC-WgO0h}I9l z1h6GPwB<5pW9XX0lNzU4C zq@;{|KOtx4UU$GUdr~`jgYXF0-qt_X*L|eF@jksMF`anc5mP1%owM8z0j zxh1*Il72&;*X3TLoU~5dfWGcru)wpT?(J0OjFoEeFYat~y#+?G zwHod6a^r})qUMr1<)js^k8W&i5XYL<(XjeMQ)mJqo~_?jYui9ig(&sDG?>FPStuR9 zGAI7yxY*Jf!ND=3`|&tkds6omH(y+_RW9C%Mi&e*-L7^!kd8U;J*YK|bl6h}4Ir&v zvQfkVFoa0b+L#;w!rN^_t7*uq@sKM%@lJeEZa~*&u1l9WeQ`v+SL(M@(X3_pp&^9T zfZtqQVg6taZi^mml2(e87}gdzFZoc^Kh-}#10XPvP9l*T!XHeThYi@CyKi$@qanwmC4z7C$2HOhdAZn0E#B<%i2SmYaWW3ZnZ(5EAmSSSDD}GNI$J|>c=wBI1 zx{*8;J*mnDt@rd7h#KR>ANL^s(ox3KH_(BgY5^Zoj>&fG<2n!&s~)heTq+ltGXHu$ zjf_`@^EoYe;wMP`g!&O;a269B{EGKTmsswcP=zMfPmSFcAnQ$&7D1{#4RsIbyY6pv zeb7|;6s@A9Ku&nNE5wSn%CurG&C42hRQ?>LHr3@{xqEH%kKD1>n^V+6q{hE^700-SjFv zC#FP#K;FF0UQ)8a)gg=es%I_v39UK(li%N4Z1H1bASS--r~L5^>%;jy$YO)RaBe(s zPR`$|Wp^Tu+&4#WNb7R_a&IO}*hg}hR@|t9YX?c894?_cUmR`o(Jc|}w&|HLZ{YFk zb{x+}x0V0nq(^%nt3cy9(c~D5B0z@Pf59ZporwWQ4p@ZuSX+6Nc^7E_a(d>i>S+~Y zwst;+_{vj*N>dt=K0zfUq~d2MBzrS7qh;0g*h=Ce>J`yZ;h{m-s#jP zx9scUDfFhlR}1%k6j@`x2w#dkOhj;B-_NN>N z@#Uo9F5p3aq#|Ul;F@pEk{3EJ;MC~M$3x!pRCCSXN^jc!fDy?beYcCot^2&Sy-7`D zxq8_eu~(cZlO2VW65817!ykW>6F8SM9#o8)g77;FE8z-j_BAGG+u!dQb&xVg?G$)0 zis*M$Wnz+rM*QuZr9pw_7)SS;{*A3mMowLmgFv5tbyO4BU;nyR7eiZD;U;dvBkiET zSxBZ$&}Hm}Dy%8t>!6hlhS;-3W6=!7heXEt!+tc8ZF;2Y4i(bBhLs_VutqZeep*)- z4*Hb%4~;k=i;6b{t|6SPkTv)YpQwJ^TUZ^n0XKQ|hN;(Ris9Y4Rcbw@cE#{t`+%D- z77-$PFLOjn?h*ER4`p`xDc+!z0N?A|^Wu}^0{QEI0KmMTb&I1v1UKDI9ys?*9d67p z@v&(ajCpY$Txrxf#fM-@;I?WD^=V0!~PtKP~v?APn~U!#n{Wo(n$pu=ww7 zdYDn82x2T*wG!ebmlEXHa&Me-NOotw3NE18j?>lR*em?%1;usp?TO}^#yo^)-?vw@ z+y^3QI8eHhjny)4p;d=17m7D%!j2hTlyF{?U8I+89U%cdSDl^y0chM*O< zX8Mwh)xl&pUi#6mFddRK`_6z$$=X%dnR_$spuw7E8PdGFksI)IG@?**L29bS5rPZn zjaNF`3)N2V()$Z^`RhE3)Zb3kW-?^kC13cY?BqNvOzfo4bHZ3gJEFz{pS#JtwUvUDsBr0elnzK%RK<$aGl9ME5mC|DuYo4^fivMH|Aah^^=FAk2%(^o$McR z7&TEZt)MSJR#|Xzw#{|*Hj_Gi$l@#rQcEuZjl=qS??T8U` z1(QbSDu0wnscMmZY?UWknP(N!Z}l+YqWTq&8&38?^NT6ECf%ueflLB)QcVsf+s}Fr ziC9Ggp#NGL&mDA$paypZPtCG8PsQs?6^-=~i+(45uoC5j<+B|@o-}-2Qv;1JKMsRa z_gk+W{76cc3>G1Ob%i87XLXc^9caQfUiTW@l2aO`8O+Q8AIlmrDa)gwO(8Z;T@G2v zjva%7Ja27+CkEJM*H#>>B3eJqGx2;3lh#prb|eGOt81Phr+CLTU*A6end_R-3As$z z{O+RVcA=ll)Z34wT0yb&J7D8~K+<%Ge^Ao@OSRa^4w>h!OY z$~2R?Z2fz;D>np=ar+G0`$yuCD}a<%8jc^Dn08o4_J%==83OjXlv?rIuk51nT-Z2X@6{ zHX6oCN_451PQzcUNH&?m^pVBJ{puJM!%}E?Ek}*Q2{t>1xZq)Q)3<5!x}HMx_}W+p z3AP3Dhban5L$({WF}wcN82lkmG8emPNWunmEs`uI9G2PGSevEh5|ZzJB{pRXMfWn02f2tun1Ifzu>j}Bwc1e;o zmrL;w6>x$8tr6T%v|m-L zN*m8=H#@0OfJxOxKsZO*DK4c zHeFVx+sGmjLG5y7W75jIpJuOY$p%j~k>d|}7-O$~1HZ;Y@UM+COOD;rU`%E0dywc; zo>ux(g;NFZUPv2+YDFPvz+F9~K|+lIEM~fPRBXAEQn(Q8n5idAsA} zff|@(4s(td`EJh5fdx`@Xl(||MCI#5u-E*iO2imYE8G6dNF_Ez%82Q_7$#$=O~A#C zkFUsdzk_{r)Ns@RdjcS`n7m9DR39HE*{ECVhk=1$-)B5eD4tl4qc44$7U!{9;XG)5 z9Q5Oy=B;@0^Sh+FF3fXNu%m&aQtzTZ9O!%7nA2FHeQa`vp4`z}4ElhVn9g+D+>q-{ zk)xqwZl3p3X&cs^aQDpUKERlb zB^lK5HjAFHwjDsQ{4xHE@UcP1kK85HiT+Tyl`K*r@yctzhhL?0ai{tm_YXqAZg4F$ zAXB%7_Pvq2w>S4rFP!?qzB+$2)@E|Z*P?v_Er;C&_fF*fj)Q^FoC@q09j63!HvFL) zBKcjg8WjCq_H;diO-ZIiSiY)W-jdAaNu~2LcTMPFbI}y|tCJ3$xh+Rh*#O4R0x#VC zF?VPWCZmG8lp{dsv{FXIR#e*&wqJU+xlHcdU6}v9S)Q4F3#(mNol5uAR`std;DHCx z&DRy$YVobwMXI)(Y&aum<1N|>1H4jTFE1vQv5XT&So@GvIpDGv0R_b1lt$^)KS0rk zBN0~kPr>{UL^^1^u1Jgxfi`Zb$@qbc>*gA0g){rF;9KI00*&DowVmh86R8 znOWxF;g2n=&e1|{^2IXUOPMg^jMGCyMn26Kkydi}x=;u~HJ! zU)I(hnGDR*3nwBdr^;*8_!}ILOkJPoXL>~P1~-bCPmkR+`n3Q-!+$x0*M8=mx(K#F7FCnbXY}YrzU9Z zZ`ZpOoPYUEJ+8f76S{geyzRzMm|`=(KOPtI07s6Kc%!=#)jc2L)G5TRBWf02%CG+a zMH{`~RVp1p`~-*j&yf)D&ql@k|ElKyb5o9xt*wKrtC^|t|5}~nYG&v7uhN_S2MX#+ z{Xh5T@Xh`a77S|Tw0t8WkXwbI3CEw1 zF}q9h^-f*OEp-?Kac&}KXh4i(i9I9?#7556C3pG3}eH$$;gCvOV&C(m37=jKfhG&dBcQBRzQ`V2H+rtOd zjuzcP)^cjzMOlSnm;^*2%`@u`3AQ)BIu%64!HQXk6T2qOn(z(5Tx6Yi@2s)0UAcZlA6S^XW za&UQ=RQ8oM-_#`Cpnqw!^)@qMp6A#IH-RXZTnd+*c4okeHOMLb){-}lS9c!7{76~) zD*G9`p^F)=2XS*ImJ;V(K}c86_;q`g;X7s@UCUC%q3CqeQpapoF#OV^u!Eh&89NVu ztsn%AY>!tGF6WcE7rfv78)t=N~L00l|1;My^n?jgA z`8}UrtP^~D{iYGNq{c3B7qh1Gd7L`y<2-vr&;dd1G!$vNF7tRwP&-wR`hbZn#gd#-z`IicvsIb0 zu<>xR-T*CaP~&8P{YZ7KCta(VJYsN*K7^{doZswz9pu6HdpWC+-yr3YejB8)Yw9_d zN@CeDxTrKXe0en@%1tnAgF0zRwihqv&;EXoI6FbS@2w9F0!h7K4&_t(ObFw4QT)Ag zv=XZ}(qC?fgMz2+aAMZG+kPeWZfW>*=WqPdTusInTeIRmVw5?dAWvdCGrz#`WLjnTUhEtFw`nt+Iogs~O$@N;10t z?F{;_>BjIM>E^~aWZBgM>U^=Hw@73;8*Dru#i(^pIi45u`8r<^wP;$aVR%*~iZFrt z^eU+&EC0ILfXuVr@M|q%VPg1cdz9xH)Gi#Rr$5+FJMf{>81dfrM$pglVFB}U2R%4%XHwY*tYf3fk5VNP5oL`>?$Tzz!%l*o5u#9A?QknXwi=add zR!w`ZGz)wWQq>8nKYwvOMsH5sNNO{fwxWI10%Oe|39)J`1sDe3q^oNU&1Sq9S=zMn zM7{*NEo34~C1{-*+tJpD_CA^xqtz;quI(vn^p}HH#Ve(W(>(K-nlW?NoMS!-s2PY@ zqKTBV95(#01y~$jRa04zYFtuy+u2YXvul8(gNMg^Yi}+-z7ai^rVN#IUxT{%2dtz4q`vXt zmQPuQO%_&0^}SBuAHzEei5er#ky`eY)OL2oscQgfW`}JV$^QBSTs?|H8Z9i24p-)3 zsrW;@nYxHhcrX8Tz8NdUPrTOA((KbD&1(r;zsg+>8u(#^bhXeyxxKr7Cgv6@j2Z85 zAVf!5?AU>y!#5OPW_{}4UTvEEn^LKPx4<>g4pp1&n>ivbU70hJBTj;$eZQH8x9e_B z4IFMxId&bW;r2BYp{Ou-b1`pZk_2B!qM9@Lew}_==IU<@KSZS-0_G~KYdQ3F+P}wo zt5p9@%Q&mt<>4gl7jy*Vtn0Hr#`SFM_`dEL&ZYbq=f#(7oc(_4+Z=9wmcJA1!~_1z zA!8L=D*dr_7)12XtDA`g1jO+FFZlm6@^WDn{p~{@Ow!d zTB=)tM4s|_{bA$ggR%A$#36RhMr$n+SDUs{gsm3X1@HNaYTrs*UJ-Jk#)su^)6?OF zfYK_bmk~e^;?|_CkxT;B6LKj2aPA=(Y`s%YQ4mGFfqnO8Ra;Yovz`G_C}W*oVUSvC zqtIW99n~UBdw-XI)uJHO=34fh%f z6z*3SLmP_Wgi}WFN}S2C%`X>gk#vU4XbFb*DleT^O+Bi$hUWwy$+c3_*=0DN?h_wG zWY_{7+*+gV-A$}8tBRFFo6=miKKUz`^O6{2+65W_G@iDTXvNw~7ywH)2hoFFuVA%k zOAdSj1-V7oheTGr{a|a5R@wY3x(@#$Z>nbgF8ic-2q}*c;UFJMkE#mxh(d`#Na2Xj zy++Lk&N)~}r$)IU<-uDi0&`oDuoPHN5yEml2TlX^(J+B6&`K;Jj`tKPbLJLCE8)DD za! zq=eUCXi}{wwqmt|kEAni;l5U5_05)RYw*{!$wy2@FMQhtU8ZdCTlM3qYz@k_&*2V- zmT6?)VwTB8aoQC5N!sD~4c7OVSC5oWqwHNb7rr;Z-tcccr?H|pj|$ri7!RGfNYbo6 zk-uR%4=t?0=*MMua-!NJj`xzZOTCPKFc_iT{ef`*Q>i_&;f9E}!+@t;-fl z#z+kS8c@qZPxqmPFNiShku(-0>TxHLPPhAkimoIc1AXYkX= zG?Yb?mBfx<`0y7srB0~N`KsV0A-@{Zg6O>(g!>XHqo}fLk))P{C7<)WBb^fHvN940 z#RUa9A7_S=^F3M3UF6Z`D5VER?^5VMxDA9(jxVO`OaBpSXVF^s$%z#(aQ9gU`qlI(4j%M1{H1w z6^PV)y??-5pDB9+?fGHPtll@Z!hj#WM3GygtG~+WF5IO=&1r#>Y|zYH{z@(cVj99? zs7bDFxNLNyNu`akqV*<0Wp{aPgUmINGxcQE|kqIc+m6K z!4VuOji)aS_MsV>vrw=NX+oJv5<|P$3JjmZBaOFh-IMA@i&&>71OEst_Sw0}Wp<65ymyDx8C z*;+_g~fs;_sGHSy)Xzf3=#?tbmTp+PfBr@qpNJR zYJDg-<=>8AU^I02sc`)=l2j~!pf%-I^G6Kjeve~KY3l_KDjDXYnMl*!U(=gQw2We( z@SoUeDV?>dCnO5*kyP^7m17~zowAaAb84G;m%jbuy|okIUY9tdv=vcGr748l+&pq` zMpL(s-o+R@mvt%xg2U0<{YZ=vEW`tr5cBKx>2~@S<|Uu2xBVC2X$_5iLF)mf)(xDw z7p+!DrZY3Fr61NT*wIWV$6ny^#!F(XoZh{TG)OC_fuaXrG~E#{!(e8a7S;9g&_@tq z_4eAH)e!FMj8UnU$|)>{C#6nv)iu;n_2QzFd$#9dwmGj${tB^8gkIVmYX18UG=+{v zgpoD6k@W>zQ#^Y%Q{pK=ts=rNsF_r_6%4 zZFYHK6*U{IWpT%2dVMvt*hs)+#@N**h#ym&Qh;z>lxb!_3*}G@_Yw9zDAllJO zb+@;qFlh{^T#)Xv6k-5ez)Y#;GIx0Qd4vywX@DZ8-QnMx((dQC~O;@_fw)(E)|8&z!C)Nc&%Ik(=`a6i)C zn+lc8Ttg=eSRyasYer6yRM9Q&_VOLgj;UukI->U*7L|PIQ0>bB92ed}MKg#azrNxA5??}pEOmtI&W-R+7FrzbF3UgE zI40~Be<@N?0d<1FfHl1B^19gX6vPqQ5u89<#4w5GZW=LT?!t{=WE+T=`wpI_puZY) z$lUF)59fIFm0jL@xY(s8lp3IF=HYW9`JM_+_O&X&BABPIl4twg)60m94gka)6ry-# zhw13~u>C##`2IRj-25;(K=gvZ|7liGFf5GQ`QUWf{CYc)d4%Txypeq;ahk>Hb*Np* zcK(7syS6q4JzYvjhH^!L)5w}&eSftD$U0n8a|)1Ewg6_xFy)!RanScY&q+v~$smiRn9 zZ&+x1K{~JG@pv85m#r@sVdkf|rNlh?Ve$^>CBlSp_>Udbh2VzT*K|?K5Q|p`g~*nR zuOg&+9e8xoZ9K7-jxo`}^~X3DW{x0}CVsH-=wrR#Z%*XCF0$nO5DF*+C$mxap%kQU zCF90F#oK_(UzF{>4sn&_cS#h`wy5#tjYrU94fWlB^=tHeVTEN*h~N{V+7Dvob=_2M`7o?lk!9=B|O*x}F5u|~l6PsZ+zm;cre^#5sdsQncQdJN>h5x-q9X2R_&KT@ek0Ou0=F zPajWS@9~hQl>Va0l49F6$T}!aZf1DjaV)FI*ZzkipJo5kA?WZeod0ofGvWq6w3~E? zlz&{Y3AN84nN`M@gXA>=K{)7p?Xw@s7R^vdg4@IS#iZzzxP342#K+Qdi+OfyR-clv%+Tcv{%%8y6Di8B#WiXkG2m?(z2sGL$mBeQI-LW3luIz)bXwze7kOB`q9n$^)A1GP7evY>`8T-CMdr-`T)yHPo=Z5H%ZDCJ|(-99VlWZQj53<-1A*v!gXsJV9r*V=f$6Q*l z)t_MxsZ7+Axv0UR&#UM^6-VX1Wb8BsufWPoR@h@Of5^P{B-~#w?wW9KJbqAMkGJ17Ctjwx!-2&f9H_Kh;&C zhAxEfO5!MpouxrFY{dG9l&CBq?4aj%f-;{z2PaVlSLt4Y>yPs^fuSI(uGF^DKI&(V za*FJ*CbkZPOYKG5&-u0Iuh{j1CBG?d2@ zxqNgG*dz-ICbHQ+wKj1LpO$K%9$x3HApAh!nsA3USm(HZ!>1QTd{fwd!$NfSK!jpw zy`Bq$O*r7Hzfmd6v^)Jxg)_G5IY*c2LClgZV*ZM2TQlD@@sW7N0z#?06A)_s*xt%x zVz7#>UzF2|M;H&ghAJvrNu?2E*n!7Vo@IpoMg*8WI_XDLmx%6mS*j_zs7Oc*CU$tg zQj<+#>5D~@>>ysmR^_O;2F(qT$1_>i6e4rh_u?#L5+aVz9(pXGrs9~z(Iax?B+kzV z{Y0vDX|0-CHO5b%%Dt{lh@Q_7#vtTSPWa;urM4^@X>~yvR5;|vYA8D#?9hK|@4`eY z(XKabOe1pfA%Z4@MO5!BB#V3I*fp}wz@s<6QNQy>H13wOdTJ4$<|eJKj*WrV>h$B`tP8@{}M%r-*pfA zQ*sO=i~Kaf!e@LQBE2EcR!$-s2QiV#&$Do!htuTkU8|$L0`?G`kRymt=%w}|_~YdK zfjQ5Y?Wv$gY8+Ipq#{MNnwnKS4=~ zjejn%dtR_4dPbZL@nm%-16#cvr=Z>U3O!pI*uq7-I#KJe(D&&^9QR~>)VDHY34*aZ z`376R%`ye<% zlf^S=a+^YI{Tj*bC;4hq(0S^9MM&t_H$MksnuTCPGz-(l_5ty>Ij%M8RjQMjC@4I~ z3^(!K{lVcTrevwQqU-b!7eFZ)m>Pn@(*}zrPIx(^9fz-=C{hLP;6`DCRiQlg5vp%& zS5&ygVj9cn3GA+RmzR*84J7)O4)1e*MXmIaT+IA`c%6 zBcqqR{1V0 z&`?TRU?BC?{It?+;t#Rq1%}oPzC7=bKGD5BBM0i5EkCRrBPiMmk+4#Bw=bKU zM3oW^f@mXFQ?Uu!m~Bp=_OpSiT7Rgx{Fwc%EjygA1?d1N93)apLyBM?lmL1#tC8<7 zN;XAVCimcCbh>zu*rJQ-zSY?t#Vlr>d66@yIz*s_!XB>guA{Gw$BXWL8JI29GfOfo zNH2N}1I_(FPD#We?h z!2eZwadAkxSacy@I@}DZRp|Q6OJ743z?{6{-%5HDzunrQXAtI%(#$g+7NW~)y- zLc^MjazaB7)!XQ^gJ8lz&h6t`U?@2Dh@OD=1t|Ssk9h)}b^wKhP3@z%(IX8RtovLX z&+JLbnfLXlN8CIkTr>^drSBQ;mX#gQ2`Y# zuSbo>22K!NvvJ13bF+xS|=0H$#K}{3rd@3Wqj~7-*TRsKcu@NvN3kilr=&#lPh5pL)3|9Bv^^S zmT&qtV(powCojCSUPPi;8_+XhDw>+YqEikQs$K~{FtI~2Nz4q-oeULxq1f&wX_zxd zp{18&hUWRHXJ3J9W4p6f$w|F5Tkqy(fRT)P%EJZq2X(3PI-AXmZf8jcc^ zjUyP_8{w7lNvcCkhT+wNYMWEZ*>Y0{Yg2)$yoq#I?7XgRL;d{;3m;Bbg@n`zoN8f$ z^>%vxb^O*An`L8HajL6vQch)*i zVE__9e4?a)s73Ne`gMD8gm4)|T!ov-6w+27PV{SSR3A$vpW3%w1b3P!jc4OBqGFjB ze~6GeU7Rk76a@qsBaJzVWM61JKl^NOGH*D+rg(~WL(yuXh)gymK~UN1^F8aJdB3zG z>yb`c5L~145i$>I3oQMJ22-yreUlr{9C*PPPPX~$!TkAfAYnZEWtZ^74~wXo;WQsR zy)Otr-wShgM#*I2%+0CbhMO=huB3a*MC6&=BIzuNVXZuZ5Be1w?jA^?^kH{oYB-sSuKpO z_Gb$6UTj2`scHxkH?if7=81khmdXIRU1#_Fss~b2`W&fC*0|p*j)}33Dh!myWfJJg zHr|$=#!(%^Nw8ZSsyOeKH53VAs7m0DEm$#Rk3I%{!012boO&4zFM}IEKTstu_n-zS zFKm|hNeg#}9z}&O9o!!ntbpYgV;-$acK8aaID~RSUEV*sr=YaO0FZ~Houo}-%*_D8 z&F;!-kt(k*8!4$b;4dMTltH|uX=h4E7i+^fO*<#T_fK{xZR_Vmjbi36VHK29=TueE zlW>4s&}&*ZIZ8$)~Bq>kWVXIGBTtBV=!Q%UcH+bp{n`j`j!#kyr{q< z&P<7)y6AZ@q6AJ}%6L65yyaC@wr?ur>f^iGJ4y~faFa$REb;I*vg~9oNmsan8$u&; z8=0hLvXO1!AU0A}m}50A6cv7`j>V+_qqHR=JMBwyND4dj7{`|FaRrxkBQr?ek6(jT zqYdY=c90EBxRwO&*h&THygWIT)7G*xHHEY8nNiaiG(14w12G8&_u?s)#T@xW@;5CC%DWU7 zh@qfVmV)FrkjyyP73tvHyN0{FjvH-m2)`7Xq9 zX_DSLa(gdT=kqEr*;}!5b`Atcd38o8DB*wGUMv2{ASi7DbX2f2*06D~5Vv)dbP+SR zur~hde&LUew~m}0fDK(R$q-niLV}=dE;A0w5!T7|7Z=_hV{bC3sIs!NW}#E}^5|K{ zEB9Yg8K*B&>LMN)YO+;A4ps|qTiDEgNG*GsP zq$*~!>H!IxatGeResVfn|~^z_i2(ev?LY1zmt0;Xiv#NNBl7iP#ekJ$Qoq$XQbp6+ZJUDSK6sta)w zsn|qQ=uj0z$V^$h;Z~&0iinbul1z##ZVZE zN_&Em+T#%&@{AegV|c2TUpWJ2Ee8hFM=^GwV6L4y^}$HIkE&p$MS7*ZwyOzgT)Heq zS@2xChXA&qgGO1tXQh1Ji_DclPqG3o3{n4~)uKF%;-RMnrW10jqzA(e)?)$kLq%av z>3laI^v^hnb^vYJ67d_9eHBx>rfVC5+6xeI;T$Gf;uTHDPKx#xSwTZ{Hsa69jZomQ zvEU>};R>rH6Q~!n`X*r+X2{ZE;0}7T!}H3IuqT_U@~?AB#3SE5$D|Wb6*SdT-NAt5 z*dW*o?dKcyRPd|e3=eWIc}_$|=bV!J@HIK~37)H$N;mlm@4FM_0VlG`et=xrX@_y5 zQ?M$U{IjB`TAia0&Sj~s%(v!5&t9{oky*(ONVlh-#FM>scqFFHXhQiZBc*n*E!@2+ z=Q2nvIa;reFTKAa_nh_xGiLf+l+9&fc-TZIZ92OU9p~p=v?0ja9!8`Gep?T{#!D%? zgrwcyq0Zhz1lF6~#)#*I!Xm|urjt0@jL+7P8@R0Shtfz=OPQMN!GGVN_DBbpefg=x z5QRg>H`g@7l?-2154G<8?o-OhYGFDdEz~4uI-|BGCpUtd2h)1g_;F|Fwb}LaPcIU;Hg?*G@<+So>JTRzUy#_^E=<)* zprcP_38Ex77^VB=7EO5ObOYuoef!m(fj3|n%p@PgE-d=THPHl&DrqiHFon%k><(p~ zDYs2sA(uvGqboM~t=p$>EaeGJN4T|+E?{8{&^$42nT17SeKXDF^so^b#G&M|sY_4Y z8eq#)J#^+W`kn#!hRS5eGInHMKQM`B!;@Sqm;|Xf%?o(ZjhrxayC1gHNy>ZrN8 zqyAVfVz^nPoMx6DqdCqR@Rq{(0%FyE$7kOfBXPp6!Aq}LcjCm=n`-?bbitdm^w6&oP6`Q8P!`JzMKsFt>k7_A6Ce6d$mBB_xJk@8gvM8$Who=+yz^^Drqf*N4-ZqUOq6n&4LtTwCRX zG;iBUadh`}r%EMXAZ-kD%s4)pbq2#uYVmNHhWm$7H36eTLS1PDHwpc$mD)&9(;+ zPt|GUe{mvGH8FAmSvb0ZoUBb8etrIG=vpnXVtb`~2avMrBrB+Fi5^cgE#QaO8p{|) zFh1^iQM)b+@|E)X7U?0AYRteCJ{FWNn)Bx5?SUTEc$h(uYi=FINVJRM;wSejFPZ&n z`f4aSCkbZU=cTxVFs%YF&EGhWM2Og$XvBzHr~pV`N|;-y=6zsU5tnA>_D$mCfQ44e z=F%WM7Skhi}>afeCpsL zXD(B&Iuf!JIpsIr(l)`5;H4BrPAUoE&O{?N&1EBq!6OjI8G2`qe)irVGG}vgJY|N0 zHxzBkSGGyVGi?O%y=+H2ZNstD#8EGaV$WbfThFb35T`$DdIzVYEgFCNX#x6qfgs@{ zjHk)+-*}19Ze(~P$}gh>kS5J#9Fk*5+GLrmYiK!G6(c50b+Bs{&*Nf4w31S%(KM0h z)Tp&2s>O`xDB(rJ$g%1PWwX_Fv3PNHaiqPzZ^V7=uy>i3)#Nyy8hXZBz-i(!dXQtq zT0DumF9OOltH+W9RXQ>?3GlFxKComRCf#29n0O%;g|4*jM9dL&Suaeqh(v`!AZjI{ zypi&*G0-SqDp+R@hV{g^o4k{N*y!Q)Q-aOJG56^rT4KK_)K{lECC7*wR_EvWV?EEF z=!dn->a&ftK;_N&&{uTsKZMgS@m1*XbvF=EeT6&;kGZR{lX0o7Q)YZzEO-`^Z?Dia9vRFF^TVK&&)X(hM>Xo1F!;?C2Nu_b}6C$o)| zZHx&Q=L4&1%U;^wAW<`|_YB;TxLjFo@1(S7h*MrSDHIg6< zp73Otbt}3me25ypC6zJ6|MFOz;@NaV~e~BHLp1(Iy#xcurm@2c9=|C8G6{DJzeP4E6maFIZw~RCk1n${q^hz z)F*IgBS^q9Y`Jc+-NG}BAr=`e2WN*(YLbQ*VCgngjxX4UDE#=x_}~*kv$tLE)1#qB zhbq+Mr1A?Rr-sHdH5L(i7;e2${rlLYp+d_^GqYl4WZEl*=U?V=zMq+O-Z$77)0Hxp3dDJVDR+tYlQQ-SgU!iJNW1>aCjd4aIuTW*N= z6YwJ)UOj>?1Vj&C%eP_=H3eow4J`XmGH$!p6L zx>nh_vKs?jcXrMw`F5twU~JOCkUdOo(Hl;ytlk*;qSUg&M`~-(qp%4<#f|+H!F<#C zRMhM_S&t>(PZ!wp1TwW_Nqa%gGJ>Hoa%02xpK;LB@cTiFViv> zGU+iNMVy)}Vw%TgbSqhTq@wRvcq0Pkn6C)>!qxQquv2Q%aGw+Bxo?w?!S4<~9zl5b zOl}xpuSz(hB~9=EOKM$}VDi*z@RNTYQwX~6lxSJeIfb-VfK&Zr1LWJ`=lL&E*|BQW zifr~74>3a=N+uiLHd62tHRUW2IBgkrGsPAzif+Nj%o8~uj1;zg)x?4ec)M0$q8@pe zSV6WfH<@zedfT4jO)TGR&DJeiBDzVEB=&h&!Z_4o1l4l8ti~tz0-+cYyu|$^vU_P+ z;hS~EXOIWPp00s?(H~V0O~T@`)!@orUEs%ZI{bE+wOXn(40T^6dKhC_-QTwE3!sGU zmQYcE-{IhWQbaK&K||a#@BkIwRw`rMQBvBgD6eBd!`A@D$h>y5UF5>lEMwEmgI(_% zE2RMwI>kdt)!}-}**YlYAjs_vuiO#Z$(e;=X+Ii^Vr`K0;PHh3h7!ZOCBZ#ZhiP|u zz|FXvM}F3g*-qNhyX3H-^RohpmD2@xosBLtZ5qJAmJs+W)Rj6v~Q%lei_yG)iPOkkSm+(96AlHS;P}pzm zP?RmMIRL{?6()P{&xJ6}d0=g$m;E%Ozn~*KwLUROP49WOJhb)sBKu)W2E?Ucw$#SE zZ$7q!zf@?FVeFT^jimL~iF9|Ndutpi?pc58*8V7gv?H5qOy#y zxt-89^s)EjNfi^wjY8{GrDHyJ(|zwR?4ancdxJ|kh)qh0G3b7jNY>BZ5-I(VlaC^; zXD*HcWzmS`xMA&zDJuS3VuJhEBWf}XGXm?^^v~W5EP=JVR50n|QN&y&hSv($KSDeK zdD897+}>Qls^T67hrKs-9T-P#(WBi^>*kT^J&d##Ed`!gKS6eN3 zzC7Ig5Ww#8tzo~Bd0cHun3|1oT`Mp|AZobC3PBJUxX#c=kVpU0k1x9za;!axww_!Y z7(DFTcKX!Mt(G#XH&CB;hH(j$LC0dKx6}(ftjjnS-+g7w{gH|(j_8PtbNXdtlQLM# z3$Gv}UJfmR@I}Yla{m+YOT8GhsOjgv)wFyRe20P$8(RHp?%7leiLGun|qhO7!=1-rCUOLnBlS?h!j2B$jxxh$yQqo%`L^ZJcb0 zu-szCLeDW|U6>;ck?LZ)B#0i_0@#)FCJ*{(Zuy0_Uap`Ri$#3S8Z!>UtKa=u5P`IFYpiQXJ>A#l7yS=igm8{d6se!qjvOBm=_L#s~+>y zacayr8+pyN@YdktB$p98H)*Mja1?hy;LC?T?@Qs&waHLkhpnAGoaq!rjEW^^>C8lP z(j(6T?D1E))~J{-b!VziLoNYt(X<`#V*X|%Sqp{nmqO_03L-gM)79X&$ zo10%eD|#?BOxb&ihR~4uMI`b}VPd>UaZ9rEBjt&MO@8{oC+ZCD6wr2e@Dg3gmy4zL zcb=MH1MUYkdm4<{FOla$41LS9!*{yIpO<$-_fw$|^l5q9*~BL9B!3-}*KpliN3jn> z*qySD_2p1aq0wdXGpObcAuj(S&q6n^_EBJiRnfScMIpcq7Mc(mUW27_SwAmy-?ei^ z0Z*If=R~1hPD?MB(Du{zO*7@YbG;%-53ld zvzI6$nSj*e(M1OPjlssytMG015k=pof8YR{9vspOZ&RMepD}U;)(H+lS&CU#6Blt@)5-?=25DJzXXfEns?%I|Bh=IK z;?Pc^O;jm-`NpcMK)=0t&L#>Zq?^G0&M)cb(3QHuOHWvh%&|ofqi@bfhcNOA%DQNM z;YtLy*0C&^tWl@f89kVUo7paIfb&#+b@%|S1Gm;B=i0=H56${hxM!bclBx)IR=nE< zi^;N5BDHuCIb`AuTQjlbCmkm==;-YvtuEZSj32s#Ha%O z4CXnr$rh@ViBG42yU^YrQqC&fuaX8{cvfipTX$v)Jb}6L40h7ln`p1|NY<|fh^gqdo(kW?GO2^TuBM>uo9@a)LSHGq_`;|So=x_hz|KtY!CzWT%c}G8 z)fR7#9?Q>l!Lv}R!!bhXwmd6^FP)}BuS3_`eW_<@L@C>zLJ+u#mFRlC$>-&Mg6m!H z-s<7<&eiLktB>YpjDfNFmuF&gs%TSOQdB$9WHt`+`c3Qn))HU6Gz6X(R}GN(>!EkM z+&nMYEbg}EoD|SXSrzDBpaj&TbXOqYNmp&9VJ(cSn>sj_H98reSO|(zB2Y3 zsvtiPlq^*6j421wx0GH#-T{utPdErW`n+j2FLeA-i+YL`o%|}0mt|M|xXg4h+P*V3 z#}<94WK_^|LGiRH*9KbSWes0KjWLf;kOM z67$?`c>&!E!Oj48Ox%vx2Usq;kvprh--RAnP{b{bFUSuxNnk#7=-_@BhStgMUYtza zO)1^Ipzwb0$s1uRpCf*O>W_dVAsr7DYe1x_Sjn1*7W>PQBFj;lIr#O*mTZ!n_G1=A zVG5rw1&@dbZPmDfZB``GP1{4@Uo4X{b1L1Ihbx$$I!3qw#yL9!HxM~p6SqhoC`&9h z?78}TTo-lXw_vt4C9g8eyccL!Lqh8e`qB|tCNStS*lHA ziR9^pd9sbIt5HfbkJbEM%YZ3&z!Re>Rddv!s|cq z@YXDPTK0-;n0^>*Q2nK1wRY6?=b;5N67bQNF9UH2yJ7hH{JKWHr}M^1XWJ!iDod}Y z3d~v?Kg)hlNa9|2^%%_cN%kGtV?3wnE9h(iT$1W{_10~zFutm=3iBW6z{FcZEz~AR z#*DaEO)_%T>v7e*7|9dj-$o+}rVPo}b5|Mgy^EQVp)cq|arXDuxHeXI7V`dEw}^-glccz!8WZR)n3;{4mD$zC`aURBy?u~Q;W)HY(&-;y zck-X0@y0GFHjpzZW(bbZFQEMpD*ph5M4T`)zW_Rz7&gCucZDwaUlI;i0(}Ee;J{` zmY>*n@;FrF{;F#C3rvEI7z?E9?$qDO`!K&Jp1KcnV(=@>{WMg+An7uo{b*2f+Rp~v z$@@sZrxLo46bAei>9@o}zrdO8hyIv(cQAMIKHTrQF7Cr=oBb2+zhu6+&!IS??{)<8 zSSsrH+2lKUpTqBY0Pb^WxBMR*{!3PX`&6J0D?p8iYXO&dwSTA0O{mU9(VFSkKd0B@AKeE{qH>fIWaOjloEeT4E5Dw tzaEZ1Y>K3u-^}a#-MnY=)2z6Ye>V>fV)*?qAqb%SAkX+Nh#DxU{{u9Zi^u=~ literal 0 HcmV?d00001 -- 2.16.6