Skip to content

Commit 0ac412b

Browse files
authored
Do not generated UUIDs for key fields, runtime will do that. (#496)
1 parent 15298a1 commit 0ac412b

File tree

8 files changed

+46
-64
lines changed

8 files changed

+46
-64
lines changed

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/handler/applicationservice/CreateAttachmentsHandler.java

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,16 @@
77

88
import java.util.ArrayList;
99
import java.util.List;
10-
import java.util.UUID;
1110

1211
import org.slf4j.Logger;
1312
import org.slf4j.LoggerFactory;
1413

1514
import com.sap.cds.CdsData;
16-
import com.sap.cds.CdsDataProcessor;
1715
import com.sap.cds.feature.attachments.handler.applicationservice.helper.ModifyApplicationHandlerHelper;
1816
import com.sap.cds.feature.attachments.handler.applicationservice.helper.ReadonlyDataContextEnhancer;
1917
import com.sap.cds.feature.attachments.handler.applicationservice.helper.ThreadDataStorageReader;
2018
import com.sap.cds.feature.attachments.handler.applicationservice.modifyevents.ModifyAttachmentEventFactory;
2119
import com.sap.cds.feature.attachments.handler.common.ApplicationHandlerHelper;
22-
import com.sap.cds.reflect.CdsBaseType;
23-
import com.sap.cds.reflect.CdsEntity;
2420
import com.sap.cds.services.cds.ApplicationService;
2521
import com.sap.cds.services.cds.CdsCreateEventContext;
2622
import com.sap.cds.services.handler.EventHandler;
@@ -40,7 +36,6 @@ public class CreateAttachmentsHandler implements EventHandler {
4036

4137
private final ModifyAttachmentEventFactory eventFactory;
4238
private final ThreadDataStorageReader storageReader;
43-
private final CdsDataProcessor processor = CdsDataProcessor.create();
4439

4540
public CreateAttachmentsHandler(ModifyAttachmentEventFactory eventFactory, ThreadDataStorageReader storageReader) {
4641
this.eventFactory = requireNonNull(eventFactory, "eventFactory must not be null");
@@ -56,20 +51,10 @@ void processBeforeForDraft(CdsCreateEventContext context, List<CdsData> data) {
5651
@Before
5752
@HandlerOrder(HandlerOrder.LATE)
5853
void processBefore(CdsCreateEventContext context, List<CdsData> data) {
59-
if (ApplicationHandlerHelper.noContentFieldInData(context.getTarget(), data)) {
60-
return;
54+
if (ApplicationHandlerHelper.containsContentField(context.getTarget(), data)) {
55+
logger.debug("Processing before {} event for entity {}", context.getEvent(), context.getTarget());
56+
ModifyApplicationHandlerHelper.handleAttachmentForEntities(context.getTarget(), data, new ArrayList<>(),
57+
eventFactory, context);
6158
}
62-
63-
logger.debug("Processing before create event for entity {}", context.getTarget().getName());
64-
setKeysInData(context.getTarget(), data);
65-
ModifyApplicationHandlerHelper.handleAttachmentForEntities(context.getTarget(), data, new ArrayList<>(),
66-
eventFactory, context);
67-
}
68-
69-
private void setKeysInData(CdsEntity entity, List<CdsData> data) {
70-
processor.addGenerator(
71-
(path, element, type) -> element.isKey() && element.getType().isSimpleType(CdsBaseType.UUID),
72-
(path, element, isNull) -> UUID.randomUUID().toString()).process(data, entity);
7359
}
74-
7560
}

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/handler/applicationservice/DeleteAttachmentsHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public DeleteAttachmentsHandler(AttachmentsReader attachmentsReader, MarkAsDelet
4444
@Before
4545
@HandlerOrder(HandlerOrder.LATE)
4646
void processBefore(CdsDeleteEventContext context) {
47-
logger.debug("Processing before delete event for entity {}", context.getTarget().getName());
47+
logger.debug("Processing before {} event for entity {}", context.getEvent(), context.getTarget());
4848

4949
List<Attachments> attachments = attachmentsReader.readAttachments(context.getModel(), context.getTarget(),
5050
context.getCqn());

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/handler/applicationservice/ReadAttachmentsHandler.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public ReadAttachmentsHandler(AttachmentService attachmentService, AttachmentSta
7171
@Before
7272
@HandlerOrder(HandlerOrder.EARLY)
7373
void processBefore(CdsReadEventContext context) {
74-
logger.debug("Processing before read event for entity {}", context.getTarget().getName());
74+
logger.debug("Processing before {} for entity {}.", context.getEvent(), context.getTarget());
7575

7676
CdsModel cdsModel = context.getModel();
7777
List<String> fieldNames = getAttachmentAssociations(cdsModel, context.getTarget(), "", new ArrayList<>());
@@ -84,27 +84,26 @@ void processBefore(CdsReadEventContext context) {
8484
@After
8585
@HandlerOrder(HandlerOrder.EARLY)
8686
void processAfter(CdsReadEventContext context, List<CdsData> data) {
87-
if (ApplicationHandlerHelper.noContentFieldInData(context.getTarget(), data)) {
88-
return;
87+
if (ApplicationHandlerHelper.containsContentField(context.getTarget(), data)) {
88+
logger.debug("Processing after {} event for entity {}", context.getEvent(), context.getTarget());
89+
90+
Converter converter = (path, element, value) -> {
91+
Attachments attachment = Attachments.of(path.target().values());
92+
InputStream content = attachment.getContent();
93+
boolean contentExists = nonNull(content);
94+
if (nonNull(attachment.getContentId()) || contentExists) {
95+
verifyStatus(path, attachment, contentExists);
96+
Supplier<InputStream> supplier = contentExists ? () -> content
97+
: () -> attachmentService.readAttachment(attachment.getContentId());
98+
return new LazyProxyInputStream(supplier, statusValidator, attachment.getStatus());
99+
} else {
100+
return value;
101+
}
102+
};
103+
104+
CdsDataProcessor.create().addConverter(ApplicationHandlerHelper.MEDIA_CONTENT_FILTER, converter)
105+
.process(data, context.getTarget());
89106
}
90-
logger.debug("Processing after read event for entity {}", context.getTarget().getQualifiedName());
91-
92-
Converter converter = (path, element, value) -> {
93-
Attachments attachment = Attachments.of(path.target().values());
94-
InputStream content = attachment.getContent();
95-
boolean contentExists = nonNull(content);
96-
if (nonNull(attachment.getContentId()) || contentExists) {
97-
verifyStatus(path, attachment, contentExists);
98-
Supplier<InputStream> supplier = contentExists ? () -> content
99-
: () -> attachmentService.readAttachment(attachment.getContentId());
100-
return new LazyProxyInputStream(supplier, statusValidator, attachment.getStatus());
101-
} else {
102-
return value;
103-
}
104-
};
105-
106-
CdsDataProcessor.create().addConverter(ApplicationHandlerHelper.MEDIA_CONTENT_FILTER, converter).process(data,
107-
context.getTarget());
108107
}
109108

110109
private List<String> getAttachmentAssociations(CdsModel model, CdsEntity entity, String associationName,

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/handler/applicationservice/UpdateAttachmentsHandler.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,21 +70,19 @@ void processBefore(CdsUpdateEventContext context, List<CdsData> data) {
7070
CdsEntity target = context.getTarget();
7171
boolean associationsAreUnchanged = associationsAreUnchanged(target, data);
7272

73-
if (ApplicationHandlerHelper.noContentFieldInData(target, data) && associationsAreUnchanged) {
74-
return;
75-
}
76-
77-
logger.debug("Processing before update event for entity {}", target.getName());
73+
if (ApplicationHandlerHelper.containsContentField(target, data) || !associationsAreUnchanged) {
74+
logger.debug("Processing before {} event for entity {}", context.getEvent(), target);
7875

79-
CqnSelect select = CqnUtils.toSelect(context.getCqn(), context.getTarget());
80-
List<Attachments> attachments = attachmentsReader.readAttachments(context.getModel(), target, select);
76+
CqnSelect select = CqnUtils.toSelect(context.getCqn(), context.getTarget());
77+
List<Attachments> attachments = attachmentsReader.readAttachments(context.getModel(), target, select);
8178

82-
List<Attachments> condensedAttachments = ApplicationHandlerHelper.condenseAttachments(attachments, target);
83-
ModifyApplicationHandlerHelper.handleAttachmentForEntities(target, data, condensedAttachments, eventFactory,
84-
context);
79+
List<Attachments> condensedAttachments = ApplicationHandlerHelper.condenseAttachments(attachments, target);
80+
ModifyApplicationHandlerHelper.handleAttachmentForEntities(target, data, condensedAttachments, eventFactory,
81+
context);
8582

86-
if (!associationsAreUnchanged) {
87-
deleteRemovedAttachments(attachments, data, target, context.getUserInfo());
83+
if (!associationsAreUnchanged) {
84+
deleteRemovedAttachments(attachments, data, target, context.getUserInfo());
85+
}
8886
}
8987
}
9088

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/handler/common/ApplicationHandlerHelper.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ public final class ApplicationHandlerHelper {
4141
* @param data The data to check
4242
* @return <code>true</code> if the data contains a content field, <code>false</code> otherwise
4343
*/
44-
public static boolean noContentFieldInData(CdsEntity entity, List<? extends CdsData> data) {
44+
public static boolean containsContentField(CdsEntity entity, List<? extends CdsData> data) {
4545
AtomicBoolean isIncluded = new AtomicBoolean();
46-
Validator validator = (path, element, value) -> isIncluded.set(true);
47-
CdsDataProcessor.create().addValidator(MEDIA_CONTENT_FILTER, validator).process(data, entity);
48-
return !isIncluded.get();
46+
CdsDataProcessor.create().addValidator(MEDIA_CONTENT_FILTER, (path, element, value) -> isIncluded.set(true))
47+
.process(data, entity);
48+
return isIncluded.get();
4949
}
5050

5151
/**

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/handler/draftservice/DraftCancelAttachmentsHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public DraftCancelAttachmentsHandler(AttachmentsReader attachmentsReader,
5959
@HandlerOrder(HandlerOrder.LATE)
6060
void processBeforeDraftCancel(DraftCancelEventContext context) {
6161
if (isWhereEmpty(context)) {
62-
logger.debug("Processing before draft cancel event for entity {}", context.getTarget().getName());
62+
logger.debug("Processing before {} event for entity {}", context.getEvent(), context.getTarget());
6363

6464
CdsEntity activeEntity = DraftUtils.getActiveEntity(context.getTarget());
6565
CdsEntity draftEntity = DraftUtils.getDraftEntity(context.getTarget());

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/handler/draftservice/DraftPatchAttachmentsHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public DraftPatchAttachmentsHandler(PersistenceService persistence, ModifyAttach
5151
@Before
5252
@HandlerOrder(HandlerOrder.LATE)
5353
void processBeforeDraftPatch(DraftPatchEventContext context, List<? extends CdsData> data) {
54-
logger.debug("Processing before draft patch event for entity {}", context.getTarget().getName());
54+
logger.debug("Processing before {} event for entity {}", context.getEvent(), context.getTarget());
5555

5656
Converter converter = (path, element, value) -> {
5757
CdsEntity draftEntity = DraftUtils.getDraftEntity(path.target().entity());

cds-feature-attachments/src/test/java/com/sap/cds/feature/attachments/handler/applicationservice/CreateAttachmentsHandlerTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.junit.jupiter.api.Assertions.assertThrows;
55
import static org.mockito.ArgumentMatchers.any;
6+
import static org.mockito.ArgumentMatchers.eq;
67
import static org.mockito.Mockito.mock;
78
import static org.mockito.Mockito.verify;
89
import static org.mockito.Mockito.verifyNoInteractions;
@@ -90,8 +91,7 @@ void idsAreSetInDataForCreate() {
9091

9192
cut.processBefore(createContext, List.of(roots));
9293

93-
assertThat(roots.getId()).isNotEmpty();
94-
assertThat(attachment.getId()).isNotEmpty();
94+
verify(eventFactory).getEvent(null, null, Attachments.create());
9595
}
9696

9797
@Test
@@ -205,16 +205,16 @@ void handlerCalledForMediaEventInAssociationIdsAreSet() {
205205
events.setContent("test");
206206
var items = Items.create();
207207
var attachment = Attachments.create();
208-
attachment.setContent(mock(InputStream.class));
208+
var content = mock(InputStream.class);
209+
attachment.setContent(content);
209210
items.setAttachments(List.of(attachment));
210211
events.setItems(List.of(items));
211212
when(eventFactory.getEvent(any(), any(), any())).thenReturn(event);
212213

213214
List<CdsData> input = List.of(events);
214215
cut.processBefore(createContext, input);
215216

216-
assertThat(events.getId1()).isNotEmpty();
217-
assertThat(events.getId2()).isNull();
217+
verify(eventFactory).getEvent(eq(content), any(), any());
218218
}
219219

220220
@Test

0 commit comments

Comments
 (0)