Skip to content

Commit

Permalink
Merge pull request quarkusio#28927 from tmihalac/issue_28133
Browse files Browse the repository at this point in the history
Implement per persistence unit configuration for Hibernate Envers
  • Loading branch information
geoand authored Oct 31, 2022
2 parents d4d05b5 + aedee7a commit 529e29e
Show file tree
Hide file tree
Showing 6 changed files with 296 additions and 183 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.hibernate.envers.HibernateEnversBuildTimeConfig;
import io.quarkus.hibernate.envers.HibernateEnversBuildTimeConfigPersistenceUnit;
import io.quarkus.hibernate.envers.HibernateEnversRecorder;
import io.quarkus.hibernate.orm.deployment.AdditionalJpaModelBuildItem;
import io.quarkus.hibernate.orm.deployment.PersistenceUnitDescriptorBuildItem;
Expand Down Expand Up @@ -38,8 +39,10 @@ public void registerEnversReflections(BuildProducer<ReflectiveClassBuildItem> re
reflectiveClass.produce(
new ReflectiveClassBuildItem(false, false, "org.hibernate.tuple.component.DynamicMapComponentTuplizer"));

buildTimeConfig.revisionListener.ifPresent(s -> reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, s)));
buildTimeConfig.auditStrategy.ifPresent(s -> reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, s)));
for (HibernateEnversBuildTimeConfigPersistenceUnit pu : buildTimeConfig.getAllPersistenceUnitConfigsAsMap().values()) {
pu.revisionListener.ifPresent(s -> reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, s)));
pu.auditStrategy.ifPresent(s -> reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, s)));
}
}

@BuildStep
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package io.quarkus.hibernate.orm.envers;

import static org.assertj.core.api.Assertions.assertThat;

import javax.inject.Inject;
import javax.persistence.EntityManagerFactory;

import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.envers.boot.internal.EnversService;
import org.hibernate.envers.configuration.internal.AuditEntitiesConfiguration;
import org.hibernate.internal.SessionFactoryImpl;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.PersistenceUnit;
import io.quarkus.test.QuarkusUnitTest;

public class EnversConfigurationPerPUTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.withApplicationRoot((jar) -> jar
.addClasses(MyAuditedEntity.class))
.withConfigurationResource("application-multiple-pu.properties");

@Inject
EntityManagerFactory emf;

@Inject
@PersistenceUnit("db1")
EntityManagerFactory emf1;

@Inject
@PersistenceUnit("db2")
EntityManagerFactory emf2;

@Test
public void testTableName() {
String generatedTableName = getAuditConfiguration(emf).getAuditTableName("entity", "table");
assertThat(generatedTableName).isEqualTo("P_table");

generatedTableName = getAuditConfiguration(emf1).getAuditTableName("entity", "table");
assertThat(generatedTableName).isEqualTo("T_table");

generatedTableName = getAuditConfiguration(emf2).getAuditTableName("entity", "table");
assertThat(generatedTableName).isEqualTo("R_table");
}

@Test
public void testRevisionFieldName() {
String configuredRevisionFieldName = getAuditConfiguration(emf).getRevisionFieldName();
assertThat(configuredRevisionFieldName).isEqualTo("GEN");

configuredRevisionFieldName = getAuditConfiguration(emf1).getRevisionFieldName();
assertThat(configuredRevisionFieldName).isEqualTo("REVISION");

configuredRevisionFieldName = getAuditConfiguration(emf2).getRevisionFieldName();
assertThat(configuredRevisionFieldName).isEqualTo("REV");
}

@Test
public void testRevisionTypeName() {
String configuredRevisionTypeName = getAuditConfiguration(emf).getRevisionTypePropName();
assertThat(configuredRevisionTypeName).isEqualTo("GEN_TYPE");

configuredRevisionTypeName = getAuditConfiguration(emf1).getRevisionTypePropName();
assertThat(configuredRevisionTypeName).isEqualTo("REV_TYPE");

configuredRevisionTypeName = getAuditConfiguration(emf2).getRevisionTypePropName();
assertThat(configuredRevisionTypeName).isEqualTo("REVTYPE");
}

private AuditEntitiesConfiguration getAuditConfiguration(EntityManagerFactory emf) {
return ((((SessionFactoryImplementor) emf
.unwrap(SessionFactoryImpl.class))
.getServiceRegistry()).getParentServiceRegistry())
.getService(EnversService.class).getAuditEntitiesConfiguration();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
quarkus.datasource.db-kind=h2

#quarkus.hibernate-orm.log.sql=true
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.packages=io.quarkus.hibernate.orm.envers
quarkus.hibernate-envers.audit-table-suffix=
quarkus.hibernate-envers.audit-table-prefix=P_
quarkus.hibernate-envers.revision-field-name=GEN
quarkus.hibernate-envers.revision-type-field-name=GEN_TYPE

quarkus.datasource."db1".db-kind=h2
quarkus.hibernate-orm."db1".database.generation=drop-and-create
quarkus.hibernate-orm."db1".datasource=db1
quarkus.hibernate-orm."db1".packages=io.quarkus.hibernate.orm.envers
quarkus.hibernate-envers."db1".audit-table-suffix=
quarkus.hibernate-envers."db1".audit-table-prefix=T_
quarkus.hibernate-envers."db1".revision-field-name=REVISION
quarkus.hibernate-envers."db1".revision-type-field-name=REV_TYPE

quarkus.datasource."db2".db-kind=h2
quarkus.hibernate-orm."db2".database.generation=drop-and-create
quarkus.hibernate-orm."db2".datasource=db2
quarkus.hibernate-orm."db2".packages=io.quarkus.hibernate.orm.envers
quarkus.hibernate-envers."db2".audit-table-suffix=
quarkus.hibernate-envers."db2".audit-table-prefix=R_
quarkus.hibernate-envers."db2".revision-field-name=REV
quarkus.hibernate-envers."db2".revision-type-field-name=REVTYPE

Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package io.quarkus.hibernate.envers;

import java.util.Map;
import java.util.Optional;
import java.util.TreeMap;

import io.quarkus.hibernate.orm.runtime.PersistenceUnitUtil;
Expand Down Expand Up @@ -50,163 +49,6 @@ public Map<String, HibernateEnversBuildTimeConfigPersistenceUnit> getAllPersiste
return map;
}

/**
* Enable store_data_at_delete feature.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#STORE_DATA_AT_DELETE}.
*/
@ConfigItem(defaultValue = "false")
public boolean storeDataAtDelete;

/**
* Defines a suffix for historical data table. Defaults to {@literal _AUD}.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#AUDIT_TABLE_SUFFIX}.
*/
@ConfigItem(defaultValue = "_AUD")
public Optional<String> auditTableSuffix;

/**
* Defines a prefix for historical data table. Default is the empty string.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#AUDIT_TABLE_PREFIX}.
*/
@ConfigItem(defaultValue = "")
public Optional<String> auditTablePrefix;

/**
* Revision field name. Defaults to {@literal REV}.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#REVISION_FIELD_NAME}.
*/
@ConfigItem(defaultValue = "REV")
public Optional<String> revisionFieldName;

/**
* Revision type field name. Defaults to {@literal REVTYPE}.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#REVISION_TYPE_FIELD_NAME}.
*/
@ConfigItem(defaultValue = "REVTYPE")
public Optional<String> revisionTypeFieldName;

/**
* Enable the revision_on_collection_change feature.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#REVISION_ON_COLLECTION_CHANGE}.
*/
@ConfigItem(defaultValue = "true")
public boolean revisionOnCollectionChange;

/**
* Enable the do_not_audit_optimistic_locking_field feature.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#DO_NOT_AUDIT_OPTIMISTIC_LOCKING_FIELD}.
*/
@ConfigItem(defaultValue = "true")
public boolean doNotAuditOptimisticLockingField;

/**
* Defines the default schema of where audit tables are to be created.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#DEFAULT_SCHEMA}.
*/
@ConfigItem(defaultValue = "")
public Optional<String> defaultSchema;

/**
* Defines the default catalog of where audit tables are to be created.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#DEFAULT_CATALOG}.
*/
@ConfigItem(defaultValue = "")
public Optional<String> defaultCatalog;

/**
* Enables the track_entities_changed_in_revision feature.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#TRACK_ENTITIES_CHANGED_IN_REVISION}.
*/
@ConfigItem(defaultValue = "false")
public boolean trackEntitiesChangedInRevision;

/**
* Enables the use_revision_entity_with_native_id feature.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#USE_REVISION_ENTITY_WITH_NATIVE_ID}.
*/
@ConfigItem(defaultValue = "true")
public boolean useRevisionEntityWithNativeId;

/**
* Enables the global_with_modified_flag feature.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#GLOBAL_WITH_MODIFIED_FLAG}.
*/
@ConfigItem(defaultValue = "false")
public boolean globalWithModifiedFlag;

/**
* Defines the suffix to be used for modified flag columns. Defaults to {@literal _MOD}.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#MODIFIED_FLAG_SUFFIX}
*/
@ConfigItem(defaultValue = "_MOD")
public Optional<String> modifiedFlagSuffix;

/**
* Defines the fully qualified class name of a user defined revision listener.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#REVISION_LISTENER}.
*/
@ConfigItem
public Optional<String> revisionListener;

/**
* Defines the fully qualified class name of the audit strategy to be used.
*
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#AUDIT_STRATEGY}.
*/
@ConfigItem(defaultValue = "org.hibernate.envers.strategy.DefaultAuditStrategy")
public Optional<String> auditStrategy;

/**
* Defines the property name for the audit entity's composite primary key. Defaults to {@literal originalId}.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#ORIGINAL_ID_PROP_NAME}.
*/
@ConfigItem(defaultValue = "originalId")
public Optional<String> originalIdPropName;

/**
* Defines the column name that holds the end revision number in audit entities. Defaults to {@literal REVEND}.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#AUDIT_STRATEGY_VALIDITY_END_REV_FIELD_NAME}.
*/
@ConfigItem(defaultValue = "REVEND")
public Optional<String> auditStrategyValidityEndRevFieldName;

/**
* Enables the audit_strategy_validity_store_revend_timestamp feature.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#AUDIT_STRATEGY_VALIDITY_STORE_REVEND_TIMESTAMP}.
*/
@ConfigItem(defaultValue = "false")
public boolean auditStrategyValidityStoreRevendTimestamp;

/**
* Defines the column name of the revision end timestamp in the audit tables. Defaults to {@literal REVEND_TSTMP}.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#AUDIT_STRATEGY_VALIDITY_REVEND_TIMESTAMP_FIELD_NAME}.
*/
@ConfigItem(defaultValue = "REVEND_TSTMP")
public Optional<String> auditStrategyValidityRevendTimestampFieldName;

/**
* Defines the name of the column used for storing collection ordinal values for embeddable elements.
* Defaults to {@literal SETORDINAL}.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#EMBEDDABLE_SET_ORDINAL_FIELD_NAME}.
*/
@ConfigItem(defaultValue = "SETORDINAL")
public Optional<String> embeddableSetOrdinalFieldName;

/**
* Enables the allow_identifier_reuse feature.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#ALLOW_IDENTIFIER_REUSE}.
*/
@ConfigItem(defaultValue = "false")
public boolean allowIdentifierReuse;

/**
* Defines the naming strategy to be used for modified columns.
* Defaults to {@literal org.hibernate.envers.boot.internal.LegacyModifiedColumnNamingStrategy}.
* Maps to {@link org.hibernate.envers.configuration.EnversSettings#MODIFIED_COLUMN_NAMING_STRATEGY}.
*/
@ConfigItem(defaultValue = "org.hibernate.envers.boot.internal.LegacyModifiedColumnNamingStrategy")
public Optional<String> modifiedColumnNamingStrategy;

public static String extensionPropertyKey(String radical) {
return "quarkus.hibernate-envers." + radical;
}
Expand Down
Loading

0 comments on commit 529e29e

Please sign in to comment.