Skip to content

Commit 41616b6

Browse files
committed
add an experimental JakartaStandardJtaPlatform
1 parent 8ca24d9 commit 41616b6

File tree

5 files changed

+140
-9
lines changed

5 files changed

+140
-9
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.engine.transaction.jta.platform.internal;
6+
7+
import jakarta.transaction.HeuristicMixedException;
8+
import jakarta.transaction.HeuristicRollbackException;
9+
import jakarta.transaction.NotSupportedException;
10+
import jakarta.transaction.RollbackException;
11+
import jakarta.transaction.SystemException;
12+
import jakarta.transaction.Transaction;
13+
import jakarta.transaction.TransactionManager;
14+
import jakarta.transaction.TransactionSynchronizationRegistry;
15+
import jakarta.transaction.UserTransaction;
16+
import org.hibernate.Incubating;
17+
18+
import javax.transaction.xa.XAResource;
19+
20+
/**
21+
* A {@link org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform}
22+
* that in principle is supposed to work in any Jakarta EE container. This
23+
* implementation is crippled by the fact that it is unable to suspend and
24+
* resume transactions.
25+
* @since 4.0
26+
* @author Gavin King
27+
*/
28+
@Incubating
29+
public class JakartaStandardJtaPlatform extends AbstractJtaPlatform
30+
implements TransactionManager, Transaction {
31+
32+
public static final JakartaStandardJtaPlatform INSTANCE = new JakartaStandardJtaPlatform();
33+
public static final String USER_TRANSACTION = "java:comp/UserTransaction";
34+
public static final String TRANSACTION_SYNCHRONIZATION_REGISTRY =
35+
"java:comp/TransactionSynchronizationRegistry";
36+
37+
@Override
38+
protected TransactionManager locateTransactionManager() {
39+
return this;
40+
}
41+
42+
@Override
43+
protected UserTransaction locateUserTransaction() {
44+
return (UserTransaction) jndiService().locate( USER_TRANSACTION );
45+
}
46+
47+
@Override
48+
protected JtaSynchronizationStrategy getSynchronizationStrategy() {
49+
return new SynchronizationRegistryBasedSynchronizationStrategy(
50+
this::getTransactionSynchronizationRegistry );
51+
}
52+
53+
private TransactionSynchronizationRegistry getTransactionSynchronizationRegistry() {
54+
return (TransactionSynchronizationRegistry)
55+
jndiService().locate( TRANSACTION_SYNCHRONIZATION_REGISTRY );
56+
}
57+
58+
@Override
59+
public void begin() throws NotSupportedException, SystemException {
60+
locateUserTransaction().begin();
61+
}
62+
63+
@Override
64+
public void commit()
65+
throws RollbackException, HeuristicMixedException, HeuristicRollbackException,
66+
SecurityException, IllegalStateException, SystemException {
67+
locateUserTransaction().commit();
68+
}
69+
70+
@Override
71+
public void rollback() throws IllegalStateException, SecurityException, SystemException {
72+
locateUserTransaction().rollback();
73+
}
74+
75+
@Override
76+
public void setRollbackOnly() throws IllegalStateException, SystemException {
77+
locateUserTransaction().setRollbackOnly();
78+
}
79+
80+
@Override
81+
public int getStatus() throws SystemException {
82+
return locateUserTransaction().getStatus();
83+
}
84+
85+
@Override
86+
public Transaction getTransaction() throws SystemException {
87+
return this;
88+
}
89+
90+
@Override
91+
public void setTransactionTimeout(int seconds) throws SystemException {
92+
locateUserTransaction().setTransactionTimeout( seconds );
93+
}
94+
95+
@Override
96+
public boolean delistResource(XAResource xaRes, int flag) {
97+
throw new UnsupportedOperationException( "JakartaStandardJtaPlatform does not have access to the TransactionManager" );
98+
}
99+
100+
@Override
101+
public boolean enlistResource(XAResource xaRes) {
102+
throw new UnsupportedOperationException( "JakartaStandardJtaPlatform does not have access to the TransactionManager" );
103+
}
104+
105+
@Override
106+
public Transaction suspend() throws SystemException {
107+
throw new UnsupportedOperationException( "JakartaStandardJtaPlatform does not have access to the TransactionManager" );
108+
}
109+
110+
@Override
111+
public void resume(Transaction tobj) {
112+
throw new UnsupportedOperationException( "JakartaStandardJtaPlatform does not have access to the TransactionManager" );
113+
}
114+
115+
}

hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/JtaPlatformResolverInitiator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import org.hibernate.boot.registry.StandardServiceInitiator;
1010
import org.hibernate.boot.registry.selector.spi.StrategySelector;
11-
import org.hibernate.cfg.AvailableSettings;
11+
import org.hibernate.cfg.TransactionSettings;
1212
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatformResolver;
1313
import org.hibernate.service.spi.ServiceRegistryImplementor;
1414

@@ -24,8 +24,8 @@ public class JtaPlatformResolverInitiator implements StandardServiceInitiator<Jt
2424

2525
@Override
2626
public JtaPlatformResolver initiateService(Map<String, Object> configurationValues, ServiceRegistryImplementor registry) {
27-
final Object setting = configurationValues.get( AvailableSettings.JTA_PLATFORM_RESOLVER );
28-
final JtaPlatformResolver resolver =
27+
final Object setting = configurationValues.get( TransactionSettings.JTA_PLATFORM_RESOLVER );
28+
final var resolver =
2929
registry.requireService( StrategySelector.class )
3030
.resolveStrategy( JtaPlatformResolver.class, setting );
3131
if ( resolver == null ) {

hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/StandardJtaPlatformResolver.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515

1616
import org.jboss.logging.Logger;
1717

18+
import javax.naming.InitialContext;
19+
import javax.naming.NamingException;
20+
21+
import static org.hibernate.engine.transaction.jta.platform.internal.JakartaStandardJtaPlatform.TRANSACTION_SYNCHRONIZATION_REGISTRY;
22+
1823
/**
1924
* @author Steve Ebersole
2025
*/
@@ -25,11 +30,11 @@ public class StandardJtaPlatformResolver implements JtaPlatformResolver {
2530

2631
@Override
2732
public JtaPlatform resolveJtaPlatform(Map<?,?> configurationValues, ServiceRegistryImplementor registry) {
28-
final ClassLoaderService classLoaderService = registry.requireService( ClassLoaderService.class );
33+
final var classLoaderService = registry.requireService( ClassLoaderService.class );
2934

3035
// Initially look for a JtaPlatformProvider
31-
for ( JtaPlatformProvider provider : classLoaderService.loadJavaServices( JtaPlatformProvider.class ) ) {
32-
final JtaPlatform providedPlatform = provider.getProvidedJtaPlatform();
36+
for ( var provider : classLoaderService.loadJavaServices( JtaPlatformProvider.class ) ) {
37+
final var providedPlatform = provider.getProvidedJtaPlatform();
3338
LOG.tracef( "Located JtaPlatformProvider [%s] provided JtaPlatform : %s", provider, providedPlatform );
3439
if ( providedPlatform!= null ) {
3540
return providedPlatform;
@@ -87,8 +92,18 @@ public JtaPlatform resolveJtaPlatform(Map<?,?> configurationValues, ServiceRegis
8792
catch (ClassLoadingException ignore) {
8893
}
8994

95+
// Fallback for EE environment
96+
try {
97+
new InitialContext().lookup( TRANSACTION_SYNCHRONIZATION_REGISTRY );
98+
LOG.tracef( "Could not determine JtaPlatform, using default [%s]", JakartaStandardJtaPlatform.class.getName() );
99+
return JakartaStandardJtaPlatform.INSTANCE;
100+
}
101+
catch (NamingException ne) {
102+
//ignore
103+
}
104+
90105
// Finally, return the default...
91-
LOG.tracef( "Could not resolve JtaPlatform, using default [%s]", NoJtaPlatform.class.getName() );
106+
LOG.tracef( "Could not determine JtaPlatform, using default [%s]", NoJtaPlatform.class.getName() );
92107
return NoJtaPlatform.INSTANCE;
93108
}
94109
}

hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/WebSphereLibertyJtaPlatform.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ public int getCurrentStatus() throws SystemException {
6363
@Override
6464
public void registerSynchronization(Synchronization synchronization) {
6565
try {
66-
NullnessUtil.castNonNull( retrieveTransactionManager() ).getTransaction().registerSynchronization(synchronization);
66+
NullnessUtil.castNonNull( retrieveTransactionManager() ).getTransaction()
67+
.registerSynchronization(synchronization);
6768
}
6869
catch ( RollbackException | SystemException x ) {
6970
throw new RuntimeException(x);

hibernate-core/src/test/java/org/hibernate/orm/test/inheritance/SingleTableAbstractDiscriminatorTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void testNonCompliantModel(ServiceRegistryScope registryScope) {
4040
//
4141
// > The DiscriminatorValue annotation can only be specified on a concrete entity class.
4242
//
43-
// we do not validate this though
43+
// we do not validate this though
4444
var model = new MetadataSources( registryScope.getRegistry() )
4545
.addAnnotatedClasses( Root.class, Trunk.class, Branch.class )
4646
.buildMetadata();

0 commit comments

Comments
 (0)