summaryrefslogtreecommitdiffstats
path: root/csarvalidation/src/main/java/org/onap/cvc/csar/parser/ManifestFileSplitter.java
blob: f8d920c07cd661c9ac235a49a41c02f7da4a3c60 (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
/*
 * Copyright 2019 Nokia
 * <p>
 * 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
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * 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.
 *
 */

package org.onap.cvc.csar.parser;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class FileFormat {
    public enum FileType { WINDOWS, UNIX, MAC, UNKNOWN }

    private static final char CR = '\r';
    private static final char LF = '\n';

    private FileFormat() {
    }

    public static FileType discover(String fileName) throws IOException {

        try (Reader reader = new BufferedReader(new FileReader(fileName))) {
            return discover(reader);
        }
    }

    public static String getNewLine(String fileName) throws IOException {
        switch(discover(fileName)) {
            case WINDOWS: return String.valueOf(CR) + String.valueOf(LF);
            case MAC: return String.valueOf(CR);
            default: return String.valueOf(LF);
        }
    }

    private static FileType discover(Reader reader) throws IOException {
        int c;
        while ((c = reader.read()) != -1) {
            switch(c) {
                case LF: return FileType.UNIX;
                case CR: {
                    if (reader.read() == LF)
                        return FileType.WINDOWS;
                    else
                        return FileType.MAC;
                }
                default: continue;
            }
        }
        return FileType.UNKNOWN;
    }
}

public class ManifestFileSplitter {

    private static final Logger LOG = LoggerFactory.getLogger(ManifestFileSplitter.class);

    public ManifestFileModel split(File manifestFile) {
        String fileName = manifestFile.getAbsolutePath();
        List<String> data = new ArrayList<>();
        List<String> cms = new ArrayList<>();

        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
            List<String> lines = stream.collect(Collectors.toList());
            return createManifestFileModel(data, cms, lines, FileFormat.getNewLine(fileName));

        } catch (IOException e) {
            LOG.error("Unable to process manifest file!", e);
            throw new IllegalArgumentException(String.format("Unable to process manifest file! Wrong file path: '%s'", fileName));
        }
    }

    private ManifestFileModel createManifestFileModel(List<String> data, List<String> cms, List<String> lines, String newLine) {
        boolean isCmsSection = false;

        for (String line : lines) {
            if (line.contains("BEGIN CMS")) {
                isCmsSection = true;
            }

            if (isCmsSection) {
                cms.add(line);
            } else {
                data.add(line);
            }
        }
        return new ManifestFileModel(data, cms, newLine);
    }
}