summaryrefslogtreecommitdiffstats
path: root/common/onap-tosca-datatype/src/main/java/org/onap/sdc/tosca/services/DataModelConvertUtil.java
blob: 693e7d66df0e0524cb35e3544c2897e8ad3f7bcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package org.onap.sdc.tosca.services;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;

import org.apache.commons.collections4.CollectionUtils;
import org.onap.sdc.tosca.datatypes.model.Import;
import org.onap.sdc.tosca.error.ToscaRuntimeException;

public class DataModelConvertUtil {

    private static final String INVALID_TOSCA_IMPORT_SECTION = "Invalid TOSCA import section";

    private DataModelConvertUtil() {
        //Hiding implicit default constructor
    }

    public static List<Map<String, Import>> convertToscaImports(List importObj) {
        ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
        List<Map<String, Import>> convertedImport = new ArrayList<>();
        if (CollectionUtils.isEmpty(importObj)) {
            return null;
        }
        for (Object importEntry : importObj) {
            convertToscaImportEntry(convertedImport, importEntry, toscaExtensionYamlUtil);
        }
        return convertedImport;
    }

    private static void convertToscaImportEntry(List<Map<String, Import>> convertedImport, Object importEntry,
                                         ToscaExtensionYamlUtil toscaExtensionYamlUtil) {
        if (importEntry instanceof String) {
            //Support for import short notation
            /*
            imports:
              - <file_URI_1>
              - <file_URI_2>
             */
            convertImportShortNotation(convertedImport, importEntry.toString());
        } else if (importEntry instanceof Map) {
            handleImportMultiLineGrammar(convertedImport, importEntry, toscaExtensionYamlUtil);
        }
    }

    private static void handleImportMultiLineGrammar(List<Map<String, Import>> convertedImport, Object importEntry,
                                              ToscaExtensionYamlUtil toscaExtensionYamlUtil) {
        try {
            if (((Map) importEntry).containsKey("file")) {
                //Support for import entry of the format - file: <file_uri> or - file: <import object>
                Import importObject = toscaExtensionYamlUtil
                        .yamlToObject(toscaExtensionYamlUtil.objectToYaml(importEntry), Import.class);
                convertImportExtendedNotation(convertedImport, importObject);
            } else {
                convertImportMultiLineGrammar(convertedImport, (Map) importEntry, toscaExtensionYamlUtil);
            }
        } catch (Exception ex) {
            throw new ToscaRuntimeException(INVALID_TOSCA_IMPORT_SECTION, ex);
        }
    }

    private static void convertImportMultiLineGrammar(List<Map<String, Import>> convertedImport, Map importEntry,
                                                      ToscaExtensionYamlUtil toscaExtensionYamlUtil) {
        Set<Map.Entry<String, Object>> importEntries = importEntry.entrySet();
        for (Map.Entry<String, Object> toscaImport : importEntries) {
            String key = toscaImport.getKey();
            Object importValue = toscaImport.getValue();
            if (importValue instanceof Map) {
                /* Support for import entry of the format multi line extended import notation
                    - another_definition_file:
                          file: path1/file.yaml
                          repository: service_repo
                          namespace_uri: http://test.xyz/uri
                          namespace_prefix: pref
                 */
                Import importObject = toscaExtensionYamlUtil
                        .yamlToObject(toscaExtensionYamlUtil.objectToYaml(importValue), Import.class);
                Map<String, Import> convertedToscaImport = new HashMap<>();
                convertedToscaImport.put(key, importObject);
                convertedImport.add(convertedToscaImport);
            } else {
                //Support for import entry of the format - some_definition_file: path1/path2/fileName.yaml
                convertedImport.add((Map<String, Import>) importEntry);
            }
        }
    }

    private static void convertImportExtendedNotation(List<Map<String, Import>> convertedImport, Import importEntry) {
        Map<String, Import> importMap = new HashMap<>();
        Optional<String> fileNameWithoutExtension =
                getFileNameWithoutExtension(getFileName(importEntry.getFile()).replaceAll("/", "_"));
        if (fileNameWithoutExtension.isPresent()) {
            importMap.put(fileNameWithoutExtension.get(), importEntry);
            convertedImport.add(importMap);
        }
    }

    private static void convertImportShortNotation(List<Map<String, Import>> convertImport, String fileFullName) {
        Import importObject = new Import();
        importObject.setFile(fileFullName);
        Map<String, Import> importMap = new HashMap<>();
        Optional<String> fileNameWithoutExtension = getFileNameWithoutExtension(getFileName(fileFullName));
        if (fileNameWithoutExtension.isPresent()) {
            importMap.put(fileNameWithoutExtension.get().replaceAll("/", "_"), importObject);
            convertImport.add(importMap);
        }
    }

    private static Optional<String> getFileNameWithoutExtension(String fileName) {
        if (Objects.isNull(fileName)) {
            return Optional.empty();
        }
        return !fileName.contains(".") ? Optional.of(fileName)
                : Optional.of(fileName.substring(0, fileName.lastIndexOf('.')));
    }


    private static String getFileName(String relativeFileName) {
        if (relativeFileName.contains("../")) {
            return relativeFileName.replace("../", "");
        } else {
            return relativeFileName;
        }
    }
}