/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.envers.strategy;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.envers.boot.internal.EnversService;
import org.hibernate.envers.configuration.internal.AuditEntitiesConfiguration;
import org.hibernate.envers.configuration.internal.GlobalConfiguration;
import org.hibernate.envers.internal.entities.mapper.PersistentCollectionChangeData;
import org.hibernate.envers.internal.entities.mapper.relation.MiddleComponentData;
import org.hibernate.envers.internal.entities.mapper.relation.MiddleIdData;
import org.hibernate.envers.internal.tools.query.Parameters;
import org.hibernate.envers.internal.tools.query.QueryBuilder;
/**
* Behaviours of different audit strategy for populating audit data.
*
* @author Stephanie Pau
* @author Adam Warski (adam at warski dot org)
* @author Chris Cranford
*/
public interface AuditStrategy {
/**
* Perform the persistence of audited data for regular entities.
*
* @param session Session, which can be used to persist the data.
* @param entityName Name of the entity, in which the audited change happens
* @param enversService The EnversService
* @param id Id of the entity.
* @param data Audit data to persist
* @param revision Current revision data
* @deprecated (since 5.2.1), use {@link #perform(Session, String, AuditEntitiesConfiguration, Serializable, Object, Object)}
*/
@Deprecated
default void perform(
Session session,
String entityName,
EnversService enversService,
Serializable id,
Object data,
Object revision) {
perform(
session,
entityName,
enversService.getAuditEntitiesConfiguration(),
id,
data,
revision
);
}
/**
* Perform the persistence of audited data for regular entities.
*
* @param session Session, which can be used to persist the data.
* @param entityName Name of the entity, in which the audited change happens
* @param auditEntitiesConfiguration The audit entity configuration.
* @param id Id of the entity.
* @param data Audit data to persist.
* @param revision Current revision data.
*/
void perform(
Session session,
String entityName,
AuditEntitiesConfiguration auditEntitiesConfiguration,
Serializable id,
Object data,
Object revision);
/**
* Perform the persistence of audited data for collection ("middle") entities.
*
* @param session Session, which can be used to persist the data.
* @param entityName Name of the entity, in which the audited change happens.
* @param propertyName The name of the property holding the persistent collection
* @param enversService The EnversService
* @param persistentCollectionChangeData Collection change data to be persisted.
* @param revision Current revision data
* @deprecated (since 5.2.1), use {@link #performCollectionChange(Session, String, String, AuditEntitiesConfiguration, PersistentCollectionChangeData, Object)}
*/
@Deprecated
default void performCollectionChange(
Session session,
String entityName,
String propertyName,
EnversService enversService,
PersistentCollectionChangeData persistentCollectionChangeData,
Object revision) {
performCollectionChange(
session,
entityName,
propertyName,
enversService.getAuditEntitiesConfiguration(),
persistentCollectionChangeData,
revision
);
}
/**
* Perform the persistence of audited data for collection ("middle") entities.
*
* @param session Session, which can be used to persist the data.
* @param entityName Name of the entity, in which the audited change happens.
* @param propertyName The name of the property holding the persistent collection
* @param auditEntitiesConfiguration audit entity configuration
* @param persistentCollectionChangeData Collection change data to be persisted.
* @param revision Current revision data
*/
void performCollectionChange(
Session session,
String entityName,
String propertyName,
AuditEntitiesConfiguration auditEntitiesConfiguration,
PersistentCollectionChangeData persistentCollectionChangeData,
Object revision);
/**
* Update the rootQueryBuilder with an extra WHERE clause to restrict the revision for a two-entity relation.
* This WHERE clause depends on the AuditStrategy, as follows:
* <ul>
* <li>For {@link DefaultAuditStrategy} a subquery is created:
* <p><code>e.revision = (SELECT max(...) ...)</code></p>
* </li>
* <li>for {@link ValidityAuditStrategy} the revision-end column is used:
* <p><code>e.revision <= :revision and (e.endRevision > :revision or e.endRevision is null)</code></p>
* </li>
* </ul>
*
* @param globalCfg the {@link GlobalConfiguration}
* @param rootQueryBuilder the {@link QueryBuilder} that will be updated
* @param parameters root parameters to which restrictions shall be added
* @param revisionProperty property of the revision column
* @param revisionEndProperty property of the revisionEnd column (only used for {@link ValidityAuditStrategy})
* @param addAlias {@code boolean} indicator if a left alias is needed
* @param idData id-information for the two-entity relation (only used for {@link DefaultAuditStrategy})
* @param revisionPropertyPath path of the revision property (only used for {@link ValidityAuditStrategy})
* @param originalIdPropertyName name of the id property (only used for {@link ValidityAuditStrategy})
* @param alias1 an alias used for subquery (only used for {@link ValidityAuditStrategy})
* @param alias2 an alias used for subquery (only used for {@link ValidityAuditStrategy})
* @param inclusive indicates whether revision number shall be treated as inclusive or exclusive
*/
void addEntityAtRevisionRestriction(
GlobalConfiguration globalCfg,
QueryBuilder rootQueryBuilder,
Parameters parameters,
String revisionProperty,
String revisionEndProperty,
boolean addAlias,
MiddleIdData idData,
String revisionPropertyPath,
String originalIdPropertyName,
String alias1,
String alias2,
boolean inclusive);
/**
* Update the rootQueryBuilder with an extra WHERE clause to restrict the revision for a middle-entity
* association. This WHERE clause depends on the AuditStrategy, as follows:
* <ul>
* <li>For {@link DefaultAuditStrategy} a subquery is created:
* <p><code>e.revision = (SELECT max(...) ...)</code></p>
* </li>
* <li>for {@link ValidityAuditStrategy} the revision-end column is used:
* <p><code>e.revision <= :revision and (e.endRevision > :revision or e.endRevision is null)</code></p>
* </li>
* </ul>
*
* @param rootQueryBuilder the {@link QueryBuilder} that will be updated
* @param parameters root parameters to which restrictions shall be added
* @param revisionProperty property of the revision column
* @param revisionEndProperty property of the revisionEnd column (only used for {@link ValidityAuditStrategy})
* @param addAlias {@code boolean} indicator if a left alias is needed
* @param referencingIdData id-information for the middle-entity association (only used for {@link DefaultAuditStrategy})
* @param versionsMiddleEntityName name of the middle-entity
* @param eeOriginalIdPropertyPath name of the id property (only used for {@link ValidityAuditStrategy})
* @param revisionPropertyPath path of the revision property (only used for {@link ValidityAuditStrategy})
* @param originalIdPropertyName name of the id property (only used for {@link ValidityAuditStrategy})
* @param alias1 an alias used for subqueries (only used for {@link DefaultAuditStrategy})
* @param inclusive indicates whether revision number shall be treated as inclusive or exclusive
* @param componentDatas information about the middle-entity relation
*/
void addAssociationAtRevisionRestriction(
QueryBuilder rootQueryBuilder,
Parameters parameters,
String revisionProperty,
String revisionEndProperty,
boolean addAlias,
MiddleIdData referencingIdData,
String versionsMiddleEntityName,
String eeOriginalIdPropertyPath,
String revisionPropertyPath,
String originalIdPropertyName,
String alias1,
boolean inclusive,
MiddleComponentData... componentDatas);
}