/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.jta.narayana;
import java.util.List;
import com.arjuna.ats.arjuna.common.CoordinatorEnvironmentBean;
import com.arjuna.ats.arjuna.common.CoreEnvironmentBean;
import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
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.springframework.beans.factory.InitializingBean;
/**
* Bean that configures Narayana transaction manager.
*
* @author Gytis Trikleris
* @since 1.4.0
*/
public class NarayanaConfigurationBean implements InitializingBean {
private static final String JBOSSTS_PROPERTIES_FILE_NAME = "jbossts-properties.xml";
private final NarayanaProperties properties;
public NarayanaConfigurationBean(NarayanaProperties narayanaProperties) {
this.properties = narayanaProperties;
}
@Override
public void afterPropertiesSet() throws Exception {
if (isPropertiesFileAvailable()) {
return;
}
setNodeIdentifier(this.properties.getTransactionManagerId());
setObjectStoreDir(this.properties.getLogDir());
setCommitOnePhase(this.properties.isOnePhaseCommit());
setDefaultTimeout(this.properties.getDefaultTimeout());
setPeriodicRecoveryPeriod(this.properties.getPeriodicRecoveryPeriod());
setRecoveryBackoffPeriod(this.properties.getRecoveryBackoffPeriod());
setXaResourceOrphanFilters(this.properties.getXaResourceOrphanFilters());
setRecoveryModules(this.properties.getRecoveryModules());
setExpiryScanners(this.properties.getExpiryScanners());
}
private boolean isPropertiesFileAvailable() {
return Thread.currentThread().getContextClassLoader()
.getResource(JBOSSTS_PROPERTIES_FILE_NAME) != null;
}
private void setNodeIdentifier(String nodeIdentifier)
throws CoreEnvironmentBeanException {
getPopulator(CoreEnvironmentBean.class).setNodeIdentifier(nodeIdentifier);
}
private void setObjectStoreDir(String 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) {
getPopulator(CoordinatorEnvironmentBean.class)
.setCommitOnePhase(isCommitOnePhase);
}
private void setDefaultTimeout(int defaultTimeout) {
getPopulator(CoordinatorEnvironmentBean.class).setDefaultTimeout(defaultTimeout);
}
private void setPeriodicRecoveryPeriod(int periodicRecoveryPeriod) {
getPopulator(RecoveryEnvironmentBean.class)
.setPeriodicRecoveryPeriod(periodicRecoveryPeriod);
}
private void setRecoveryBackoffPeriod(int recoveryBackoffPeriod) {
getPopulator(RecoveryEnvironmentBean.class)
.setRecoveryBackoffPeriod(recoveryBackoffPeriod);
}
private void setXaResourceOrphanFilters(List<String> xaResourceOrphanFilters) {
getPopulator(JTAEnvironmentBean.class)
.setXaResourceOrphanFilterClassNames(xaResourceOrphanFilters);
}
private void setRecoveryModules(List<String> recoveryModules) {
getPopulator(RecoveryEnvironmentBean.class)
.setRecoveryModuleClassNames(recoveryModules);
}
private void setExpiryScanners(List<String> expiryScanners) {
getPopulator(RecoveryEnvironmentBean.class)
.setExpiryScannerClassNames(expiryScanners);
}
private <T> T getPopulator(Class<T> beanClass) {
return BeanPopulator.getDefaultInstance(beanClass);
}
private <T> T getPopulator(Class<T> beanClass, String name) {
return BeanPopulator.getNamedInstance(beanClass, name);
}
}