Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement per persistence unit configuration for Hibernate Envers #28927

Merged
merged 1 commit into from
Oct 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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