Search in sources :

Example 1 with ClassAuditingData

use of org.hibernate.envers.configuration.internal.metadata.reader.ClassAuditingData in project hibernate-orm by hibernate.

the class ClassesAuditingData method updateCalculatedFields.

/**
 * After all meta-data is read, updates calculated fields. This includes:
 * <ul>
 * <li>setting {@code forceInsertable} to {@code true} for properties specified by {@code @AuditMappedBy}</li>
 * <li>adding {@code synthetic} properties to mappedBy relations which have {@code IndexColumn} or {@code OrderColumn}.</li>
 * </ul>
 */
public void updateCalculatedFields() {
    for (Map.Entry<PersistentClass, ClassAuditingData> classAuditingDataEntry : persistentClassToAuditingData.entrySet()) {
        final PersistentClass pc = classAuditingDataEntry.getKey();
        final ClassAuditingData classAuditingData = classAuditingDataEntry.getValue();
        for (String propertyName : classAuditingData.getNonSyntheticPropertyNames()) {
            final Property property = pc.getProperty(propertyName);
            updateCalculatedProperty(pc.getEntityName(), property, propertyName, classAuditingData);
        }
    }
}
Also used : ClassAuditingData(org.hibernate.envers.configuration.internal.metadata.reader.ClassAuditingData) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) Property(org.hibernate.mapping.Property) PersistentClass(org.hibernate.mapping.PersistentClass)

Example 2 with ClassAuditingData

use of org.hibernate.envers.configuration.internal.metadata.reader.ClassAuditingData in project hibernate-orm by hibernate.

the class EntitiesConfigurator method configure.

public EntitiesConfigurations configure(MetadataImplementor metadata, ServiceRegistry serviceRegistry, ReflectionManager reflectionManager, MappingCollector mappingCollector, GlobalConfiguration globalConfiguration, AuditEntitiesConfiguration auditEntitiesConfiguration, AuditStrategy auditStrategy, Document revisionInfoXmlMapping, Element revisionInfoRelationMapping) {
    // Creating a name register to capture all audit entity names created.
    final AuditEntityNameRegister auditEntityNameRegister = new AuditEntityNameRegister();
    // Sorting the persistent class topologically - superclass always before subclass
    final Iterator<PersistentClass> classes = GraphTopologicalSort.sort(new PersistentClassGraphDefiner(metadata)).iterator();
    final ClassesAuditingData classesAuditingData = new ClassesAuditingData();
    final Map<PersistentClass, EntityXmlMappingData> xmlMappings = new HashMap<>();
    // Reading metadata from annotations
    while (classes.hasNext()) {
        final PersistentClass pc = classes.next();
        // Ensure we're in POJO, not dynamic model, mapping.
        if (pc.getClassName() != null) {
            // Collecting information from annotations on the persistent class pc
            final AnnotationsMetadataReader annotationsMetadataReader = new AnnotationsMetadataReader(globalConfiguration, reflectionManager, pc);
            final ClassAuditingData auditData = annotationsMetadataReader.getAuditData();
            classesAuditingData.addClassAuditingData(pc, auditData);
        }
    }
    // Now that all information is read we can update the calculated fields.
    classesAuditingData.updateCalculatedFields();
    final AuditMetadataGenerator auditMetaGen = new AuditMetadataGenerator(metadata, serviceRegistry, globalConfiguration, auditEntitiesConfiguration, auditStrategy, revisionInfoRelationMapping, auditEntityNameRegister);
    // First pass
    for (Map.Entry<PersistentClass, ClassAuditingData> pcDatasEntry : classesAuditingData.getAllClassAuditedData()) {
        final PersistentClass pc = pcDatasEntry.getKey();
        final ClassAuditingData auditData = pcDatasEntry.getValue();
        final EntityXmlMappingData xmlMappingData = new EntityXmlMappingData();
        if (auditData.isAudited()) {
            if (!StringTools.isEmpty(auditData.getAuditTable().value())) {
                auditEntitiesConfiguration.addCustomAuditTableName(pc.getEntityName(), auditData.getAuditTable().value());
            }
            auditMetaGen.generateFirstPass(pc, auditData, xmlMappingData, true);
        } else {
            auditMetaGen.generateFirstPass(pc, auditData, xmlMappingData, false);
        }
        xmlMappings.put(pc, xmlMappingData);
    }
    // Second pass
    for (Map.Entry<PersistentClass, ClassAuditingData> pcDatasEntry : classesAuditingData.getAllClassAuditedData()) {
        final EntityXmlMappingData xmlMappingData = xmlMappings.get(pcDatasEntry.getKey());
        if (pcDatasEntry.getValue().isAudited()) {
            auditMetaGen.generateSecondPass(pcDatasEntry.getKey(), pcDatasEntry.getValue(), xmlMappingData);
            try {
                mappingCollector.addDocument(xmlMappingData.getMainXmlMapping());
                for (Document additionalMapping : xmlMappingData.getAdditionalXmlMappings()) {
                    mappingCollector.addDocument(additionalMapping);
                }
            } catch (DocumentException e) {
                throw new MappingException(e);
            }
        }
    }
    // Only if there are any versioned classes
    if (auditMetaGen.getEntitiesConfigurations().size() > 0) {
        try {
            if (revisionInfoXmlMapping != null) {
                mappingCollector.addDocument(revisionInfoXmlMapping);
            }
        } catch (DocumentException e) {
            throw new MappingException(e);
        }
    }
    return new EntitiesConfigurations(auditMetaGen.getEntitiesConfigurations(), auditMetaGen.getNotAuditedEntitiesConfigurations());
}
Also used : AuditMetadataGenerator(org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator) HashMap(java.util.HashMap) EntityXmlMappingData(org.hibernate.envers.configuration.internal.metadata.EntityXmlMappingData) Document(org.dom4j.Document) AuditEntityNameRegister(org.hibernate.envers.configuration.internal.metadata.AuditEntityNameRegister) MappingException(org.hibernate.MappingException) AnnotationsMetadataReader(org.hibernate.envers.configuration.internal.metadata.reader.AnnotationsMetadataReader) ClassAuditingData(org.hibernate.envers.configuration.internal.metadata.reader.ClassAuditingData) DocumentException(org.dom4j.DocumentException) HashMap(java.util.HashMap) Map(java.util.Map) PersistentClass(org.hibernate.mapping.PersistentClass) EntitiesConfigurations(org.hibernate.envers.internal.entities.EntitiesConfigurations)

Example 3 with ClassAuditingData

use of org.hibernate.envers.configuration.internal.metadata.reader.ClassAuditingData in project hibernate-orm by hibernate.

the class ClassesAuditingData method updateCalculatedProperty.

private void updateCalculatedProperty(String entityName, Property property, String propertyName, AuditedPropertiesHolder propertyHolder) {
    final PropertyAuditingData propertyAuditingData = propertyHolder.getPropertyAuditingData(propertyName);
    final boolean isAuditMappedBy = propertyAuditingData.getAuditMappedBy() != null;
    final boolean isRelationMappedBy = propertyAuditingData.getRelationMappedBy() != null;
    // handle updating the property, if applicable.
    if (isAuditMappedBy || isRelationMappedBy) {
        final String referencedEntityName = MappingTools.getReferencedEntityName(property.getValue());
        final ClassAuditingData referencedAuditData = entityNameToAuditingData.get(referencedEntityName);
        if (isAuditMappedBy) {
            // If a property had the @AuditMappedBy annotation, setting the referenced fields to be always insertable.
            setAuditMappedByInsertable(referencedEntityName, entityName, referencedAuditData, propertyAuditingData);
        } else if (isRelationMappedBy && (property.getValue() instanceof List)) {
            // If a property has mappedBy= and @Indexed and isn't @AuditMappedBy, add synthetic support.
            addSyntheticIndexProperty((List) property.getValue(), property.getPropertyAccessorName(), referencedAuditData);
        }
    }
    // This is useful for AuditMappedBy inside an Embeddable that holds a collection of entities.
    if (propertyAuditingData instanceof ComponentAuditingData) {
        final ComponentAuditingData componentAuditingData = (ComponentAuditingData) propertyAuditingData;
        final Component component = (Component) property.getValue();
        for (String componentPropertyName : componentAuditingData.getNonSyntheticPropertyNames()) {
            final Property componentProperty = component.getProperty(componentPropertyName);
            updateCalculatedProperty(entityName, componentProperty, componentPropertyName, componentAuditingData);
        }
    }
}
Also used : ClassAuditingData(org.hibernate.envers.configuration.internal.metadata.reader.ClassAuditingData) ComponentAuditingData(org.hibernate.envers.configuration.internal.metadata.reader.ComponentAuditingData) List(org.hibernate.mapping.List) PropertyAuditingData(org.hibernate.envers.configuration.internal.metadata.reader.PropertyAuditingData) Component(org.hibernate.mapping.Component) Property(org.hibernate.mapping.Property)

Aggregations

ClassAuditingData (org.hibernate.envers.configuration.internal.metadata.reader.ClassAuditingData)3 HashMap (java.util.HashMap)2 Map (java.util.Map)2 PersistentClass (org.hibernate.mapping.PersistentClass)2 Property (org.hibernate.mapping.Property)2 LinkedHashMap (java.util.LinkedHashMap)1 Document (org.dom4j.Document)1 DocumentException (org.dom4j.DocumentException)1 MappingException (org.hibernate.MappingException)1 AuditEntityNameRegister (org.hibernate.envers.configuration.internal.metadata.AuditEntityNameRegister)1 AuditMetadataGenerator (org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator)1 EntityXmlMappingData (org.hibernate.envers.configuration.internal.metadata.EntityXmlMappingData)1 AnnotationsMetadataReader (org.hibernate.envers.configuration.internal.metadata.reader.AnnotationsMetadataReader)1 ComponentAuditingData (org.hibernate.envers.configuration.internal.metadata.reader.ComponentAuditingData)1 PropertyAuditingData (org.hibernate.envers.configuration.internal.metadata.reader.PropertyAuditingData)1 EntitiesConfigurations (org.hibernate.envers.internal.entities.EntitiesConfigurations)1 Component (org.hibernate.mapping.Component)1 List (org.hibernate.mapping.List)1