use of io.jmix.core.event.AttributeChanges in project jmix by jmix-framework.
the class EntityTrackingListener method processEntityChangedEvent.
protected void processEntityChangedEvent(EntityChangedEvent<?> event) {
Id<?> entityId = event.getEntityId();
Class<?> entityClass = entityId.getEntityClass();
MetaClass metaClass = metadata.getClass(entityClass);
EntityChangedEvent.Type eventType = event.getType();
String entityName = metaClass.getName();
AttributeChanges changes = event.getChanges();
if (indexConfigurationManager.isDirectlyIndexed(entityName)) {
log.debug("{} is directly indexed", entityId);
switch(eventType) {
case CREATED:
indexingQueueManager.enqueueIndexByEntityId(entityId);
break;
case UPDATED:
if (isUpdateRequired(entityClass, changes)) {
indexingQueueManager.enqueueIndexByEntityId(entityId);
}
break;
case DELETED:
indexingQueueManager.enqueueDeleteByEntityId(entityId);
break;
}
}
if (EntityChangedEvent.Type.UPDATED.equals(eventType)) {
Set<Id<?>> dependentEntityIds = getEntityIdsDependentOnUpdatedEntity(entityId, metaClass, changes);
if (!dependentEntityIds.isEmpty()) {
indexingQueueManager.enqueueIndexCollectionByEntityIds(dependentEntityIds);
}
} else if (EntityChangedEvent.Type.DELETED.equals(eventType)) {
Set<Id<?>> dependentEntityIds = removalDependencies.getIfPresent(entityId);
if (CollectionUtils.isNotEmpty(dependentEntityIds)) {
indexingQueueManager.enqueueIndexCollectionByEntityIds(dependentEntityIds);
removalDependencies.invalidate(entityId);
}
}
}
use of io.jmix.core.event.AttributeChanges in project jmix by jmix-framework.
the class BaseAttributeChangesProvider method getAttributeChanges.
@Override
public AttributeChanges getAttributeChanges(Object entity) {
checkEntityState(entity);
AttributeChanges.Builder builder = AttributeChanges.Builder.create();
if (!entityStates.isManaged(entity)) {
return builder.build();
}
if (entityStates.isNew(entity)) {
for (MetaProperty property : metadata.getClass(entity.getClass()).getProperties()) {
if (metadataTools.isJpa(property)) {
builder.withChange(property.getName(), EntityValues.getValue(entity, property.getName()));
}
}
return builder.build();
}
buildChangesByImplementation(builder, entity, this::convertValueIfNeeded);
buildExtraChanges(builder, entity);
return builder.build();
}
use of io.jmix.core.event.AttributeChanges in project jmix by jmix-framework.
the class EntityLogImpl method registerModify.
@Override
public void registerModify(Object entity, boolean auto, @Nullable AttributeChanges changes) {
try {
if (doNotRegister(entity))
return;
String entityName = getEntityName(entity);
Set<String> attributes = getLoggedAttributes(entityName, auto);
if (attributes != null && attributes.contains("*")) {
attributes = getAllAttributes(entity);
}
if (attributes == null) {
return;
}
MetaClass metaClass = metadata.getClass(entityName);
attributes = filterRemovedAttributes(entity, attributes);
String storeName = metaClass.getStore().getName();
EntityLogItem item;
// Create a new transaction in main DB if we are saving an entity from additional data store
if (!Stores.isMain(storeName)) {
Set<String> finalAttributes = attributes;
item = transaction.execute(status -> internalRegisterModify(entity, changes, metaClass, storeName, finalAttributes));
} else {
item = internalRegisterModify(entity, changes, metaClass, storeName, attributes);
}
enqueueItem(item, storeName);
} catch (Exception e) {
logError(entity, e);
}
}
Aggregations