Search in sources :

Example 1 with XClass

use of org.hibernate.annotations.common.reflection.XClass in project hibernate-orm by hibernate.

the class AuditedPropertiesReader method read.

public void read() {
    // First reading the access types for the persistent properties.
    readPersistentPropertiesAccess();
    if (persistentPropertiesSource instanceof DynamicComponentSource) {
        addPropertiesFromDynamicComponent((DynamicComponentSource) persistentPropertiesSource);
    } else {
        // Retrieve classes and properties that are explicitly marked for auditing process by any superclass
        // of currently mapped entity or itself.
        final XClass clazz = persistentPropertiesSource.getXClass();
        readAuditOverrides(clazz);
        // Adding all properties from the given class.
        addPropertiesFromClass(clazz);
    }
}
Also used : XClass(org.hibernate.annotations.common.reflection.XClass)

Example 2 with XClass

use of org.hibernate.annotations.common.reflection.XClass in project hibernate-orm by hibernate.

the class RevisionInfoConfiguration method searchForRevisionInfoCfg.

private void searchForRevisionInfoCfg(XClass clazz, ReflectionManager reflectionManager, MutableBoolean revisionNumberFound, MutableBoolean revisionTimestampFound, MutableBoolean modifiedEntityNamesFound) {
    final XClass superclazz = clazz.getSuperclass();
    if (!"java.lang.Object".equals(superclazz.getName())) {
        searchForRevisionInfoCfg(superclazz, reflectionManager, revisionNumberFound, revisionTimestampFound, modifiedEntityNamesFound);
    }
    searchForRevisionInfoCfgInProperties(clazz, reflectionManager, revisionNumberFound, revisionTimestampFound, modifiedEntityNamesFound, "field");
    searchForRevisionInfoCfgInProperties(clazz, reflectionManager, revisionNumberFound, revisionTimestampFound, modifiedEntityNamesFound, "property");
}
Also used : XClass(org.hibernate.annotations.common.reflection.XClass)

Example 3 with XClass

use of org.hibernate.annotations.common.reflection.XClass in project hibernate-orm by hibernate.

the class RevisionInfoConfiguration method searchForRevisionInfoCfgInProperties.

private void searchForRevisionInfoCfgInProperties(XClass clazz, ReflectionManager reflectionManager, MutableBoolean revisionNumberFound, MutableBoolean revisionTimestampFound, MutableBoolean modifiedEntityNamesFound, String accessType) {
    for (XProperty property : clazz.getDeclaredProperties(accessType)) {
        final RevisionNumber revisionNumber = property.getAnnotation(RevisionNumber.class);
        final RevisionTimestamp revisionTimestamp = property.getAnnotation(RevisionTimestamp.class);
        final ModifiedEntityNames modifiedEntityNames = property.getAnnotation(ModifiedEntityNames.class);
        if (revisionNumber != null) {
            if (revisionNumberFound.isSet()) {
                throw new MappingException("Only one property may be annotated with @RevisionNumber!");
            }
            final XClass revisionNumberClass = property.getType();
            if (reflectionManager.equals(revisionNumberClass, Integer.class) || reflectionManager.equals(revisionNumberClass, Integer.TYPE)) {
                revisionInfoIdData = new PropertyData(property.getName(), property.getName(), accessType, null);
                revisionNumberFound.set();
            } else if (reflectionManager.equals(revisionNumberClass, Long.class) || reflectionManager.equals(revisionNumberClass, Long.TYPE)) {
                revisionInfoIdData = new PropertyData(property.getName(), property.getName(), accessType, null);
                revisionNumberFound.set();
                // The default is integer
                revisionPropType = "long";
            } else {
                throw new MappingException("The field annotated with @RevisionNumber must be of type " + "int, Integer, long or Long");
            }
            // Getting the @Column definition of the revision number property, to later use that info to
            // generate the same mapping for the relation from an audit table's revision number to the
            // revision entity revision number.
            final Column revisionPropColumn = property.getAnnotation(Column.class);
            if (revisionPropColumn != null) {
                revisionPropSqlType = revisionPropColumn.columnDefinition();
            }
        }
        if (revisionTimestamp != null) {
            if (revisionTimestampFound.isSet()) {
                throw new MappingException("Only one property may be annotated with @RevisionTimestamp!");
            }
            final XClass revisionTimestampClass = property.getType();
            if (reflectionManager.equals(revisionTimestampClass, Long.class) || reflectionManager.equals(revisionTimestampClass, Long.TYPE) || reflectionManager.equals(revisionTimestampClass, Date.class) || reflectionManager.equals(revisionTimestampClass, java.sql.Date.class)) {
                revisionInfoTimestampData = new PropertyData(property.getName(), property.getName(), accessType, null);
                revisionTimestampFound.set();
            } else {
                throw new MappingException("The field annotated with @RevisionTimestamp must be of type " + "long, Long, java.util.Date or java.sql.Date");
            }
        }
        if (modifiedEntityNames != null) {
            if (modifiedEntityNamesFound.isSet()) {
                throw new MappingException("Only one property may be annotated with @ModifiedEntityNames!");
            }
            final XClass modifiedEntityNamesClass = property.getType();
            if (reflectionManager.equals(modifiedEntityNamesClass, Set.class) && reflectionManager.equals(property.getElementClass(), String.class)) {
                modifiedEntityNamesData = new PropertyData(property.getName(), property.getName(), accessType, null);
                modifiedEntityNamesFound.set();
            } else {
                throw new MappingException("The field annotated with @ModifiedEntityNames must be of Set<String> type.");
            }
        }
    }
}
Also used : XProperty(org.hibernate.annotations.common.reflection.XProperty) ModifiedEntityNames(org.hibernate.envers.ModifiedEntityNames) PropertyData(org.hibernate.envers.internal.entities.PropertyData) Set(java.util.Set) RevisionTimestamp(org.hibernate.envers.RevisionTimestamp) RevisionNumber(org.hibernate.envers.RevisionNumber) XClass(org.hibernate.annotations.common.reflection.XClass) Date(java.util.Date) MappingException(org.hibernate.MappingException) Column(javax.persistence.Column)

Example 4 with XClass

use of org.hibernate.annotations.common.reflection.XClass in project hibernate-orm by hibernate.

the class RevisionInfoConfiguration method configure.

public RevisionInfoConfigurationResult configure(MetadataImplementor metadata, ReflectionManager reflectionManager) {
    boolean revisionEntityFound = false;
    RevisionInfoGenerator revisionInfoGenerator = null;
    Class<?> revisionInfoClass = null;
    for (PersistentClass persistentClass : metadata.getEntityBindings()) {
        // Ensure we're in POJO, not dynamic model, mapping.
        if (persistentClass.getClassName() != null) {
            XClass clazz;
            try {
                clazz = reflectionManager.classForName(persistentClass.getClassName());
            } catch (ClassLoadingException e) {
                throw new MappingException(e);
            }
            final RevisionEntity revisionEntity = clazz.getAnnotation(RevisionEntity.class);
            if (revisionEntity != null) {
                if (revisionEntityFound) {
                    throw new MappingException("Only one entity may be annotated with @RevisionEntity!");
                }
                // Checking if custom revision entity isn't audited
                if (clazz.getAnnotation(Audited.class) != null) {
                    throw new MappingException("An entity annotated with @RevisionEntity cannot be audited!");
                }
                revisionEntityFound = true;
                final MutableBoolean revisionNumberFound = new MutableBoolean();
                final MutableBoolean revisionTimestampFound = new MutableBoolean();
                final MutableBoolean modifiedEntityNamesFound = new MutableBoolean();
                searchForRevisionInfoCfg(clazz, reflectionManager, revisionNumberFound, revisionTimestampFound, modifiedEntityNamesFound);
                if (!revisionNumberFound.isSet()) {
                    throw new MappingException("An entity annotated with @RevisionEntity must have a field annotated " + "with @RevisionNumber!");
                }
                if (!revisionTimestampFound.isSet()) {
                    throw new MappingException("An entity annotated with @RevisionEntity must have a field annotated " + "with @RevisionTimestamp!");
                }
                revisionInfoEntityName = persistentClass.getEntityName();
                revisionInfoClass = persistentClass.getMappedClass();
                final Class<? extends RevisionListener> revisionListenerClass = getRevisionListenerClass(revisionEntity.value());
                revisionInfoTimestampType = persistentClass.getProperty(revisionInfoTimestampData.getName()).getType();
                if (globalCfg.isTrackEntitiesChangedInRevision() || (globalCfg.isUseRevisionEntityWithNativeId() && DefaultTrackingModifiedEntitiesRevisionEntity.class.isAssignableFrom(revisionInfoClass)) || (!globalCfg.isUseRevisionEntityWithNativeId() && SequenceIdTrackingModifiedEntitiesRevisionEntity.class.isAssignableFrom(revisionInfoClass)) || modifiedEntityNamesFound.isSet()) {
                    // If tracking modified entities parameter is enabled, custom revision info entity is a subtype
                    // of DefaultTrackingModifiedEntitiesRevisionEntity class, or @ModifiedEntityNames annotation is used.
                    revisionInfoGenerator = new DefaultTrackingModifiedEntitiesRevisionInfoGenerator(revisionInfoEntityName, revisionInfoClass, revisionListenerClass, revisionInfoTimestampData, isTimestampAsDate(), modifiedEntityNamesData, metadata.getMetadataBuildingOptions().getServiceRegistry());
                    globalCfg.setTrackEntitiesChangedInRevision(true);
                } else {
                    revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoEntityName, revisionInfoClass, revisionListenerClass, revisionInfoTimestampData, isTimestampAsDate(), metadata.getMetadataBuildingOptions().getServiceRegistry());
                }
            }
        }
    }
    // In case of a custom revision info generator, the mapping will be null.
    Document revisionInfoXmlMapping = null;
    final Class<? extends RevisionListener> revisionListenerClass = getRevisionListenerClass(RevisionListener.class);
    if (revisionInfoGenerator == null) {
        if (globalCfg.isTrackEntitiesChangedInRevision()) {
            revisionInfoClass = globalCfg.isUseRevisionEntityWithNativeId() ? DefaultTrackingModifiedEntitiesRevisionEntity.class : SequenceIdTrackingModifiedEntitiesRevisionEntity.class;
            revisionInfoEntityName = revisionInfoClass.getName();
            revisionInfoGenerator = new DefaultTrackingModifiedEntitiesRevisionInfoGenerator(revisionInfoEntityName, revisionInfoClass, revisionListenerClass, revisionInfoTimestampData, isTimestampAsDate(), modifiedEntityNamesData, metadata.getMetadataBuildingOptions().getServiceRegistry());
        } else {
            revisionInfoClass = globalCfg.isUseRevisionEntityWithNativeId() ? DefaultRevisionEntity.class : SequenceIdRevisionEntity.class;
            revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoEntityName, revisionInfoClass, revisionListenerClass, revisionInfoTimestampData, isTimestampAsDate(), metadata.getMetadataBuildingOptions().getServiceRegistry());
        }
        revisionInfoXmlMapping = generateDefaultRevisionInfoXmlMapping();
    }
    return new RevisionInfoConfigurationResult(revisionInfoGenerator, revisionInfoXmlMapping, new RevisionInfoQueryCreator(revisionInfoEntityName, revisionInfoIdData.getName(), revisionInfoTimestampData.getName(), isTimestampAsDate()), generateRevisionInfoRelationMapping(), new RevisionInfoNumberReader(revisionInfoClass, revisionInfoIdData, metadata.getMetadataBuildingOptions().getServiceRegistry()), globalCfg.isTrackEntitiesChangedInRevision() ? new ModifiedEntityNamesReader(revisionInfoClass, modifiedEntityNamesData, metadata.getMetadataBuildingOptions().getServiceRegistry()) : null, revisionInfoEntityName, revisionInfoClass, revisionInfoTimestampData);
}
Also used : ClassLoadingException(org.hibernate.annotations.common.reflection.ClassLoadingException) SequenceIdRevisionEntity(org.hibernate.envers.enhanced.SequenceIdRevisionEntity) MutableBoolean(org.hibernate.envers.internal.tools.MutableBoolean) ModifiedEntityNamesReader(org.hibernate.envers.internal.revisioninfo.ModifiedEntityNamesReader) DefaultRevisionInfoGenerator(org.hibernate.envers.internal.revisioninfo.DefaultRevisionInfoGenerator) Document(org.dom4j.Document) XClass(org.hibernate.annotations.common.reflection.XClass) RevisionInfoNumberReader(org.hibernate.envers.internal.revisioninfo.RevisionInfoNumberReader) SequenceIdTrackingModifiedEntitiesRevisionEntity(org.hibernate.envers.enhanced.SequenceIdTrackingModifiedEntitiesRevisionEntity) MappingException(org.hibernate.MappingException) DefaultRevisionEntity(org.hibernate.envers.DefaultRevisionEntity) RevisionEntity(org.hibernate.envers.RevisionEntity) SequenceIdRevisionEntity(org.hibernate.envers.enhanced.SequenceIdRevisionEntity) SequenceIdTrackingModifiedEntitiesRevisionEntity(org.hibernate.envers.enhanced.SequenceIdTrackingModifiedEntitiesRevisionEntity) DefaultTrackingModifiedEntitiesRevisionEntity(org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity) Audited(org.hibernate.envers.Audited) DefaultTrackingModifiedEntitiesRevisionInfoGenerator(org.hibernate.envers.internal.revisioninfo.DefaultTrackingModifiedEntitiesRevisionInfoGenerator) DefaultRevisionInfoGenerator(org.hibernate.envers.internal.revisioninfo.DefaultRevisionInfoGenerator) RevisionInfoGenerator(org.hibernate.envers.internal.revisioninfo.RevisionInfoGenerator) DefaultRevisionEntity(org.hibernate.envers.DefaultRevisionEntity) DefaultTrackingModifiedEntitiesRevisionInfoGenerator(org.hibernate.envers.internal.revisioninfo.DefaultTrackingModifiedEntitiesRevisionInfoGenerator) DefaultTrackingModifiedEntitiesRevisionEntity(org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity) RevisionInfoQueryCreator(org.hibernate.envers.internal.revisioninfo.RevisionInfoQueryCreator) PersistentClass(org.hibernate.mapping.PersistentClass)

Example 5 with XClass

use of org.hibernate.annotations.common.reflection.XClass in project hibernate-orm by hibernate.

the class AnnotationMetadataSourceProcessorImpl method orderAndFillHierarchy.

private List<XClass> orderAndFillHierarchy(List<XClass> original) {
    List<XClass> copy = new ArrayList<XClass>(original);
    insertMappedSuperclasses(original, copy);
    // order the hierarchy
    List<XClass> workingCopy = new ArrayList<XClass>(copy);
    List<XClass> newList = new ArrayList<XClass>(copy.size());
    while (workingCopy.size() > 0) {
        XClass clazz = workingCopy.get(0);
        orderHierarchy(workingCopy, newList, copy, clazz);
    }
    return newList;
}
Also used : ArrayList(java.util.ArrayList) XClass(org.hibernate.annotations.common.reflection.XClass)

Aggregations

XClass (org.hibernate.annotations.common.reflection.XClass)39 XProperty (org.hibernate.annotations.common.reflection.XProperty)11 AnnotationException (org.hibernate.AnnotationException)10 HashMap (java.util.HashMap)8 MappingException (org.hibernate.MappingException)7 ArrayList (java.util.ArrayList)6 ClassLoadingException (org.hibernate.annotations.common.reflection.ClassLoadingException)6 PersistentClass (org.hibernate.mapping.PersistentClass)5 Property (org.hibernate.mapping.Property)5 Column (javax.persistence.Column)4 ElementCollection (javax.persistence.ElementCollection)4 EmbeddedId (javax.persistence.EmbeddedId)4 JoinColumn (javax.persistence.JoinColumn)4 CollectionId (org.hibernate.annotations.CollectionId)4 Component (org.hibernate.mapping.Component)4 Date (java.util.Date)3 Map (java.util.Map)3 Embeddable (javax.persistence.Embeddable)3 EntityListeners (javax.persistence.EntityListeners)3 JoinTable (javax.persistence.JoinTable)3