Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
**************************************************************************/
package com.sap.cds.feature.attachments.handler.applicationservice;

import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
Expand All @@ -22,9 +24,8 @@
import com.sap.cds.services.handler.annotations.ServiceName;

/**
* The class {@link DeleteAttachmentsHandler} is an event handler that is
* responsible for deleting attachments for entities.
* It is called before a delete event is executed.
* The class {@link DeleteAttachmentsHandler} is an event handler that is responsible for deleting attachments for
* entities. It is called before a delete event is executed.
*/
@ServiceName(value = "*", type = ApplicationService.class)
public class DeleteAttachmentsHandler implements EventHandler {
Expand All @@ -48,8 +49,8 @@ public void processBefore(CdsDeleteEventContext context) {

var attachments = attachmentsReader.readAttachments(context.getModel(), context.getTarget(), context.getCqn());
Filter filter = ApplicationHandlerHelper.buildFilterForMediaTypeEntity();
Converter converter = (path, element, value) -> deleteContentAttachmentEvent.processEvent(path, value,
CdsData.create(path.target().values()), context);
Converter converter = (path, element, value) -> deleteContentAttachmentEvent.processEvent(path,
(InputStream) value, CdsData.create(path.target().values()), context);

ApplicationHandlerHelper.callProcessor(context.getTarget(), attachments, filter, converter);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
**************************************************************************/
package com.sap.cds.feature.attachments.handler.applicationservice.helper;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

Expand All @@ -25,25 +26,26 @@ public static void handleAttachmentForEntities(CdsEntity entity, List<CdsData> d
ModifyAttachmentEventFactory eventFactory, EventContext eventContext) {
Filter filter = ApplicationHandlerHelper.buildFilterForMediaTypeEntity();
Converter converter = (path, element, value) -> handleAttachmentForEntity(existingDataList, eventFactory,
eventContext, path, value);
eventContext, path, (InputStream) value);
ApplicationHandlerHelper.callProcessor(entity, data, filter, converter);
}

public static Object handleAttachmentForEntity(List<CdsData> existingDataList,
ModifyAttachmentEventFactory eventFactory, EventContext eventContext, Path path, Object value) {
public static InputStream handleAttachmentForEntity(List<CdsData> existingDataList,
ModifyAttachmentEventFactory eventFactory, EventContext eventContext, Path path, InputStream content) {
var keys = ApplicationHandlerHelper.removeDraftKeys(path.target().keys());
ReadonlyDataContextEnhancer.fillReadonlyInContext((CdsData) path.target().values());
var existingData = getExistingData(keys, existingDataList);
var contentIdExists = path.target().values().containsKey(Attachments.CONTENT_ID);
var contentId = (String) path.target().values().get(Attachments.CONTENT_ID);

var eventToProcess = eventFactory.getEvent(value, contentId, contentIdExists, existingData);
return eventToProcess.processEvent(path, value, existingData, eventContext);
var eventToProcess = eventFactory.getEvent(content, contentId, contentIdExists, existingData);
return eventToProcess.processEvent(path, content, existingData, eventContext);
}

private static CdsData getExistingData(Map<String, Object> keys, List<CdsData> existingDataList) {
return existingDataList.stream().filter(existingData -> ApplicationHandlerHelper.areKeysInData(keys, existingData))
.findAny().orElse(CdsData.create());
return existingDataList.stream()
.filter(existingData -> ApplicationHandlerHelper.areKeysInData(keys, existingData)).findAny()
.orElse(CdsData.create());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,8 @@
import com.sap.cds.services.EventContext;

/**
* The class {@link CreateAttachmentEvent} handles the creation of an attachment.
* It calls the {@link AttachmentService} to create the attachment and registers the
* transaction listener to be able to revert the creation in case of errors.
* The class {@link CreateAttachmentEvent} handles the creation of an attachment. It calls the {@link AttachmentService}
* to create the attachment and registers the transaction listener to be able to revert the creation in case of errors.
*/
public class CreateAttachmentEvent implements ModifyAttachmentEvent {

Expand All @@ -45,22 +44,23 @@ private static Optional<String> getFieldValue(String fieldName, Map<String, Obje
}

@Override
public Object processEvent(Path path, Object value, CdsData existingData, EventContext eventContext) {
logger.debug("Calling attachment service with create event for entity {}", path.target().entity().getQualifiedName());
public InputStream processEvent(Path path, InputStream content, CdsData existingData, EventContext eventContext) {
logger.debug("Calling attachment service with create event for entity {}",
path.target().entity().getQualifiedName());
var values = path.target().values();
var keys = ApplicationHandlerHelper.removeDraftKeys(path.target().keys());
var mimeTypeOptional = getFieldValue(MediaData.MIME_TYPE, values, existingData);
var fileNameOptional = getFieldValue(MediaData.FILE_NAME, values, existingData);

var createEventInput = new CreateAttachmentInput(keys, path.target().entity(), fileNameOptional.orElse(null),
mimeTypeOptional.orElse(null), (InputStream) value);
mimeTypeOptional.orElse(null), content);
var result = attachmentService.createAttachment(createEventInput);
var createListener = listenerProvider.provideListener(result.contentId(), eventContext.getCdsRuntime());
var context = eventContext.getChangeSetContext();
context.register(createListener);
path.target().values().put(Attachments.CONTENT_ID, result.contentId());
path.target().values().put(Attachments.STATUS, result.status());
return result.isInternalStored() ? value : null;
return result.isInternalStored() ? content : null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
**************************************************************************/
package com.sap.cds.feature.attachments.handler.applicationservice.processor.modifyevents;

import java.io.InputStream;
import java.util.Objects;
import java.util.Optional;

Expand Down Expand Up @@ -39,7 +40,7 @@ public DefaultModifyAttachmentEventFactory(ModifyAttachmentEvent createEvent, Mo
}

@Override
public ModifyAttachmentEvent getEvent(Object content, String contentId, boolean contentIdExist, CdsData existingData) {
public ModifyAttachmentEvent getEvent(InputStream content, String contentId, boolean contentIdExist, CdsData existingData) {
var existingContentId = existingData.get(Attachments.CONTENT_ID);
var event = contentIdExist ? handleExistingContentId(content, contentId,
existingContentId) : handleNonExistingContentId(content, existingContentId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
**************************************************************************/
package com.sap.cds.feature.attachments.handler.applicationservice.processor.modifyevents;

import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -19,10 +21,10 @@ public class DoNothingAttachmentEvent implements ModifyAttachmentEvent {
private static final Logger logger = LoggerFactory.getLogger(DoNothingAttachmentEvent.class);

@Override
public Object processEvent(Path path, Object value, CdsData existingData, EventContext eventContext) {
public InputStream processEvent(Path path, InputStream content, CdsData existingData, EventContext eventContext) {
logger.debug("Do nothing event for entity {}", path.target().entity().getQualifiedName());

return value;
return content;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
**************************************************************************/
package com.sap.cds.feature.attachments.handler.applicationservice.processor.modifyevents;

import java.io.InputStream;
import java.util.Objects;

import org.slf4j.Logger;
Expand Down Expand Up @@ -32,7 +33,7 @@ public MarkAsDeletedAttachmentEvent(AttachmentService outboxedAttachmentService)
}

@Override
public Object processEvent(Path path, Object value, CdsData existingData, EventContext eventContext) {
public InputStream processEvent(Path path, InputStream content, CdsData existingData, EventContext eventContext) {
var qualifiedName = eventContext.getTarget().getQualifiedName();
logger.debug("Processing the event for calling attachment service with mark as delete event for entity {}",
qualifiedName);
Expand All @@ -56,7 +57,7 @@ public Object processEvent(Path path, Object value, CdsData existingData, EventC
path.target().values().put(Attachments.SCANNED_AT, null);
}
}
return value;
return content;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
**************************************************************************/
package com.sap.cds.feature.attachments.handler.applicationservice.processor.modifyevents;

import java.io.InputStream;

import com.sap.cds.CdsData;
import com.sap.cds.feature.attachments.service.AttachmentService;
import com.sap.cds.ql.cqn.Path;
Expand All @@ -17,11 +19,11 @@ public interface ModifyAttachmentEvent {
* Processes the event on the {@link AttachmentService}.
*
* @param path the path of the attachment
* @param value the content of the attachment
* @param content the content of the attachment
* @param existingData existing data
* @param eventContext the current event context
* @return
*/
Object processEvent(Path path, Object value, CdsData existingData, EventContext eventContext);
InputStream processEvent(Path path, InputStream content, CdsData existingData, EventContext eventContext);

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ public interface ModifyAttachmentEventFactory {
* @param existingData the existing {@link CdsData data}
* @return the corresponding {@link ModifyAttachmentEvent} that should be executed
*/
ModifyAttachmentEvent getEvent(Object content, String contentId, boolean contentIdExist, CdsData existingData);
ModifyAttachmentEvent getEvent(InputStream content, String contentId, boolean contentIdExist, CdsData existingData);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
**************************************************************************/
package com.sap.cds.feature.attachments.handler.applicationservice.processor.modifyevents;

import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -31,12 +33,12 @@ public UpdateAttachmentEvent(ModifyAttachmentEvent createAttachmentEvent,
}

@Override
public Object processEvent(Path path, Object value, CdsData existingData, EventContext eventContext) {
public InputStream processEvent(Path path, InputStream content, CdsData existingData, EventContext eventContext) {
logger.debug("Processing UPDATE event by calling attachment service with create and delete event for entity {}",
path.target().entity().getQualifiedName());

deleteAttachmentEvent.processEvent(path, value, existingData, eventContext);
return createAttachmentEvent.processEvent(path, value, existingData, eventContext);
deleteAttachmentEvent.processEvent(path, content, existingData, eventContext);
return createAttachmentEvent.processEvent(path, content, existingData, eventContext);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
**************************************************************************/
package com.sap.cds.feature.attachments.handler.draftservice;

import java.io.InputStream;
import java.util.List;

import org.slf4j.Logger;
Expand All @@ -26,10 +27,9 @@
import com.sap.cds.services.persistence.PersistenceService;

/**
* The class {@link DraftPatchAttachmentsHandler} is an event handler that is called
* before a draft patch event is executed.
* The handler checks the attachments of the draft entity and calls the event factory
* and corresponding events.
* The class {@link DraftPatchAttachmentsHandler} is an event handler that is called before a draft patch event is
* executed. The handler checks the attachments of the draft entity and calls the event factory and corresponding
* events.
*/
@ServiceName(value = "*", type = DraftService.class)
public class DraftPatchAttachmentsHandler implements EventHandler {
Expand All @@ -52,14 +52,14 @@ public void processBeforeDraftPatch(DraftPatchEventContext context, List<CdsData

var filter = ApplicationHandlerHelper.buildFilterForMediaTypeEntity();
Converter converter = (path, element, value) -> {
var draftElement = path.target().entity().getQualifiedName().endsWith(
DraftConstants.DRAFT_TABLE_POSTFIX) ? path.target().entity() : path.target().entity().getTargetOf(
DraftConstants.SIBLING_ENTITY);
var draftElement = path.target().entity().getQualifiedName().endsWith(DraftConstants.DRAFT_TABLE_POSTFIX)
? path.target().entity()
: path.target().entity().getTargetOf(DraftConstants.SIBLING_ENTITY);
var select = Select.from(draftElement.getQualifiedName()).matching(path.target().keys());
var result = persistence.run(select);

return ModifyApplicationHandlerHelper.handleAttachmentForEntity(result.listOf(CdsData.class), eventFactory, context,
path, value);
return ModifyApplicationHandlerHelper.handleAttachmentForEntity(result.listOf(CdsData.class), eventFactory,
context, path, (InputStream) value);
};

ApplicationHandlerHelper.callProcessor(context.getTarget(), data, filter, converter);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package com.sap.cds.feature.attachments.handler.applicationservice.processor.modifyevents;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;

import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

Expand Down Expand Up @@ -49,7 +54,7 @@ void setup() {

@Test
void documentIsExternallyDeleted() {
var value = "test";
var value = new ByteArrayInputStream("test".getBytes(StandardCharsets.UTF_8));
var contentId = "some id";
var data = Attachments.create();
data.setContentId(contentId);
Expand All @@ -69,7 +74,7 @@ void documentIsExternallyDeleted() {

@Test
void documentIsNotExternallyDeletedBecauseDoesNotExistBefore() {
var value = "test";
var value = new ByteArrayInputStream("test".getBytes(StandardCharsets.UTF_8));
var data = Attachments.create();

var expectedValue = cut.processEvent(path, value, data, context);
Expand All @@ -82,7 +87,7 @@ void documentIsNotExternallyDeletedBecauseDoesNotExistBefore() {

@Test
void documentIsNotExternallyDeletedBecauseItIsDraftChangeEvent() {
var value = "test";
var value = new ByteArrayInputStream("test".getBytes(StandardCharsets.UTF_8));
var contentId = "some id";
var data = Attachments.create();
data.setContentId(contentId);
Expand Down