/*
* Bitronix Transaction Manager
*
* Copyright (c) 2010, Bitronix Software.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package bitronix.tm.resource.common;
import java.io.Serializable;
import java.util.Properties;
/**
* Abstract javabean container for all common properties of a {@link bitronix.tm.resource.common.XAResourceProducer} as configured in the
* resources configuration file.
*
* @author lorban
*/
public abstract class ResourceBean implements Serializable {
private String className;
private String uniqueName;
private boolean automaticEnlistingEnabled = true;
private boolean useTmJoin = true;
private Properties driverProperties = new Properties();
private int maxPoolSize = 0;
private int minPoolSize = 0;
private int maxIdleTime = 60;
private int acquireIncrement = 1;
private int acquisitionTimeout = 30;
private boolean deferConnectionRelease = true;
private int acquisitionInterval = 1;
private boolean allowLocalTransactions = false;
private int twoPcOrderingPosition = 1;
private boolean applyTransactionTimeout = false;
private boolean shareTransactionConnections = false;
private boolean disabled = false;
private boolean ignoreRecoveryFailures = false;
private transient int createdResourcesCounter;
/**
* Initialize all properties with their default values.
*/
protected ResourceBean() {
}
/**
* @return the underlying implementation class name.
*/
public String getClassName() {
return className;
}
/**
* Specify the underlying implementation class name of the XA resource described by this bean.
* @param className the underlying implementation class name.
*/
public void setClassName(String className) {
this.className = className;
}
/**
* @return the resource's unique name.
*/
public String getUniqueName() {
return uniqueName;
}
/**
* Specify the resource unique name to be used to identify this resource during recovery. This name will be
* registered in the transactions journal so once assigned it must never be changed.
* @param uniqueName the resource's unique name.
*/
public void setUniqueName(String uniqueName) {
this.uniqueName = uniqueName;
}
/**
* @return true if the the XA resource wrapper should enlist/delist this resource automatically in global
* transactions.
*/
public boolean getAutomaticEnlistingEnabled() {
return automaticEnlistingEnabled;
}
/**
* Specify if the XA resource wrapper should enlist/delist this resource automatically in global transactions.
* When set to false, you have to enlist resources yourself with {@link javax.transaction.Transaction#enlistResource(javax.transaction.xa.XAResource)} and delist them
* {@link javax.transaction.Transaction#delistResource(javax.transaction.xa.XAResource, int)}.
* @param automaticEnlistingEnabled true if the the XA resource wrapper should enlist/delist this resource automatically in global
* transactions.
*/
public void setAutomaticEnlistingEnabled(boolean automaticEnlistingEnabled) {
this.automaticEnlistingEnabled = automaticEnlistingEnabled;
}
/**
* @return true if transaction branches joining should be used.
*/
public boolean getUseTmJoin() {
return useTmJoin;
}
/**
* Specify if the transaction manager should try to join resources by calling
* {@link javax.transaction.xa.XAResource#start(javax.transaction.xa.Xid, int)} with
* {@link javax.transaction.xa.XAResource#TMJOIN}. The transaction manager checks if two branches can be joined by
* calling {@link javax.transaction.xa.XAResource#isSameRM(javax.transaction.xa.XAResource)}.
* It should only be set to true if the underlying implementation supports resource joining.
* @param useTmJoin true if transaction branches joining should be used.
*/
public void setUseTmJoin(boolean useTmJoin) {
this.useTmJoin = useTmJoin;
}
/**
* @return the properties that should be set on the underlying implementation.
*/
public Properties getDriverProperties() {
return driverProperties;
}
/**
* Set the properties that should be set on the underlying implementation.
* @param driverProperties the properties that should be set on the underlying implementation.
*/
public void setDriverProperties(Properties driverProperties) {
this.driverProperties = driverProperties;
}
/**
* @return the maximum amount of connections that can be in the pool.
*/
public int getMaxPoolSize() {
return maxPoolSize;
}
/**
* Define the maximum amount of connections that can be in the pool.
* @param maxPoolSize the maximum amount of connections that can be in the pool.
*/
public void setMaxPoolSize(int maxPoolSize) {
this.maxPoolSize = maxPoolSize;
}
/**
* @return the minimal amount of connections that can be in the pool.
*/
public int getMinPoolSize() {
return minPoolSize;
}
/**
* Define the minimal amount of connections that can be in the pool.
* @param minPoolSize the maximum amount of connections that can be in the pool.
*/
public void setMinPoolSize(int minPoolSize) {
this.minPoolSize = minPoolSize;
}
/**
* @return the amount of seconds and idle connection can stay in the pool before getting closed.
*/
public int getMaxIdleTime() {
return maxIdleTime;
}
/**
* Define the amount of seconds and idle connection can stay in the pool before getting closed.
* @param maxIdleTime the amount of seconds and idle connection can stay in the pool before getting closed.
*/
public void setMaxIdleTime(int maxIdleTime) {
this.maxIdleTime = maxIdleTime;
}
/**
* @return the amount of connections to be created at once when the pool needs to grow.
*/
public int getAcquireIncrement() {
return acquireIncrement;
}
/**
* Define the amount of connections to be created at once when the pool needs to grow.
* @param acquireIncrement the amount of connections to be created at once when the pool needs to grow.
*/
public void setAcquireIncrement(int acquireIncrement) {
this.acquireIncrement = acquireIncrement;
}
/**
* @return the amount of time in seconds a call to get a connection from the pool will wait when the pool is empty.
*/
public int getAcquisitionTimeout() {
return acquisitionTimeout;
}
/**
* Define the amount of time in seconds a call to get a connection from the pool will wait when the pool is empty.
* @param acquisitionTimeout the amount of time in seconds.
*/
public void setAcquisitionTimeout(int acquisitionTimeout) {
this.acquisitionTimeout = acquisitionTimeout;
}
/**
* @return false only if the database can run many transactions on the same connection.
*/
public boolean getDeferConnectionRelease() {
return deferConnectionRelease;
}
/**
* Define the transaction interleaving capability of the database.
* Should be true only if the database can run many transactions on the same connection.
* @param deferConnectionRelease false only if the database can run many transactions on the same connection.
*/
public void setDeferConnectionRelease(boolean deferConnectionRelease) {
this.deferConnectionRelease = deferConnectionRelease;
}
/**
* @return the amount of time between failed connection acquirements.
*/
public int getAcquisitionInterval() {
return acquisitionInterval;
}
/**
* Set the amount of time in seconds the pool will wait before trying to acquire a connection again after an
* invalid connection has been attempted to be acquired.
* @param acquisitionInterval amount of time in seconds.
*/
public void setAcquisitionInterval(int acquisitionInterval) {
this.acquisitionInterval = acquisitionInterval;
}
/**
* @return true if the transaction manager should allow mixing XA and non-XA transactions.
*/
public boolean getAllowLocalTransactions() {
return allowLocalTransactions;
}
/**
* Set if the transaction manager should allow mixing XA and non-XA transactions. If you know all your transactions
* should be executed within global (ie: XA) scope it is a good idea to set this property to false.
* @param allowLocalTransactions if the transaction manager should allow mixing XA and non-XA transactions.
*/
public void setAllowLocalTransactions(boolean allowLocalTransactions) {
this.allowLocalTransactions = allowLocalTransactions;
}
/**
* @return the position at which this resource should stand during 2PC commit.
*/
public int getTwoPcOrderingPosition() {
return twoPcOrderingPosition;
}
/**
* Set the position at which this resource should stand during 2PC commit.
* @param twoPcOrderingPosition the position at which this resource should stand during 2PC commit.
*/
public void setTwoPcOrderingPosition(int twoPcOrderingPosition) {
this.twoPcOrderingPosition = twoPcOrderingPosition;
}
/**
* @return true if the transaction-timeout should be set on the XAResource.
*/
public boolean getApplyTransactionTimeout() {
return applyTransactionTimeout;
}
/**
* Set if the transaction-timeout should be set on the XAResource when the XAResource is
* enlisted.
* @param applyTransactionTimeout true if the transaction-timeout should be set.
*/
public void setApplyTransactionTimeout(boolean applyTransactionTimeout) {
this.applyTransactionTimeout = applyTransactionTimeout;
}
/**
* Set whether connections in the ACCESSIBLE state can be shared within the context
* of a transaction.
* @param shareAccessibleConnections the shareAccessibleConnections to set.
*/
public void setShareTransactionConnections(boolean shareAccessibleConnections) {
this.shareTransactionConnections = shareAccessibleConnections;
}
/**
* @return true if accessible connections can be shared.
*/
public boolean getShareTransactionConnections() {
return shareTransactionConnections;
}
/**
* Set whether XA recovery errors should quarantine the resource or be ignored.
* @param ignoreRecoveryFailures true if recovery errors should be ignored, false otherwise.
*/
public void setIgnoreRecoveryFailures(boolean ignoreRecoveryFailures) {
this.ignoreRecoveryFailures = ignoreRecoveryFailures;
}
/**
* @return true if recovery errors should be ignored, false otherwise.
*/
public boolean getIgnoreRecoveryFailures() {
return ignoreRecoveryFailures;
}
/**
* Set whether this resource is disabled, meaning it's temporarily forbidden to acquire
* a connection from its pool.
* @param disabled true to disable the resource, false to enable it.
*/
public void setDisabled(boolean disabled) {
this.disabled = disabled;
}
/**
* @return true if the resource is disabled, false if it is enabled.
*/
public boolean isDisabled() {
return disabled;
}
/**
* Increment a transient counter. This is used for assigning per-resource numbers to connections.
* @return the current value of the counter.
*/
public int incCreatedResourcesCounter() {
return this.createdResourcesCounter++;
}
}