Skip to content

Commit f0823a2

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

File tree

4 files changed

+135
-7
lines changed

4 files changed

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

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.hibernate.boot.registry.StandardServiceInitiator;
1010
import org.hibernate.boot.registry.selector.spi.StrategySelector;
1111
import org.hibernate.cfg.AvailableSettings;
12+
import org.hibernate.cfg.TransactionSettings;
1213
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatformResolver;
1314
import org.hibernate.service.spi.ServiceRegistryImplementor;
1415

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

2526
@Override
2627
public JtaPlatformResolver initiateService(Map<String, Object> configurationValues, ServiceRegistryImplementor registry) {
27-
final Object setting = configurationValues.get( AvailableSettings.JTA_PLATFORM_RESOLVER );
28-
final JtaPlatformResolver resolver =
28+
final Object setting = configurationValues.get( TransactionSettings.JTA_PLATFORM_RESOLVER );
29+
final var resolver =
2930
registry.requireService( StrategySelector.class )
3031
.resolveStrategy( JtaPlatformResolver.class, setting );
3132
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);

0 commit comments

Comments
 (0)