diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/transaction/jta/NarayanaJtaConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/transaction/jta/NarayanaJtaConfiguration.java index ac243d57f1..8fbdc180f6 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/transaction/jta/NarayanaJtaConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/transaction/jta/NarayanaJtaConfiguration.java @@ -16,12 +16,15 @@ package org.springframework.boot.autoconfigure.transaction.jta; +import java.io.File; + import javax.jms.Message; import javax.transaction.TransactionManager; import javax.transaction.UserTransaction; import com.arjuna.ats.jbossatx.jta.RecoveryManagerService; +import org.springframework.boot.ApplicationHome; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.jta.XAConnectionFactoryWrapper; @@ -37,6 +40,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.jta.JtaTransactionManager; +import org.springframework.util.StringUtils; /** * JTA Configuration for Narayana. @@ -66,9 +70,7 @@ public class NarayanaJtaConfiguration { @ConditionalOnMissingBean public NarayanaConfigurationBean narayanaConfiguration( NarayanaProperties properties) { - if (this.jtaProperties.getLogDir() != null) { - properties.setLogDir(this.jtaProperties.getLogDir()); - } + properties.setLogDir(getLogDir().getAbsolutePath()); if (this.jtaProperties.getTransactionManagerId() != null) { properties.setTransactionManagerId( this.jtaProperties.getTransactionManagerId()); @@ -76,6 +78,14 @@ public class NarayanaJtaConfiguration { return new NarayanaConfigurationBean(properties); } + private File getLogDir() { + if (StringUtils.hasLength(this.jtaProperties.getLogDir())) { + return new File(this.jtaProperties.getLogDir()); + } + File home = new ApplicationHome().getDir(); + return new File(home, "transaction-logs"); + } + @Bean @DependsOn("narayanaConfiguration") @ConditionalOnMissingBean diff --git a/spring-boot/src/main/java/org/springframework/boot/jta/narayana/NarayanaConfigurationBean.java b/spring-boot/src/main/java/org/springframework/boot/jta/narayana/NarayanaConfigurationBean.java index 08094c375c..05ff13c59e 100644 --- a/spring-boot/src/main/java/org/springframework/boot/jta/narayana/NarayanaConfigurationBean.java +++ b/spring-boot/src/main/java/org/springframework/boot/jta/narayana/NarayanaConfigurationBean.java @@ -71,11 +71,14 @@ public class NarayanaConfigurationBean implements InitializingBean { } private void setObjectStoreDir(String objectStoreDir) { - getPopulator(ObjectStoreEnvironmentBean.class).setObjectStoreDir(objectStoreDir); - getPopulator(ObjectStoreEnvironmentBean.class, "communicationStore") - .setObjectStoreDir(objectStoreDir); - getPopulator(ObjectStoreEnvironmentBean.class, "stateStore") - .setObjectStoreDir(objectStoreDir); + if (objectStoreDir != null) { + getPopulator(ObjectStoreEnvironmentBean.class) + .setObjectStoreDir(objectStoreDir); + getPopulator(ObjectStoreEnvironmentBean.class, "communicationStore") + .setObjectStoreDir(objectStoreDir); + getPopulator(ObjectStoreEnvironmentBean.class, "stateStore") + .setObjectStoreDir(objectStoreDir); + } } private void setCommitOnePhase(boolean isCommitOnePhase) { diff --git a/spring-boot/src/main/java/org/springframework/boot/jta/narayana/NarayanaProperties.java b/spring-boot/src/main/java/org/springframework/boot/jta/narayana/NarayanaProperties.java index 730d4736cb..f0d639ef79 100644 --- a/spring-boot/src/main/java/org/springframework/boot/jta/narayana/NarayanaProperties.java +++ b/spring-boot/src/main/java/org/springframework/boot/jta/narayana/NarayanaProperties.java @@ -37,9 +37,9 @@ public class NarayanaProperties { public static final String PROPERTIES_PREFIX = "spring.jta.narayana"; /** - * Transaction object store directory. Default: target/tx-object-store. + * Transaction object store directory. */ - private String logDir = "target/tx-object-store"; + private String logDir; /** * Unique transaction manager id. Default: 1. diff --git a/spring-boot/src/test/java/org/springframework/boot/jta/narayana/NarayanaConfigurationBeanTests.java b/spring-boot/src/test/java/org/springframework/boot/jta/narayana/NarayanaConfigurationBeanTests.java index a09221f8b5..d639c9faeb 100644 --- a/spring-boot/src/test/java/org/springframework/boot/jta/narayana/NarayanaConfigurationBeanTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/jta/narayana/NarayanaConfigurationBeanTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.jta.narayana; import java.util.Arrays; import java.util.List; +import java.util.Map; import com.arjuna.ats.arjuna.common.CoordinatorEnvironmentBean; import com.arjuna.ats.arjuna.common.CoreEnvironmentBean; @@ -25,8 +26,11 @@ import com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean; import com.arjuna.ats.arjuna.common.RecoveryEnvironmentBean; import com.arjuna.ats.jta.common.JTAEnvironmentBean; import com.arjuna.common.internal.util.propertyservice.BeanPopulator; +import org.junit.After; import org.junit.Test; +import org.springframework.test.util.ReflectionTestUtils; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -36,6 +40,13 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class NarayanaConfigurationBeanTests { + @After + @SuppressWarnings("unchecked") + public void cleanup() { + ((Map) ReflectionTestUtils.getField(BeanPopulator.class, + "beanInstances")).clear(); + } + @Test public void shouldSetDefaultProperties() throws Exception { NarayanaProperties narayanaProperties = new NarayanaProperties(); @@ -46,13 +57,13 @@ public class NarayanaConfigurationBeanTests { assertThat(BeanPopulator.getDefaultInstance(CoreEnvironmentBean.class) .getNodeIdentifier()).isEqualTo("1"); assertThat(BeanPopulator.getDefaultInstance(ObjectStoreEnvironmentBean.class) - .getObjectStoreDir()).isEqualTo("target/tx-object-store"); + .getObjectStoreDir()).endsWith("ObjectStore"); assertThat(BeanPopulator .getNamedInstance(ObjectStoreEnvironmentBean.class, "communicationStore") - .getObjectStoreDir()).isEqualTo("target/tx-object-store"); + .getObjectStoreDir()).endsWith("ObjectStore"); assertThat(BeanPopulator .getNamedInstance(ObjectStoreEnvironmentBean.class, "stateStore") - .getObjectStoreDir()).isEqualTo("target/tx-object-store"); + .getObjectStoreDir()).endsWith("ObjectStore"); assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class) .isCommitOnePhase()).isTrue(); assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class)