267729596b43f46290078c27357ecb1ab9f95f11
[sdc.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019 Nordix Foundation.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.tosca.csar;
22
23 import java.util.ArrayList;
24 import java.util.Iterator;
25 import java.util.List;
26
27 import static org.openecomp.sdc.tosca.csar.CSARConstants.ALGORITHM_MF_ATTRIBUTE;
28 import static org.openecomp.sdc.tosca.csar.CSARConstants.CMD_END;
29 import static org.openecomp.sdc.tosca.csar.CSARConstants.CMS_BEGIN;
30 import static org.openecomp.sdc.tosca.csar.CSARConstants.HASH_MF_ATTRIBUTE;
31 import static org.openecomp.sdc.tosca.csar.CSARConstants.NON_MANO_MF_ATTRIBUTE;
32 import static org.openecomp.sdc.tosca.csar.CSARConstants.SEPERATOR_MF_ATTRIBUTE;
33 import static org.openecomp.sdc.tosca.csar.CSARConstants.SOURCE_MF_ATTRIBUTE;
34
35 public class SOL004ManifestOnboarding extends AbstractOnboardingManifest implements Manifest {
36
37     @Override
38     protected void processMetadata(Iterator<String> iterator) {
39         if(!iterator.hasNext()){
40             return;
41         }
42         String line = iterator.next();
43         if(isEmptyLine(iterator, line)){
44             return;
45         }
46         String[] metaSplit = line.split(SEPERATOR_MF_ATTRIBUTE);
47         if (isInvalidLine(line, metaSplit)) {
48             return;
49         }
50         if (!metaSplit[0].equals(SOURCE_MF_ATTRIBUTE) && !metaSplit[0].equals(NON_MANO_MF_ATTRIBUTE)){
51             String value = line.substring((metaSplit[0] + SEPERATOR_MF_ATTRIBUTE).length()).trim();
52             metadata.put(metaSplit[0].trim(),value.trim());
53             processMetadata(iterator);
54         } else {
55             processSourcesAndNonManoSources(iterator, line);
56         }
57     }
58
59     private void processSourcesAndNonManoSources(Iterator<String> iterator, String prevLine) {
60         if(prevLine.isEmpty()){
61             if(iterator.hasNext()){
62                 processSourcesAndNonManoSources(iterator, iterator.next());
63             }
64         } else if(prevLine.startsWith(SOURCE_MF_ATTRIBUTE+SEPERATOR_MF_ATTRIBUTE)){
65             processSource(iterator, prevLine);
66         }
67         else if(prevLine.startsWith(ALGORITHM_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE) ||
68                 prevLine.startsWith(HASH_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE)){
69             processSourcesAndNonManoSources(iterator, iterator.next());
70         }else if(prevLine.startsWith(CMS_BEGIN)){
71             String line = iterator.next();
72             while(iterator.hasNext() && !line.contains(CMD_END)){
73                line = iterator.next();
74             }
75             processSourcesAndNonManoSources(iterator, iterator.next());
76         }
77         else if(prevLine.startsWith(NON_MANO_MF_ATTRIBUTE+SEPERATOR_MF_ATTRIBUTE)){
78             //non mano should be the last bit in manifest file,
79             // all sources after non mano will be placed to the last non mano
80             // key, if any other structure met error reported
81             processNonManoInputs(iterator, iterator.next());
82         }else{
83             reportError(prevLine);
84         }
85     }
86
87     private void processSource(Iterator<String> iterator, String prevLine) {
88         String value = prevLine.substring((SOURCE_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE).length()).trim();
89         sources.add(value);
90         if(iterator.hasNext()) {
91             processSourcesAndNonManoSources(iterator, iterator.next());
92         }
93     }
94
95     private void processNonManoInputs(Iterator<String> iterator, String prevLine) {
96         if(prevLine.trim().equals(SOURCE_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE)){
97             reportError(prevLine);
98             return;
99         }
100         if(!prevLine.contains(SEPERATOR_MF_ATTRIBUTE)){
101             reportError(prevLine);
102             return;
103         }
104
105         String[] metaSplit = prevLine.trim().split(SEPERATOR_MF_ATTRIBUTE);
106         if (metaSplit.length > 1){
107             reportError(prevLine);
108             return;
109         }
110         int index = prevLine.indexOf(':');
111         if(index > 0){
112             prevLine = prevLine.substring(0, index);
113         }
114         processNonManoSource(iterator, prevLine, new ArrayList<>());
115
116     }
117
118     private void processNonManoSource(Iterator<String> iterator, String key, List<String> sources) {
119         if(!iterator.hasNext()){
120             return;
121         }
122         String line = iterator.next();
123         if(line.isEmpty()){
124             processNonManoSource(iterator, key, sources);
125         }else if(line.trim().startsWith(SOURCE_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE)){
126             String value = line.replace(SOURCE_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE, "").trim();
127             sources.add(value);
128             processNonManoSource(iterator, key, sources);
129         }else {
130             processNonManoInputs(iterator, line);
131         }
132         nonManoSources.put(key.trim(), sources);
133     }
134 }