@Override public void flush() { EntityManagerContext context = persistence.getEntityManagerContext(); List<EntityLogItem> items = context.getAttribute(EntityLog.class.getName()); if (items == null || items.isEmpty()) return; for (EntityLogItem item : items) { List<EntityLogItem> sameEntityList = items.stream() .filter(entityLogItem -> entityLogItem.getDbGeneratedIdEntity() != null ? entityLogItem.getDbGeneratedIdEntity().equals(item.getDbGeneratedIdEntity()) : entityLogItem.getObjectEntityId().equals(item.getObjectEntityId())) .collect(Collectors.toList()); EntityLogItem itemToSave = sameEntityList.get(0); computeChanges(itemToSave, sameEntityList); saveItem(itemToSave); } }
@Override public void onBeforeDetach(EntityLogItem item, EntityManager entityManager) { if (item.getAttributes() != null) return; fillAttributesFromChangesField(item); }
protected void internalRegisterCreate(Entity entity, String entityName, Set<String> attributes) throws IOException { Date ts = timeSource.currentTimestamp(); EntityManager em = persistence.getEntityManager(); EntityLogItem item = metadata.create(EntityLogItem.class); item.setEventTs(ts); item.setUser(findUser(em)); item.setType(EntityLogItem.Type.CREATE); item.setEntity(entityName); if (entity instanceof BaseDbGeneratedIdEntity) { item.setDbGeneratedIdEntity((BaseDbGeneratedIdEntity) entity); } else { item.setObjectEntityId(referenceToEntitySupport.getReferenceId(entity)); } item.setAttributes(createLogAttributes(entity, attributes, null)); enqueueItem(item); }
protected void computeChanges(EntityLogItem itemToSave, List<EntityLogItem> sameEntityList) { Set<String> allAttributes = sameEntityList.stream() .flatMap(entityLogItem -> entityLogItem.getAttributes().stream().map(EntityLogAttr::getName)) .collect(Collectors.toSet()); sameEntityList.get(0).getAttributes().stream() .filter(entityLogAttr -> entityLogAttr.getName().equals(attributeName)) .findFirst() .ifPresent(entityLogAttr -> setAttributeOldValue(entityLogAttr, itemToSave)); sameEntityList.get(sameEntityList.size() - 1).getAttributes().stream() .filter(entityLogAttr -> entityLogAttr.getName().equals(attributeName)) .findFirst() for (EntityLogAttr attr : itemToSave.getAttributes()) { properties.setProperty(attr.getName(), attr.getValue()); if (attr.getValueId() != null) { if (itemToSave.getType() == EntityLogItem.Type.MODIFY) { sameEntityList.stream() .filter(entityLogItem -> entityLogItem.getType() == EntityLogItem.Type.CREATE) .findFirst() .ifPresent(entityLogItem -> itemToSave.setType(EntityLogItem.Type.CREATE)); itemToSave.setChanges(getChanges(properties));
public String getLocValue(String value) { if (Strings.isNullOrEmpty(value)) return value; String entityName = getLogItem().getEntity(); com.haulmont.chile.core.model.MetaClass metaClass = getClassFromEntityName(entityName); if (metaClass != null) { com.haulmont.chile.core.model.MetaProperty property = metaClass.getProperty(name); if (property != null && property.getRange().isEnum()) { try { Enum caller = Enum.valueOf((Class<Enum>) property.getJavaType(), value); Messages messages = AppBeans.get(Messages.NAME); return messages.getMessage(caller); } catch (IllegalArgumentException ignored) {} } } if (!StringUtils.isBlank(messagesPack)) { Messages messages = AppBeans.get(Messages.NAME); return messages.getMessage(messagesPack, value); } else { return value; } } }
protected void saveItem(EntityLogItem item) { String storeName = metadataTools.getStoreName(metadata.getClassNN(item.getEntity())); if (item.getDbGeneratedIdEntity() == null) { if (Stores.isMain(storeName)) { EntityManager em = persistence.getEntityManager(); em.persist(item); } else { // Create a new transaction in main DB if we are saving an entity from additional data store try (Transaction tx = persistence.createTransaction()) { EntityManager em = persistence.getEntityManager(); em.persist(item); tx.commit(); } } } else { TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { Number id = item.getDbGeneratedIdEntity().getId().getNN(); item.setObjectEntityId(id); try (Transaction tx = persistence.createTransaction()) { EntityManager em = persistence.getEntityManager(); em.persist(item); tx.commit(); } } }); } }
@Override public void afterCommit() { Number id = item.getDbGeneratedIdEntity().getId().getNN(); item.setObjectEntityId(id); try (Transaction tx = persistence.createTransaction()) { EntityManager em = persistence.getEntityManager(); em.persist(item); tx.commit(); } } });
item.setAttributes(new LinkedHashSet<>(attributes)); return; StringReader reader = new StringReader(item.getChanges()); Properties properties = new Properties(); try { item.setAttributes(new LinkedHashSet<>(attributes));
if (entity.getObjectEntityId() != null) { return new Table.PlainTextCell(entity.getObjectEntityId().toString());
protected String getDisplayValue(String value) { if (StringUtils.isEmpty(value)) { return value; } final String entityName = getLogItem().getEntity(); com.haulmont.chile.core.model.MetaClass metaClass = getClassFromEntityName(entityName); if (metaClass != null) { com.haulmont.chile.core.model.MetaProperty property = metaClass.getProperty(getName()); if (property != null) { if (property.getRange().isDatatype()) { return value; } else if (property.getRange().isEnum()) { String nameKey = property.getRange().asEnumeration().getJavaClass().getSimpleName() + "." + value; String packageName = property.getRange().asEnumeration().getJavaClass().getPackage().getName(); Messages messages = AppBeans.get(Messages.NAME); return messages.getMessage(packageName, nameKey); } else { return value; } } else { return value; } } else { return value; } }
protected void internalRegisterDelete(Entity entity, String entityName, Set<String> attributes) throws IOException { Date ts = timeSource.currentTimestamp(); EntityManager em = persistence.getEntityManager(); EntityLogItem item = metadata.create(EntityLogItem.class); item.setEventTs(ts); item.setUser(findUser(em)); item.setType(EntityLogItem.Type.DELETE); item.setEntity(entityName); item.setObjectEntityId(referenceToEntitySupport.getReferenceId(entity)); item.setAttributes(createLogAttributes(entity, attributes, null)); enqueueItem(item); }
@MetaProperty public String getDisplayName() { String entityName = getLogItem().getEntity(); String message; com.haulmont.chile.core.model.MetaClass metaClass = getClassFromEntityName(entityName); if (metaClass != null) { Messages messages = AppBeans.get(Messages.NAME); message = messages.getTools().getPropertyCaption(metaClass, getName()); } else { return getName(); } return (message != null ? message : getName()); }
protected EntityLogAttr getAttrToSave(EntityLogAttr entityLogAttr, EntityLogItem itemToSave) { EntityLogAttr attr = itemToSave.getAttributes().stream() .filter(a -> a.getName().equals(entityLogAttr.getName())) .findFirst() .orElse(null); if (attr == null) { attr = metadata.create(EntityLogAttr.class); attr.setName(entityLogAttr.getName()); itemToSave.getAttributes().add(attr); } return attr; }
protected void internalRegisterModifyAttributeValue(CategoryAttributeValue entity, @Nullable EntityAttributeChanges changes, Set<String> attributes) { String propertyName = DynamicAttributesUtils.encodeAttributeCode(entity.getCode()); if (!attributes.contains(propertyName)) { return; } Date ts = timeSource.currentTimestamp(); EntityManager em = persistence.getEntityManager(); Set<String> dirty = changes == null ? persistence.getTools().getDirtyFields(entity) : changes.getOwnAttributes(); boolean registerDeleteOp = dirty.contains("deleteTs") && entity.isDeleted(); boolean hasChanges = dirty.stream().anyMatch(s -> s.endsWith("Value")); if (hasChanges) { EntityLogItem item = metadata.create(EntityLogItem.class); item.setEventTs(ts); item.setUser(findUser(em)); item.setType(EntityLogItem.Type.MODIFY); item.setEntity(getEntityName(entity)); item.setObjectEntityId(entity.getObjectEntityId()); item.setAttributes(createDynamicLogAttribute(entity, changes, registerDeleteOp)); enqueueItem(item); } }
item.setEventTs(ts); item.setUser(findUser(em)); item.setType(type); item.setEntity(metadata.getExtendedEntities().getOriginalOrThisMetaClass(metaClass).getName()); item.setObjectEntityId(referenceToEntitySupport.getReferenceId(entity)); item.setAttributes(entityLogAttrs);