Skip to content
This repository has been archived by the owner on Mar 7, 2022. It is now read-only.

Commit

Permalink
apply HanseMerkur patch
Browse files Browse the repository at this point in the history
  • Loading branch information
Patrick Meyer committed Jan 18, 2021
1 parent 64be512 commit 0e55f75
Show file tree
Hide file tree
Showing 15 changed files with 262 additions and 135 deletions.
2 changes: 1 addition & 1 deletion gradle/base-information.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
apply plugin: 'base'

ext {
ormVersion = new HibernateVersion( '5.3.20.Final', project )
ormVersion = new HibernateVersion( '5.3.20.HM1', project )
baselineJavaVersion = '1.8'
jpaVersion = new JpaVersion('2.2')
}
Expand Down
1 change: 1 addition & 0 deletions hibernate-envers/hibernate-envers.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

apply from: rootProject.file( 'gradle/published-java-module.gradle' )
apply plugin: 'hibernate-matrix-testing'
apply plugin: 'maven'

description = 'Hibernate\'s entity version (audit/history) support'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,15 @@ public interface EnversSettings {
* Exactly one row with {@code null} end date exists for each identifier.
*/
String ALLOW_IDENTIFIER_REUSE = "org.hibernate.envers.allow_identifier_reuse";


/**
* Indicates if the audit table includes a column holding the revision type
*/
String REVISION_TYPE_IN_AUDIT_TABLE = "org.hibernate.envers.revision_type_in_audit_table";

/**
* Indicates if envers is using a global revision id or separate ids for each table
*/
String USE_GLOBAL_REVISION_ID = "org.hibernate.envers.use_global_revision_id";
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
* @author Stephanie Pau at Markit Group Plc
* @author Chris Cranford
*/
public class AuditEntitiesConfiguration {
public class AuditEntitiesConfiguration {
private final String auditTablePrefix;
private final String auditTableSuffix;

Expand All @@ -48,6 +48,11 @@ public class AuditEntitiesConfiguration {
private final String embeddableSetOrdinalPropertyName;
private final EnversService enversService;

// Is the revision type part of the audit table
private final boolean revisionTypeInAuditTable;
// Is the AuditStrategy using a global revision id or one local to the entity
private final boolean useGlobalRevisionId;

public AuditEntitiesConfiguration(
Properties properties,
String revisionInfoEntityName,
Expand All @@ -60,6 +65,7 @@ public AuditEntitiesConfiguration(

auditStrategyName = ConfigurationHelper.getString(
EnversSettings.AUDIT_STRATEGY, properties, DefaultAuditStrategy.class.getName()

);

originalIdPropName = ConfigurationHelper.getString(
Expand Down Expand Up @@ -98,6 +104,18 @@ public AuditEntitiesConfiguration(
embeddableSetOrdinalPropertyName = ConfigurationHelper.getString(
EnversSettings.EMBEDDABLE_SET_ORDINAL_FIELD_NAME, properties, "SETORDINAL"
);

String revisionTypeInAuditTableStr = ConfigurationHelper.getString(
EnversSettings.REVISION_TYPE_IN_AUDIT_TABLE, properties,
"true"
);
revisionTypeInAuditTable = Boolean.parseBoolean( revisionTypeInAuditTableStr );

String useGlobalRevisionIdStr = ConfigurationHelper.getString(
EnversSettings.USE_GLOBAL_REVISION_ID, properties,
"true"
);
useGlobalRevisionId = Boolean.parseBoolean( useGlobalRevisionIdStr );
}

public String getOriginalIdPropName() {
Expand Down Expand Up @@ -178,4 +196,12 @@ public String getEmbeddableSetOrdinalPropertyName() {
public EnversService getEnversService() {
return enversService;
}

public boolean isUseGlobalRevisionId() {
return useGlobalRevisionId;
}

public boolean isRevisionTypeInAuditTable() {
return revisionTypeInAuditTable;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import org.hibernate.envers.internal.entities.mapper.relation.MiddleIdData;
import org.hibernate.envers.internal.reader.AuditReaderImplementor;
import org.hibernate.envers.internal.tools.query.QueryBuilder;
import org.hibernate.envers.query.internal.impl.SpecialRevisionRestrictionProvider;
import org.hibernate.envers.strategy.AuditStrategy;
import org.hibernate.query.Query;

import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.DEL_REVISION_TYPE_PARAMETER;
Expand All @@ -30,14 +32,17 @@ public abstract class AbstractRelationQueryGenerator implements RelationQueryGen
protected final AuditEntitiesConfiguration verEntCfg;
protected final MiddleIdData referencingIdData;
protected final boolean revisionTypeInId;
protected final AuditStrategy auditStrategy;

protected AbstractRelationQueryGenerator(
AuditStrategy auditStrategy,
AuditEntitiesConfiguration verEntCfg,
MiddleIdData referencingIdData,
boolean revisionTypeInId) {
this.verEntCfg = verEntCfg;
this.referencingIdData = referencingIdData;
this.revisionTypeInId = revisionTypeInId;
this.auditStrategy = auditStrategy;
}

/**
Expand All @@ -54,14 +59,18 @@ protected AbstractRelationQueryGenerator(

@Override
public Query getQuery(AuditReaderImplementor versionsReader, Object primaryKey, Number revision, boolean removed) {
final Query query = versionsReader.getSession().createQuery( removed ? getQueryRemovedString() : getQueryString() );
query.setParameter( DEL_REVISION_TYPE_PARAMETER, RevisionType.DEL );
query.setParameter( REVISION_PARAMETER, revision );
Query query = versionsReader.getSession().createQuery( removed ? getQueryRemovedString() : getQueryString() );
if ( verEntCfg.isRevisionTypeInAuditTable() ) {
query.setParameter( DEL_REVISION_TYPE_PARAMETER, RevisionType.DEL );
query.setParameter( REVISION_PARAMETER, revision );
}
for ( QueryParameterData paramData : referencingIdData.getPrefixedMapper().mapToQueryParametersFromId(
primaryKey
) ) {
primaryKey ) ) {
paramData.setParameterValue( query );
}
if ( auditStrategy instanceof SpecialRevisionRestrictionProvider ) {
( (SpecialRevisionRestrictionProvider) auditStrategy ).setRevisionRestrictionParameter( query );
}
return query;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
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;
import org.hibernate.envers.query.internal.impl.SpecialRevisionRestrictionProvider;
import org.hibernate.envers.strategy.AuditStrategy;

import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.DEL_REVISION_TYPE_PARAMETER;
Expand Down Expand Up @@ -43,7 +44,7 @@ public OneAuditEntityQueryGenerator(
boolean revisionTypeInId,
String mappedBy,
boolean mappedByKey) {
super( verEntCfg, referencingIdData, revisionTypeInId );
super( auditStrategy, verEntCfg, referencingIdData, revisionTypeInId );

this.mappedBy = mappedBy;

Expand Down Expand Up @@ -124,7 +125,9 @@ private void createValidDataRestrictions(
true
);
// e.revision_type != DEL
rootParameters.addWhereWithNamedParam( getRevisionTypePath(), false, "!=", DEL_REVISION_TYPE_PARAMETER );
if ( verEntCfg.isRevisionTypeInAuditTable() ) {
rootParameters.addWhereWithNamedParam( getRevisionTypePath(), false, "!=", DEL_REVISION_TYPE_PARAMETER );
}
}

/**
Expand All @@ -140,10 +143,17 @@ private void createValidAndRemovedDataRestrictions(
final Parameters removed = disjoint.addSubParameters( "and" );
// Excluding current revision, because we need to match data valid at the previous one.
createValidDataRestrictions( globalCfg, auditStrategy, referencedIdData, remQb, valid );
// e.revision = :revision
removed.addWhereWithNamedParam( verEntCfg.getRevisionNumberPath(), false, "=", REVISION_PARAMETER );
// e.revision_type = DEL
removed.addWhereWithNamedParam( getRevisionTypePath(), false, "=", DEL_REVISION_TYPE_PARAMETER );
if ( verEntCfg.isUseGlobalRevisionId() ) {
// e.revision = :revision
removed.addWhereWithNamedParam( verEntCfg.getRevisionNumberPath(), false, "=", REVISION_PARAMETER );
}
if ( verEntCfg.isRevisionTypeInAuditTable() ) {
// e.revision_type = DEL
removed.addWhereWithNamedParam( getRevisionTypePath(), false, "=", DEL_REVISION_TYPE_PARAMETER );
}
if ( auditStrategy instanceof SpecialRevisionRestrictionProvider ) {
( (SpecialRevisionRestrictionProvider) auditStrategy ).setRevisionRestrictionParameter( null, valid );
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
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;
import org.hibernate.envers.query.internal.impl.SpecialRevisionRestrictionProvider;
import org.hibernate.envers.strategy.AuditStrategy;

import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.DEL_REVISION_TYPE_PARAMETER;
Expand All @@ -31,7 +32,7 @@ public OneEntityQueryGenerator(
AuditEntitiesConfiguration verEntCfg, AuditStrategy auditStrategy,
String versionsMiddleEntityName, MiddleIdData referencingIdData,
boolean revisionTypeInId, MiddleComponentData... componentData) {
super( verEntCfg, referencingIdData, revisionTypeInId );
super( auditStrategy, verEntCfg, referencingIdData, revisionTypeInId );

/*
* The valid query that we need to create:
Expand Down Expand Up @@ -99,7 +100,9 @@ private void createValidDataRestrictions(
originalIdPropertyName, MIDDLE_ENTITY_ALIAS, inclusive, componentData
);
// ee.revision_type != DEL
rootParameters.addWhereWithNamedParam( getRevisionTypePath(), "!=", DEL_REVISION_TYPE_PARAMETER );
if ( verEntCfg.isRevisionTypeInAuditTable() ) {
rootParameters.addWhereWithNamedParam( getRevisionTypePath(), "!=", DEL_REVISION_TYPE_PARAMETER );
}
}

/**
Expand All @@ -116,9 +119,17 @@ private void createValidAndRemovedDataRestrictions(
// Excluding current revision, because we need to match data valid at the previous one.
createValidDataRestrictions( auditStrategy, versionsMiddleEntityName, remQb, valid, false, componentData );
// ee.revision = :revision
removed.addWhereWithNamedParam( verEntCfg.getRevisionNumberPath(), "=", REVISION_PARAMETER );
if ( verEntCfg.isUseGlobalRevisionId() ) {
removed.addWhereWithNamedParam( verEntCfg.getRevisionNumberPath(), "=", REVISION_PARAMETER );
removed.addWhereWithNamedParam( verEntCfg.getRevisionNumberPath(), "=", verEntCfg.getRevisionFieldName() );
}
// ee.revision_type = DEL
removed.addWhereWithNamedParam( getRevisionTypePath(), "=", DEL_REVISION_TYPE_PARAMETER );
if ( verEntCfg.isRevisionTypeInAuditTable() ) {
removed.addWhereWithNamedParam( getRevisionTypePath(), "=", DEL_REVISION_TYPE_PARAMETER );
}
if ( auditStrategy instanceof SpecialRevisionRestrictionProvider ) {
( (SpecialRevisionRestrictionProvider) auditStrategy ).setRevisionRestrictionParameter( null, valid );
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hibernate.envers.configuration.internal.GlobalConfiguration;
import org.hibernate.envers.internal.entities.mapper.relation.MiddleComponentData;
import org.hibernate.envers.internal.entities.mapper.relation.MiddleIdData;
import org.hibernate.envers.query.internal.impl.SpecialRevisionRestrictionProvider;
import org.hibernate.envers.internal.tools.query.Parameters;
import org.hibernate.envers.internal.tools.query.QueryBuilder;
import org.hibernate.envers.strategy.AuditStrategy;
Expand Down Expand Up @@ -38,7 +39,7 @@ public ThreeEntityQueryGenerator(
MiddleIdData referencingIdData, MiddleIdData referencedIdData,
MiddleIdData indexIdData, boolean revisionTypeInId,
MiddleComponentData... componentData) {
super( verEntCfg, referencingIdData, revisionTypeInId );
super( auditStrategy, verEntCfg, referencingIdData, revisionTypeInId );

/*
* The valid query that we need to create:
Expand Down Expand Up @@ -188,22 +189,24 @@ private void createValidDataRestrictions(
referencingIdData, versionsMiddleEntityName, eeOriginalIdPropertyPath, revisionPropertyPath,
originalIdPropertyName, MIDDLE_ENTITY_ALIAS, inclusive, componentData
);
// ee.revision_type != DEL
rootParameters.addWhereWithNamedParam( revisionTypePropName, "!=", DEL_REVISION_TYPE_PARAMETER );
// e.revision_type != DEL
rootParameters.addWhereWithNamedParam(
REFERENCED_ENTITY_ALIAS + "." + revisionTypePropName,
false,
"!=",
DEL_REVISION_TYPE_PARAMETER
);
// f.revision_type != DEL
rootParameters.addWhereWithNamedParam(
INDEX_ENTITY_ALIAS + "." + revisionTypePropName,
false,
"!=",
DEL_REVISION_TYPE_PARAMETER
);
if ( verEntCfg.isRevisionTypeInAuditTable() ) {
// ee.revision_type != DEL
rootParameters.addWhereWithNamedParam( revisionTypePropName, "!=", DEL_REVISION_TYPE_PARAMETER );
// e.revision_type != DEL
rootParameters.addWhereWithNamedParam(
REFERENCED_ENTITY_ALIAS + "." + revisionTypePropName,
false,
"!=",
DEL_REVISION_TYPE_PARAMETER
);
// f.revision_type != DEL
rootParameters.addWhereWithNamedParam(
INDEX_ENTITY_ALIAS + "." + revisionTypePropName,
false,
"!=",
DEL_REVISION_TYPE_PARAMETER
);
}
}

/**
Expand All @@ -224,38 +227,52 @@ private void createValidAndRemovedDataRestrictions(
createValidDataRestrictions(
globalCfg, auditStrategy, referencedIdData, versionsMiddleEntityName, remQb, valid, false, indexIdData, componentData
);
// ee.revision = :revision
removed.addWhereWithNamedParam( revisionPropertyPath, "=", REVISION_PARAMETER );
// e.revision = :revision
removed.addWhereWithNamedParam(
REFERENCED_ENTITY_ALIAS + "." + revisionPropertyPath,
false,
"=",
REVISION_PARAMETER
);
// f.revision = :revision
removed.addWhereWithNamedParam(
INDEX_ENTITY_ALIAS + "." + revisionPropertyPath,
false,
"=",
REVISION_PARAMETER
);
// ee.revision_type = DEL
removed.addWhereWithNamedParam( revisionTypePropName, "=", DEL_REVISION_TYPE_PARAMETER );
// e.revision_type = DEL
removed.addWhereWithNamedParam(
REFERENCED_ENTITY_ALIAS + "." + revisionTypePropName,
false,
"=",
DEL_REVISION_TYPE_PARAMETER
);
// f.revision_type = DEL
removed.addWhereWithNamedParam(
INDEX_ENTITY_ALIAS + "." + revisionTypePropName,
false,
"=",
DEL_REVISION_TYPE_PARAMETER
);
if ( verEntCfg.isUseGlobalRevisionId() ) {
// ee.revision = :revision
removed.addWhereWithNamedParam( revisionPropertyPath, "=", REVISION_PARAMETER );
// e.revision = :revision
removed.addWhereWithNamedParam(
REFERENCED_ENTITY_ALIAS + "." + revisionPropertyPath,
false,
"=",
REVISION_PARAMETER
);
// f.revision = :revision
removed.addWhereWithNamedParam(
INDEX_ENTITY_ALIAS + "." + revisionPropertyPath,
false,
"=",
REVISION_PARAMETER
);
}
if ( verEntCfg.isRevisionTypeInAuditTable() ) {
// ee.revision_type = DEL
removed.addWhereWithNamedParam( revisionTypePropName, "=", DEL_REVISION_TYPE_PARAMETER );
// e.revision_type = DEL
removed.addWhereWithNamedParam(
REFERENCED_ENTITY_ALIAS + "." + revisionTypePropName,
false,
"=",
DEL_REVISION_TYPE_PARAMETER
);
// f.revision_type = DEL
removed.addWhereWithNamedParam(
INDEX_ENTITY_ALIAS + "." + revisionTypePropName,
false,
"=",
DEL_REVISION_TYPE_PARAMETER
);
}
if ( auditStrategy instanceof SpecialRevisionRestrictionProvider ) {
( (SpecialRevisionRestrictionProvider) auditStrategy ).setRevisionRestrictionParameter(
REFERENCED_ENTITY_ALIAS,
valid
);
( (SpecialRevisionRestrictionProvider) auditStrategy ).setRevisionRestrictionParameter(
INDEX_ENTITY_ALIAS,
valid
);
}
}

@Override
Expand Down
Loading

0 comments on commit 0e55f75

Please sign in to comment.