aboutsummaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/HeatFileAnalyzerRowDataImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/HeatFileAnalyzerRowDataImpl.java')
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/HeatFileAnalyzerRowDataImpl.java152
1 files changed, 152 insertions, 0 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/HeatFileAnalyzerRowDataImpl.java b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/HeatFileAnalyzerRowDataImpl.java
new file mode 100644
index 0000000000..d26942219f
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/HeatFileAnalyzerRowDataImpl.java
@@ -0,0 +1,152 @@
+/*-
+ * ============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.vendorsoftwareproduct.services.impl;
+
+import org.openecomp.sdc.vendorsoftwareproduct.services.HeatFileAnalyzer;
+import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.AnalyzedZipHeatFiles;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.*;
+import java.util.regex.Pattern;
+
+public class HeatFileAnalyzerRowDataImpl implements HeatFileAnalyzer {
+ private static final String HEAT_IDENTIFIER_REGEX = "^heat_template_version:.*";
+ private static final String HEAT_RESOURCES_REGEX = "^resources:\\s*$";
+ private static final String HEAT_PARAMETERS_REGEX = "^parameters:\\s*$";
+ private static final String HEAT_CONDITIONS_REGEX = "^conditions:\\s*$";
+ private static final String HEAT_OUTPUTS_REGEX = "^outputs:\\s*$";
+ private static final String HEAT_PARAMETER_GROUP_REGEX = "^parameter_groups:\\s*$";
+ private static final String HEAT_DESCRIPTION_REGEX = "^description:\\s*$";
+ //allowing spaces at start followed by 'type:' + spaces + any characters + ('.yml' or '.yaml')+
+ // spaces
+ private static final String HEAT_NESTED_RESOURCE_REGEX = "\\s*type:\\s*\\S*.(yml|yaml)\\s*$";
+
+
+ private static final String IDENTIFIER = "IDENTIFIER";
+ private static final String RESOURCES = "RESOURCES";
+ private static final String PARAMETERS = "PARAMETERS";
+ private static final String CONDITIONS = "CONDITIONS";
+ private static final String OUTPUTS = "OUTPUTS";
+ private static final String PARAMETER_GROUP = "PARAMETER_GROUP";
+ private static final String DESCRIPTION = "DESCRIPTION";
+ private static final String NESTED_PATTERN = "NESTED_PATTERN";
+
+ private Map<String, Pattern> patterns;
+
+ public HeatFileAnalyzerRowDataImpl() {
+ patterns = new HashMap<>();
+ patterns.put(IDENTIFIER, Pattern.compile(HEAT_IDENTIFIER_REGEX));
+ patterns.put(RESOURCES, Pattern.compile(HEAT_RESOURCES_REGEX));
+ patterns.put(PARAMETERS, Pattern.compile(HEAT_PARAMETERS_REGEX));
+ patterns.put(CONDITIONS, Pattern.compile(HEAT_CONDITIONS_REGEX));
+ patterns.put(OUTPUTS, Pattern.compile(HEAT_OUTPUTS_REGEX));
+ patterns.put(PARAMETER_GROUP, Pattern.compile(HEAT_PARAMETER_GROUP_REGEX));
+ patterns.put(DESCRIPTION, Pattern.compile(HEAT_DESCRIPTION_REGEX));
+ patterns.put(NESTED_PATTERN, Pattern.compile(HEAT_NESTED_RESOURCE_REGEX));
+ }
+
+ @Override
+ public AnalyzedZipHeatFiles analyzeFilesNotEligibleForModulesFromFileAnalyzer(Map<String, byte[]> files)
+ throws IOException {
+ AnalyzedZipHeatFiles analyzedZipHeatFiles = new AnalyzedZipHeatFiles();
+
+ BufferedReader bfReader;
+ for (Map.Entry<String, byte[]> fileData : files.entrySet()) {
+ String fileName = fileData.getKey();
+ if (!HeatFileAnalyzer.isYamlFile(fileName)) {
+ analyzedZipHeatFiles.addOtherNonModuleFile(fileName);
+ continue;
+ }
+ boolean foundHeatIdentifier = false;
+ try (InputStream is = new ByteArrayInputStream(fileData.getValue())) {
+ bfReader = new BufferedReader(new InputStreamReader(is));
+ String line;
+ boolean isResourcesSection = false;
+ Set<String> nestedFilesNames = new HashSet<>();
+ while ((line = bfReader.readLine()) != null) {
+ if (!foundHeatIdentifier && isMatch(patterns.get(IDENTIFIER), line)) {
+ foundHeatIdentifier = true;
+ analyzedZipHeatFiles.addModuleFile(fileName);
+ if (isResourcesSection) // it means the identifier is located after the resources
+ // section
+ {
+ break;
+ }
+ } else if (isMatch(patterns.get(RESOURCES), line)) {
+ isResourcesSection = true;
+ } else if (isResourceSectionEnd(line, isResourcesSection)) {
+ if (foundHeatIdentifier) {
+ break;
+ }
+ } else if (isResourcesSection) {
+ Optional<String> optionalNestedFileName = fetchNestedFileName(line);
+ optionalNestedFileName
+ .ifPresent(nestedFilesNames::add);
+ }
+ }
+ analyzedZipHeatFiles.addNestedFiles(fetchFileNamesToReturn(nestedFilesNames,
+ foundHeatIdentifier));
+ }
+ }
+ return analyzedZipHeatFiles;
+ }
+
+ private Optional<String> fetchNestedFileName(String line) {
+ if (isMatch(patterns.get(NESTED_PATTERN), line)) {
+ String trimmedLine = line.trim();
+ String nestedFileName = trimmedLine
+ .substring(trimmedLine.indexOf("type:") + "type:".length(), trimmedLine.length())
+ .trim();
+ return Optional.of(nestedFileName);
+ }
+ return Optional.empty();
+ }
+
+ private Set<String> fetchFileNamesToReturn(Set<String> filesNamesToReturn,
+ boolean foundHeatIdentifier) {
+ if (!foundHeatIdentifier) {
+ return new HashSet<>();
+ } else {
+ return filesNamesToReturn;
+ }
+ }
+
+ private boolean isResourceSectionEnd(String line, boolean isResourcesSection) {
+ return isResourcesSection && isStartOfNonResourcesHeatSection(line);
+ }
+
+ private boolean isStartOfNonResourcesHeatSection(String line) {
+ return isMatch(patterns.get(PARAMETERS), line) ||
+ isMatch(patterns.get(CONDITIONS), line) ||
+ isMatch(patterns.get(OUTPUTS), line) ||
+ isMatch(patterns.get(PARAMETER_GROUP), line) ||
+ isMatch(patterns.get(DESCRIPTION), line);
+ }
+
+ private boolean isMatch(Pattern pattern, String line) {
+ return pattern.matcher(line).matches();
+ }
+
+}