Skip to content

Commit fa49d2f

Browse files
authored
Don't register event handlers if no ApplicationService is available (#396)
1 parent 845ccfd commit fa49d2f

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/configuration/Registration.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.sap.cds.feature.attachments.service.malware.client.mapper.DefaultMalwareClientStatusMapper;
4242
import com.sap.cds.feature.attachments.service.malware.constants.MalwareScanConstants;
4343
import com.sap.cds.services.ServiceCatalog;
44+
import com.sap.cds.services.cds.ApplicationService;
4445
import com.sap.cds.services.draft.DraftService;
4546
import com.sap.cds.services.environment.CdsEnvironment;
4647
import com.sap.cds.services.environment.CdsProperties.ConnectionPool;
@@ -110,12 +111,17 @@ public void eventHandlers(CdsRuntimeConfigurer configurer) {
110111
var attachmentsReader = new DefaultAttachmentsReader(new DefaultAssociationCascader(), persistenceService);
111112
ThreadLocalDataStorage storage = new ThreadLocalDataStorage();
112113

113-
// register event handlers for application service
114-
configurer.eventHandler(new CreateAttachmentsHandler(eventFactory, storage));
115-
configurer.eventHandler(new UpdateAttachmentsHandler(eventFactory, attachmentsReader, outboxedAttachmentService, storage));
116-
configurer.eventHandler(new DeleteAttachmentsHandler(attachmentsReader, deleteContentEvent));
117-
var scanRunner = new EndTransactionMalwareScanRunner(null, null, malwareScanner, runtime);
118-
configurer.eventHandler(new ReadAttachmentsHandler(attachmentService, new DefaultAttachmentStatusValidator(), scanRunner));
114+
// register event handlers for application service, if at least one application service is available
115+
boolean hasApplicationServices = serviceCatalog.getServices(ApplicationService.class).findFirst().isPresent();
116+
if (hasApplicationServices) {
117+
configurer.eventHandler(new CreateAttachmentsHandler(eventFactory, storage));
118+
configurer.eventHandler(new UpdateAttachmentsHandler(eventFactory, attachmentsReader, outboxedAttachmentService, storage));
119+
configurer.eventHandler(new DeleteAttachmentsHandler(attachmentsReader, deleteContentEvent));
120+
var scanRunner = new EndTransactionMalwareScanRunner(null, null, malwareScanner, runtime);
121+
configurer.eventHandler(new ReadAttachmentsHandler(attachmentService, new DefaultAttachmentStatusValidator(), scanRunner));
122+
} else {
123+
logger.debug("No application service is available. Application service event handlers will not be registered.");
124+
}
119125

120126
// register event handlers on draft service, if at least one draft service is available
121127
boolean hasDraftServices = serviceCatalog.getServices(DraftService.class).findFirst().isPresent();

cds-feature-attachments/src/test/java/com/sap/cds/feature/attachments/configuration/RegistrationTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.sap.cds.feature.attachments.service.handler.DefaultAttachmentsServiceHandler;
2626
import com.sap.cds.services.Service;
2727
import com.sap.cds.services.ServiceCatalog;
28+
import com.sap.cds.services.cds.ApplicationService;
2829
import com.sap.cds.services.draft.DraftService;
2930
import com.sap.cds.services.environment.CdsEnvironment;
3031
import com.sap.cds.services.handler.EventHandler;
@@ -42,6 +43,7 @@ class RegistrationTest {
4243
private AttachmentService attachmentService;
4344
private OutboxService outboxService;
4445
private DraftService draftService;
46+
private ApplicationService applicationService;
4547
private ArgumentCaptor<Service> serviceArgumentCaptor;
4648
private ArgumentCaptor<EventHandler> handlerArgumentCaptor;
4749

@@ -61,6 +63,7 @@ void setup() {
6163
attachmentService = mock(AttachmentService.class);
6264
outboxService = mock(OutboxService.class);
6365
draftService = mock(DraftService.class);
66+
applicationService = mock(ApplicationService.class);
6467
serviceArgumentCaptor = ArgumentCaptor.forClass(Service.class);
6568
handlerArgumentCaptor = ArgumentCaptor.forClass(EventHandler.class);
6669
}
@@ -87,6 +90,7 @@ void handlersAreRegistered() {
8790
when(serviceCatalog.getService(OutboxService.class, OutboxService.PERSISTENT_UNORDERED_NAME)).thenReturn(
8891
outboxService);
8992
when(serviceCatalog.getServices(DraftService.class)).thenReturn(Stream.of(draftService));
93+
when(serviceCatalog.getServices(ApplicationService.class)).thenReturn(Stream.of(applicationService));
9094

9195
cut.eventHandlers(configurer);
9296

@@ -104,9 +108,40 @@ void handlersAreRegistered() {
104108
isHandlerForClassIncluded(handlers, DraftActiveAttachmentsHandler.class);
105109
}
106110

111+
@Test
112+
void lessHandlersAreRegistered() {
113+
when(serviceCatalog.getService(PersistenceService.class, PersistenceService.DEFAULT_NAME)).thenReturn(
114+
persistenceService);
115+
when(serviceCatalog.getService(AttachmentService.class, AttachmentService.DEFAULT_NAME)).thenReturn(
116+
attachmentService);
117+
when(serviceCatalog.getService(OutboxService.class, OutboxService.PERSISTENT_UNORDERED_NAME)).thenReturn(
118+
outboxService);
119+
120+
cut.eventHandlers(configurer);
121+
122+
var handlerSize = 1;
123+
verify(configurer, times(handlerSize)).eventHandler(handlerArgumentCaptor.capture());
124+
var handlers = handlerArgumentCaptor.getAllValues();
125+
assertThat(handlers).hasSize(handlerSize);
126+
isHandlerForClassIncluded(handlers, DefaultAttachmentsServiceHandler.class);
127+
// event handlers for application services are not registered
128+
isHandlerForClassMissing(handlers, CreateAttachmentsHandler.class);
129+
isHandlerForClassMissing(handlers, UpdateAttachmentsHandler.class);
130+
isHandlerForClassMissing(handlers, DeleteAttachmentsHandler.class);
131+
isHandlerForClassMissing(handlers, ReadAttachmentsHandler.class);
132+
// event handlers for draft services are not registered
133+
isHandlerForClassMissing(handlers, DraftPatchAttachmentsHandler.class);
134+
isHandlerForClassMissing(handlers, DraftCancelAttachmentsHandler.class);
135+
isHandlerForClassMissing(handlers, DraftActiveAttachmentsHandler.class);
136+
}
137+
107138
private void isHandlerForClassIncluded(List<EventHandler> handlers, Class<? extends EventHandler> includedClass) {
108139
var isHandlerIncluded = handlers.stream().anyMatch(handler -> handler.getClass() == includedClass);
109140
assertThat(isHandlerIncluded).isTrue();
110141
}
142+
private void isHandlerForClassMissing(List<EventHandler> handlers, Class<? extends EventHandler> includedClass) {
143+
var isHandlerIncluded = handlers.stream().anyMatch(handler -> handler.getClass() == includedClass);
144+
assertThat(isHandlerIncluded).isFalse();
145+
}
111146

112147
}

0 commit comments

Comments
 (0)