/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.resource.metadata.mcf;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.jboss.logging.Logger;
import org.jboss.managed.api.annotation.ActivationPolicy;
import org.jboss.managed.api.annotation.ManagementObject;
import org.jboss.managed.api.annotation.ManagementObjectID;
import org.jboss.managed.api.annotation.ManagementObjectRef;
import org.jboss.managed.api.annotation.ManagementProperties;
import org.jboss.managed.api.annotation.ManagementProperty;
import org.jboss.managed.api.annotation.ManagementPropertyFactory;
import org.jboss.managed.api.annotation.ViewUse;
import org.jboss.resource.deployers.management.ConnectionFactoryProperty;
import org.jboss.system.metadata.ServiceMetaData;
/**
* A ManagedConnectionFactoryDeployment.
*
* @author <a href="weston.price@jboss.org">Weston Price</a>
* @version $Revision: 90839 $
*/
@XmlAccessorType(XmlAccessType.FIELD)
@ManagementObject(properties=ManagementProperties.EXPLICIT)
public class ManagedConnectionFactoryDeploymentMetaData
implements Serializable, ConnectionPoolMetaData
{
private static Logger log = Logger.getLogger(ManagedConnectionFactoryDeploymentMetaData.class);
/** The serialVersionUID */
private static final long serialVersionUID = -4591557831734316580L;
/** The jndiName */
@XmlElement(name="jndi-name")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
private String jndiName;
/** The rarName */
@XmlElement(name="rar-name")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
private String rarName;
/** The useJavaContext */
@XmlElement(name="use-java-context")
private boolean useJavaContext = true;
/** The connectionDefinition */
@XmlElement(name="connection-definition")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
protected String connectionDefinition;
/** The jmxInvokerName */
@XmlElement(name="jmx-invoker-name")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
private String jmxInvokerName = "jboss:service=invoker,type=jrmp";
@XmlElement(name="min-pool-size")
private int minSize = 0;
@XmlElement(name="max-pool-size")
private int maxPoolSize = 10;
@XmlElement(name="blocking-timeout-millis")
private long blockingTimeout = 30000;
@XmlElement(name="idle-timeout-minutes")
private int idleTimeout = 30;
@XmlElement(name="prefill")
private Boolean prefill = Boolean.FALSE;
@XmlElement(name="background-validation")
private boolean backgroundValidation;
@XmlElement(name="background-validation-millis")
private long backgroundValidationMillis;
@XmlElement(name="validate-on-match")
private boolean validateOnMatch = true;
@XmlJavaTypeAdapter(ManagedConnectionEmptyContentAdapter.class)
@XmlElement(name="use-strict-min")
private Boolean useStrictMin = Boolean.FALSE;
@XmlJavaTypeAdapter(ManagedConnectionEmptyContentAdapter.class)
@XmlElement(name="no-tx-separate-pools")
private Boolean noTxSeparatePools = Boolean.FALSE;
@XmlElement(name="statistics-formatter")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
private String statisticsFormatter = "org.jboss.resource.statistic.pool.JBossDefaultSubPoolStatisticFormatter";
@XmlElement(name="isSameRM-override-value")
private Boolean isSameRMOverrideValue = Boolean.FALSE;
// is always true now and left here for the xml binding
@Deprecated
@XmlJavaTypeAdapter(ManagedConnectionEmptyContentAdapter.class)
@XmlElement(name="track-connection-by-tx")
private Boolean trackConnectionByTransaction;
@XmlJavaTypeAdapter(ManagedConnectionEmptyContentAdapter.class)
@XmlElement(name="interleaving")
private Boolean interleaving;
@XmlElement(name="allocation-retry")
private int allocationRetry = 0;
@XmlElement(name="allocation-retry-wait-millis")
private long allocationRetryWaitMillis = 5000;
/** The transactionSupportMetaData */
@XmlTransient
private ManagedConnectionFactoryTransactionSupportMetaData transactionSupportMetaData = ManagedConnectionFactoryTransactionSupportMetaData.NONE;
/** The managedConnectionFactoryProperties */
@XmlElement(name="config-property")
private List<ManagedConnectionFactoryPropertyMetaData> managedConnectionFactoryProperties = new ArrayList<ManagedConnectionFactoryPropertyMetaData>();
/** The securityMetaData */
@XmlElements({@XmlElement(name="security-domain", type=SecurityDomainMetaData.class), @XmlElement(name="security-domain-and-application",type=SecurityDomainApplicationManagedMetaData.class), @XmlElement(name="application-managed-security",type=ApplicationManagedSecurityMetaData.class)})
private SecurityMetaData securityMetaData;
@XmlElement(name="depends")
private List<String> dependsNames = new ArrayList<String>();
@XmlTransient
private List<ServiceMetaData> dependsServices = new ArrayList<ServiceMetaData>();
@XmlElement(name="metadata")
private DBMSMetaData dbmsMetaData;
// todo: this should be wrapped into <metadata> element
@XmlElement(name="type-mapping")
String typeMapping;
/** The localTransactions */
@XmlJavaTypeAdapter(ManagedConnectionEmptyContentAdapter.class)
@XmlElement(name="local-transaction")
private Boolean localTransactions = Boolean.FALSE;
public ManagedConnectionFactoryDeploymentMetaData()
{
this.interleaving = Boolean.FALSE;
}
/**
* Get the connectionDefinition.
*
* @return the connectionDefinition.
*/
@ManagementProperty(name="connection-definition",
description="The connection factory class name",
mandatory=true, includeInTemplate=true)
public String getConnectionDefinition()
{
return connectionDefinition;
}
/**
* Set the connectionDefinition.
*
* @param connectionDefinition The connectionDefinition to set.
*/
public void setConnectionDefinition(String connectionDefinition)
{
this.connectionDefinition = connectionDefinition;
}
/**
* Get the jndiName. This is the id for the DataSource ManagedObject.
*
* @return the jndiName.
*/
@ManagementProperty(name="jndi-name",
description="The global JNDI name to bind the factory under",
includeInTemplate=true,
mandatory=true)
@ManagementObjectID(type="DataSource")
public String getJndiName()
{
return jndiName;
}
/**
* Set the jndiName.
*
* @param jndiName The jndiName to set.
*/
public void setJndiName(String jndiName)
{
this.jndiName = jndiName;
}
/**
* Get the transactionSupportMetaData.
*
* @return the transactionSupportMetaData.
*/
@ManagementProperty(ignored=true)
public ManagedConnectionFactoryTransactionSupportMetaData getTransactionSupportMetaData()
{
return transactionSupportMetaData;
}
/**
* Set the transactionSupportMetaData.
*
* @param transactionSupportMetaData The transactionSupportMetaData to set.
*/
public void setTransactionSupportMetaData(ManagedConnectionFactoryTransactionSupportMetaData transactionSupportMetaData)
{
this.transactionSupportMetaData = transactionSupportMetaData;
}
/**
* Get the useJavaContext.
*
* @return the useJavaContext.
*/
@ManagementProperty(name="use-java-context",
description="Should the jndi name be bound under the java: context",
includeInTemplate=true)
public boolean isUseJavaContext()
{
return useJavaContext;
}
/**
* Set the useJavaContext.
*
* @param useJavaContext The useJavaContext to set.
*/
public void setUseJavaContext(boolean useJavaContext)
{
this.useJavaContext = useJavaContext;
}
/**
* Get the managedConnectionFactoryProperties.
*
* @return the managedConnectionFactoryProperties.
*/
@ManagementProperty(name="config-property",
description="The connection factory config properties",
managed=true, includeInTemplate=true)
@ManagementPropertyFactory(ConnectionFactoryProperty.class)
public List<ManagedConnectionFactoryPropertyMetaData> getManagedConnectionFactoryProperties()
{
return managedConnectionFactoryProperties;
}
/**
* Set the managedConnectionFactoryProperties.
*
* @param managedConnectionFactoryProperties The managedConnectionFactoryProperties to set.
*/
public void setManagedConnectionFactoryProperties(
List<ManagedConnectionFactoryPropertyMetaData> managedConnectionFactoryProperties)
{
this.managedConnectionFactoryProperties = managedConnectionFactoryProperties;
}
/**
* Get the rarName.
*
* @return the rarName.
*/
@ManagementProperty(name="rar-name",
description="The resource adapter archive name",
mandatory=true, includeInTemplate=true)
public String getRarName()
{
return rarName;
}
/**
* Set the rarName.
*
* @param rarName The rarName to set.
*/
public void setRarName(String rarName)
{
this.rarName = rarName;
}
/**
* Get the securityMetaData.
*
* @return the securityMetaData.
*/
@ManagementProperty(name="security-domain",
description="The security-domain used to validate connections",
includeInTemplate=true)
public SecurityMetaData getSecurityMetaData()
{
return securityMetaData;
}
/**
* Set the securityMetaData.
*
* @param securityMetaData The securityMetaData to set.
*/
public void setSecurityMetaData(SecurityMetaData securityMetaData)
{
this.securityMetaData = securityMetaData;
}
/**
* Get the typeMapping.
*
* @return the typeMapping.
*/
@ManagementProperty(name="type-mapping", includeInTemplate=true)
public String getTypeMapping()
{
return typeMapping;
}
/**
* Set the typeMapping.
*
* @param typeMapping The typeMapping to set.
*/
public void setTypeMapping(String typeMapping)
{
this.typeMapping = typeMapping;
}
/**
* Get the jmxInvokerName.
*
* @return the jmxInvokerName.
*/
@ManagementProperty(name="jmx-invoker-name",
description="The name of the JMX invoker",
includeInTemplate=true)
@ManagementObjectRef(type="JMXInvoker")
public String getJmxInvokerName()
{
return jmxInvokerName;
}
/**
* Set the jmxInvokerName.
*
* @param jmxInvokerName The jmxInvokerName to set.
*/
public void setJmxInvokerName(String jmxInvokerName)
{
this.jmxInvokerName = jmxInvokerName;
}
/**
* Get the dependsNames.
*
* @return the dependsNames.
*/
@ManagementProperty(name="depends", ignored=true)
public List<String> getDependsNames()
{
return dependsNames;
}
/**
* Set the dependsNames.
*
* @param dependsNames The dependsNames to set.
*/
public void setDependsNames(List<String> dependsNames)
{
this.dependsNames = dependsNames;
}
/**
* Get the dependsServices.
*
* @return the dependsServices.
*/
@ManagementProperty(name="services", ignored=true)
public List<ServiceMetaData> getDependsServices()
{
return dependsServices;
}
/**
* Set the dependsServices.
*
* @param dependsServices The dependsServices to set.
*/
public void setDependsServices(List<ServiceMetaData> dependsServices)
{
this.dependsServices = dependsServices;
}
@ManagementProperty(name="min-pool-size",
description="The min size of the pool",
includeInTemplate=true)
public void setMinSize(int minSize)
{
this.minSize = minSize;
}
public int getMinSize()
{
return this.minSize;
}
@ManagementProperty(name="max-pool-size",
description="The max size of the pool",
includeInTemplate=true)
public void setMaxSize(int maxSize)
{
this.maxPoolSize = maxSize;
}
public int getMaxSize()
{
if (this.maxPoolSize >= this.minSize)
{
return this.maxPoolSize;
} else {
return this.minSize;
}
}
@ManagementProperty(name="blocking-timeout-millis",
description="The time to wait for a connection to become available before giving up",
includeInTemplate=true)
public void setBlockingTimeoutMilliSeconds(long blockTimeout)
{
this.blockingTimeout = blockTimeout;
}
public long getBlockingTimeoutMilliSeconds()
{
return this.blockingTimeout;
}
@ManagementProperty(name="idle-timeout-minutes",
description="The idle timeout in minutes",
includeInTemplate=true)
public void setIdleTimeoutMinutes(int idleTimeout)
{
this.idleTimeout = idleTimeout;
}
public int getIdleTimeoutMinutes()
{
return this.idleTimeout;
}
@ManagementProperty(name="prefill",
description = "Whether to prefill the pool",
includeInTemplate=true)
public void setPrefill(Boolean prefill)
{
this.prefill = prefill;
}
public Boolean getPrefill()
{
return this.prefill;
}
@ManagementProperty(name="background-validation",
description = "Whether to use backgroup validation",
includeInTemplate=true)
public boolean isBackgroundValidation()
{
return backgroundValidation;
}
public void setBackgroundValidation(boolean backgroundValidation)
{
this.backgroundValidation = backgroundValidation;
}
public void setBackgroundValidationMillis(long interval)
{
this.backgroundValidationMillis = interval;
}
@ManagementProperty(name="background-validation-millis", includeInTemplate=true)
public long getBackgroundValidationMillis()
{
return this.backgroundValidationMillis;
}
public void setValidateOnMatch(boolean validateOnMatch)
{
this.validateOnMatch = validateOnMatch;
}
@ManagementProperty(name="validate-on-match", includeInTemplate=true)
public boolean isValidateOnMatch()
{
return this.validateOnMatch;
}
@ManagementProperty(name="isSameRM-override-value", includeInTemplate=true)
public Boolean getIsSameRMOverrideValue()
{
return isSameRMOverrideValue;
}
public void setIsSameRMOverrideValue(Boolean isSameRMOverrideValue)
{
this.isSameRMOverrideValue = isSameRMOverrideValue;
}
@Deprecated
@ManagementProperty(name="track-connection-by-tx", includeInTemplate=true,
use={ViewUse.CONFIGURATION})
public Boolean getTrackConnectionByTransaction()
{
return !isInterleaving();
}
@Deprecated
public void setTrackConnectionByTransaction(Boolean trackConnectionByTransaction)
{
if(Boolean.TRUE == getLocalTransactions() && !Boolean.TRUE.equals(trackConnectionByTransaction))
{
log.warn("In case of local transactions track-connection-by-tx must always be true");
trackConnectionByTransaction = Boolean.TRUE;
}
setInterleaving(!Boolean.TRUE.equals(trackConnectionByTransaction));
}
public Boolean isInterleaving()
{
return interleaving == Boolean.TRUE && !Boolean.TRUE.equals(getLocalTransactions());
}
@ManagementProperty(name="interleaving", includeInTemplate=true,
use={ViewUse.CONFIGURATION}, activationPolicy=ActivationPolicy.DEPLOYMENT_RESTART)
public Boolean getInterleaving()
{
return isInterleaving();
}
public void setInterleaving(Boolean interleaving)
{
this.interleaving = interleaving;
}
@ManagementProperty(name="allocation-retry",
description="The number of times allocation retries should be tried",
includeInTemplate=true,
use={ViewUse.CONFIGURATION})
public int getAllocationRetry()
{
return this.allocationRetry;
}
public void setAllocationRetry(int ar)
{
this.allocationRetry = ar;
}
@ManagementProperty(name="allocation-retry-wait-millis",
description="The time to wait between allocation retries",
includeInTemplate=true,
use={ViewUse.CONFIGURATION})
public long getAllocationRetryWaitMillis()
{
return this.allocationRetryWaitMillis;
}
public void setAllocationRetryWaitMillis(long arwm)
{
this.allocationRetryWaitMillis = arwm;
}
@ManagementProperty(name="local-transaction", use={ViewUse.RUNTIME}, readOnly=true)
public Boolean getLocalTransactions()
{
return localTransactions;
}
public void setLocalTransactions(Boolean localTransactions)
{
this.localTransactions = localTransactions;
}
@ManagementProperty(name="use-strict-min", includeInTemplate=true)
public Boolean getUseStrictMin()
{
return useStrictMin;
}
public void setUseStrictMin(Boolean useStrictMin)
{
this.useStrictMin = useStrictMin;
}
@ManagementProperty(name="statistics-formatter", includeInTemplate=true)
public String getStatisticsFormatter()
{
return statisticsFormatter;
}
public void setStatisticsFormatter(String statisticsFormatter)
{
this.statisticsFormatter = statisticsFormatter;
}
@ManagementProperty(name="no-tx-separate-pools", includeInTemplate=true)
public Boolean getNoTxSeparatePools()
{
return this.noTxSeparatePools;
}
public void setNoTxSeparatePools(Boolean notxpool)
{
this.noTxSeparatePools = notxpool;
}
@ManagementProperty(name="metadata", includeInTemplate=true)
public DBMSMetaData getDBMSMetaData()
{
return dbmsMetaData;
}
public void setDBMSMetaData(DBMSMetaData dbmsMetaData)
{
this.dbmsMetaData = dbmsMetaData;
}
}