Skip to content

Commit

Permalink
Change to ArchiveEntryExtractor
Browse files Browse the repository at this point in the history
  • Loading branch information
vkalapov committed Jan 20, 2025
1 parent 64bbfb4 commit 28dc591
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 106 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,13 @@ private void processApplicationArchive(ProcessContext context, String appArchive
DeploymentDescriptor deploymentDescriptor = extractDeploymentDescriptor(context, appArchiveId, archiveEntriesWithStreamPositions);

ContentLengthTracker sizeTracker = new ContentLengthTracker();
ExternalFileProcessor fileProcessor = new ExternalFileProcessor(sizeTracker, configuration.getMaxResourceFileSize(), fileService);

ExternalFileProcessor fileProcessor = new ExternalFileProcessor(sizeTracker, configuration.getMaxResourceFileSize(), fileService,
context);

if (context.getVariable(Variables.SHOULD_BACKUP_PREVIOUS_VERSION)) {
MtaArchiveContentResolver contentResolver = new MtaArchiveContentResolver(deploymentDescriptor, configuration, fileProcessor, sizeTracker);
contentResolver.resolveMtaArchiveFilesInDescriptor(context.getVariable(Variables.SPACE_GUID), appArchiveId, helper);
MtaArchiveContentResolver contentResolver = new MtaArchiveContentResolver(deploymentDescriptor, configuration, fileProcessor,
sizeTracker);
contentResolver.resolveMtaArchiveFilesInDescriptor(appArchiveId, helper);
}

MtaArchiveElements mtaArchiveElements = new MtaArchiveElements();
Expand All @@ -80,7 +82,8 @@ private void processApplicationArchive(ProcessContext context, String appArchive
context.setVariable(Variables.DEPLOYMENT_DESCRIPTOR, deploymentDescriptor);
}

private MtaArchiveHelper createMtaArchiveHelperFromManifest(ProcessContext context, String appArchiveId, List<ArchiveEntryWithStreamPositions> archiveEntriesWithStreamPositions) {
private MtaArchiveHelper createMtaArchiveHelperFromManifest(ProcessContext context, String appArchiveId,
List<ArchiveEntryWithStreamPositions> archiveEntriesWithStreamPositions) {
ArchiveEntryWithStreamPositions mtaManifestEntry = ArchiveEntryExtractorUtil.findEntry(ArchiveHandler.MTA_MANIFEST_NAME,
archiveEntriesWithStreamPositions);
byte[] inflatedManifestFile = readEntry(context, appArchiveId, mtaManifestEntry);
Expand All @@ -98,16 +101,19 @@ private byte[] readEntry(ProcessContext context, String appArchiveId, ArchiveEnt
return archiveEntryExtractor.extractEntryBytes(ImmutableFileEntryProperties.builder()
.guid(appArchiveId)
.name(mtaManifestEntry.getName())
.spaceGuid(context.getRequiredVariable(Variables.SPACE_GUID))
.maxFileSizeInBytes(configuration.getMaxMtaDescriptorSize())
.spaceGuid(
context.getRequiredVariable(Variables.SPACE_GUID))
.maxFileSizeInBytes(
configuration.getMaxMtaDescriptorSize())
.build(), mtaManifestEntry);
}

protected MtaArchiveHelper getHelper(Manifest manifest) {
return new MtaArchiveHelper(manifest);
}

private void addMtaArchiveModulesInMtaArchiveElements(ProcessContext context, MtaArchiveHelper helper, MtaArchiveElements mtaArchiveElements) {
private void addMtaArchiveModulesInMtaArchiveElements(ProcessContext context, MtaArchiveHelper helper,
MtaArchiveElements mtaArchiveElements) {
Map<String, String> mtaArchiveModules = helper.getMtaArchiveModules();
mtaArchiveModules.forEach(mtaArchiveElements::addModuleFileName);
getStepLogger().debug(Messages.MTA_ARCHIVE_MODULES_0_MESSAGE, mtaArchiveModules.keySet());
Expand All @@ -126,13 +132,15 @@ private void addMtaArchiveResourcesInMtaArchiveElements(MtaArchiveHelper helper,
getStepLogger().debug(Messages.MTA_ARCHIVE_RESOURCES_0_MESSAGE, mtaArchiveResources.keySet());
}

private DeploymentDescriptor extractDeploymentDescriptor(ProcessContext context, String appArchiveId, List<ArchiveEntryWithStreamPositions> archiveEntriesWithStreamPositions) {
private DeploymentDescriptor extractDeploymentDescriptor(ProcessContext context, String appArchiveId,
List<ArchiveEntryWithStreamPositions> archiveEntriesWithStreamPositions) {

ArchiveEntryWithStreamPositions deploymentDescriptorEntry = ArchiveEntryExtractorUtil.findEntry(ArchiveHandler.MTA_DEPLOYMENT_DESCRIPTOR_NAME,
archiveEntriesWithStreamPositions);
ArchiveEntryWithStreamPositions deploymentDescriptorEntry = ArchiveEntryExtractorUtil.findEntry(
ArchiveHandler.MTA_DEPLOYMENT_DESCRIPTOR_NAME, archiveEntriesWithStreamPositions);
byte[] inflatedDeploymentDescriptor = readEntry(context, appArchiveId, deploymentDescriptorEntry);
DescriptorParserFacade descriptorParserFacade = descriptorParserFactory.getInstance();
DeploymentDescriptor deploymentDescriptor = descriptorParserFacade.parseDeploymentDescriptor(new String(inflatedDeploymentDescriptor));
DeploymentDescriptor deploymentDescriptor = descriptorParserFacade.parseDeploymentDescriptor(
new String(inflatedDeploymentDescriptor));
getStepLogger().debug(Messages.MTA_DESCRIPTOR_LENGTH_0_MESSAGE, inflatedDeploymentDescriptor.length);
return deploymentDescriptor;
}
Expand All @@ -148,7 +156,8 @@ private void acquireOperationLock(ProcessContext context) {
String mtaId = deploymentDescriptor.getId();
String namespace = context.getVariable(Variables.MTA_NAMESPACE);
conflictPreventerSupplier.apply(operationService)
.acquireLock(mtaId, namespace, context.getVariable(Variables.SPACE_GUID), context.getVariable(Variables.CORRELATION_ID));
.acquireLock(mtaId, namespace, context.getVariable(Variables.SPACE_GUID),
context.getVariable(Variables.CORRELATION_ID));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

import org.cloudfoundry.multiapps.common.SLException;
import org.cloudfoundry.multiapps.common.util.JsonUtil;
import org.cloudfoundry.multiapps.controller.core.Messages;
import org.cloudfoundry.multiapps.controller.persistence.services.FileService;
import org.cloudfoundry.multiapps.controller.persistence.services.FileStorageException;
import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext;
import org.cloudfoundry.multiapps.controller.process.variables.Variables;
import org.cloudfoundry.multiapps.mta.handlers.ArchiveHandler;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

Expand All @@ -16,17 +18,33 @@ public class ExternalFileProcessor {
private final FileService fileService;
private long maxMtaFileSize;

public ExternalFileProcessor(ContentLengthTracker sizeTracker, long maxMtaFileSize, FileService fileService) {
private ProcessContext context;

public ExternalFileProcessor(ContentLengthTracker sizeTracker, long maxMtaFileSize, FileService fileService, ProcessContext context) {
this.sizeTracker = sizeTracker;
this.maxMtaFileSize = maxMtaFileSize;
this.fileService = fileService;
this.context = context;
}

public Map<String, Object> processFileContent(String space, String appArchiveId, String fileName) {
try {
return fileService.processFileContent(space, appArchiveId, input -> getFileContent(input, fileName));
} catch (FileStorageException e) {
throw new SLException(e, Messages.COULD_NOT_GET_FILE_CONTENT_FOR_0, fileName);
public Map<String, Object> processFileContent(String appArchiveId, String fileName) {
ArchiveEntryExtractor archiveEntryExtractor = new ArchiveEntryExtractor(fileService);
ArchiveEntryWithStreamPositions mtaManifestEntry = ArchiveEntryExtractorUtil.findEntry(ArchiveHandler.MTA_MANIFEST_NAME,
context.getVariable(
Variables.ARCHIVE_ENTRIES_POSITIONS));
byte[] parametersFile = archiveEntryExtractor.extractEntryBytes(ImmutableFileEntryProperties.builder()
.guid(appArchiveId)
.name(mtaManifestEntry.getName())
.spaceGuid(context.getRequiredVariable(
Variables.SPACE_GUID))
.maxFileSizeInBytes(maxMtaFileSize)
.build(), mtaManifestEntry);

try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(parametersFile)) {
return JsonUtil.convertJsonToMap(byteArrayInputStream);
} catch (IOException e) {
throw new SLException(e, org.cloudfoundry.multiapps.controller.process.Messages.ERROR_RETRIEVING_MTA_RESOURCE_CONTENT,
fileName);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,24 +33,25 @@ public class MtaArchiveContentResolver {

private final ExternalFileProcessor fileProcessor;

public MtaArchiveContentResolver(DeploymentDescriptor descriptor, ApplicationConfiguration configuration, ExternalFileProcessor fileProcessor, ContentLengthTracker sizeTracker) {
public MtaArchiveContentResolver(DeploymentDescriptor descriptor, ApplicationConfiguration configuration,
ExternalFileProcessor fileProcessor, ContentLengthTracker sizeTracker) {
this.descriptor = descriptor;
this.configuration = configuration;
this.fileProcessor = fileProcessor;
this.sizeTracker = sizeTracker;
}

public void resolveMtaArchiveFilesInDescriptor(String space, String appArchiveId, MtaArchiveHelper helper) {
resolveResourcesContent(space, appArchiveId, helper);
resolveRequiresDependenciesContent(space, appArchiveId, helper);
public void resolveMtaArchiveFilesInDescriptor(String appArchiveId, MtaArchiveHelper helper) {
resolveResourcesContent(appArchiveId, helper);
resolveRequiresDependenciesContent(appArchiveId, helper);
long totalSizeOfResolvedEntries = sizeTracker.getTotalSize();
LOGGER.debug(MessageFormat.format(Messages.TOTAL_SIZE_OF_ALL_RESOLVED_CONTENT_0, totalSizeOfResolvedEntries));
}

private void resolveResourcesContent(String space, String appArchiveId, MtaArchiveHelper helper) {
private void resolveResourcesContent(String appArchiveId, MtaArchiveHelper helper) {
Map<String, List<String>> resourceFileAttributes = helper.getResourceFileAttributes();
for (var entry : resourceFileAttributes.entrySet()) {
Map<String, Object> parametersFromFile = fileProcessor.processFileContent(space, appArchiveId, entry.getKey());
Map<String, Object> parametersFromFile = fileProcessor.processFileContent(appArchiveId, entry.getKey());
mergeResourcesFromFile(entry, parametersFromFile);
}
}
Expand Down Expand Up @@ -85,16 +86,17 @@ private Map<String, Object> mergeConfiguration(Map<String, Object> parameters, M
Map<String, Object> resourcesCopy = new HashMap<>(parameters);
resourcesCopy.putIfAbsent(SERVICE_CONFIG, new HashMap<String, Object>());

Map<String, Object> serviceCreationParameters = (Map<String, Object>) resourcesCopy.getOrDefault(SERVICE_CONFIG, Collections.emptyMap());
Map<String, Object> serviceCreationParameters = (Map<String, Object>) resourcesCopy.getOrDefault(SERVICE_CONFIG,
Collections.emptyMap());

resolvedResources.forEach(serviceCreationParameters::putIfAbsent);
return resourcesCopy;
}

private void resolveRequiresDependenciesContent(String space, String appArchiveId, MtaArchiveHelper helper) {
private void resolveRequiresDependenciesContent(String appArchiveId, MtaArchiveHelper helper) {
Map<String, List<String>> dependencyFileAttributes = helper.getRequiresDependenciesFileAttributes();
for (var entry : dependencyFileAttributes.entrySet()) {
Map<String, Object> parametersFromFile = fileProcessor.processFileContent(space, appArchiveId, entry.getKey());
Map<String, Object> parametersFromFile = fileProcessor.processFileContent(appArchiveId, entry.getKey());
mergeMtaRequiresDependencyInModules(entry, parametersFromFile);
}
}
Expand All @@ -108,15 +110,17 @@ private void mergeMtaRequiresDependencyInModules(Map.Entry<String, List<String>>
descriptor.setModules(resolvedModules);
}

private void resolveRequiredDependencyFileParameters(Module module, Map.Entry<String, List<String>> entry, Map<String, Object> parametersFromFile) {
private void resolveRequiredDependencyFileParameters(Module module, Map.Entry<String, List<String>> entry,
Map<String, Object> parametersFromFile) {
for (String requiresPath : entry.getValue()) {
String[] splitEntry = requiresPath.split(Constants.MTA_ELEMENT_SEPARATOR);
String requiresDependencyModuleName = splitEntry[0];
String requiresDependencyName = splitEntry[1];
if (module.getName()
.equals(requiresDependencyModuleName)) {
RequiredDependency requiredDependency = getRequiredDependencyForModule(module, requiresDependencyName);
Map<String, Object> mergedRequiredDependencyParameters = mergeConfiguration(requiredDependency.getParameters(), parametersFromFile);
Map<String, Object> mergedRequiredDependencyParameters = mergeConfiguration(requiredDependency.getParameters(),
parametersFromFile);
requiredDependency.setParameters(mergedRequiredDependencyParameters);
sizeTracker.incrementFileSize();
verifyMaxContentSizeIsNotExceeded();
Expand All @@ -131,7 +135,8 @@ private RequiredDependency getRequiredDependencyForModule(Module module, String
.equals(requiresDependencyName))
.findFirst()
.orElseThrow(
() -> new SLException(Messages.ERROR_COULD_NOT_FIND_REQUIRED_DEPENDENCY_0_FOR_MODULE_1, requiresDependencyName, module.getName()));
() -> new SLException(Messages.ERROR_COULD_NOT_FIND_REQUIRED_DEPENDENCY_0_FOR_MODULE_1, requiresDependencyName,
module.getName()));
}

private void verifyMaxContentSizeIsNotExceeded() {
Expand Down
Loading

0 comments on commit 28dc591

Please sign in to comment.