diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d05cb05..21e0d540 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). The format is based on [Keep a Changelog](http://keepachangelog.com/). +## Version 1.7.0 + +### Added +- ChangeLog support +- MoveAttachments support +- Upload Status support in Attachments +- Internationalization support for error messages + +### Fixed +- Prevent unwanted update calls on edit without changes +- Heap Out of Memory error in Large file upload + ## Version 1.6.2 ### Fixed diff --git a/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMCreateAttachmentsHandler.java b/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMCreateAttachmentsHandler.java index f1f7d2ca..690210ab 100644 --- a/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMCreateAttachmentsHandler.java +++ b/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMCreateAttachmentsHandler.java @@ -72,9 +72,8 @@ public void processBefore(CdsCreateEventContext context, List data) thr logger.info("Attachment compositions present in CDS Model : " + attachmentCompositionDetails); updateName(context, data, attachmentCompositionDetails); // Remove uploadStatus from attachment data to prevent validation errors - + cleanupReadonlyContextsForAttachments(context, entityData, attachmentCompositionDetails); } - SDMUtils.cleanupReadonlyContexts(data); } @After @@ -536,6 +535,45 @@ private void appendWithSpace(StringBuilder sb) { } } + private void cleanupReadonlyContextsForAttachments( + CdsCreateEventContext context, + Map entityData, + Map> attachmentCompositionDetails) { + String targetEntity = context.getTarget().getQualifiedName(); + + for (Map.Entry> entry : attachmentCompositionDetails.entrySet()) { + String attachmentCompositionName = entry.getValue().get("name"); + + logger.info( + "Cleaning up SDM_READONLY_CONTEXT for composition: {}", attachmentCompositionName); + + // Fetch attachments for this specific composition + List> attachments = + AttachmentsHandlerUtils.fetchAttachments( + targetEntity, entityData, attachmentCompositionName); + + if (attachments != null && !attachments.isEmpty()) { + logger.info( + "Found {} attachments in composition: {}", + attachments.size(), + attachmentCompositionName); + + for (int i = 0; i < attachments.size(); i++) { + Map attachment = attachments.get(i); + if (attachment.containsKey(SDM_READONLY_CONTEXT)) { + logger.info( + " Removing SDM_READONLY_CONTEXT from attachment [{}] in {}", + i, + attachmentCompositionName); + attachment.remove(SDM_READONLY_CONTEXT); + } + } + } else { + logger.info("No attachments found for composition: {}", attachmentCompositionName); + } + } + } + private static class SDMAttachmentData { final String fileNameInSDM; final String descriptionInSDM; diff --git a/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMUpdateAttachmentsHandler.java b/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMUpdateAttachmentsHandler.java index df13018f..05c90c2c 100644 --- a/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMUpdateAttachmentsHandler.java +++ b/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMUpdateAttachmentsHandler.java @@ -122,8 +122,10 @@ public void processBefore(CdsUpdateEventContext context, List data) thr logger.info("Attachment compositions present in CDS Model : " + attachmentCompositionDetails); updateName(context, data, attachmentCompositionDetails); + + // Remove uploadStatus from attachment data to prevent validation errors + cleanupReadonlyContextsForAttachments(context, entityData, attachmentCompositionDetails); } - SDMUtils.cleanupReadonlyContexts(data); } public void updateName( @@ -582,4 +584,43 @@ private void handleWarnings( + contextInfo); } } + + private void cleanupReadonlyContextsForAttachments( + CdsUpdateEventContext context, + Map entityData, + Map> attachmentCompositionDetails) { + String targetEntity = context.getTarget().getQualifiedName(); + + for (Map.Entry> entry : attachmentCompositionDetails.entrySet()) { + String attachmentCompositionName = entry.getValue().get("name"); + + logger.info( + "Cleaning up SDM_READONLY_CONTEXT for composition: {}", attachmentCompositionName); + + // Fetch attachments for this specific composition + List> attachments = + AttachmentsHandlerUtils.fetchAttachments( + targetEntity, entityData, attachmentCompositionName); + + if (attachments != null && !attachments.isEmpty()) { + logger.info( + "Found {} attachments in composition: {}", + attachments.size(), + attachmentCompositionName); + + for (int i = 0; i < attachments.size(); i++) { + Map attachment = attachments.get(i); + if (attachment.containsKey(SDM_READONLY_CONTEXT)) { + logger.info( + " Removing SDM_READONLY_CONTEXT from attachment [{}] in {}", + i, + attachmentCompositionName); + attachment.remove(SDM_READONLY_CONTEXT); + } + } + } else { + logger.info("No attachments found for composition: {}", attachmentCompositionName); + } + } + } } diff --git a/sdm/src/main/java/com/sap/cds/sdm/utilities/SDMUtils.java b/sdm/src/main/java/com/sap/cds/sdm/utilities/SDMUtils.java index 7ef74693..a40cb355 100644 --- a/sdm/src/main/java/com/sap/cds/sdm/utilities/SDMUtils.java +++ b/sdm/src/main/java/com/sap/cds/sdm/utilities/SDMUtils.java @@ -67,24 +67,6 @@ public static Set FileNameContainsWhitespace( return filenamesWithWhitespace; } - public static void cleanupReadonlyContexts(List data) { - for (CdsData entityData : data) { - // Remove SDM_READONLY_CONTEXT from all attachments in the data - entityData.forEach( - (key, value) -> { - if (value instanceof List) { - List list = (List) value; - for (Object item : list) { - if (item instanceof Map) { - Map attachment = (Map) item; - attachment.remove(SDM_READONLY_CONTEXT); - } - } - } - }); - } - } - public static Set FileNameDuplicateInDrafts( List data, String composition, String targetEntity, String upIdKey) { Set uniqueFilenames = new HashSet<>();