Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import com.arjuna.ats.internal.jdbc.drivers.modifiers.SupportsMultipleConnectionsModifier;
import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
import com.arjuna.ats.jta.recovery.XAResourceRecoveryHelper;
import dev.snowdrop.boot.narayana.core.properties.RecoveryCredentialsProperties;
import dev.snowdrop.boot.narayana.core.properties.RecoveryProperties;
import dev.snowdrop.boot.narayana.core.properties.TransactionalDriverProperties;
import org.springframework.boot.jdbc.DatabaseDriver;
import org.springframework.boot.jdbc.XADataSourceWrapper;
Expand All @@ -44,15 +44,15 @@ public class GenericXADataSourceWrapper implements XADataSourceWrapper {

private final XARecoveryModule xaRecoveryModule;
private final TransactionalDriverProperties transactionalDriverProperties;
private final RecoveryCredentialsProperties recoveryCredentials;
private final RecoveryProperties recoveryCredentials;

/**
* Create a new {@link GenericXADataSourceWrapper} instance.
*
* @param xaRecoveryModule recovery module to register data source with.
*/
public GenericXADataSourceWrapper(XARecoveryModule xaRecoveryModule) {
this(xaRecoveryModule, RecoveryCredentialsProperties.DEFAULT);
this(xaRecoveryModule, RecoveryProperties.DEFAULT);
}

/**
Expand All @@ -61,7 +61,7 @@ public GenericXADataSourceWrapper(XARecoveryModule xaRecoveryModule) {
* @param xaRecoveryModule recovery module to register data source with.
* @param recoveryCredentials credentials for recovery helper
*/
public GenericXADataSourceWrapper(XARecoveryModule xaRecoveryModule, RecoveryCredentialsProperties recoveryCredentials) {
public GenericXADataSourceWrapper(XARecoveryModule xaRecoveryModule, RecoveryProperties recoveryCredentials) {
this(xaRecoveryModule, new TransactionalDriverProperties(), recoveryCredentials);
}

Expand All @@ -72,7 +72,7 @@ public GenericXADataSourceWrapper(XARecoveryModule xaRecoveryModule, RecoveryCre
* @param transactionalDriverProperties Transactional driver properties
*/
public GenericXADataSourceWrapper(XARecoveryModule xaRecoveryModule, TransactionalDriverProperties transactionalDriverProperties) {
this(xaRecoveryModule, transactionalDriverProperties, RecoveryCredentialsProperties.DEFAULT);
this(xaRecoveryModule, transactionalDriverProperties, RecoveryProperties.DEFAULT);
}

/**
Expand All @@ -83,7 +83,7 @@ public GenericXADataSourceWrapper(XARecoveryModule xaRecoveryModule, Transaction
* @param recoveryCredentials credentials for recovery helper
*/
public GenericXADataSourceWrapper(XARecoveryModule xaRecoveryModule, TransactionalDriverProperties transactionalDriverProperties,
RecoveryCredentialsProperties recoveryCredentials) {
RecoveryProperties recoveryCredentials) {
this.xaRecoveryModule = xaRecoveryModule;
this.transactionalDriverProperties = transactionalDriverProperties;
this.recoveryCredentials = recoveryCredentials;
Expand All @@ -98,8 +98,10 @@ public GenericXADataSourceWrapper(XARecoveryModule xaRecoveryModule, Transaction
*/
@Override
public DataSource wrapDataSource(XADataSource dataSource) throws Exception {
XAResourceRecoveryHelper recoveryHelper = getRecoveryHelper(dataSource);
this.xaRecoveryModule.addXAResourceRecoveryHelper(recoveryHelper);
if (this.recoveryCredentials.isEnabled()) {
XAResourceRecoveryHelper recoveryHelper = getRecoveryHelper(dataSource);
this.xaRecoveryModule.addXAResourceRecoveryHelper(recoveryHelper);
}
registerModifier(dataSource);
return new NarayanaDataSource(dataSource, this.transactionalDriverProperties);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
import com.arjuna.ats.jta.recovery.XAResourceRecoveryHelper;
import dev.snowdrop.boot.narayana.core.properties.RecoveryCredentialsProperties;
import dev.snowdrop.boot.narayana.core.properties.RecoveryProperties;
import org.jboss.narayana.jta.jms.ConnectionFactoryProxy;
import org.jboss.narayana.jta.jms.JmsXAResourceRecoveryHelper;
import org.springframework.boot.jms.XAConnectionFactoryWrapper;
Expand All @@ -35,9 +35,9 @@
public abstract class AbstractXAConnectionFactoryWrapper implements XAConnectionFactoryWrapper {

private final XARecoveryModule xaRecoveryModule;
private final RecoveryCredentialsProperties recoveryCredentials;
private final RecoveryProperties recoveryCredentials;

protected AbstractXAConnectionFactoryWrapper(XARecoveryModule xaRecoveryModule, RecoveryCredentialsProperties recoveryCredentials) {
protected AbstractXAConnectionFactoryWrapper(XARecoveryModule xaRecoveryModule, RecoveryProperties recoveryCredentials) {
this.xaRecoveryModule = xaRecoveryModule;
this.recoveryCredentials = recoveryCredentials;
}
Expand All @@ -46,12 +46,14 @@ protected AbstractXAConnectionFactoryWrapper(XARecoveryModule xaRecoveryModule,

@Override
public ConnectionFactory wrapConnectionFactory(XAConnectionFactory xaConnectionFactory) throws Exception {
XAResourceRecoveryHelper recoveryHelper = getRecoveryHelper(xaConnectionFactory, this.recoveryCredentials);
this.xaRecoveryModule.addXAResourceRecoveryHelper(recoveryHelper);
if (this.recoveryCredentials.isEnabled()) {
XAResourceRecoveryHelper recoveryHelper = getRecoveryHelper(xaConnectionFactory, this.recoveryCredentials);
this.xaRecoveryModule.addXAResourceRecoveryHelper(recoveryHelper);
}
return wrapConnectionFactoryInternal(xaConnectionFactory);
}

protected XAResourceRecoveryHelper getRecoveryHelper(XAConnectionFactory xaConnectionFactory, RecoveryCredentialsProperties recoveryCredentials) {
protected XAResourceRecoveryHelper getRecoveryHelper(XAConnectionFactory xaConnectionFactory, RecoveryProperties recoveryCredentials) {
if (recoveryCredentials.isValid()) {
return new JmsXAResourceRecoveryHelper(xaConnectionFactory, recoveryCredentials.getUser(),
recoveryCredentials.getPassword());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import jakarta.transaction.TransactionManager;

import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
import dev.snowdrop.boot.narayana.core.properties.RecoveryCredentialsProperties;
import dev.snowdrop.boot.narayana.core.properties.RecoveryProperties;
import org.jboss.narayana.jta.jms.ConnectionFactoryProxy;
import org.jboss.narayana.jta.jms.TransactionHelperImpl;

Expand All @@ -36,7 +36,7 @@ public class GenericXAConnectionFactoryWrapper extends AbstractXAConnectionFacto
* @param xaRecoveryModule recovery module to register data source with.
*/
public GenericXAConnectionFactoryWrapper(TransactionManager transactionManager, XARecoveryModule xaRecoveryModule) {
this(transactionManager, xaRecoveryModule, RecoveryCredentialsProperties.DEFAULT);
this(transactionManager, xaRecoveryModule, RecoveryProperties.DEFAULT);
}

/**
Expand All @@ -47,7 +47,7 @@ public GenericXAConnectionFactoryWrapper(TransactionManager transactionManager,
* @param recoveryCredentials Credentials for recovery helper
*/
public GenericXAConnectionFactoryWrapper(TransactionManager transactionManager, XARecoveryModule xaRecoveryModule,
RecoveryCredentialsProperties recoveryCredentials) {
RecoveryProperties recoveryCredentials) {
super(xaRecoveryModule, recoveryCredentials);
this.transactionManager = transactionManager;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import dev.snowdrop.boot.narayana.core.jms.pool.JmsPoolNarayanaConnectionFactory;
import dev.snowdrop.boot.narayana.core.jms.pool.NamedJmsXAResourceRecoveryHelper;
import dev.snowdrop.boot.narayana.core.properties.MessagingHubConnectionFactoryProperties;
import dev.snowdrop.boot.narayana.core.properties.RecoveryCredentialsProperties;
import dev.snowdrop.boot.narayana.core.properties.RecoveryProperties;

public class PooledXAConnectionFactoryWrapper extends AbstractXAConnectionFactoryWrapper {

Expand All @@ -41,7 +41,7 @@ public class PooledXAConnectionFactoryWrapper extends AbstractXAConnectionFactor
*/
public PooledXAConnectionFactoryWrapper(TransactionManager transactionManager, XARecoveryModule xaRecoveryModule,
MessagingHubConnectionFactoryProperties properties) {
this(transactionManager, xaRecoveryModule, properties, RecoveryCredentialsProperties.DEFAULT);
this(transactionManager, xaRecoveryModule, properties, RecoveryProperties.DEFAULT);
}

/**
Expand All @@ -53,7 +53,7 @@ public PooledXAConnectionFactoryWrapper(TransactionManager transactionManager, X
* @param recoveryCredentials Credentials for recovery helper
*/
public PooledXAConnectionFactoryWrapper(TransactionManager transactionManager, XARecoveryModule xaRecoveryModule,
MessagingHubConnectionFactoryProperties properties, RecoveryCredentialsProperties recoveryCredentials) {
MessagingHubConnectionFactoryProperties properties, RecoveryProperties recoveryCredentials) {
super(xaRecoveryModule, recoveryCredentials);
this.properties = properties;
this.transactionManager = transactionManager;
Expand Down Expand Up @@ -82,7 +82,7 @@ protected ConnectionFactory wrapConnectionFactoryInternal(XAConnectionFactory xa
}

@Override
protected XAResourceRecoveryHelper getRecoveryHelper(XAConnectionFactory xaConnectionFactory, RecoveryCredentialsProperties recoveryCredentials) {
protected XAResourceRecoveryHelper getRecoveryHelper(XAConnectionFactory xaConnectionFactory, RecoveryProperties recoveryCredentials) {
if (recoveryCredentials.isValid()) {
return new NamedJmsXAResourceRecoveryHelper(xaConnectionFactory, recoveryCredentials.getUser(),
recoveryCredentials.getPassword(), this.properties.getName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,14 @@ public class NarayanaProperties {
private int expiryScanInterval = 12;

/**
* Database credentials to be used by recovery manager.
* Database recovery properties to be used by recovery manager.
*/
private RecoveryCredentialsProperties recoveryDbCredentials = new RecoveryCredentialsProperties();
private RecoveryProperties dbRecoveryProperties = new RecoveryProperties();

/**
* JMS credentials to be used by recovery manager.
* JMS recovery properties to be used by recovery manager.
*/
private RecoveryCredentialsProperties recoveryJmsCredentials = new RecoveryCredentialsProperties();
private RecoveryProperties jmsRecoveryProperties = new RecoveryProperties();

/**
* Comma-separated list of orphan filters.
Expand Down Expand Up @@ -253,20 +253,40 @@ public void setExpiryScanners(List<String> expiryScanners) {
this.expiryScanners = expiryScanners;
}

public RecoveryCredentialsProperties getRecoveryDbCredentials() {
return this.recoveryDbCredentials;
@Deprecated(forRemoval = true)
public RecoveryProperties getRecoveryDbCredentials() {
return this.dbRecoveryProperties;
}

public void setRecoveryDbCredentials(RecoveryCredentialsProperties recoveryDbCredentials) {
this.recoveryDbCredentials = recoveryDbCredentials;
@Deprecated(forRemoval = true)
public void setRecoveryDbCredentials(RecoveryProperties dbRecoveryProperties) {
this.dbRecoveryProperties = dbRecoveryProperties;
}

public RecoveryCredentialsProperties getRecoveryJmsCredentials() {
return this.recoveryJmsCredentials;
@Deprecated(forRemoval = true)
public RecoveryProperties getRecoveryJmsCredentials() {
return this.jmsRecoveryProperties;
}

public void setRecoveryJmsCredentials(RecoveryCredentialsProperties recoveryJmsCredentials) {
this.recoveryJmsCredentials = recoveryJmsCredentials;
@Deprecated(forRemoval = true)
public void setRecoveryJmsCredentials(RecoveryProperties jmsRecoveryProperties) {
this.jmsRecoveryProperties = jmsRecoveryProperties;
}

public RecoveryProperties getDbRecoveryProperties() {
return this.dbRecoveryProperties;
}

public void setDbRecoveryProperties(RecoveryProperties dbRecoveryProperties) {
this.dbRecoveryProperties = dbRecoveryProperties;
}

public RecoveryProperties getJmsRecoveryProperties() {
return this.jmsRecoveryProperties;
}

public void setJmsRecoveryProperties(RecoveryProperties jmsRecoveryProperties) {
this.jmsRecoveryProperties = jmsRecoveryProperties;
}

public TransactionalDriverProperties getTransactionalDriver() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,31 @@

package dev.snowdrop.boot.narayana.core.properties;

public class RecoveryCredentialsProperties {
public class RecoveryProperties {

/**
* default instance for convenience.
*/
public static final RecoveryCredentialsProperties DEFAULT;
public static final RecoveryProperties DEFAULT;

private boolean enabled;
private String user;
private String password;

static {
DEFAULT = new RecoveryCredentialsProperties();
DEFAULT = new RecoveryProperties();
}

public RecoveryCredentialsProperties() {
public RecoveryProperties() {
this(true);
}

public RecoveryCredentialsProperties(String user, String password) {
public RecoveryProperties(boolean enabled) {
this.enabled = enabled;
}

public RecoveryProperties(String user, String password) {
this(true);
this.user = user;
this.password = password;
}
Expand All @@ -42,6 +49,14 @@ public boolean isValid() {
return !(this.user == null && this.password == null);
}

public boolean isEnabled() {
return this.enabled;
}

public void setEnabled(boolean enabled) {
this.enabled = enabled;
}

public String getUser() {
return this.user;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import javax.sql.XADataSource;

import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
import dev.snowdrop.boot.narayana.core.properties.RecoveryCredentialsProperties;
import dev.snowdrop.boot.narayana.core.properties.RecoveryProperties;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand All @@ -35,6 +35,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

/**
Expand All @@ -61,7 +62,7 @@ class GenericXADataSourceWrapperTests {
private XARecoveryModule mockXaRecoveryModule;

@Mock
private RecoveryCredentialsProperties mockRecoveryCredentialsProperties;
private RecoveryProperties mockRecoveryProperties;

private GenericXADataSourceWrapper wrapper;

Expand All @@ -71,27 +72,38 @@ void before() throws SQLException {
given(this.mockXaConnection.getConnection()).willReturn(this.mockConnection);
given(this.mockConnection.getMetaData()).willReturn(this.mockDatabaseMetaData);
given(this.mockDatabaseMetaData.getDatabaseProductName()).willReturn("");
this.wrapper = new GenericXADataSourceWrapper(this.mockXaRecoveryModule, this.mockRecoveryCredentialsProperties);
given(this.mockRecoveryProperties.isEnabled()).willReturn(true);
this.wrapper = new GenericXADataSourceWrapper(this.mockXaRecoveryModule, this.mockRecoveryProperties);
}

@Test
void wrap() throws Exception {
given(this.mockRecoveryCredentialsProperties.isValid()).willReturn(false);
given(this.mockRecoveryProperties.isValid()).willReturn(false);
DataSource wrapped = this.wrapper.wrapDataSource(this.mockXaDataSource);
assertThat(wrapped).isInstanceOf(NarayanaDataSource.class);
verify(this.mockRecoveryProperties).isValid();
verify(this.mockXaRecoveryModule).addXAResourceRecoveryHelper(any(DataSourceXAResourceRecoveryHelper.class));
verify(this.mockRecoveryCredentialsProperties).isValid();
}

@Test
void wrapWithCredentials() throws Exception {
given(this.mockRecoveryCredentialsProperties.isValid()).willReturn(true);
given(this.mockRecoveryCredentialsProperties.getUser()).willReturn("userName");
given(this.mockRecoveryCredentialsProperties.getPassword()).willReturn("password");
given(this.mockRecoveryProperties.isValid()).willReturn(true);
given(this.mockRecoveryProperties.getUser()).willReturn("userName");
given(this.mockRecoveryProperties.getPassword()).willReturn("password");
DataSource wrapped = this.wrapper.wrapDataSource(this.mockXaDataSource);
assertThat(wrapped).isInstanceOf(NarayanaDataSource.class);
verify(this.mockRecoveryProperties).isValid();
verify(this.mockRecoveryProperties).getUser();
verify(this.mockRecoveryProperties).getPassword();
verify(this.mockXaRecoveryModule).addXAResourceRecoveryHelper(any(DataSourceXAResourceRecoveryHelper.class));
verify(this.mockRecoveryCredentialsProperties).getUser();
verify(this.mockRecoveryCredentialsProperties).getPassword();
}

@Test
void wrapWithRecoveryDisabled() throws Exception {
given(this.mockRecoveryProperties.isEnabled()).willReturn(false);
DataSource wrapped = this.wrapper.wrapDataSource(this.mockXaDataSource);
assertThat(wrapped).isInstanceOf(NarayanaDataSource.class);
verify(this.mockXaRecoveryModule, times(0)).addXAResourceRecoveryHelper(any(DataSourceXAResourceRecoveryHelper.class));
verify(this.mockRecoveryProperties, times(0)).isValid();
}
}
Loading