Skip to content

Commit d6a84b5

Browse files
authored
MODEXPW-582 - TD: Replacing of custom AWS client by folio-s3-client library (#703)
MODEXPW-582 - TD: Replacing of custom AWS client by folio-s3-client library
1 parent 764dedb commit d6a84b5

29 files changed

Lines changed: 270 additions & 832 deletions

pom.xml

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
<folio-service-tools.version>4.1.1</folio-service-tools.version>
5252
<folio-spring-cql.version>9.0.0</folio-spring-cql.version>
5353
<folio-module-descriptor-validator.version>1.0.0</folio-module-descriptor-validator.version>
54-
<minio.version>8.5.15</minio.version>
5554
<openapi-generator.version>6.2.1</openapi-generator.version>
5655
<commons-collections4.version>4.5.0</commons-collections4.version>
5756
<hypersistence-utils-hibernate-63.version>3.7.3</hypersistence-utils-hibernate-63.version>
@@ -62,12 +61,13 @@
6261

6362
<!-- Test properties-->
6463
<junit-extensions.version>2.4.0</junit-extensions.version>
65-
<embedded-minio.version>2.3.1</embedded-minio.version>
6664
<spring-cloud-starter-bootstrap.version>4.2.0</spring-cloud-starter-bootstrap.version>
6765
<wiremock.version>2.27.2</wiremock.version>
66+
<localstack.version>1.20.5</localstack.version>
6867
<marc4j.version>2.9.1</marc4j.version>
6968
<testcontainers.version>1.17.6</testcontainers.version>
70-
<aws.sdk.version>2.29.47</aws.sdk.version>
69+
<aws.sdk.version>2.29.6</aws.sdk.version>
70+
<folio-s3-client.version>3.0.0-SNAPSHOT</folio-s3-client.version>
7171
<hamcrest-all.version>1.3</hamcrest-all.version>
7272
<mockito-inline.version>5.2.0</mockito-inline.version>
7373

@@ -155,11 +155,6 @@
155155
<artifactId>feign-jackson</artifactId>
156156
<version>${feign-jackson.version}</version>
157157
</dependency>
158-
<dependency>
159-
<groupId>io.minio</groupId>
160-
<artifactId>minio</artifactId>
161-
<version>${minio.version}</version>
162-
</dependency>
163158

164159
<dependency>
165160
<groupId>org.apache.sshd</groupId>
@@ -220,7 +215,7 @@
220215

221216
<dependency>
222217
<groupId>software.amazon.awssdk</groupId>
223-
<artifactId>s3</artifactId>
218+
<artifactId>aws-sdk-java</artifactId>
224219
<version>${aws.sdk.version}</version>
225220
</dependency>
226221

@@ -249,6 +244,12 @@
249244
<version>${streamex.version}</version>
250245
</dependency>
251246

247+
<dependency>
248+
<groupId>org.folio</groupId>
249+
<artifactId>folio-s3-client</artifactId>
250+
<version>${folio-s3-client.version}</version>
251+
</dependency>
252+
252253
<!-- Test dependencies -->
253254

254255
<dependency>
@@ -337,11 +338,11 @@
337338
<version>${junit-extensions.version}</version>
338339
<scope>test</scope>
339340
</dependency>
340-
<dependency>
341-
<groupId>com.playtika.testcontainers</groupId>
342-
<artifactId>embedded-minio</artifactId>
343-
<version>${embedded-minio.version}</version>
344-
<scope>test</scope>
341+
<dependency>
342+
<groupId>org.testcontainers</groupId>
343+
<artifactId>localstack</artifactId>
344+
<version>${localstack.version}</version>
345+
<scope>test</scope>
345346
</dependency>
346347
<dependency>
347348
<groupId>com.github.tomakehurst</groupId>
@@ -675,6 +676,8 @@
675676
<artifactId>maven-surefire-plugin</artifactId>
676677
<version>${maven-surefire-plugin.version}</version>
677678
<configuration>
679+
<forkCount>1</forkCount>
680+
<reuseForks>true</reuseForks>
678681
<argLine>
679682
@{argLine} -Xmx2G -Duser.language=en -Duser.region=US
680683
</argLine>

src/main/java/org/folio/dew/batch/AbstractStorageStreamWriter.java

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.folio.dew.batch;
22

3+
import java.io.IOException;
4+
import lombok.Getter;
5+
import lombok.Setter;
36
import lombok.extern.slf4j.Slf4j;
4-
import org.apache.commons.lang3.ArrayUtils;
57
import org.apache.commons.lang3.StringUtils;
68
import org.folio.dew.error.FileOperationException;
79
import org.folio.dew.repository.LocalFilesStorage;
@@ -14,18 +16,15 @@
1416
import org.springframework.batch.item.file.transform.LineAggregator;
1517
import org.springframework.core.io.WritableResource;
1618

17-
import java.io.IOException;
1819
import java.nio.charset.StandardCharsets;
19-
import java.util.List;
20-
21-
import static org.folio.dew.utils.Constants.LINE_SEPARATOR;
22-
import static org.folio.dew.utils.Constants.LINE_SEPARATOR_REPLACEMENT;
2320

2421
@Slf4j
2522
public class AbstractStorageStreamWriter<T, S extends S3CompatibleStorage> implements ItemWriter<T> {
2623

24+
@Getter
2725
private WritableResource resource;
2826
private S storage;
27+
@Setter
2928
private LineAggregator<T> lineAggregator;
3029

3130
public AbstractStorageStreamWriter(String tempOutputFilePath, LocalFilesStorage localFilesStorage) {
@@ -62,32 +61,23 @@ public AbstractStorageStreamWriter(String tempOutputFilePath, String columnHeade
6261
log.info("Creating file {}.", tempOutputFilePath);
6362
}
6463

65-
public WritableResource getResource() {
66-
return resource;
67-
}
68-
6964
public void setResource(S3CompatibleResource<S> resource) {
7065
this.resource = resource;
7166
}
7267

73-
public void setLineAggregator(LineAggregator<T> lineAggregator) {
74-
this.lineAggregator = lineAggregator;
75-
}
76-
77-
public LineAggregator<T> getLineAggregator() {
78-
return lineAggregator;
79-
}
80-
8168
public S3CompatibleStorage getStorage() {
8269
return storage;
8370
}
8471

8572
@Override
8673
public void write(Chunk<? extends T> items) throws Exception {
74+
var filename = resource.getFilename();
8775
var sb = new StringBuilder();
76+
var header =new String(storage.readAllBytes(filename));
77+
sb.append(header);
8878
for (T item : items) {
8979
sb.append(lineAggregator.aggregate(item)).append('\n');
9080
}
91-
storage.append(resource.getFilename(), sb.toString().getBytes(StandardCharsets.UTF_8));
81+
storage.write(filename, sb.toString().getBytes(StandardCharsets.UTF_8));
9282
}
9383
}

src/main/java/org/folio/dew/batch/CsvFileAssembler.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.springframework.stereotype.Component;
1111

1212
import java.util.Collection;
13-
import java.util.stream.Collectors;
1413

1514
@Component
1615
@Log4j2
@@ -24,28 +23,28 @@ public class CsvFileAssembler implements StepExecutionAggregator {
2423
public void aggregate(StepExecution stepExecution, Collection<StepExecution> finishedStepExecutions) {
2524
var csvFilePartObjectNames = finishedStepExecutions.stream()
2625
.map(e -> e.getExecutionContext().getString(JobParameterNames.TEMP_OUTPUT_FILE_PATH))
27-
.collect(Collectors.toList());
26+
.toList();
2827
var destCsvObject = FilenameUtils.getName(
2928
stepExecution.getJobExecution().getJobParameters().getString(JobParameterNames.TEMP_OUTPUT_FILE_PATH) + ".csv");
3029
try {
3130
if ("CIRCULATION_LOG".equals(stepExecution.getJobExecution().getJobInstance().getJobName())) {
32-
var csvUrl = remoteFilesStorage.composeObject(destCsvObject, csvFilePartObjectNames, null, TEXT_CSV);
31+
var csvUrl = remoteFilesStorage.compose(destCsvObject, csvFilePartObjectNames, null, TEXT_CSV);
3332
ExecutionContextUtils.addToJobExecutionContext(stepExecution, JobParameterNames.CIRCULATION_LOG_FILE_NAME, destCsvObject, ";");
3433
ExecutionContextUtils.addToJobExecutionContext(stepExecution, JobParameterNames.OUTPUT_FILES_IN_STORAGE, csvUrl, ";");
3534
} else {
3635
var prefix = stepExecution.getJobExecution().getJobParameters().getString(JobParameterNames.JOB_ID) + "/";
3736

3837
destCsvObject = prefix + destCsvObject;
3938
var csvUrl = remoteFilesStorage.objectToPresignedObjectUrl(
40-
remoteFilesStorage.composeObject(destCsvObject, csvFilePartObjectNames, null, TEXT_CSV));
39+
remoteFilesStorage.compose(destCsvObject, csvFilePartObjectNames, null, TEXT_CSV));
4140

4241
var jsonFilePartObjectNames = finishedStepExecutions.stream()
4342
.map(e -> e.getExecutionContext().getString(JobParameterNames.TEMP_OUTPUT_FILE_PATH) + ".json")
44-
.collect(Collectors.toList());
43+
.toList();
4544
var destJsonObject = prefix + FilenameUtils.getName(
4645
stepExecution.getJobExecution().getJobParameters().getString(JobParameterNames.TEMP_OUTPUT_FILE_PATH) + ".json");
4746
var jsonUrl = remoteFilesStorage.objectToPresignedObjectUrl(
48-
remoteFilesStorage.composeObject(destJsonObject, jsonFilePartObjectNames, null, TEXT_CSV));
47+
remoteFilesStorage.compose(destJsonObject, jsonFilePartObjectNames, null, TEXT_CSV));
4948

5049
ExecutionContextUtils.addToJobExecutionContext(stepExecution, JobParameterNames.OUTPUT_FILES_IN_STORAGE, csvUrl + ";;" + jsonUrl, ";");
5150
}

src/main/java/org/folio/dew/batch/JobCompletionNotificationListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ private void processJobAfter(String jobId, JobParameters jobParameters) {
8484
return;
8585
}
8686
var files = localFilesStorage.walk(path)
87-
.filter(name -> FilenameUtils.getName(name).startsWith(fileNameStart)).collect(Collectors.toList());
87+
.filter(name -> FilenameUtils.getName(name).startsWith(fileNameStart)).toList();
8888
if (files.isEmpty()) {
8989
return;
9090
}

src/main/java/org/folio/dew/batch/authoritycontrol/AuthorityControlCsvFileWriter.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,18 @@ protected String doWrite(Chunk<? extends AuthorityControlExportFormat> chunk) {
7474
}
7575

7676
private void writeString(String str) throws IOException {
77-
localFilesStorage.append(tempOutputFilePath, str.getBytes(StandardCharsets.UTF_8));
77+
78+
try {
79+
var header = new String(localFilesStorage.readAllBytes(tempOutputFilePath));
80+
if (header.charAt(header.length() - 1) != '\n') {
81+
str = header + "\n" + str;
82+
} else {
83+
str = header + str;
84+
}
85+
} catch (IOException e) {
86+
// Just ignore it if there's nothing to append to.
87+
}
88+
localFilesStorage.write(tempOutputFilePath, str.getBytes(StandardCharsets.UTF_8));
7889
}
7990

8091
private void setResource(String tempOutputFilePath) {

src/main/java/org/folio/dew/batch/bursarfeesfines/service/BursarWriter.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,10 @@ public void write(Chunk<? extends String> items) throws Exception {
5858
.map(token -> BursarTokenFormatter.formatHeaderFooterToken(token, items.size(), aggregateTotalAmount))
5959
.collect(Collectors.joining());
6060

61-
localFilesStorage.write(resource.getFilename(), header.getBytes(StandardCharsets.UTF_8));
61+
String result = header
62+
+ lines
63+
+ footer;
6264

63-
localFilesStorage.append(resource.getFilename(), lines.toString()
64-
.getBytes(StandardCharsets.UTF_8));
65-
66-
localFilesStorage.append(resource.getFilename(), footer.getBytes(StandardCharsets.UTF_8));
65+
localFilesStorage.write(resource.getFilename(), result.getBytes(StandardCharsets.UTF_8));
6766
}
6867
}

src/main/java/org/folio/dew/batch/eholdings/EHoldingsCsvFileWriter.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.stream.Collectors;
2626
import java.util.stream.IntStream;
2727
import org.apache.commons.collections.CollectionUtils;
28+
import org.apache.commons.lang3.ArrayUtils;
2829
import org.folio.de.entity.EHoldingsPackage;
2930
import org.folio.dew.domain.dto.EHoldingsExportConfig;
3031
import org.folio.dew.domain.dto.eholdings.EHoldingsResourceExportFormat;
@@ -132,7 +133,13 @@ private void writePackage(Long jobExecutionId) throws IOException {
132133
}
133134

134135
private void writeString(String str) throws IOException {
135-
localFilesStorage.append(tempOutputFilePath, str.getBytes(StandardCharsets.UTF_8));
136+
byte[] bytesHeader = new byte[0];
137+
try {
138+
bytesHeader = localFilesStorage.readAllBytes(tempOutputFilePath);
139+
} catch (IOException e) {
140+
// Just ignore it if there's nothing to append to.
141+
}
142+
localFilesStorage.write(tempOutputFilePath, ArrayUtils.addAll(bytesHeader, str.getBytes(StandardCharsets.UTF_8)));
136143
}
137144

138145
private String getHeader(List<String> fieldNames) {

src/main/java/org/folio/dew/batch/eholdings/GetEHoldingsWriter.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import static org.folio.dew.batch.eholdings.EHoldingsJobConstants.CONTEXT_TOTAL_RESOURCES;
55

66
import java.util.Comparator;
7-
import java.util.List;
8-
import java.util.stream.Collectors;
97

108
import org.folio.dew.domain.dto.eholdings.EHoldingsResourceDTO;
119
import org.folio.dew.repository.EHoldingsResourceRepository;
@@ -40,7 +38,7 @@ public void beforeStep(StepExecution stepExecution) {
4038

4139
@Override
4240
public void write(Chunk<? extends EHoldingsResourceDTO> list) throws Exception {
43-
var resources = list.getItems().stream().map(EHoldingsResourceMapper::convertToEntity).collect(Collectors.toList());
41+
var resources = list.getItems().stream().map(EHoldingsResourceMapper::convertToEntity).toList();
4442
resources.forEach(r -> r.setJobExecutionId(jobId));
4543
repository.saveAll(resources);
4644
jobExecution.getExecutionContext().putInt(CONTEXT_TOTAL_RESOURCES,

src/main/java/org/folio/dew/batch/marc/DataExportCsvItemReader.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import org.folio.dew.repository.LocalFilesStorage;
77

88
import java.util.List;
9-
import java.util.stream.Collectors;
109

1110
public class DataExportCsvItemReader extends CsvItemReader<ItemIdentifier> {
1211

@@ -30,7 +29,7 @@ protected List<ItemIdentifier> getItems(int offset, int limit) {
3029
.skip(offset)
3130
.limit(limit)
3231
.map(ItemIdentifier::new)
33-
.collect(Collectors.toList());
32+
.toList();
3433
}
3534
} catch (Exception e) {
3635
throw new FileOperationException(e.getMessage());

0 commit comments

Comments
 (0)