Skip to content

Commit

Permalink
Merge pull request #19618 from gastaldi/multitenancy_fix
Browse files Browse the repository at this point in the history
Activate RequestContext when resolving TenantResolver
  • Loading branch information
gastaldi committed Aug 24, 2021
2 parents 6bae936 + dd99c0e commit 406e8c5
Showing 1 changed file with 23 additions and 4 deletions.
@@ -1,9 +1,12 @@
package io.quarkus.hibernate.orm.runtime.tenant;

import java.lang.annotation.Annotation;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.inject.Default;

import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider;
Expand All @@ -12,14 +15,14 @@

import io.quarkus.arc.Arc;
import io.quarkus.arc.InstanceHandle;
import io.quarkus.arc.ManagedContext;
import io.quarkus.hibernate.orm.PersistenceUnit.PersistenceUnitLiteral;
import io.quarkus.hibernate.orm.runtime.PersistenceUnitUtil;

/**
* Maps from the Quarkus {@link TenantConnectionResolver} to the {@link HibernateMultiTenantConnectionProvider} model.
*
* @author Michael Schnell
*
*/
public final class HibernateMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider {

Expand All @@ -34,7 +37,23 @@ public HibernateMultiTenantConnectionProvider(String persistenceUnitName) {

@Override
protected ConnectionProvider getAnyConnectionProvider() {
String tenantId = tenantResolver(persistenceUnitName).getDefaultTenantId();
InstanceHandle<TenantResolver> tenantResolver = tenantResolver(persistenceUnitName);
String tenantId;
// Activate RequestScope if the TenantResolver is @RequestScoped or @SessionScoped
ManagedContext requestContext = Arc.container().requestContext();
Class<? extends Annotation> tenantScope = tenantResolver.getBean().getScope();
boolean requiresRequestScope = (tenantScope == RequestScoped.class || tenantScope == SessionScoped.class);
boolean forceRequestActivation = (!requestContext.isActive() && requiresRequestScope);
try {
if (forceRequestActivation) {
requestContext.activate();
}
tenantId = tenantResolver.get().getDefaultTenantId();
} finally {
if (forceRequestActivation) {
requestContext.deactivate();
}
}
if (tenantId == null) {
throw new IllegalStateException("Method 'TenantResolver.getDefaultTenantId()' returned a null value. "
+ "This violates the contract of the interface!");
Expand Down Expand Up @@ -88,7 +107,7 @@ private static ConnectionProvider resolveConnectionProvider(String persistenceUn
*
* @return Current tenant resolver.
*/
private static TenantResolver tenantResolver(String persistenceUnitName) {
private static InstanceHandle<TenantResolver> tenantResolver(String persistenceUnitName) {
InstanceHandle<TenantResolver> resolverInstance;
if (PersistenceUnitUtil.isDefaultPersistenceUnit(persistenceUnitName)) {
resolverInstance = Arc.container().instance(TenantResolver.class, Default.Literal.INSTANCE);
Expand All @@ -102,7 +121,7 @@ private static TenantResolver tenantResolver(String persistenceUnitName) {
+ "You need to create an implementation for this interface to allow resolving the current tenant identifier.",
TenantResolver.class.getSimpleName(), persistenceUnitName));
}
return resolverInstance.get();
return resolverInstance;
}

}

0 comments on commit 406e8c5

Please sign in to comment.