use of eu.bcvsolutions.idm.core.api.event.EventType in project CzechIdMng by bcvsolutions.
the class DefaultEntityEventManagerIntergationTest method testConfigPropertyEventTypeOverwrite.
@Test
public void testConfigPropertyEventTypeOverwrite() {
String eventTypeName = System.nanoTime() + "_test_type";
EventType type = (EventType) () -> eventTypeName;
EntityEvent<TestContentTwo> event = new CoreEvent<>(type, new TestContentTwo());
EventContext<TestContentTwo> context = entityEventManager.process(event);
assertEquals(0, context.getResults().size());
String configPropName = testTwoEntityEventProcessorOne.getConfigurationPropertyName(EntityEventProcessor.PROPERTY_EVENT_TYPES);
configurationService.setValue(configPropName, eventTypeName);
EntityEvent<TestContentTwo> event2 = new CoreEvent<>(type, new TestContentTwo());
EventContext<TestContentTwo> context2 = entityEventManager.process(event2);
assertEquals(2, context2.getResults().size());
}
use of eu.bcvsolutions.idm.core.api.event.EventType in project CzechIdMng by bcvsolutions.
the class AbstractEventableDtoController method saveDto.
/**
* {@inheritDoc}
*
* Calls save method by event publishing with higher priority.
*
* @param dto
* @return
*/
@Override
public DTO saveDto(DTO dto, BasePermission... permission) {
Assert.notNull(dto, "DTO is required");
// UI actions has higher priority
EventType eventType = getService().isNew(dto) ? CoreEventType.CREATE : CoreEventType.UPDATE;
Map<String, Serializable> properties = new HashMap<>();
properties.put(EntityEventManager.EVENT_PROPERTY_PRIORITY, PriorityType.HIGH);
CoreEvent<DTO> event = new CoreEvent<DTO>(eventType, validateDto(dto), properties);
//
return getService().publish(event, permission).getContent();
}
use of eu.bcvsolutions.idm.core.api.event.EventType in project CzechIdMng by bcvsolutions.
the class DefaultEntityEventManager method putToQueue.
@SuppressWarnings({ "unchecked", "rawtypes" })
private void putToQueue(IdmEntityEventDto entityEvent) {
if (entityEvent.getPriority() == PriorityType.IMMEDIATE) {
LOG.trace("Event type [{}] for owner with id [{}] will be executed synchronously.", entityEvent.getEventType(), entityEvent.getOwnerId());
executeEvent(entityEvent);
return;
}
if (!eventConfiguration.isAsynchronous()) {
LOG.trace("Event type [{}] for owner with id [{}] will be executed synchronously, asynchronous event processing [{}] is disabled.", entityEvent.getEventType(), entityEvent.getOwnerId(), EventConfiguration.PROPERTY_EVENT_ASYNCHRONOUS_ENABLED);
executeEvent(entityEvent);
return;
}
//
// get enabled processors
final EntityEvent<Identifiable> event = toEvent(entityEvent);
List<EntityEventProcessor> registeredProcessors = context.getBeansOfType(EntityEventProcessor.class).values().stream().filter(enabledEvaluator::isEnabled).filter(processor -> !processor.isDisabled()).filter(processor -> processor.supports(event)).filter(processor -> processor.conditional(event)).sorted(new AnnotationAwareOrderComparator()).collect(Collectors.toList());
if (registeredProcessors.isEmpty()) {
LOG.debug("Event type [{}] for owner with id [{}] will not be executed, no enabled processor is registered.", entityEvent.getEventType(), entityEvent.getOwnerId());
return;
}
//
// evaluate event priority by registered processors
PriorityType priority = evaluatePriority(event, registeredProcessors);
if (priority != null && priority.getPriority() < entityEvent.getPriority().getPriority()) {
entityEvent.setPriority(priority);
}
// registered processors voted about event will be processed synchronously
if (entityEvent.getPriority() == PriorityType.IMMEDIATE) {
LOG.trace("Event type [{}] for owner with id [{}] will be executed synchronously.", entityEvent.getEventType(), entityEvent.getOwnerId());
executeEvent(entityEvent);
return;
}
//
// notification - info about registered (asynchronous) processors
Map<String, Object> parameters = new LinkedHashMap<>();
parameters.put("eventType", entityEvent.getEventType());
parameters.put("ownerId", entityEvent.getOwnerId());
parameters.put("instanceId", entityEvent.getInstanceId());
parameters.put("processors", registeredProcessors.stream().map(DefaultEntityEventManager.this::toDto).collect(Collectors.toList()));
notificationManager.send(CoreModuleDescriptor.TOPIC_EVENT, new IdmMessageDto.Builder().setLevel(NotificationLevel.INFO).setModel(new DefaultResultModel(CoreResultCode.EVENT_ACCEPTED, parameters)).build());
//
// persist event - asynchronous processing
entityEventService.save(entityEvent);
}
use of eu.bcvsolutions.idm.core.api.event.EventType in project CzechIdMng by bcvsolutions.
the class DefaultEntityEventManager method toEvent.
@Override
public EntityEvent<Identifiable> toEvent(IdmEntityEventDto entityEvent) {
Identifiable content = null;
// only if type and id is the same as owner can be used
if (entityEvent.getContent() != null && entityEvent.getContent().getClass().getCanonicalName().equals(entityEvent.getOwnerType()) && entityEvent.getContent().getId().equals(entityEvent.getOwnerId())) {
content = entityEvent.getContent();
}
if (content == null) {
// content is not persisted - try to find actual entity
content = findOwner(entityEvent);
}
if (content == null) {
throw new EventContentDeletedException(entityEvent);
}
//
Map<String, Serializable> eventProperties = entityEvent.getProperties().toMap();
eventProperties.put(EVENT_PROPERTY_EVENT_ID, entityEvent.getId());
eventProperties.put(EVENT_PROPERTY_PRIORITY, entityEvent.getPriority());
eventProperties.put(EVENT_PROPERTY_EXECUTE_DATE, entityEvent.getExecuteDate());
eventProperties.put(EVENT_PROPERTY_PARENT_EVENT_TYPE, entityEvent.getParentEventType());
final String type = entityEvent.getEventType();
DefaultEventContext<Identifiable> initContext = new DefaultEventContext<>();
initContext.setProcessedOrder(entityEvent.getProcessedOrder());
EventType eventType = (EventType) () -> type;
EntityEvent<Identifiable> resurectedEvent = new CoreEvent<>(eventType, content, eventProperties, initContext);
resurectedEvent.setOriginalSource(entityEvent.getOriginalSource());
//
return resurectedEvent;
}
use of eu.bcvsolutions.idm.core.api.event.EventType in project CzechIdMng by bcvsolutions.
the class DefaultEntityEventManager method init.
/**
* Cancel all previously ran events
*/
@Override
public void init() {
LOG.info("Cancel unprocessed events - event was interrupt during instance restart");
//
String instanceId = configurationService.getInstanceId();
entityEventService.findByState(instanceId, OperationState.RUNNING).forEach(event -> {
LOG.info("Cancel unprocessed event [{}] - event was interrupt during instance [{}] restart", event.getId(), instanceId);
//
// cancel event
ResultModel resultModel = new DefaultResultModel(CoreResultCode.EVENT_CANCELED_BY_RESTART, ImmutableMap.of("eventId", event.getId(), "eventType", event.getEventType(), "ownerId", String.valueOf(event.getOwnerId()), "instanceId", event.getInstanceId()));
OperationResultDto result = new OperationResultDto.Builder(OperationState.CANCELED).setModel(resultModel).build();
event.setResult(result);
entityEventService.saveInternal(event);
//
// cancel event states
IdmEntityStateFilter filter = new IdmEntityStateFilter();
filter.setEventId(event.getId());
entityStateService.find(filter, null).getContent().stream().filter(state -> {
return OperationState.RUNNING == state.getResult().getState();
}).forEach(state -> {
event.setResult(result);
entityStateService.save(state);
});
});
}
Aggregations