Skip to content

Commit 46fb64b

Browse files
committed
Fix comments
1 parent 8810415 commit 46fb64b

8 files changed

Lines changed: 89 additions & 75 deletions

File tree

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/Messages.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,7 @@ public final class Messages {
8787
public static final String ERROR_OCCURRED_DURING_OBJECT_STORE_HEALTH_CHECKING_FOR_INSTANCE = "Error occurred during object store health checking for instance: \"{0}\"";
8888
public static final String ERROR_OCCURRED_WHILE_CHECKING_DATABASE_INSTANCE_0 = "Error occurred while checking database instance: \"{0}\"";
8989
public static final String INVALID_MULTIPART_FILE = "The provided multipart file cannot be empty";
90-
public static final String INVALID_YAML_FILE = "The provided yaml file is invalid";
91-
public static final String INVALID_MTAR_FILE = "The provided mtar file is invalid";
90+
public static final String INVALID_YAML_FILE = "The provided {0} file is invalid! The file format must be either yaml or mtaext";
9291
public static final String UNSUPPORTED_FILE_FORMAT = "Unsupported file format! \"{0}\" detected";
9392

9493
// Warning messages

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/FileMimeTypeValidator.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44
import java.io.InputStream;
55
import java.text.MessageFormat;
66

7+
import jakarta.inject.Named;
78
import org.apache.commons.io.FilenameUtils;
89
import org.apache.tika.Tika;
910
import org.cloudfoundry.multiapps.common.SLException;
1011
import org.cloudfoundry.multiapps.controller.core.Messages;
1112
import org.springframework.web.multipart.MultipartFile;
13+
import org.yaml.snakeyaml.LoaderOptions;
1214
import org.yaml.snakeyaml.Yaml;
15+
import org.yaml.snakeyaml.constructor.SafeConstructor;
1316
import org.yaml.snakeyaml.error.YAMLException;
1417

18+
@Named
1519
public class FileMimeTypeValidator {
1620

1721
private static final String APPLICATION_ZIP_MIME_TYPE = "application/zip";
@@ -21,10 +25,7 @@ public class FileMimeTypeValidator {
2125
private static final String EXTENSION_DESCRIPTOR_FILE_EXTENSION = "mtaext";
2226
private static final Tika tika = new Tika();
2327

24-
private FileMimeTypeValidator() {
25-
}
26-
27-
public static void validateMultipartFileMimeType(MultipartFile multipartFile) {
28+
public void validateMultipartFileMimeType(MultipartFile multipartFile) {
2829
if (multipartFile == null || multipartFile.isEmpty()) {
2930
throw new IllegalArgumentException(Messages.INVALID_MULTIPART_FILE);
3031
}
@@ -36,7 +37,7 @@ public static void validateMultipartFileMimeType(MultipartFile multipartFile) {
3637
}
3738
}
3839

39-
public static void validateInputStreamMimeType(InputStream uploadedFileInputStream, String filename) throws IOException {
40+
public void validateInputStreamMimeType(InputStream uploadedFileInputStream, String filename) throws IOException {
4041
String detectedType = getFileMimeType(uploadedFileInputStream);
4142
switch (detectedType) {
4243
case TEXT_PLAIN_MIME_TYPE -> validateYamlFile(uploadedFileInputStream, filename);
@@ -46,25 +47,25 @@ public static void validateInputStreamMimeType(InputStream uploadedFileInputStre
4647
}
4748
}
4849

49-
private static String getFileMimeType(InputStream uploadedFileInputStream) throws IOException {
50+
private String getFileMimeType(InputStream uploadedFileInputStream) throws IOException {
5051
return tika.detect(uploadedFileInputStream);
5152
}
5253

53-
private static void validateYamlFile(InputStream uploadedFileInputStream, String filename) {
54+
private void validateYamlFile(InputStream uploadedFileInputStream, String filename) {
5455
validateTextFileExtension(filename);
55-
Yaml yaml = new Yaml();
56+
Yaml yaml = new Yaml(new SafeConstructor(new LoaderOptions()));
5657
try {
5758
yaml.load(uploadedFileInputStream);
5859
} catch (YAMLException e) {
59-
throw new IllegalArgumentException(Messages.INVALID_YAML_FILE);
60+
throw new IllegalArgumentException(MessageFormat.format(Messages.INVALID_YAML_FILE, filename), e);
6061
}
6162
}
6263

63-
private static void validateTextFileExtension(String filename) {
64+
private void validateTextFileExtension(String filename) {
6465
String fileExtension = FilenameUtils.getExtension(filename);
6566

6667
if (!(YAML_FILE_EXTENSION.equals(fileExtension) || EXTENSION_DESCRIPTOR_FILE_EXTENSION.equals(fileExtension))) {
67-
throw new IllegalArgumentException(Messages.INVALID_YAML_FILE);
68+
throw new IllegalArgumentException(MessageFormat.format(Messages.INVALID_YAML_FILE, filename));
6869
}
6970
}
7071
}

multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/FileMimeTypeValidatorTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313
import static org.junit.jupiter.api.Assertions.assertThrows;
1414
import static org.mockito.Mockito.when;
1515

16-
class FileMimeTypeValidatorTest {
16+
class fileMimeTypeValidatorTest {
1717

1818
private Tika tika;
1919
private MultipartFile multipartFile;
2020
private InputStream inputStream;
21+
private FileMimeTypeValidator fileMimeTypeValidator = new FileMimeTypeValidator();
2122

2223
@BeforeEach
2324
void setUp() {
@@ -28,7 +29,7 @@ void setUp() {
2829
@Test
2930
void testValidateMultipartFileMimeTypeWithNullFile() {
3031
assertThrows(IllegalArgumentException.class, () -> {
31-
FileMimeTypeValidator.validateMultipartFileMimeType(null);
32+
fileMimeTypeValidator.validateMultipartFileMimeType(null);
3233
}, Messages.INVALID_MULTIPART_FILE);
3334
}
3435

@@ -37,7 +38,7 @@ void testValidateMultipartFileMimeTypeWithEmptyFile() {
3738
when(multipartFile.isEmpty()).thenReturn(true);
3839

3940
assertThrows(IllegalArgumentException.class, () -> {
40-
FileMimeTypeValidator.validateMultipartFileMimeType(multipartFile);
41+
fileMimeTypeValidator.validateMultipartFileMimeType(multipartFile);
4142
}, Messages.INVALID_MULTIPART_FILE);
4243
}
4344

@@ -49,7 +50,7 @@ void testValidateMultipartFileMimeType_ValidYamlFile() throws Exception {
4950
when(multipartFile.getOriginalFilename()).thenReturn("valid.yaml");
5051
when(tika.detect(inputStream)).thenReturn("text/plain");
5152

52-
FileMimeTypeValidator.validateMultipartFileMimeType(multipartFile);
53+
fileMimeTypeValidator.validateMultipartFileMimeType(multipartFile);
5354
}
5455

5556
@Test
@@ -58,7 +59,7 @@ void testValidateMultipartFileOctetStreamMimeType() throws Exception {
5859
when(multipartFile.getOriginalFilename()).thenReturn("valid.zip");
5960
when(tika.detect(inputStream)).thenReturn("application/octet-stream");
6061

61-
FileMimeTypeValidator.validateMultipartFileMimeType(multipartFile);
62+
fileMimeTypeValidator.validateMultipartFileMimeType(multipartFile);
6263
}
6364

6465
@Test
@@ -67,6 +68,6 @@ void testValidateMultipartFileOApplicationZipMimeType() throws Exception {
6768
when(multipartFile.getOriginalFilename()).thenReturn("valid.zip");
6869
when(tika.detect(inputStream)).thenReturn("application/zip");
6970

70-
FileMimeTypeValidator.validateMultipartFileMimeType(multipartFile);
71+
fileMimeTypeValidator.validateMultipartFileMimeType(multipartFile);
7172
}
7273
}

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ValidateDeployParametersStep.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ public class ValidateDeployParametersStep extends SyncFlowableStep {
3636

3737
private final ResilientOperationExecutor resilientOperationExecutor = new ResilientOperationExecutor();
3838
private final ExecutorService fileStorageThreadPool;
39+
private final FileMimeTypeValidator fileMimeTypeValidator;
3940

4041
@Inject
41-
public ValidateDeployParametersStep(ExecutorService fileStorageThreadPool) {
42+
public ValidateDeployParametersStep(ExecutorService fileStorageThreadPool, FileMimeTypeValidator fileMimeTypeValidator) {
4243
this.fileStorageThreadPool = fileStorageThreadPool;
44+
this.fileMimeTypeValidator = fileMimeTypeValidator;
4345
}
4446

4547
@Override
@@ -179,13 +181,11 @@ private void mergeArchive(ProcessContext context, List<FileEntry> archivePartEnt
179181
private void mergeArchive(ProcessContext context, List<FileEntry> archivePartEntries, BigInteger archiveSize) {
180182
ArchiveStreamWithName archiveStreamWithName = getMergedArchiveStreamCreator(archivePartEntries, archiveSize).createArchiveStream();
181183
try {
182-
LazyArchiveInputStream lazyArchiveInputStream = (LazyArchiveInputStream) archiveStreamWithName.getArchiveStream();
183-
FileMimeTypeValidator.validateInputStreamMimeType(lazyArchiveInputStream.getCurrentInputStream(),
184-
archiveStreamWithName.getArchiveName());
185184
getStepLogger().infoWithoutProgressMessage(Messages.ARCHIVE_IS_SPLIT_TO_0_PARTS_TOTAL_SIZE_IN_BYTES_1_UPLOADING,
186185
archivePartEntries.size(), archiveSize);
187186
FileEntry uploadedArchive = persistArchive(archiveStreamWithName, context, archiveSize);
188187
context.setVariable(Variables.APP_ARCHIVE_ID, uploadedArchive.getId());
188+
validateMergedArchive(archiveStreamWithName);
189189
getStepLogger().infoWithoutProgressMessage(MessageFormat.format(Messages.ARCHIVE_WITH_ID_0_AND_NAME_1_WAS_STORED,
190190
uploadedArchive.getId(),
191191
archiveStreamWithName.getArchiveName()));
@@ -196,6 +196,13 @@ private void mergeArchive(ProcessContext context, List<FileEntry> archivePartEnt
196196
}
197197
}
198198

199+
private void validateMergedArchive(ArchiveStreamWithName archiveStreamWithName) throws IOException {
200+
LazyArchiveInputStream lazyArchiveInputStream = (LazyArchiveInputStream) archiveStreamWithName.getArchiveStream();
201+
fileMimeTypeValidator.validateInputStreamMimeType(lazyArchiveInputStream.getCurrentInputStream(),
202+
archiveStreamWithName.getArchiveName());
203+
lazyArchiveInputStream.close();
204+
}
205+
199206
private String[] getArchivePartIds(ProcessContext context) {
200207
String archiveId = context.getRequiredVariable(Variables.APP_ARCHIVE_ID);
201208
return archiveId.split(",");

multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/ValidateDeployParametersStepTest.java

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
package org.cloudfoundry.multiapps.controller.process.steps;
22

3-
import static org.junit.jupiter.api.Assertions.assertEquals;
4-
import static org.junit.jupiter.api.Assertions.assertFalse;
5-
import static org.junit.jupiter.api.Assertions.assertThrows;
6-
import static org.mockito.ArgumentMatchers.any;
7-
import static org.mockito.Mockito.when;
8-
93
import java.io.InputStream;
104
import java.math.BigInteger;
115
import java.nio.file.Files;
@@ -21,6 +15,7 @@
2115

2216
import org.cloudfoundry.multiapps.common.SLException;
2317
import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration;
18+
import org.cloudfoundry.multiapps.controller.core.validators.parameters.FileMimeTypeValidator;
2419
import org.cloudfoundry.multiapps.controller.persistence.model.FileEntry;
2520
import org.cloudfoundry.multiapps.controller.persistence.model.ImmutableFileEntry;
2621
import org.cloudfoundry.multiapps.controller.persistence.services.FileStorageException;
@@ -33,6 +28,12 @@
3328
import org.junit.jupiter.params.provider.MethodSource;
3429
import org.mockito.Mockito;
3530

31+
import static org.junit.jupiter.api.Assertions.assertEquals;
32+
import static org.junit.jupiter.api.Assertions.assertFalse;
33+
import static org.junit.jupiter.api.Assertions.assertThrows;
34+
import static org.mockito.ArgumentMatchers.any;
35+
import static org.mockito.Mockito.when;
36+
3637
class ValidateDeployParametersStepTest extends SyncFlowableStepTest<ValidateDeployParametersStep> {
3738

3839
private static final String MERGED_ARCHIVE_TEST_MTAR = "merged-archive-test.mtar";
@@ -48,36 +49,37 @@ class ValidateDeployParametersStepTest extends SyncFlowableStepTest<ValidateDepl
4849

4950
private static Stream<Arguments> testExecution() {
5051
return Stream.of(
51-
// [1] No file associated with the specified file id
52-
Arguments.of(new StepInput(EXISTING_FILE_ID, NOT_EXISTING_FILE_ID + "," + EXISTING_FILE_ID, 1, null),
53-
MessageFormat.format(Messages.ERROR_NO_FILE_ASSOCIATED_WITH_THE_SPECIFIED_FILE_ID_0_IN_SPACE_1,
54-
"notExistingFileId", "space-id"),
55-
false, ""),
56-
57-
// [2] Valid parameters
58-
Arguments.of(new StepInput(EXISTING_FILE_ID,
59-
EXISTING_FILE_ID + "," + EXISTING_FILE_ID,
60-
1,
61-
VersionRule.HIGHER.toString()),
62-
null, false, ""),
63-
64-
// [3] Max descriptor size exceeded
65-
Arguments.of(new StepInput(EXISTING_FILE_ID, EXISTING_BIGGER_FILE_ID, 1, VersionRule.HIGHER.toString()),
66-
MessageFormat.format(org.cloudfoundry.multiapps.mta.Messages.ERROR_SIZE_OF_FILE_EXCEEDS_CONFIGURED_MAX_SIZE_LIMIT,
67-
"1048577", "extDescriptorFile", "1048576"),
68-
false, ""),
69-
70-
// [4] Process chunked file
71-
Arguments.of(new StepInput(MERGED_ARCHIVE_NAME + ".part.0," + MERGED_ARCHIVE_NAME + ".part.1,"
72-
+ MERGED_ARCHIVE_NAME + ".part.2", null, 1, VersionRule.HIGHER.toString()), null, true, ""),
73-
74-
// [5] Max size of entries exceeded
75-
Arguments.of(new StepInput(EXCEEDING_FILE_SIZE_ID + ".part.0," + EXCEEDING_FILE_SIZE_ID + ".part.1,"
76-
+ EXCEEDING_FILE_SIZE_ID + ".part.2," + EXCEEDING_FILE_SIZE_ID + ".part.3," + EXCEEDING_FILE_SIZE_ID
77-
+ ".part.4", null, 1, VersionRule.HIGHER.toString()),
78-
MessageFormat.format(Messages.SIZE_OF_ALL_OPERATIONS_FILES_0_EXCEEDS_MAX_UPLOAD_SIZE_1, 5368709120L,
79-
4294967296L),
80-
true, ""));
52+
// [1] No file associated with the specified file id
53+
Arguments.of(new StepInput(EXISTING_FILE_ID, NOT_EXISTING_FILE_ID + "," + EXISTING_FILE_ID, 1, null),
54+
MessageFormat.format(Messages.ERROR_NO_FILE_ASSOCIATED_WITH_THE_SPECIFIED_FILE_ID_0_IN_SPACE_1,
55+
"notExistingFileId", "space-id"),
56+
false, ""),
57+
58+
// [2] Valid parameters
59+
Arguments.of(new StepInput(EXISTING_FILE_ID,
60+
EXISTING_FILE_ID + "," + EXISTING_FILE_ID,
61+
1,
62+
VersionRule.HIGHER.toString()),
63+
null, false, ""),
64+
65+
// [3] Max descriptor size exceeded
66+
Arguments.of(new StepInput(EXISTING_FILE_ID, EXISTING_BIGGER_FILE_ID, 1, VersionRule.HIGHER.toString()),
67+
MessageFormat.format(org.cloudfoundry.multiapps.mta.Messages.ERROR_SIZE_OF_FILE_EXCEEDS_CONFIGURED_MAX_SIZE_LIMIT,
68+
"1048577", "extDescriptorFile", "1048576"),
69+
false, ""),
70+
71+
// [4] Process chunked file
72+
Arguments.of(new StepInput(MERGED_ARCHIVE_NAME + ".part.0," + MERGED_ARCHIVE_NAME + ".part.1,"
73+
+ MERGED_ARCHIVE_NAME + ".part.2", null, 1, VersionRule.HIGHER.toString()), null, true, ""),
74+
75+
// [5] Max size of entries exceeded
76+
Arguments.of(new StepInput(EXCEEDING_FILE_SIZE_ID + ".part.0," + EXCEEDING_FILE_SIZE_ID + ".part.1,"
77+
+ EXCEEDING_FILE_SIZE_ID + ".part.2," + EXCEEDING_FILE_SIZE_ID + ".part.3,"
78+
+ EXCEEDING_FILE_SIZE_ID
79+
+ ".part.4", null, 1, VersionRule.HIGHER.toString()),
80+
MessageFormat.format(Messages.SIZE_OF_ALL_OPERATIONS_FILES_0_EXCEEDS_MAX_UPLOAD_SIZE_1, 5368709120L,
81+
4294967296L),
82+
true, ""));
8183
}
8284

8385
private static FileEntry createFileEntry(String id, String name, long size) {
@@ -125,15 +127,15 @@ private void prepareContext() {
125127

126128
private void prepareFileService(String appArchiveId) throws FileStorageException {
127129
when(fileService.getFile("space-id", EXISTING_FILE_ID))
128-
.thenReturn(createFileEntry(EXISTING_FILE_ID, "some-file-entry-name", 1024 * 1024L));
130+
.thenReturn(createFileEntry(EXISTING_FILE_ID, "some-file-entry-name", 1024 * 1024L));
129131
when(fileService.getFile("space-id", MERGED_ARCHIVE_NAME + ".part.0"))
130-
.thenReturn(createFileEntry(MERGED_ARCHIVE_NAME + ".part.0", MERGED_ARCHIVE_NAME + ".part.0", 1024 * 1024L));
132+
.thenReturn(createFileEntry(MERGED_ARCHIVE_NAME + ".part.0", MERGED_ARCHIVE_NAME + ".part.0", 1024 * 1024L));
131133

132134
when(fileService.getFile("space-id", MERGED_ARCHIVE_NAME + ".part.1"))
133-
.thenReturn(createFileEntry(MERGED_ARCHIVE_NAME + ".part.1", MERGED_ARCHIVE_NAME + ".part.1", 1024 * 1024L));
135+
.thenReturn(createFileEntry(MERGED_ARCHIVE_NAME + ".part.1", MERGED_ARCHIVE_NAME + ".part.1", 1024 * 1024L));
134136

135137
when(fileService.getFile("space-id", MERGED_ARCHIVE_NAME + ".part.2"))
136-
.thenReturn(createFileEntry(MERGED_ARCHIVE_NAME + ".part.2", MERGED_ARCHIVE_NAME + ".part.2", 1024 * 1024L));
138+
.thenReturn(createFileEntry(MERGED_ARCHIVE_NAME + ".part.2", MERGED_ARCHIVE_NAME + ".part.2", 1024 * 1024L));
137139

138140
when(fileService.getFile("space-id", EXCEEDING_FILE_SIZE_ID + ".part.0"))
139141
.thenReturn(createFileEntry(MERGED_ARCHIVE_NAME + ".part.0", MERGED_ARCHIVE_NAME + ".part.0", 1024 * 1024 * 1024));
@@ -151,11 +153,11 @@ private void prepareFileService(String appArchiveId) throws FileStorageException
151153
.thenReturn(createFileEntry(MERGED_ARCHIVE_NAME + ".part.4", MERGED_ARCHIVE_NAME + ".part.4", 1024 * 1024 * 1024));
152154

153155
when(fileService.getFile("space-id", EXISTING_BIGGER_FILE_ID))
154-
.thenReturn(createFileEntry(EXISTING_BIGGER_FILE_ID, "extDescriptorFile", 1024 * 1024L + 1));
156+
.thenReturn(createFileEntry(EXISTING_BIGGER_FILE_ID, "extDescriptorFile", 1024 * 1024L + 1));
155157
when(fileService.getFile("space-id", NOT_EXISTING_FILE_ID))
156-
.thenReturn(null);
158+
.thenReturn(null);
157159
when(fileService.addFile(any(FileEntry.class), any(InputStream.class)))
158-
.thenReturn(createFileEntry(EXISTING_FILE_ID, MERGED_ARCHIVE_TEST_MTAR, 1024 * 1024 * 1024L));
160+
.thenReturn(createFileEntry(EXISTING_FILE_ID, MERGED_ARCHIVE_TEST_MTAR, 1024 * 1024 * 1024L));
159161
if (appArchiveId.contains(EXCEEDING_FILE_SIZE_ID)) {
160162
List<FileEntry> fileEntries = List.of(createFileEntry(EXCEEDING_FILE_SIZE_ID + ".part.0", EXCEEDING_FILE_SIZE_ID + ".part.0",
161163
1024 * 1024 * 1024),
@@ -168,7 +170,7 @@ private void prepareFileService(String appArchiveId) throws FileStorageException
168170
createFileEntry(EXCEEDING_FILE_SIZE_ID + ".part.4", EXCEEDING_FILE_SIZE_ID + ".part.4",
169171
1024 * 1024 * 1024));
170172
when(fileService.listFilesBySpaceAndOperationId(Mockito.anyString(), Mockito.anyString()))
171-
.thenReturn(fileEntries);
173+
.thenReturn(fileEntries);
172174
}
173175
}
174176

@@ -179,9 +181,9 @@ private void prepareArchiveMerger() {
179181

180182
private void prepareConfiguration() {
181183
when(configuration.getMaxMtaDescriptorSize())
182-
.thenReturn(ApplicationConfiguration.DEFAULT_MAX_MTA_DESCRIPTOR_SIZE);
184+
.thenReturn(ApplicationConfiguration.DEFAULT_MAX_MTA_DESCRIPTOR_SIZE);
183185
when(configuration.getMaxUploadSize())
184-
.thenReturn(ApplicationConfiguration.DEFAULT_MAX_UPLOAD_SIZE);
186+
.thenReturn(ApplicationConfiguration.DEFAULT_MAX_UPLOAD_SIZE);
185187
}
186188

187189
private void validate() {
@@ -204,7 +206,7 @@ protected ValidateDeployParametersStep createStep() {
204206
futureTask.run();
205207
return futureTask;
206208
});
207-
return new ValidateDeployParametersStep(executorService);
209+
return new ValidateDeployParametersStep(executorService, new FileMimeTypeValidator());
208210
}
209211

210212
private static class StepInput {

0 commit comments

Comments
 (0)