Skip to content

Commit

Permalink
Merge pull request wildfly#18439 from scottmarlow/WFLY-20005_Remove_n…
Browse files Browse the repository at this point in the history
…on-breakingUseOfModuleIdentifier_JPA

[WFLY-20005] Persistence/JPA subsystem should remove non-breaking use of ModuleIdentifier
  • Loading branch information
bstansberry authored Dec 15, 2024
2 parents 498d973 + 2bcf75b commit 7fdec39
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@

import jakarta.persistence.spi.PersistenceProvider;

import org.jboss.as.controller.ModuleIdentifierUtil;
import org.jboss.as.jpa.config.Configuration;
import org.jboss.modules.Module;
import org.jboss.modules.ModuleIdentifier;
import org.jboss.modules.ModuleLoadException;
import org.jboss.modules.ModuleLoader;

Expand Down Expand Up @@ -44,8 +44,9 @@ public static void loadDefaultProvider() throws ModuleLoadException {
* Note: side effect of saving loaded persistence providers to static api in jakarta.persistence.spi.PersistenceProvider.
*/
public static List<PersistenceProvider> loadProviderModuleByName(String moduleName) throws ModuleLoadException {
moduleName = ModuleIdentifierUtil.canonicalModuleIdentifier(moduleName);
final ModuleLoader moduleLoader = Module.getBootModuleLoader();
Module module = moduleLoader.loadModule(ModuleIdentifier.fromString(moduleName));
Module module = moduleLoader.loadModule(moduleName);
final ServiceLoader<PersistenceProvider> serviceLoader =
module.loadService(PersistenceProvider.class);
List<PersistenceProvider> result = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.DotName;
import org.jboss.modules.Module;
import org.jboss.modules.ModuleIdentifier;
import org.jboss.modules.ModuleLoader;
import org.jipijapa.plugin.spi.PersistenceUnitMetadata;

Expand All @@ -38,17 +37,6 @@
public class HibernateSearchProcessor implements DeploymentUnitProcessor {

private static final DotName ANNOTATION_INDEXED_NAME = DotName.createSimple("org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed");
private static final ModuleIdentifier MODULE_MAPPER_ORM_DEFAULT =
ModuleIdentifier.fromString(Configuration.HIBERNATE_SEARCH_MODULE_MAPPER_ORM);

private static final ModuleIdentifier MODULE_MAPPER_ORM_OUTBOXPOLLING =
ModuleIdentifier.fromString(Configuration.HIBERNATE_SEARCH_MODULE_MAPPER_ORM_OUTBOXPOLLING);
private static final ModuleIdentifier MODULE_BACKEND_LUCENE =
ModuleIdentifier.fromString(Configuration.HIBERNATE_SEARCH_MODULE_BACKEND_LUCENE);
private static final ModuleIdentifier MODULE_BACKEND_ELASTICSEARCH =
ModuleIdentifier.fromString(Configuration.HIBERNATE_SEARCH_MODULE_BACKEND_ELASTICSEARCH);


private static final String NONE = "none";
private static final String IGNORE = "auto"; // if set to `auto`, will behave like not having set the property

Expand Down Expand Up @@ -93,18 +81,20 @@ else if (!providerModule.equals(searchMapperModuleName)) {

// use Search module name specified in persistence unit definition
if (searchMapperModuleName != null && !IGNORE.equals(searchMapperModuleName)) {
ModuleIdentifier moduleIdentifier = ModuleIdentifier.fromString(searchMapperModuleName);
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, moduleIdentifier, false, true, true, false));
ROOT_LOGGER.debugf("added %s dependency to %s", moduleIdentifier, deploymentUnit.getName());
moduleSpecification.addSystemDependency(ModuleDependency.Builder.of(moduleLoader, searchMapperModuleName).
setOptional(false).setExport(true).setImportServices(true).setUserSpecified(false).build());

ROOT_LOGGER.debugf("added %s dependency to %s", searchMapperModuleName, deploymentUnit.getName());
} else {
// add Hibernate Search module dependency if application is using the Hibernate Search Indexed annotation
final CompositeIndex index = deploymentUnit.getAttachment(org.jboss.as.server.deployment.Attachments.COMPOSITE_ANNOTATION_INDEX);
List<AnnotationInstance> annotations = index.getAnnotations(ANNOTATION_INDEXED_NAME);
if (annotations != null && !annotations.isEmpty()) {
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, MODULE_MAPPER_ORM_DEFAULT,
false, true, true, false));
moduleSpecification.addSystemDependency(
ModuleDependency.Builder.of(moduleLoader, Configuration.HIBERNATE_SEARCH_MODULE_MAPPER_ORM).
setOptional(false).setExport(true).setImportServices(true).setUserSpecified(false).build());
ROOT_LOGGER.debugf("deployment %s contains %s annotation, added %s dependency", deploymentUnit.getName(),
ANNOTATION_INDEXED_NAME, MODULE_MAPPER_ORM_DEFAULT);
ANNOTATION_INDEXED_NAME, Configuration.HIBERNATE_SEARCH_MODULE_MAPPER_ORM);
}
}

Expand All @@ -116,20 +106,23 @@ else if (!providerModule.equals(searchMapperModuleName)) {
List<String> backendTypes = HibernateSearchDeploymentMarker.getBackendTypes(deploymentUnit);
if (backendTypes != null) {
if (backendTypes.contains(Configuration.HIBERNATE_SEARCH_BACKEND_TYPE_VALUE_LUCENE)) {
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, MODULE_BACKEND_LUCENE,
false, true, true, false));
moduleSpecification.addSystemDependency(
ModuleDependency.Builder.of(moduleLoader, Configuration.HIBERNATE_SEARCH_MODULE_BACKEND_LUCENE).
setOptional(false).setExport(true).setImportServices(true).setUserSpecified(false).build());
}
if (backendTypes.contains(Configuration.HIBERNATE_SEARCH_BACKEND_TYPE_VALUE_ELASTICSEARCH)) {
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, MODULE_BACKEND_ELASTICSEARCH,
false, true, true, false));
moduleSpecification.addSystemDependency(
ModuleDependency.Builder.of(moduleLoader, Configuration.HIBERNATE_SEARCH_MODULE_BACKEND_ELASTICSEARCH).
setOptional(false).setExport(true).setImportServices(true).setUserSpecified(false).build());
}
}

List<String> coordinationStrategies = HibernateSearchDeploymentMarker.getCoordinationStrategies(deploymentUnit);
if (coordinationStrategies != null) {
if (coordinationStrategies.contains(Configuration.HIBERNATE_SEARCH_COORDINATION_STRATEGY_VALUE_OUTBOX_POLLING)) {
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, MODULE_MAPPER_ORM_OUTBOXPOLLING,
false, true, true, false));
moduleSpecification.addSystemDependency(
ModuleDependency.Builder.of(moduleLoader, Configuration.HIBERNATE_SEARCH_MODULE_MAPPER_ORM_OUTBOXPOLLING).
setOptional(false).setExport(true).setExport(true).setImportServices(true).setUserSpecified(false).build());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import org.jboss.as.server.deployment.Attachments;
import org.jboss.as.server.deployment.DeploymentPhaseContext;
import org.jboss.as.server.deployment.DeploymentUnit;
import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
import org.jboss.as.server.deployment.DeploymentUtils;
import org.jboss.as.server.deployment.JPADeploymentMarker;
Expand All @@ -33,7 +32,6 @@
import org.jboss.metadata.ear.spec.EarMetaData;
import org.jboss.metadata.ear.spec.ModuleMetaData;
import org.jboss.modules.Module;
import org.jboss.modules.ModuleIdentifier;
import org.jboss.modules.ModuleLoader;
import org.jboss.msc.service.ServiceName;
import org.jipijapa.plugin.spi.PersistenceUnitMetadata;
Expand All @@ -45,48 +43,33 @@
*/
public class JPADependencyProcessor implements DeploymentUnitProcessor {

private static final ModuleIdentifier JAVAX_PERSISTENCE_API_ID = ModuleIdentifier.create("jakarta.persistence.api");
private static final ModuleIdentifier JBOSS_AS_JPA_ID = ModuleIdentifier.create("org.jboss.as.jpa");
private static final ModuleIdentifier JBOSS_AS_JPA_SPI_ID = ModuleIdentifier.create("org.jboss.as.jpa.spi");
private static final String JAR_FILE_EXTENSION = ".jar";
private static final String LIB_FOLDER = "lib";
private static final String JAVAX_PERSISTENCE_API_ID = "jakarta.persistence.api";
private static final String JBOSS_AS_JPA_ID = "org.jboss.as.jpa";
private static final String JBOSS_AS_JPA_SPI_ID = "org.jboss.as.jpa.spi";

/**
* Add dependencies for modules required for Jakarta Persistence deployments
*/
public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
public void deploy(DeploymentPhaseContext phaseContext) {
final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
final ModuleSpecification moduleSpecification = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION);
final ModuleLoader moduleLoader = Module.getBootModuleLoader();

// all applications get the jakarta.persistence module added to their deplyoment by default
addDependency(moduleSpecification, moduleLoader, deploymentUnit, JAVAX_PERSISTENCE_API_ID);
// all applications get the jakarta.persistence SPEC API module added to their deployment by default
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, JAVAX_PERSISTENCE_API_ID, false, false, true, false));
ROOT_LOGGER.debugf("added %s dependency to %s", JAVAX_PERSISTENCE_API_ID, deploymentUnit.getName());

if (!JPADeploymentMarker.isJPADeployment(deploymentUnit)) {
return; // Skip if there are no persistence use in the deployment
}
addDependency(moduleSpecification, moduleLoader, deploymentUnit, JBOSS_AS_JPA_ID, JBOSS_AS_JPA_SPI_ID);
addPersistenceProviderModuleDependencies(phaseContext, moduleSpecification, moduleLoader);
}

private void addDependency(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader,
DeploymentUnit deploymentUnit, ModuleIdentifier... moduleIdentifiers) {
for ( ModuleIdentifier moduleIdentifier : moduleIdentifiers) {
for ( String moduleIdentifier : new String[]{JBOSS_AS_JPA_ID, JBOSS_AS_JPA_SPI_ID}) {
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, moduleIdentifier, false, false, true, false));
ROOT_LOGGER.debugf("added %s dependency to %s", moduleIdentifier, deploymentUnit.getName());
}
addPersistenceProviderModuleDependencies(phaseContext, moduleSpecification, moduleLoader);
}

private void addOptionalDependency(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader,
DeploymentUnit deploymentUnit, ModuleIdentifier... moduleIdentifiers) {
for ( ModuleIdentifier moduleIdentifier : moduleIdentifiers) {
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, moduleIdentifier, true, false, false, false));
ROOT_LOGGER.debugf("added %s dependency to %s", moduleIdentifier, deploymentUnit.getName());
}
}

private void addPersistenceProviderModuleDependencies(DeploymentPhaseContext phaseContext, ModuleSpecification moduleSpecification, ModuleLoader moduleLoader) throws
DeploymentUnitProcessingException {
private void addPersistenceProviderModuleDependencies(DeploymentPhaseContext phaseContext, ModuleSpecification moduleSpecification, ModuleLoader moduleLoader) {

final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();

Expand All @@ -111,7 +94,8 @@ private void addPersistenceProviderModuleDependencies(DeploymentPhaseContext pha

// add persistence provider dependency
for (String dependency : moduleDependencies) {
addDependency(moduleSpecification, moduleLoader, deploymentUnit, ModuleIdentifier.fromString(dependency));
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, dependency, false, false, true, false));
ROOT_LOGGER.debugf("added %s dependency to %s", dependency, deploymentUnit.getName());
}

// add the PU service as a dependency to all EE components in this scope
Expand Down Expand Up @@ -194,12 +178,10 @@ private static void addPUServiceDependencyToComponents(final Collection<Componen
}
}

private int loadPersistenceUnits(final ModuleSpecification moduleSpecification, final ModuleLoader moduleLoader, final DeploymentUnit deploymentUnit, final Set<String> moduleDependencies, final PersistenceUnitMetadataHolder holder) throws
DeploymentUnitProcessingException {
private int loadPersistenceUnits(final ModuleSpecification moduleSpecification, final ModuleLoader moduleLoader, final DeploymentUnit deploymentUnit, final Set<String> moduleDependencies, final PersistenceUnitMetadataHolder holder) {
int defaultProviderCount = 0;
if (holder != null) {
for (PersistenceUnitMetadata pu : holder.getPersistenceUnits()) {
String providerModule = pu.getProperties().getProperty(Configuration.PROVIDER_MODULE);
String adapterModule = pu.getProperties().getProperty(Configuration.ADAPTER_MODULE);
String adapterClass = pu.getProperties().getProperty(Configuration.ADAPTER_CLASS);

Expand Down Expand Up @@ -227,11 +209,13 @@ private int loadPersistenceUnits(final ModuleSpecification moduleSpecification,
// since we don't know (until after PersistenceProviderProcessor runs in a later phase) if the provider
// is packaged with the app or will be accessed as a module, make the module dependency optional (in case it
// doesn't exist).
String providerModuleName = Configuration.getProviderModuleNameFromProviderClassName(pu.getPersistenceProviderClassName());
if (providerModuleName != null) {
addOptionalDependency(moduleSpecification, moduleLoader, deploymentUnit, ModuleIdentifier.fromString(providerModuleName));
ROOT_LOGGER.debugf("%s is configured to use persistence provider '%s', adding an optional dependency on module '%s'",
pu.getPersistenceUnitName(), pu.getPersistenceProviderClassName(), providerModuleName);
String persistenceProviderModule = Configuration.getProviderModuleNameFromProviderClassName(pu.getPersistenceProviderClassName());
if (persistenceProviderModule != null) {
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, persistenceProviderModule, true, false, false, false));
ROOT_LOGGER.debugf("Adding %s dependency to %s. " +
"Persistence Unit %s is configured to use Persistence Provider '%s', adding an optional dependency on Persistence Provider Module '%s'",
persistenceProviderModule, deploymentUnit.getName(),
pu.getPersistenceUnitName(), pu.getPersistenceProviderClassName(), persistenceProviderModule);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@
import jakarta.enterprise.inject.spi.BeanManager;
import jakarta.persistence.spi.PersistenceProvider;

import org.jboss.as.controller.ModuleIdentifierUtil;
import org.jboss.as.jpa.messages.JpaLogger;
import org.jboss.as.jpa.transaction.JtaManagerImpl;
import org.jboss.jandex.Index;
import org.jboss.modules.Module;
import org.jboss.modules.ModuleIdentifier;
import org.jboss.modules.ModuleLoadException;
import org.jboss.modules.ModuleLoader;
import org.jipijapa.plugin.spi.JtaManager;
Expand Down Expand Up @@ -96,7 +96,7 @@ public void markPersistenceUnitAvailable(Object wrapperBeanManagerLifeCycle) {
* @return the persistence provider adaptor for the provider class
* @throws ModuleLoadException
*/
public static PersistenceProviderAdaptor loadPersistenceAdapterModule(final String adapterModule, final Platform platform, JtaManagerImpl manager) throws
public static PersistenceProviderAdaptor loadPersistenceAdapterModule(String adapterModule, final Platform platform, JtaManagerImpl manager) throws
ModuleLoadException {
final ModuleLoader moduleLoader = Module.getBootModuleLoader();

Expand All @@ -105,8 +105,8 @@ public static PersistenceProviderAdaptor loadPersistenceAdapterModule(final Stri
}

PersistenceProviderAdaptor persistenceProviderAdaptor=null;

Module module = moduleLoader.loadModule(ModuleIdentifier.fromString(adapterModule));
adapterModule = ModuleIdentifierUtil.canonicalModuleIdentifier(adapterModule);
Module module = moduleLoader.loadModule(adapterModule);
final ServiceLoader<PersistenceProviderAdaptor> serviceLoader =
module.loadService(PersistenceProviderAdaptor.class);
if (serviceLoader != null) {
Expand Down Expand Up @@ -172,7 +172,7 @@ public static List<PersistenceProviderIntegratorAdaptor> loadPersistenceProvider
final ModuleLoader moduleLoader = Module.getBootModuleLoader();

List<PersistenceProviderIntegratorAdaptor> persistenceProviderAdaptors = new ArrayList<>();

adapterModule = ModuleIdentifierUtil.canonicalModuleIdentifier(adapterModule);
Module module = moduleLoader.loadModule(adapterModule);
final ServiceLoader<PersistenceProviderIntegratorAdaptor> serviceLoader =
module.loadService(PersistenceProviderIntegratorAdaptor.class);
Expand Down

0 comments on commit 7fdec39

Please sign in to comment.