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
|
/*
* ============LICENSE_START=======================================================
* VES-OPENAPI-MANAGER
* ================================================================================
* Copyright (C) 2021 Nokia. 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.onap.ves.openapi.manager.service;
import lombok.extern.log4j.Log4j2;
import org.onap.sdc.api.notification.IArtifactInfo;
import org.onap.sdc.http.SdcConnectorClient;
import org.onap.sdc.impl.DistributionClientDownloadResultImpl;
import org.onap.ves.openapi.manager.config.DistributionClientConfig;
import org.onap.ves.openapi.manager.exceptions.ArtifactException;
import org.onap.ves.openapi.manager.model.Artifact;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* ArtifactsCollector - Collector of artifact contents from distributed service,
* downloads artifacts contents basing on artifacts descriptions
*/
@Log4j2
@Component
public class ArtifactsCollector {
private static final String QUOTATION_MARK = "\"";
private static final int ARTIFACT_NAME_INDEX_NO_QUOTATION = 0;
private static final int ARTIFACT_NAME_INDEX_WITH_QUOTATION = 1;
private static final int NAME_WITH_QUOTATION_LENGTH = 2;
private final SdcConnectorClient sdcConnectorClient;
/**
* Constructor of ArtifactsCollector
* @param sdcConnectorClient SdcConnectorClient object
*/
@Autowired
public ArtifactsCollector(SdcConnectorClient sdcConnectorClient) {
this.sdcConnectorClient = sdcConnectorClient;
}
/**
* @param artifacts List of IArtifactInfo objects, which are descriptions of artifacts
* @return List of Artifacts, each object contains description and content of artifact
*/
public List<Artifact> pullArtifacts(List<IArtifactInfo> artifacts) {
log.info("Downloading artifacts");
List<IArtifactInfo> artifactDescriptions = filterVesEventsArtifacts(artifacts);
return artifactDescriptions.stream()
.map(sdcConnectorClient::downloadArtifact)
.map(downloadResult -> mapDownloadResultToArtifactContent(downloadResult, artifactDescriptions))
.collect(Collectors.toList());
}
private List<IArtifactInfo> filterVesEventsArtifacts(List<IArtifactInfo> artifacts) {
return artifacts.stream()
.filter(artifactInfo ->
artifactInfo.getArtifactType().equals(DistributionClientConfig.VES_EVENTS_ARTIFACT_TYPE))
.collect(Collectors.toList());
}
private Artifact mapDownloadResultToArtifactContent(DistributionClientDownloadResultImpl downloadResult,
List<IArtifactInfo> artifactDescriptions) {
String artifactName = parseArtifactName(downloadResult);
Optional<IArtifactInfo> artifact = findArtifactDescription(artifactDescriptions, artifactName);
return artifact.map(artifactInfo ->
new Artifact(artifactInfo, downloadResult.getArtifactPayload()))
.orElseThrow(ArtifactException::new);
}
private String parseArtifactName(DistributionClientDownloadResultImpl artifact) {
String[] name = artifact.getArtifactName().split(QUOTATION_MARK);
boolean doesContainQuotationMark = name.length >= NAME_WITH_QUOTATION_LENGTH;
return doesContainQuotationMark ? name[ARTIFACT_NAME_INDEX_WITH_QUOTATION] : name[ARTIFACT_NAME_INDEX_NO_QUOTATION];
}
private Optional<IArtifactInfo> findArtifactDescription(List<IArtifactInfo> artifacts, String artifactName) {
return artifacts.stream().filter(a -> a.getArtifactName().equals(artifactName)).findFirst();
}
}
|