Skip to content

Commit 722f8c1

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

File tree

4 files changed

+132
-7
lines changed

4 files changed

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

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)