You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2004/05/06 05:58:23 UTC
cvs commit: incubator-geronimo/modules/connector/src/schema geronimo-connector_1_5.xsd
djencks 2004/05/05 20:58:23
Modified: modules/connector/src/java/org/apache/geronimo/connector/deployment
AbstractRARConfigBuilder.java
RAR_1_0ConfigBuilder.java RAR_1_5ConfigBuilder.java
modules/connector/src/java/org/apache/geronimo/connector/deployment/dconfigbean
ConnectionDefinitionInstance.java
modules/connector/src/java/org/apache/geronimo/connector/outbound
LocalXAResource.java MCFConnectionInterceptor.java
MultiPoolConnectionInterceptor.java
SinglePoolConnectionInterceptor.java
TransactionCachingInterceptor.java
modules/connector/src/schema geronimo-connector_1_5.xsd
Added: modules/connector/src/java/org/apache/geronimo/connector/outbound
AbstractConnectionManager.java
ConnectionInterceptorSource.java
GenericConnectionManager.java
SinglePoolMatchAllConnectionInterceptor.java
modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig
LocalTransactions.java NoPool.java
NoTransactions.java PartitionedPool.java
PoolingSupport.java SinglePool.java
TransactionLog.java TransactionSupport.java
XATransactions.java
modules/connector/src/java/org/apache/geronimo/connector/outbound/transactionlog
JDBCLog.java LogXAResource.java
LogXAResourceInsertionInterceptor.java
Removed: modules/connector/src/java/org/apache/geronimo/connector/outbound
ConnectionManagerDeployment.java
Log:
revamp connection manager configuration to only allow valid choices and provide better indication of related choices. Implement theoretically valid last-resource one-phase commit optimization for local-tx jdbc using an explicit database-table-based xid log (idea based on discussions with Jeremy Boynes)
Revision Changes Path
1.16 +99 -1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/deployment/AbstractRARConfigBuilder.java
Index: AbstractRARConfigBuilder.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/deployment/AbstractRARConfigBuilder.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- AbstractRARConfigBuilder.java 23 Apr 2004 03:08:28 -0000 1.15
+++ AbstractRARConfigBuilder.java 6 May 2004 03:58:22 -0000 1.16
@@ -32,6 +32,8 @@
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
+import java.util.Collections;
+
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
@@ -45,12 +47,26 @@
import org.apache.geronimo.gbean.GBeanInfoFactory;
import org.apache.geronimo.gbean.GConstructorInfo;
import org.apache.geronimo.gbean.GReferenceInfo;
+import org.apache.geronimo.gbean.InvalidConfigurationException;
+import org.apache.geronimo.gbean.jmx.GBeanMBean;
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.repository.Repository;
import org.apache.geronimo.xbeans.geronimo.GerConnectorDocument;
import org.apache.geronimo.xbeans.geronimo.GerConnectorType;
import org.apache.geronimo.xbeans.geronimo.GerGbeanType;
import org.apache.geronimo.xbeans.geronimo.GerDependencyType;
+import org.apache.geronimo.xbeans.geronimo.GerConnectiondefinitionInstanceType;
+import org.apache.geronimo.xbeans.geronimo.GerConnectionmanagerType;
+import org.apache.geronimo.connector.outbound.GenericConnectionManager;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionSupport;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.NoTransactions;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.LocalTransactions;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionLog;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.XATransactions;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.SinglePool;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PartitionedPool;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.NoPool;
import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.SchemaTypeLoader;
import org.apache.xmlbeans.XmlBeans;
@@ -232,6 +248,88 @@
}
}
return uri;
+ }
+
+ protected ObjectName configureConnectionManager(GerConnectiondefinitionInstanceType connectionfactoryInstance, DeploymentContext context) throws DeploymentException {
+ if (connectionfactoryInstance.getConnectionmanagerRef() != null) {
+ //we don't configure anything, just use the supplied gbean
+ try {
+ return ObjectName.getInstance(connectionfactoryInstance.getConnectionmanagerRef());
+ } catch (MalformedObjectNameException e) {
+ throw new DeploymentException("Invalid ObjectName string supplied for ConnectionManager reference", e);
+ }
+ }
+ //we configure our connection manager
+ GerConnectionmanagerType connectionManager = connectionfactoryInstance.getConnectionmanager();
+ GBeanInfo connectionManagerGBeanInfo;
+ try {
+ connectionManagerGBeanInfo = GBeanInfo.getGBeanInfo(GenericConnectionManager.class.getName(), GenericConnectionManager.class.getClassLoader());
+ } catch (InvalidConfigurationException e) {
+ throw new DeploymentException("Unable to get GBeanInfo from ConnectionManagerDeployment", e);
+ }
+
+ GBeanMBean connectionManagerGBean;
+ try {
+ connectionManagerGBean = new GBeanMBean(connectionManagerGBeanInfo, GenericConnectionManager.class.getClassLoader());
+ } catch (InvalidConfigurationException e) {
+ throw new DeploymentException("Unable to create GMBean", e);
+ }
+ TransactionSupport transactionSupport = null;
+ if (connectionManager.getNoTransaction() != null) {
+ transactionSupport = NoTransactions.INSTANCE;
+ } else if (connectionManager.getLocalTransaction() != null) {
+ transactionSupport = LocalTransactions.INSTANCE;
+ } else if (connectionManager.getTransactionLog() != null) {
+ transactionSupport = TransactionLog.INSTANCE;
+ } else if (connectionManager.getXaTransaction() != null) {
+ transactionSupport = new XATransactions(
+ connectionManager.getXaTransaction().getTransactionCaching() != null,
+ connectionManager.getXaTransaction().getThreadCaching() != null
+ );
+ } else {
+ throw new DeploymentException("Unexpected transaction support element");
+ }
+ PoolingSupport pooling = null;
+ if (connectionManager.getSinglePool() != null) {
+ pooling = new SinglePool(connectionManager.getSinglePool().getMaxSize(),
+ connectionManager.getSinglePool().getBlockingTimeoutMilliseconds(),
+ connectionManager.getSinglePool().getMatchOne() != null,
+ connectionManager.getSinglePool().getMatchAll() != null,
+ connectionManager.getSinglePool().getSelectOneAssumeMatch() != null
+ );
+ } else if (connectionManager.getPartitionedPool() != null) {
+ pooling = new PartitionedPool(connectionManager.getPartitionedPool().getPartitionByConnectionrequestinfo() != null,
+ connectionManager.getPartitionedPool().getPartitionBySubject() != null,
+ connectionManager.getPartitionedPool().getMaxSize(),
+ connectionManager.getPartitionedPool().getBlockingTimeoutMilliseconds(),
+ connectionManager.getPartitionedPool().getMatchOne() != null,
+ connectionManager.getPartitionedPool().getMatchAll() != null,
+ connectionManager.getPartitionedPool().getSelectOneAssumeMatch() != null
+ );
+ } else if (connectionManager.getNoPool() != null) {
+ pooling = new NoPool();
+ } else {
+ throw new DeploymentException("Unexpected pooling support element");
+ }
+ try {
+ connectionManagerGBean.setAttribute("Name", connectionfactoryInstance.getName());
+ connectionManagerGBean.setAttribute("TransactionSupport", transactionSupport);
+ connectionManagerGBean.setAttribute("Pooling", pooling);
+ connectionManagerGBean.setReferencePatterns("ConnectionTracker", Collections.singleton(connectionTrackerNamePattern));
+ if (connectionManager.getRealmBridge() != null) {
+ connectionManagerGBean.setReferencePatterns("RealmBridge", Collections.singleton(ObjectName.getInstance(BASE_REALM_BRIDGE_NAME + connectionManager.getRealmBridge())));
+ }
+ } catch (Exception e) {
+ throw new DeploymentException("Problem setting up ConnectionManager", e);
+ }
+ ObjectName connectionManagerFactoryObjectName = null;
+ try {
+ connectionManagerFactoryObjectName = ObjectName.getInstance(BASE_CONNECTION_MANAGER_FACTORY_NAME + connectionfactoryInstance.getName());
+ } catch (MalformedObjectNameException e) {
+ throw new DeploymentException("Could not name ConnectionManager", e);
+ }
+ context.addGBean(connectionManagerFactoryObjectName, connectionManagerGBean);
+ return connectionManagerFactoryObjectName;
}
public static final GBeanInfo GBEAN_INFO;
1.7 +14 -50 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/deployment/RAR_1_0ConfigBuilder.java
Index: RAR_1_0ConfigBuilder.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/deployment/RAR_1_0ConfigBuilder.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- RAR_1_0ConfigBuilder.java 12 Mar 2004 17:58:45 -0000 1.6
+++ RAR_1_0ConfigBuilder.java 6 May 2004 03:58:22 -0000 1.7
@@ -33,7 +33,6 @@
import javax.resource.spi.security.PasswordCredential;
import org.apache.geronimo.common.propertyeditor.PropertyEditors;
-import org.apache.geronimo.connector.outbound.ConnectionManagerDeployment;
import org.apache.geronimo.connector.outbound.ManagedConnectionFactoryWrapper;
import org.apache.geronimo.connector.outbound.security.PasswordCredentialRealm;
import org.apache.geronimo.deployment.DeploymentContext;
@@ -46,10 +45,10 @@
import org.apache.geronimo.gbean.jmx.GBeanMBean;
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.repository.Repository;
+import org.apache.geronimo.naming.jmx.JMXReferenceFactory;
import org.apache.geronimo.xbeans.geronimo.GerConfigPropertySettingType;
import org.apache.geronimo.xbeans.geronimo.GerConnectionDefinitionType;
import org.apache.geronimo.xbeans.geronimo.GerConnectiondefinitionInstanceType;
-import org.apache.geronimo.xbeans.geronimo.GerConnectionmanagerType;
import org.apache.geronimo.xbeans.geronimo.GerConnectorDocument;
import org.apache.geronimo.xbeans.geronimo.GerConnectorType;
import org.apache.geronimo.xbeans.geronimo.GerResourceadapterType;
@@ -57,7 +56,6 @@
import org.apache.geronimo.xbeans.j2ee.connector_1_0.ConfigPropertyType;
import org.apache.geronimo.xbeans.j2ee.connector_1_0.ConnectorDocument;
import org.apache.geronimo.xbeans.j2ee.connector_1_0.ResourceadapterType;
-import org.apache.geronimo.naming.jmx.JMXReferenceFactory;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
@@ -99,69 +97,35 @@
for (int i = 0; i < geronimoResourceAdapter.getOutboundResourceadapter().getConnectionDefinitionArray().length; i++) {
GerConnectionDefinitionType geronimoConnectionDefinition = geronimoResourceAdapter.getOutboundResourceadapter().getConnectionDefinitionArray(i);
assert geronimoConnectionDefinition != null: "Null GeronimoConnectionDefinition";
- //ConnectionManagerFactory
+
for (int j = 0; j < geronimoConnectionDefinition.getConnectiondefinitionInstanceArray().length; j++) {
- GerConnectiondefinitionInstanceType gerConnectionfactoryInstance = geronimoConnectionDefinition.getConnectiondefinitionInstanceArray()[j];
+ GerConnectiondefinitionInstanceType connectionfactoryInstance = geronimoConnectionDefinition.getConnectiondefinitionInstanceArray()[j];
- GerConnectionmanagerType connectionManagerFactory = gerConnectionfactoryInstance.getConnectionmanager();
- GBeanInfo connectionManagerFactoryGBeanInfo;
- try {
- connectionManagerFactoryGBeanInfo = GBeanInfo.getGBeanInfo(ConnectionManagerDeployment.class.getName(), ConnectionManagerDeployment.class.getClassLoader());
- } catch (InvalidConfigurationException e) {
- throw new DeploymentException("Unable to get GBeanInfo from ConnectionManagerDeployment", e);
- }
+ //ConnectionManager
+ ObjectName connectionManagerObjectName = configureConnectionManager(connectionfactoryInstance, context);
- GBeanMBean connectionManagerFactoryGBean;
- try {
- connectionManagerFactoryGBean = new GBeanMBean(connectionManagerFactoryGBeanInfo, ConnectionManagerDeployment.class.getClassLoader());
- } catch (InvalidConfigurationException e) {
- throw new DeploymentException("Unable to create GMBean", e);
- }
- try {
- connectionManagerFactoryGBean.setAttribute("Name", gerConnectionfactoryInstance.getName());
- connectionManagerFactoryGBean.setAttribute("BlockingTimeout", new Integer(connectionManagerFactory.getBlockingTimeout().intValue()));
- connectionManagerFactoryGBean.setAttribute("MaxSize", new Integer(connectionManagerFactory.getMaxSize().intValue()));
- connectionManagerFactoryGBean.setAttribute("UseTransactions", Boolean.valueOf(connectionManagerFactory.getUseTransactions()));
- connectionManagerFactoryGBean.setAttribute("UseLocalTransactions", Boolean.valueOf(connectionManagerFactory.getUseLocalTransactions()));
- connectionManagerFactoryGBean.setAttribute("UseTransactionCaching", Boolean.valueOf(connectionManagerFactory.getUseTransactionCaching()));
- connectionManagerFactoryGBean.setAttribute("UseConnectionRequestInfo", Boolean.valueOf(connectionManagerFactory.getUseConnectionRequestInfo()));
- connectionManagerFactoryGBean.setAttribute("UseSubject", Boolean.valueOf(connectionManagerFactory.getUseSubject()));
- connectionManagerFactoryGBean.setReferencePatterns("ConnectionTracker", Collections.singleton(connectionTrackerNamePattern));
- if (connectionManagerFactory.getRealmBridge() != null) {
- connectionManagerFactoryGBean.setReferencePatterns("RealmBridge", Collections.singleton(ObjectName.getInstance(BASE_REALM_BRIDGE_NAME + connectionManagerFactory.getRealmBridge())));
- }
- } catch (Exception e) {
- throw new DeploymentException("Problem setting up ConnectionManagerFactory", e);
- }
- ObjectName connectionManagerFactoryObjectName = null;
- try {
- connectionManagerFactoryObjectName = ObjectName.getInstance(BASE_CONNECTION_MANAGER_FACTORY_NAME + gerConnectionfactoryInstance.getName());
- } catch (MalformedObjectNameException e) {
- throw new DeploymentException("Could not name ConnectionManagerFactory", e);
- }
- context.addGBean(connectionManagerFactoryObjectName, connectionManagerFactoryGBean);
//ManagedConnectionFactory
ObjectName managedConnectionFactoryObjectName = null;
try {
- managedConnectionFactoryObjectName = ObjectName.getInstance(JMXReferenceFactory.BASE_MANAGED_CONNECTION_FACTORY_NAME + gerConnectionfactoryInstance.getName());
+ managedConnectionFactoryObjectName = ObjectName.getInstance(JMXReferenceFactory.BASE_MANAGED_CONNECTION_FACTORY_NAME + connectionfactoryInstance.getName());
} catch (MalformedObjectNameException e) {
throw new DeploymentException("Could not construct ManagedConnectionFactory object name", e);
}
GBeanInfoFactory managedConnectionFactoryInfoFactory = new GBeanInfoFactory(ManagedConnectionFactoryWrapper.class.getName(), ManagedConnectionFactoryWrapper.getGBeanInfo());
- GBeanMBean managedConnectionFactoryGBean = setUpDynamicGBean(managedConnectionFactoryInfoFactory, resourceAdapter.getConfigPropertyArray(), gerConnectionfactoryInstance.getConfigPropertySettingArray());
+ GBeanMBean managedConnectionFactoryGBean = setUpDynamicGBean(managedConnectionFactoryInfoFactory, resourceAdapter.getConfigPropertyArray(), connectionfactoryInstance.getConfigPropertySettingArray());
try {
managedConnectionFactoryGBean.setAttribute("ManagedConnectionFactoryClass", cl.loadClass(resourceAdapter.getManagedconnectionfactoryClass().getStringValue()));
managedConnectionFactoryGBean.setAttribute("ConnectionFactoryInterface", cl.loadClass(resourceAdapter.getConnectionfactoryInterface().getStringValue()));
managedConnectionFactoryGBean.setAttribute("ConnectionFactoryImplClass", cl.loadClass(resourceAdapter.getConnectionfactoryImplClass().getStringValue()));
managedConnectionFactoryGBean.setAttribute("ConnectionInterface", cl.loadClass(resourceAdapter.getConnectionInterface().getStringValue()));
managedConnectionFactoryGBean.setAttribute("ConnectionImplClass", cl.loadClass(resourceAdapter.getConnectionImplClass().getStringValue()));
- managedConnectionFactoryGBean.setAttribute("GlobalJNDIName", gerConnectionfactoryInstance.getGlobalJndiName());
- managedConnectionFactoryGBean.setReferencePatterns("ConnectionManagerFactory", Collections.singleton(connectionManagerFactoryObjectName));
- if (gerConnectionfactoryInstance.getCredentialInterface() != null && PasswordCredential.class.getName().equals(gerConnectionfactoryInstance.getCredentialInterface().getStringValue())) {
+ managedConnectionFactoryGBean.setAttribute("GlobalJNDIName", connectionfactoryInstance.getGlobalJndiName());
+ managedConnectionFactoryGBean.setReferencePatterns("ConnectionManagerFactory", Collections.singleton(connectionManagerObjectName));
+ if (connectionfactoryInstance.getCredentialInterface() != null && PasswordCredential.class.getName().equals(connectionfactoryInstance.getCredentialInterface().getStringValue())) {
GBeanMBean realmGBean = new GBeanMBean(PasswordCredentialRealm.class.getName());
- realmGBean.setAttribute("RealmName", BASE_PASSWORD_CREDENTIAL_LOGIN_MODULE_NAME + gerConnectionfactoryInstance.getName());
- context.addGBean(ObjectName.getInstance(BASE_PASSWORD_CREDENTIAL_LOGIN_MODULE_NAME + gerConnectionfactoryInstance.getName()), realmGBean);
- managedConnectionFactoryGBean.setReferencePatterns("ManagedConnectionFactoryListener", Collections.singleton(ObjectName.getInstance(BASE_PASSWORD_CREDENTIAL_LOGIN_MODULE_NAME + gerConnectionfactoryInstance.getName())));
+ realmGBean.setAttribute("RealmName", BASE_PASSWORD_CREDENTIAL_LOGIN_MODULE_NAME + connectionfactoryInstance.getName());
+ context.addGBean(ObjectName.getInstance(BASE_PASSWORD_CREDENTIAL_LOGIN_MODULE_NAME + connectionfactoryInstance.getName()), realmGBean);
+ managedConnectionFactoryGBean.setReferencePatterns("ManagedConnectionFactoryListener", Collections.singleton(ObjectName.getInstance(BASE_PASSWORD_CREDENTIAL_LOGIN_MODULE_NAME + connectionfactoryInstance.getName())));
}
managedConnectionFactoryGBean.setReferencePatterns("Kernel", Collections.singleton(Kernel.KERNEL));
managedConnectionFactoryGBean.setAttribute("SelfName", managedConnectionFactoryObjectName);
1.11 +14 -40 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/deployment/RAR_1_5ConfigBuilder.java
Index: RAR_1_5ConfigBuilder.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/deployment/RAR_1_5ConfigBuilder.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- RAR_1_5ConfigBuilder.java 12 Apr 2004 21:54:19 -0000 1.10
+++ RAR_1_5ConfigBuilder.java 6 May 2004 03:58:22 -0000 1.11
@@ -37,8 +37,17 @@
import org.apache.geronimo.common.propertyeditor.PropertyEditors;
import org.apache.geronimo.connector.AdminObjectWrapper;
import org.apache.geronimo.connector.ResourceAdapterWrapper;
-import org.apache.geronimo.connector.outbound.ConnectionManagerDeployment;
+import org.apache.geronimo.connector.outbound.GenericConnectionManager;
import org.apache.geronimo.connector.outbound.ManagedConnectionFactoryWrapper;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionSupport;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.NoTransactions;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.LocalTransactions;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionLog;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.XATransactions;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PartitionedPool;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.SinglePool;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.NoPool;
import org.apache.geronimo.connector.outbound.security.PasswordCredentialRealm;
import org.apache.geronimo.deployment.DeploymentContext;
import org.apache.geronimo.deployment.DeploymentException;
@@ -151,44 +160,9 @@
for (int j = 0; j < geronimoConnectionDefinition.getConnectiondefinitionInstanceArray().length; j++) {
GerConnectiondefinitionInstanceType connectionfactoryInstance = geronimoConnectionDefinition.getConnectiondefinitionInstanceArray()[j];
- //ConnectionManagerFactory
- GerConnectionmanagerType connectionManagerFactory = connectionfactoryInstance.getConnectionmanager();
- GBeanInfo connectionManagerFactoryGBeanInfo;
- try {
- connectionManagerFactoryGBeanInfo = GBeanInfo.getGBeanInfo(ConnectionManagerDeployment.class.getName(), ConnectionManagerDeployment.class.getClassLoader());
- } catch (InvalidConfigurationException e) {
- throw new DeploymentException("Unable to get GBeanInfo from ConnectionManagerDeployment", e);
- }
+ //ConnectionManager
+ ObjectName connectionManagerObjectName = configureConnectionManager(connectionfactoryInstance, context);
- GBeanMBean connectionManagerFactoryGBean;
- try {
- connectionManagerFactoryGBean = new GBeanMBean(connectionManagerFactoryGBeanInfo, ConnectionManagerDeployment.class.getClassLoader());
- } catch (InvalidConfigurationException e) {
- throw new DeploymentException("Unable to create GMBean", e);
- }
- try {
- connectionManagerFactoryGBean.setAttribute("Name", connectionfactoryInstance.getName());
- connectionManagerFactoryGBean.setAttribute("BlockingTimeout", new Integer(connectionManagerFactory.getBlockingTimeout().intValue()));
- connectionManagerFactoryGBean.setAttribute("MaxSize", new Integer(connectionManagerFactory.getMaxSize().intValue()));
- connectionManagerFactoryGBean.setAttribute("UseTransactions", Boolean.valueOf(connectionManagerFactory.getUseTransactions()));
- connectionManagerFactoryGBean.setAttribute("UseLocalTransactions", Boolean.valueOf(connectionManagerFactory.getUseLocalTransactions()));
- connectionManagerFactoryGBean.setAttribute("UseTransactionCaching", Boolean.valueOf(connectionManagerFactory.getUseTransactionCaching()));
- connectionManagerFactoryGBean.setAttribute("UseConnectionRequestInfo", Boolean.valueOf(connectionManagerFactory.getUseConnectionRequestInfo()));
- connectionManagerFactoryGBean.setAttribute("UseSubject", Boolean.valueOf(connectionManagerFactory.getUseSubject()));
- connectionManagerFactoryGBean.setReferencePatterns("ConnectionTracker", Collections.singleton(connectionTrackerNamePattern));
- if (connectionManagerFactory.getRealmBridge() != null) {
- connectionManagerFactoryGBean.setReferencePatterns("RealmBridge", Collections.singleton(ObjectName.getInstance(BASE_REALM_BRIDGE_NAME + connectionManagerFactory.getRealmBridge())));
- }
- } catch (Exception e) {
- throw new DeploymentException("Problem setting up ConnectionManagerFactory", e);
- }
- ObjectName connectionManagerFactoryObjectName = null;
- try {
- connectionManagerFactoryObjectName = ObjectName.getInstance(BASE_CONNECTION_MANAGER_FACTORY_NAME + connectionfactoryInstance.getName());
- } catch (MalformedObjectNameException e) {
- throw new DeploymentException("Could not name ConnectionManagerFactory", e);
- }
- context.addGBean(connectionManagerFactoryObjectName, connectionManagerFactoryGBean);
//ManagedConnectionFactory
ObjectName managedConnectionFactoryObjectName = null;
@@ -209,7 +183,7 @@
if (resourceAdapterClassName != null) {
managedConnectionFactoryGBean.setReferencePatterns("ResourceAdapterWrapper", Collections.singleton(resourceAdapterObjectName));
}
- managedConnectionFactoryGBean.setReferencePatterns("ConnectionManagerFactory", Collections.singleton(connectionManagerFactoryObjectName));
+ managedConnectionFactoryGBean.setReferencePatterns("ConnectionManagerFactory", Collections.singleton(connectionManagerObjectName));
if (connectionfactoryInstance.getCredentialInterface() != null && PasswordCredential.class.getName().equals(connectionfactoryInstance.getCredentialInterface().getStringValue())) {
GBeanMBean realmGBean = new GBeanMBean(PasswordCredentialRealm.getGBeanInfo());
realmGBean.setAttribute("RealmName", BASE_PASSWORD_CREDENTIAL_LOGIN_MODULE_NAME + connectionfactoryInstance.getName());
1.9 +72 -72 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/deployment/dconfigbean/ConnectionDefinitionInstance.java
Index: ConnectionDefinitionInstance.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/deployment/dconfigbean/ConnectionDefinitionInstance.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ConnectionDefinitionInstance.java 10 Mar 2004 09:58:31 -0000 1.8
+++ ConnectionDefinitionInstance.java 6 May 2004 03:58:22 -0000 1.9
@@ -129,77 +129,77 @@
pcs.firePropertyChange("globalJNDIName", old, globalJNDIName);
}
- public boolean isUseConnectionRequestInfo() {
- return getConnectionManager().getUseConnectionRequestInfo();
- }
-
- public void setUseConnectionRequestInfo(boolean useConnectionRequestInfo) {
- boolean old = isUseConnectionRequestInfo();
- getConnectionManager().setUseConnectionRequestInfo(useConnectionRequestInfo);
- pcs.firePropertyChange("useConnectionRequestInfo", old, useConnectionRequestInfo);
- }
-
- public boolean isUseSubject() {
- return getConnectionManager().getUseSubject();
- }
-
- public void setUseSubject(boolean useSubject) {
- boolean old = isUseSubject();
- getConnectionManager().setUseSubject(useSubject);
- pcs.firePropertyChange("useSubject", old, useSubject);
- }
-
- public boolean isUseTransactionCaching() {
- return getConnectionManager().getUseTransactionCaching();
- }
-
- public void setUseTransactionCaching(boolean useTransactionCaching) {
- boolean old = isUseTransactionCaching();
- getConnectionManager().setUseTransactionCaching(useTransactionCaching);
- pcs.firePropertyChange("useTransactionCaching", old, useTransactionCaching);
- }
-
- public boolean isUseLocalTransactions() {
- return getConnectionManager().getUseLocalTransactions();
- }
-
- public void setUseLocalTransactions(boolean useLocalTransactions) {
- boolean old = isUseLocalTransactions();
- getConnectionManager().setUseLocalTransactions(useLocalTransactions);
- pcs.firePropertyChange("useLocalTransactions", old, useLocalTransactions);
- }
-
- public boolean isUseTransactions() {
- return getConnectionManager().getUseTransactions();
- }
-
- public void setUseTransactions(boolean useTransactions) {
- boolean old = isUseTransactions();
- getConnectionManager().setUseTransactions(useTransactions);
- pcs.firePropertyChange("useTransactions", old, useTransactions);
- }
-
- public int getMaxSize() {
- BigInteger test = getConnectionManager().getMaxSize();
- return test == null ? 0 : test.intValue();
- }
-
- public void setMaxSize(int maxSize) {
- int old = getMaxSize();
- getConnectionManager().setMaxSize(BigInteger.valueOf(maxSize));
- pcs.firePropertyChange("maxSize", old, maxSize);
- }
-
- public int getBlockingTimeout() {
- BigInteger test = getConnectionManager().getBlockingTimeout();
- return test == null ? 0 : test.intValue();
- }
-
- public void setBlockingTimeout(int blockingTimeout) {
- int old = getBlockingTimeout();
- getConnectionManager().setBlockingTimeout(BigInteger.valueOf(blockingTimeout));
- pcs.firePropertyChange("blockingTimeout", old, blockingTimeout);
- }
+// public boolean isUseConnectionRequestInfo() {
+// return getConnectionManager().getUseConnectionRequestInfo();
+// }
+//
+// public void setUseConnectionRequestInfo(boolean useConnectionRequestInfo) {
+// boolean old = isUseConnectionRequestInfo();
+// getConnectionManager().setUseConnectionRequestInfo(useConnectionRequestInfo);
+// pcs.firePropertyChange("useConnectionRequestInfo", old, useConnectionRequestInfo);
+// }
+//
+// public boolean isUseSubject() {
+// return getConnectionManager().getUseSubject();
+// }
+//
+// public void setUseSubject(boolean useSubject) {
+// boolean old = isUseSubject();
+// getConnectionManager().setUseSubject(useSubject);
+// pcs.firePropertyChange("useSubject", old, useSubject);
+// }
+//
+// public boolean isUseTransactionCaching() {
+// return getConnectionManager().getUseTransactionCaching();
+// }
+//
+// public void setUseTransactionCaching(boolean useTransactionCaching) {
+// boolean old = isUseTransactionCaching();
+// getConnectionManager().setUseTransactionCaching(useTransactionCaching);
+// pcs.firePropertyChange("useTransactionCaching", old, useTransactionCaching);
+// }
+//
+// public boolean isUseLocalTransactions() {
+// return getConnectionManager().getUseLocalTransactions();
+// }
+//
+// public void setUseLocalTransactions(boolean useLocalTransactions) {
+// boolean old = isUseLocalTransactions();
+// getConnectionManager().setUseLocalTransactions(useLocalTransactions);
+// pcs.firePropertyChange("useLocalTransactions", old, useLocalTransactions);
+// }
+//
+// public boolean isUseTransactions() {
+// return getConnectionManager().getUseTransactions();
+// }
+//
+// public void setUseTransactions(boolean useTransactions) {
+// boolean old = isUseTransactions();
+// getConnectionManager().setUseTransactions(useTransactions);
+// pcs.firePropertyChange("useTransactions", old, useTransactions);
+// }
+//
+// public int getMaxSize() {
+// BigInteger test = getConnectionManager().getMaxSize();
+// return test == null ? 0 : test.intValue();
+// }
+//
+// public void setMaxSize(int maxSize) {
+// int old = getMaxSize();
+// getConnectionManager().setMaxSize(BigInteger.valueOf(maxSize));
+// pcs.firePropertyChange("maxSize", old, maxSize);
+// }
+//
+// public int getBlockingTimeout() {
+// BigInteger test = getConnectionManager().getBlockingTimeout();
+// return test == null ? 0 : test.intValue();
+// }
+//
+// public void setBlockingTimeout(int blockingTimeout) {
+// int old = getBlockingTimeout();
+// getConnectionManager().setBlockingTimeout(BigInteger.valueOf(blockingTimeout));
+// pcs.firePropertyChange("blockingTimeout", old, blockingTimeout);
+// }
public String getRealmBridgeName() {
return getConnectionManager().getRealmBridge();
1.4 +4 -8 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/LocalXAResource.java
Index: LocalXAResource.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/LocalXAResource.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LocalXAResource.java 10 Mar 2004 09:58:32 -0000 1.3
+++ LocalXAResource.java 6 May 2004 03:58:22 -0000 1.4
@@ -51,10 +51,8 @@
try {
localTransaction.commit();
} catch (ResourceException e) {
- XAException xae = new XAException();
- //xae.setLinkedException(e);
- throw xae;
- } finally {
+ throw (XAException)new XAException().initCause(e);
+ } finally {
this.xid = null;
}
@@ -83,9 +81,7 @@
try {
localTransaction.rollback();
} catch (ResourceException e) {
- XAException xae = new XAException();
- //xae.setLinkedException(e);
- throw xae;
+ throw (XAException)new XAException().initCause(e);
} finally {
this.xid = null;
}
1.5 +8 -5 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/MCFConnectionInterceptor.java
Index: MCFConnectionInterceptor.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/MCFConnectionInterceptor.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- MCFConnectionInterceptor.java 7 Apr 2004 22:37:10 -0000 1.4
+++ MCFConnectionInterceptor.java 6 May 2004 03:58:22 -0000 1.5
@@ -28,10 +28,9 @@
*/
public class MCFConnectionInterceptor implements ConnectionInterceptor {
- private final ConnectionManagerDeployment head;
+ private ConnectionInterceptor stack;
- public MCFConnectionInterceptor(ConnectionManagerDeployment head) {
- this.head = head;
+ public MCFConnectionInterceptor() {
}
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
@@ -41,7 +40,7 @@
mci.getSubject(),
mci.getConnectionRequestInfo());
mci.setManagedConnection(mc);
- GeronimoConnectionEventListener listener = new GeronimoConnectionEventListener(head.getStack(), mci);
+ GeronimoConnectionEventListener listener = new GeronimoConnectionEventListener(stack, mci);
mci.setConnectionEventListener(listener);
mc.addConnectionEventListener(listener);
}
@@ -60,6 +59,10 @@
} catch (Throwable t) {
//log and forget
}
+ }
+
+ public void setStack(ConnectionInterceptor stack) {
+ this.stack = stack;
}
}
1.4 +17 -22 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/MultiPoolConnectionInterceptor.java
Index: MultiPoolConnectionInterceptor.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/MultiPoolConnectionInterceptor.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- MultiPoolConnectionInterceptor.java 10 Mar 2004 09:58:32 -0000 1.3
+++ MultiPoolConnectionInterceptor.java 6 May 2004 03:58:22 -0000 1.4
@@ -25,21 +25,21 @@
import javax.resource.spi.ConnectionRequestInfo;
import javax.security.auth.Subject;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
+
/**
- * MultiPoolConnectionInterceptor.java
- *
+ * MultiPoolConnectionInterceptor maps the provided subject and connection request info to a
+ * "SinglePool". This can be used to make sure all matches will succeed, avoiding synchronization
+ * slowdowns.
*
* Created: Fri Oct 10 12:53:11 2003
*
- * @version 1.0
+ * @version $Revision$ $Date$
*/
public class MultiPoolConnectionInterceptor implements ConnectionInterceptor {
private final ConnectionInterceptor next;
-
- private int maxSize;
-
- private int blockingTimeout;
+ private final PoolingSupport singlePoolFactory;
private final boolean useSubject;
@@ -49,13 +49,11 @@
public MultiPoolConnectionInterceptor(
final ConnectionInterceptor next,
- int maxSize,
- int blockingTimeout,
+ PoolingSupport singlePoolFactory,
final boolean useSubject,
final boolean useCRI) {
this.next = next;
- this.maxSize = maxSize;
- this.blockingTimeout = blockingTimeout;
+ this.singlePoolFactory = singlePoolFactory;
this.useSubject = useSubject;
this.useCRI = useCRI;
}
@@ -66,20 +64,13 @@
new SubjectCRIKey(
useSubject ? mci.getSubject() : null,
useCRI ? mci.getConnectionRequestInfo() : null);
- SinglePoolConnectionInterceptor poolInterceptor = null;
+ ConnectionInterceptor poolInterceptor = null;
synchronized (pools) {
- poolInterceptor = (SinglePoolConnectionInterceptor) pools.get(key);
+ poolInterceptor = (ConnectionInterceptor) pools.get(key);
if (poolInterceptor == null) {
- poolInterceptor =
- new SinglePoolConnectionInterceptor(
- next,
- mci.getSubject(),
- mci.getConnectionRequestInfo(),
- maxSize,
- blockingTimeout);
+ poolInterceptor = singlePoolFactory.addPoolingInterceptors(next);
pools.put(key, poolInterceptor);
- } // end of if ()
-
+ }
}
mci.setPoolInterceptor(poolInterceptor);
poolInterceptor.getConnection(connectionInfo);
@@ -106,6 +97,10 @@
this.hashcode =
(subject == null ? 17 : subject.hashCode() * 17)
^ (cri == null ? 1 : cri.hashCode());
+ }
+
+ public int hashCode() {
+ return hashcode;
}
public boolean equals(Object other) {
1.5 +23 -22 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/SinglePoolConnectionInterceptor.java
Index: SinglePoolConnectionInterceptor.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/SinglePoolConnectionInterceptor.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SinglePoolConnectionInterceptor.java 7 Apr 2004 22:37:10 -0000 1.4
+++ SinglePoolConnectionInterceptor.java 6 May 2004 03:58:22 -0000 1.5
@@ -18,24 +18,25 @@
package org.apache.geronimo.connector.outbound;
import java.util.Collections;
+
import javax.resource.ResourceException;
-import javax.resource.spi.ConnectionRequestInfo;
import javax.resource.spi.ManagedConnection;
-import javax.security.auth.Subject;
+import EDU.oswego.cs.dl.util.concurrent.FIFOSemaphore;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import EDU.oswego.cs.dl.util.concurrent.FIFOSemaphore;
-
/**
- * SinglePoolConnectionInterceptor.java
- *
+ * SinglePoolConnectionInterceptor chooses a single connection from the pool. If selectOneAssumeMatch
+ * is true, it simply returns the selected connection.
+ * THIS SHOULD BE USED ONLY IF MAXIMUM SPEED IS ESSENTIAL AND YOU HAVE THOROUGLY CHECKED THAT
+ * MATCHING WOULD SUCCEED ON THE SELECTED CONNECTION. (i.e., read the docs on your connector
+ * to find out how matching works)
+ * If selectOneAssumeMatch is false, it checks with the ManagedConnectionFactory that the
+ * selected connection does match before returning it: if not it throws an exception.
*
- * Created: Thu Oct 9 12:49:18 2003
+ * @version $Revision$ $Date$
*
- * @author <a href="mailto:d_jencks@users.sourceforge.net">David Jencks</a>
- * @version 1.0
*/
public class SinglePoolConnectionInterceptor implements ConnectionInterceptor {
@@ -48,27 +49,19 @@
private PoolDeque pool;
- private final Subject defaultSubject;
-
- private final ConnectionRequestInfo defaultCRI;
-
- private int maxSize;
-
private int blockingTimeout;
+ private boolean selectOneAssumeMatch;
public SinglePoolConnectionInterceptor(
final ConnectionInterceptor next,
- final Subject defaultSubject,
- final ConnectionRequestInfo defaultCRI,
int maxSize,
- int blockingTimeout) {
+ int blockingTimeout,
+ boolean selectOneAssumeMatch) {
this.next = next;
- this.defaultSubject = defaultSubject;
- this.defaultCRI = defaultCRI;
- this.maxSize = maxSize;
this.blockingTimeout = blockingTimeout;
permits = new FIFOSemaphore(maxSize);
pool = new PoolDeque(maxSize);
+ this.selectOneAssumeMatch = selectOneAssumeMatch;
}
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
@@ -85,9 +78,17 @@
return;
} else {
newMCI = pool.removeLast();
- } // end of else
+ }
+ if (selectOneAssumeMatch) {
+ connectionInfo.setManagedConnectionInfo(newMCI);
+ if (log.isTraceEnabled()) {
+ log.trace("Returning pooled connection without checking matching " + connectionInfo.getManagedConnectionInfo());
+ }
+ return;
+ }
try {
ManagedConnection matchedMC =
+// newMCI.getManagedConnection();
newMCI
.getManagedConnectionFactory()
.matchManagedConnections(
1.6 +1 -3 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java
Index: TransactionCachingInterceptor.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TransactionCachingInterceptor.java 6 Apr 2004 00:21:21 -0000 1.5
+++ TransactionCachingInterceptor.java 6 May 2004 03:58:22 -0000 1.6
@@ -46,11 +46,9 @@
public class TransactionCachingInterceptor implements ConnectionInterceptor, ConnectionReleaser {
private final ConnectionInterceptor next;
- private final ConnectionTracker connectionTracker;
- public TransactionCachingInterceptor(final ConnectionInterceptor next, final ConnectionTracker connectionTracker) {
+ public TransactionCachingInterceptor(final ConnectionInterceptor next) {
this.next = next;
- this.connectionTracker = connectionTracker;
}
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
Index: AbstractConnectionManager.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound;
import javax.resource.ResourceException;
import javax.resource.spi.ConnectionManager;
import javax.resource.spi.ConnectionRequestInfo;
import javax.resource.spi.LazyAssociatableConnectionManager;
import javax.resource.spi.ManagedConnectionFactory;
import org.apache.geronimo.gbean.GBean;
import org.apache.geronimo.gbean.GBeanContext;
import org.apache.geronimo.gbean.GBeanInfo;
import org.apache.geronimo.gbean.GBeanInfoFactory;
import org.apache.geronimo.gbean.WaitingException;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public abstract class AbstractConnectionManager implements ConnectionManagerFactory, GBean, ConnectionManager, LazyAssociatableConnectionManager {
protected ConnectionInterceptor stack;
public AbstractConnectionManager() {
}
public void setGBeanContext(GBeanContext context) {
}
public void doStart() throws WaitingException, Exception{
setUpConnectionManager();
}
protected abstract void setUpConnectionManager() throws IllegalStateException;
public void doStop() {
stack = null;
}
public void doFail() {
}
public Object createConnectionFactory(ManagedConnectionFactory mcf) throws ResourceException {
return mcf.createConnectionFactory(this);
}
/**
* in: mcf != null, is a deployed mcf
* out: useable connection object.
* @param managedConnectionFactory
* @param connectionRequestInfo
* @return
* @throws javax.resource.ResourceException
*/
public Object allocateConnection(
ManagedConnectionFactory managedConnectionFactory,
ConnectionRequestInfo connectionRequestInfo)
throws ResourceException {
ManagedConnectionInfo mci = new ManagedConnectionInfo(managedConnectionFactory, connectionRequestInfo);
ConnectionInfo ci = new ConnectionInfo(mci);
stack.getConnection(ci);
return ci.getConnectionHandle();
}
/**
* in: non-null connection object, from non-null mcf.
* connection object is not associated with a managed connection
* out: supplied connection object is assiciated with a non-null ManagedConnection from mcf.
* @param connection
* @param managedConnectionFactory
* @param connectionRequestInfo
* @throws javax.resource.ResourceException
*/
public void associateConnection(
Object connection,
ManagedConnectionFactory managedConnectionFactory,
ConnectionRequestInfo connectionRequestInfo)
throws ResourceException {
ManagedConnectionInfo mci = new ManagedConnectionInfo(managedConnectionFactory, connectionRequestInfo);
ConnectionInfo ci = new ConnectionInfo(mci);
ci.setConnectionHandle(connection);
stack.getConnection(ci);
}
ConnectionInterceptor getConnectionInterceptor() {
return stack;
}
protected static final GBeanInfo GBEAN_INFO;
static {
GBeanInfoFactory infoFactory = new GBeanInfoFactory(AbstractConnectionManager.class.getName());
infoFactory.addOperation("createConnectionFactory", new Class[]{ManagedConnectionFactory.class});
GBEAN_INFO = infoFactory.getBeanInfo();
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/ConnectionInterceptorSource.java
Index: ConnectionInterceptorSource.java
===================================================================
package org.apache.geronimo.connector.outbound;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public interface ConnectionInterceptorSource {
ConnectionInterceptor getConnectionInterceptor();
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java
Index: GenericConnectionManager.java
===================================================================
/**
*
* Copyright 2003-2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PartitionedPool;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionSupport;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.XATransactions;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.SinglePool;
import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
import org.apache.geronimo.gbean.GBeanInfo;
import org.apache.geronimo.gbean.GBeanInfoFactory;
import org.apache.geronimo.security.bridge.RealmBridge;
/**
* GenericConnectionManager sets up a connection manager stack according to the
* policies described in the attributes.
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
* */
public class GenericConnectionManager extends AbstractConnectionManager {
//connection manager configuration choices
private TransactionSupport transactionSupport;
private PoolingSupport pooling;
/**
* Identifying string used by unshareable resource detection
*/
private String name;
//dependencies
protected RealmBridge realmBridge;
protected ConnectionTracker connectionTracker;
//default constructor for use as endpoint
public GenericConnectionManager() {
}
public GenericConnectionManager(TransactionSupport transactionSupport,
PoolingSupport pooling,
String name,
RealmBridge realmBridge,
ConnectionTracker connectionTracker) {
this.transactionSupport = transactionSupport;
this.pooling = pooling;
this.name = name;
this.realmBridge = realmBridge;
this.connectionTracker = connectionTracker;
}
/**
* Order of constructed interceptors:
*
* ConnectionTrackingInterceptor (connectionTracker != null)
* ConnectionHandleInterceptor
* TransactionCachingInterceptor (useTransactions & useTransactionCaching)
* TransactionEnlistingInterceptor (useTransactions)
* SubjectInterceptor (realmBridge != null)
* SinglePoolConnectionInterceptor or MultiPoolConnectionInterceptor
* LocalXAResourceInsertionInterceptor or XAResourceInsertionInterceptor (useTransactions (&localTransactions))
* MCFConnectionInterceptor
*/
protected void setUpConnectionManager() throws IllegalStateException {
//check for consistency between attributes
if (realmBridge == null && pooling instanceof PartitionedPool && ((PartitionedPool)pooling).isPartitionBySubject()) {
throw new IllegalStateException("To use Subject in pooling, you need a SecurityDomain");
}
//Set up the interceptor stack
MCFConnectionInterceptor tail = new MCFConnectionInterceptor();
ConnectionInterceptor stack = tail;
stack = transactionSupport.addXAResourceInsertionInterceptor(stack);
stack = pooling.addPoolingInterceptors(stack);
//experimental threadlocal caching
if (transactionSupport instanceof XATransactions && ((XATransactions)transactionSupport).isUseThreadCaching()) {
stack = new ThreadLocalCachingConnectionInterceptor(stack, false);
}
if (realmBridge != null) {
stack = new SubjectInterceptor(stack, realmBridge);
}
stack = transactionSupport.addTransactionInterceptors(stack);
stack = new ConnectionHandleInterceptor(stack);
if (connectionTracker != null) {
stack = new ConnectionTrackingInterceptor(
stack,
getName(),
connectionTracker,
realmBridge);
}
tail.setStack(stack);
this.stack = stack;
}
public TransactionSupport getTransactionSupport() {
return transactionSupport;
}
public void setTransactionSupport(TransactionSupport transactionSupport) {
this.transactionSupport = transactionSupport;
}
public PoolingSupport getPooling() {
return pooling;
}
public void setPooling(PoolingSupport pooling) {
this.pooling = pooling;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public RealmBridge getRealmBridge() {
return realmBridge;
}
public void setRealmBridge(RealmBridge realmBridge) {
this.realmBridge = realmBridge;
}
public ConnectionTracker getConnectionTracker() {
return connectionTracker;
}
public void setConnectionTracker(ConnectionTracker connectionTracker) {
this.connectionTracker = connectionTracker;
}
public static final GBeanInfo GBEAN_INFO;
static {
GBeanInfoFactory infoFactory = new GBeanInfoFactory(GenericConnectionManager.class.getName(), AbstractConnectionManager.GBEAN_INFO);
infoFactory.addAttribute("Name", true);
infoFactory.addAttribute("TransactionSupport", true);
infoFactory.addAttribute("Pooling", true);
infoFactory.addReference("ConnectionTracker", ConnectionTracker.class);
infoFactory.addReference("RealmBridge", RealmBridge.class);
infoFactory.setConstructor(
new String[]{"TransactionSupport", "Pooling", "Name", "RealmBridge", "ConnectionTracker"},
new Class[]{TransactionSupport.class, PoolingSupport.class, String.class, RealmBridge.class, ConnectionTracker.class});
GBEAN_INFO = infoFactory.getBeanInfo();
}
public static GBeanInfo getGBeanInfo() {
return GenericConnectionManager.GBEAN_INFO;
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/SinglePoolMatchAllConnectionInterceptor.java
Index: SinglePoolMatchAllConnectionInterceptor.java
===================================================================
/**
*
* Copyright 2003-2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.resource.ResourceException;
import javax.resource.spi.ManagedConnection;
import javax.resource.spi.ManagedConnectionFactory;
import EDU.oswego.cs.dl.util.concurrent.FIFOSemaphore;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* This pool is the most spec-compliant pool. It can be used by itself with no partitioning.
* It is apt to be the slowest pool.
* For each connection request, it synchronizes access to the pool and asks the
* ManagedConnectionFactory for a match from among all managed connections. If none is found,
* it may discard a random existing connection, and creates a new connection.
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*/
public class SinglePoolMatchAllConnectionInterceptor implements ConnectionInterceptor {
private static Log log = LogFactory.getLog(SinglePoolMatchAllConnectionInterceptor.class.getName());
private final ConnectionInterceptor next;
private FIFOSemaphore permits;
private HashMap pool;
private int maxSize;
private int blockingTimeout;
private int actualConnections = 0;
public SinglePoolMatchAllConnectionInterceptor(
final ConnectionInterceptor next,
int maxSize,
int blockingTimeout) {
this.next = next;
this.maxSize = maxSize;
this.blockingTimeout = blockingTimeout;
permits = new FIFOSemaphore(maxSize);
pool = new HashMap(maxSize);
}
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo();
ManagedConnectionFactory managedConnectionFactory = mci.getManagedConnectionFactory();
try {
if (permits.attempt(blockingTimeout)) {
synchronized (pool) {
try {
if (!pool.isEmpty()) {
ManagedConnection matchedMC =
managedConnectionFactory
.matchManagedConnections(
pool.keySet(),
mci.getSubject(),
mci.getConnectionRequestInfo());
if (matchedMC != null) {
connectionInfo.setManagedConnectionInfo((ManagedConnectionInfo) pool.get(matchedMC));
if (log.isTraceEnabled()) {
log.trace("Returning pooled connection " + connectionInfo.getManagedConnectionInfo());
}
return;
}
//matching failed or pool is empty
//if pool is at maximum size, pick a cx to kill
if (actualConnections == maxSize) {
Iterator iterator = pool.entrySet().iterator();
ManagedConnectionInfo kill = (ManagedConnectionInfo) ((Map.Entry) iterator.next()).getValue();
iterator.remove();
ConnectionInfo killInfo = new ConnectionInfo(kill);
returnConnection(killInfo, ConnectionReturnAction.DESTROY);
}
next.getConnection(connectionInfo);
actualConnections++;
if (log.isTraceEnabled()) {
log.trace("Returning new connection " + connectionInfo.getManagedConnectionInfo());
}
return;
}
} catch (ResourceException e) {
//something is wrong: rethrow, release permit
permits.release();
throw e;
}
}
} else {
throw new ResourceException(
"No ManagedConnections available "
+ "within configured blocking timeout ( "
+ blockingTimeout
+ " [ms] )");
} // end of else
} catch (InterruptedException ie) {
throw new ResourceException("Interrupted while requesting permit!");
} // end of try-catch
}
public void returnConnection(
ConnectionInfo connectionInfo,
ConnectionReturnAction connectionReturnAction) {
if (log.isTraceEnabled()) {
log.trace("returning connection" + connectionInfo.getConnectionHandle());
}
boolean wasInPool = false;
ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo();
if (connectionReturnAction == ConnectionReturnAction.DESTROY) {
synchronized (pool) {
wasInPool = (pool.remove(mci.getManagedConnection()) != null);
}
} else {
if (mci.hasConnectionHandles()) {
return;
}
} // end of else
ManagedConnection mc = mci.getManagedConnection();
try {
mc.cleanup();
} catch (ResourceException e) {
connectionReturnAction = ConnectionReturnAction.DESTROY;
}
if (connectionReturnAction == ConnectionReturnAction.DESTROY) {
actualConnections--;
next.returnConnection(connectionInfo, connectionReturnAction);
} else {
synchronized (pool) {
mci.setLastUsed(System.currentTimeMillis());
pool.put(mci.getManagedConnection(), mci);
}
}
if (!wasInPool) {
permits.release();
}
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig/LocalTransactions.java
Index: LocalTransactions.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.connectionmanagerconfig;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
import org.apache.geronimo.connector.outbound.LocalXAResourceInsertionInterceptor;
import org.apache.geronimo.connector.outbound.TransactionEnlistingInterceptor;
import org.apache.geronimo.connector.outbound.TransactionCachingInterceptor;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public class LocalTransactions extends TransactionSupport {
public static final TransactionSupport INSTANCE = new LocalTransactions();
private LocalTransactions() {
}
public ConnectionInterceptor addXAResourceInsertionInterceptor(ConnectionInterceptor stack) {
return new LocalXAResourceInsertionInterceptor(stack);
}
public ConnectionInterceptor addTransactionInterceptors(ConnectionInterceptor stack) {
stack = new TransactionEnlistingInterceptor(stack);
return new TransactionCachingInterceptor(stack);
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig/NoPool.java
Index: NoPool.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.connectionmanagerconfig;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public class NoPool extends PoolingSupport {
public ConnectionInterceptor addPoolingInterceptors(ConnectionInterceptor tail) {
return tail;
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig/NoTransactions.java
Index: NoTransactions.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.connectionmanagerconfig;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public class NoTransactions extends TransactionSupport {
public static final TransactionSupport INSTANCE = new NoTransactions();
private NoTransactions() {
}
public ConnectionInterceptor addXAResourceInsertionInterceptor(ConnectionInterceptor stack) {
return stack;
}
public ConnectionInterceptor addTransactionInterceptors(ConnectionInterceptor stack) {
return stack;
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig/PartitionedPool.java
Index: PartitionedPool.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.connectionmanagerconfig;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
import org.apache.geronimo.connector.outbound.MultiPoolConnectionInterceptor;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public class PartitionedPool extends PoolingSupport {
private boolean partitionByConnectionRequestInfo;
private boolean partitionBySubject;
private final SinglePool singlePool;
public PartitionedPool(boolean partitionByConnectionRequestInfo, boolean partitionBySubject, int maxSize, int blockingTimeoutMilliseconds, boolean matchOne, boolean matchAll, boolean selectOneAssumeMatch) {
singlePool = new SinglePool(maxSize, blockingTimeoutMilliseconds, matchOne, matchAll, selectOneAssumeMatch);
this.partitionByConnectionRequestInfo = partitionByConnectionRequestInfo;
this.partitionBySubject = partitionBySubject;
}
public boolean isPartitionByConnectionRequestInfo() {
return partitionByConnectionRequestInfo;
}
public void setPartitionByConnectionRequestInfo(boolean partitionByConnectionRequestInfo) {
this.partitionByConnectionRequestInfo = partitionByConnectionRequestInfo;
}
public boolean isPartitionBySubject() {
return partitionBySubject;
}
public void setPartitionBySubject(boolean partitionBySubject) {
this.partitionBySubject = partitionBySubject;
}
public int getMaxSize() {
return singlePool.getMaxSize();
}
public void setMaxSize(int maxSize) {
singlePool.setMaxSize(maxSize);
}
public int getBlockingTimeoutMilliseconds() {
return singlePool.getBlockingTimeoutMilliseconds();
}
public void setBlockingTimeoutMilliseconds(int blockingTimeoutMilliseconds) {
singlePool.setBlockingTimeoutMilliseconds(blockingTimeoutMilliseconds);
}
public boolean isMatchOne() {
return singlePool.isMatchOne();
}
public void setMatchOne(boolean matchOne) {
singlePool.setMatchOne(matchOne);
}
public boolean isMatchAll() {
return singlePool.isMatchAll();
}
public void setMatchAll(boolean matchAll) {
singlePool.setMatchAll(matchAll);
}
public boolean isSelectOneAssumeMatch() {
return singlePool.isSelectOneAssumeMatch();
}
public void setSelectOneAssumeMatch(boolean selectOneAssumeMatch) {
singlePool.setSelectOneAssumeMatch(selectOneAssumeMatch);
}
public ConnectionInterceptor addPoolingInterceptors(ConnectionInterceptor tail) {
return new MultiPoolConnectionInterceptor(
tail,
singlePool,
isPartitionBySubject(),
isPartitionByConnectionRequestInfo());
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig/PoolingSupport.java
Index: PoolingSupport.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.connectionmanagerconfig;
import java.io.Serializable;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public abstract class PoolingSupport implements Serializable {
public abstract ConnectionInterceptor addPoolingInterceptors(ConnectionInterceptor tail);
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig/SinglePool.java
Index: SinglePool.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.connectionmanagerconfig;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
import org.apache.geronimo.connector.outbound.SinglePoolConnectionInterceptor;
import org.apache.geronimo.connector.outbound.SinglePoolMatchAllConnectionInterceptor;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public class SinglePool extends PoolingSupport {
private int maxSize;
private int blockingTimeoutMilliseconds;
private boolean matchOne;
private boolean matchAll;
private boolean selectOneAssumeMatch;
public SinglePool(int maxSize, int blockingTimeoutMilliseconds, boolean matchOne, boolean matchAll, boolean selectOneAssumeMatch) {
this.maxSize = maxSize;
this.blockingTimeoutMilliseconds = blockingTimeoutMilliseconds;
this.matchOne = matchOne;
this.matchAll = matchAll;
this.selectOneAssumeMatch = selectOneAssumeMatch;
}
public int getMaxSize() {
return maxSize;
}
public void setMaxSize(int maxSize) {
this.maxSize = maxSize;
}
public int getBlockingTimeoutMilliseconds() {
return blockingTimeoutMilliseconds;
}
public void setBlockingTimeoutMilliseconds(int blockingTimeoutMilliseconds) {
this.blockingTimeoutMilliseconds = blockingTimeoutMilliseconds;
}
public boolean isMatchOne() {
return matchOne;
}
public void setMatchOne(boolean matchOne) {
this.matchOne = matchOne;
}
public boolean isMatchAll() {
return matchAll;
}
public void setMatchAll(boolean matchAll) {
this.matchAll = matchAll;
}
public boolean isSelectOneAssumeMatch() {
return selectOneAssumeMatch;
}
public void setSelectOneAssumeMatch(boolean selectOneAssumeMatch) {
this.selectOneAssumeMatch = selectOneAssumeMatch;
}
public ConnectionInterceptor addPoolingInterceptors(ConnectionInterceptor tail) {
if (isMatchAll()) {
return new SinglePoolMatchAllConnectionInterceptor(
tail,
getMaxSize(),
getBlockingTimeoutMilliseconds());
} else {
return new SinglePoolConnectionInterceptor(
tail,
getMaxSize(),
getBlockingTimeoutMilliseconds(),
isSelectOneAssumeMatch());
}
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig/TransactionLog.java
Index: TransactionLog.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.connectionmanagerconfig;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
import org.apache.geronimo.connector.outbound.TransactionEnlistingInterceptor;
import org.apache.geronimo.connector.outbound.TransactionCachingInterceptor;
import org.apache.geronimo.connector.outbound.transactionlog.LogXAResourceInsertionInterceptor;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public class TransactionLog extends TransactionSupport
{
public static final TransactionSupport INSTANCE = new TransactionLog();
private TransactionLog() {
}
public ConnectionInterceptor addXAResourceInsertionInterceptor(ConnectionInterceptor stack) {
return new LogXAResourceInsertionInterceptor(stack);
}
public ConnectionInterceptor addTransactionInterceptors(ConnectionInterceptor stack) {
stack = new TransactionEnlistingInterceptor(stack);
return new TransactionCachingInterceptor(stack);
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig/TransactionSupport.java
Index: TransactionSupport.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.connectionmanagerconfig;
import java.io.Serializable;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public abstract class TransactionSupport implements Serializable {
public abstract ConnectionInterceptor addXAResourceInsertionInterceptor(ConnectionInterceptor stack);
public abstract ConnectionInterceptor addTransactionInterceptors(ConnectionInterceptor stack);
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/connectionmanagerconfig/XATransactions.java
Index: XATransactions.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.connectionmanagerconfig;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
import org.apache.geronimo.connector.outbound.XAResourceInsertionInterceptor;
import org.apache.geronimo.connector.outbound.TransactionEnlistingInterceptor;
import org.apache.geronimo.connector.outbound.TransactionCachingInterceptor;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:22 $
*
* */
public class XATransactions extends TransactionSupport {
private boolean useTransactionCaching;
private boolean useThreadCaching;
public XATransactions(boolean useTransactionCaching, boolean useThreadCaching) {
this.useTransactionCaching = useTransactionCaching;
this.useThreadCaching = useThreadCaching;
}
public boolean isUseTransactionCaching() {
return useTransactionCaching;
}
public void setUseTransactionCaching(boolean useTransactionCaching) {
this.useTransactionCaching = useTransactionCaching;
}
public boolean isUseThreadCaching() {
return useThreadCaching;
}
public void setUseThreadCaching(boolean useThreadCaching) {
this.useThreadCaching = useThreadCaching;
}
public ConnectionInterceptor addXAResourceInsertionInterceptor(ConnectionInterceptor stack) {
return new XAResourceInsertionInterceptor(stack);
}
public ConnectionInterceptor addTransactionInterceptors(ConnectionInterceptor stack) {
stack = new TransactionEnlistingInterceptor(stack);
if (isUseTransactionCaching()) {
stack = new TransactionCachingInterceptor(stack);
}
return stack;
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/transactionlog/JDBCLog.java
Index: JDBCLog.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.transactionlog;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import javax.transaction.xa.Xid;
import org.apache.geronimo.gbean.GBeanInfo;
import org.apache.geronimo.gbean.GBeanInfoFactory;
import org.apache.geronimo.gbean.GBean;
import org.apache.geronimo.gbean.GBeanContext;
import org.apache.geronimo.gbean.WaitingException;
import org.apache.geronimo.transaction.manager.LogException;
import org.apache.geronimo.transaction.manager.TransactionLog;
import org.apache.geronimo.transaction.manager.XidImpl;
import org.apache.geronimo.connector.outbound.ManagedConnectionFactoryWrapper;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:23 $
*
* */
public class JDBCLog implements TransactionLog, GBean {
private final static String INSERT_XID = "INSERT INTO TXLOG (SYSTEMID, FORMATID, GLOBALID, BRANCHID) VALUES (?, ?, ?, ?)";
private final static String DELETE_XID = "DELETE FROM TXLOG WHERE SYSTEMID = ? AND FORMATID = ? AND GLOBALID = ? BRANCHID = ?";
private final static String RECOVER = "SELECT FORMATID, GLOBALID, BRANCHID FROM TXLOG WHERE SYSTEMID = ?";
private DataSource dataSource;
private final String systemId;
private final ManagedConnectionFactoryWrapper managedConnectionFactoryWrapper;
public JDBCLog(String systemId, ManagedConnectionFactoryWrapper managedConnectionFactoryWrapper) {
this.systemId = systemId;
this.managedConnectionFactoryWrapper = managedConnectionFactoryWrapper;
}
public void setGBeanContext(GBeanContext context) {
}
public void doStart() throws WaitingException, Exception {
dataSource = (DataSource)managedConnectionFactoryWrapper.getProxy();
}
public void doStop() throws WaitingException, Exception {
dataSource = null;
}
public void doFail() {
}
public void begin(Xid xid) throws LogException {
}
public void prepare(Xid xid) throws LogException {
xidOperation(xid, INSERT_XID);
}
private void xidOperation(Xid xid, String sql) throws LogException {
try {
Connection connection = dataSource.getConnection();
try {
PreparedStatement ps = connection.prepareStatement(sql);
try {
ps.setString(0, systemId);
ps.setInt(1, xid.getFormatId());
ps.setBytes(2, xid.getGlobalTransactionId());
ps.setBytes(3, xid.getBranchQualifier());
ps.execute();
} finally {
ps.close();
}
if (!connection.getAutoCommit()) {
connection.commit();
}
} finally {
connection.close();
}
} catch (SQLException e) {
throw new LogException("Failure during prepare or commit", e);
}
}
public void commit(Xid xid) throws LogException {
xidOperation(xid, DELETE_XID);
}
public void rollback(Xid xid) throws LogException {
throw new LogException("JDBCLog does not support rollback of prepared transactions. Use it only on servers that do not import transactions");
}
public List recover() throws LogException {
try {
Connection connection = dataSource.getConnection();
try {
List xids = new ArrayList();
PreparedStatement ps = connection.prepareStatement(RECOVER);
ps.setString(0, systemId);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
int formatId = rs.getInt(0);
byte[] globalId = rs.getBytes(1);
byte[] branchId = rs.getBytes(2);
Xid xid = new XidImpl(formatId, globalId, branchId);
xids.add(xid);
}
return xids;
} finally {
connection.close();
}
} catch (SQLException e) {
throw new LogException("Recover failure", e);
}
}
public String getXMLStats() {
return null;
}
public int getAverageForceTime() {
return 0;
}
public int getAverageBytesPerForce() {
return 0;
}
public static final GBeanInfo GBEAN_INFO;
static {
GBeanInfoFactory infoFactory = new GBeanInfoFactory(JDBCLog.class.getName());
infoFactory.addAttribute("SystemId", true);
infoFactory.addInterface(TransactionLog.class);
infoFactory.addReference("ManagedConnectionFactoryWrapper", ManagedConnectionFactoryWrapper.class);
infoFactory.setConstructor(
new String[]{"SystemId", "DataSource"},
new Class[]{String.class, DataSource.class});
GBEAN_INFO = infoFactory.getBeanInfo();
}
public static GBeanInfo getGBeanInfo() {
return GBEAN_INFO;
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/transactionlog/LogXAResource.java
Index: LogXAResource.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.transactionlog;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import javax.transaction.xa.XAException;
import javax.resource.ResourceException;
import javax.resource.spi.LocalTransaction;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:23 $
*
* */
public class LogXAResource implements XAResource {
final LocalTransaction localTransaction;
private Xid xid;
public LogXAResource(LocalTransaction localTransaction) {
this.localTransaction = localTransaction;
}
public void commit(Xid xid, boolean onePhase) throws XAException {
}
public void end(Xid xid, int flags) throws XAException {
}
public void forget(Xid xid) throws XAException {
}
public int getTransactionTimeout() throws XAException {
return 0;
}
public boolean isSameRM(XAResource xaResource) throws XAException {
return this == xaResource;
}
public int prepare(Xid xid) throws XAException {
return 0;
}
public Xid[] recover(int flag) throws XAException {
return new Xid[0];
}
public void rollback(Xid xid) throws XAException {
if (this.xid == null || !this.xid.equals(xid)) {
throw new XAException();
}
try {
localTransaction.rollback();
} catch (ResourceException e) {
throw (XAException)new XAException().initCause(e);
} finally {
this.xid = null;
}
}
public boolean setTransactionTimeout(int seconds) throws XAException {
return false;
}
public void start(Xid xid, int flag) throws XAException {
if (flag == XAResource.TMNOFLAGS) {
// first time in this transaction
if (this.xid != null) {
throw new XAException("already enlisted");
}
this.xid = xid;
try {
localTransaction.begin();
} catch (ResourceException e) {
throw (XAException) new XAException("could not start local tx").initCause(e);
}
} else if (flag == XAResource.TMRESUME) {
if (xid != this.xid) {
throw new XAException("attempting to resume in different transaction");
}
} else {
throw new XAException("unknown state");
}
}
}
1.1 incubator-geronimo/modules/connector/src/java/org/apache/geronimo/connector/outbound/transactionlog/LogXAResourceInsertionInterceptor.java
Index: LogXAResourceInsertionInterceptor.java
===================================================================
/**
*
* Copyright 2003-2004 The Apache Software Foundation
*
* 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.apache.geronimo.connector.outbound.transactionlog;
import javax.resource.ResourceException;
import org.apache.geronimo.connector.outbound.ConnectionInfo;
import org.apache.geronimo.connector.outbound.ConnectionInterceptor;
import org.apache.geronimo.connector.outbound.ConnectionReturnAction;
import org.apache.geronimo.connector.outbound.ManagedConnectionInfo;
/**
* LocalXAResourceInsertionInterceptor.java
*
*
* @version $Revision: 1.1 $ $Date: 2004/05/06 03:58:23 $
*/
public class LogXAResourceInsertionInterceptor
implements ConnectionInterceptor {
private final ConnectionInterceptor next;
public LogXAResourceInsertionInterceptor(final ConnectionInterceptor next) {
this.next = next;
}
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
next.getConnection(connectionInfo);
ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo();
mci.setXAResource(
new LogXAResource(
mci.getManagedConnection().getLocalTransaction()));
}
public void returnConnection(
ConnectionInfo connectionInfo,
ConnectionReturnAction connectionReturnAction) {
next.returnConnection(connectionInfo, connectionReturnAction);
}
}
1.13 +48 -21 incubator-geronimo/modules/connector/src/schema/geronimo-connector_1_5.xsd
Index: geronimo-connector_1_5.xsd
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/connector/src/schema/geronimo-connector_1_5.xsd,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- geronimo-connector_1_5.xsd 14 Apr 2004 04:01:25 -0000 1.12
+++ geronimo-connector_1_5.xsd 6 May 2004 03:58:23 -0000 1.13
@@ -222,9 +222,12 @@
type="ger:config-property-settingType"
minOccurs="0"
maxOccurs="unbounded"/>
- <xsd:element name="connectionmanager"
- type="ger:connectionmanagerType">
- </xsd:element>
+ <xsd:choice>
+ <xsd:element name="connectionmanager"
+ type="ger:connectionmanagerType">
+ </xsd:element>
+ <xsd:element name="connectionmanager-ref" type="xsd:string"/>
+ </xsd:choice>
<!-- will be bound in ger: context if present -->
<xsd:element name="global-jndi-name"
type="xsd:string"
@@ -241,8 +244,7 @@
<xsd:complexType name="connectionmanagerType">
<xsd:annotation>
<xsd:documentation>
-
- Specification of factory that will construct the ConnectionManager for us.
+ The ConnectionManager configuration.
</xsd:documentation>
</xsd:annotation>
@@ -251,23 +253,50 @@
<xsd:element name="realm-bridge"
type="xsd:string"
minOccurs="0"/>
- <xsd:element name="blockingTimeout"
- type="xsd:integer"/>
- <xsd:element name="maxSize"
- type="xsd:integer"/>
- <xsd:element name="useTransactions"
- type="xsd:boolean"/>
- <xsd:element name="useLocalTransactions"
- type="xsd:boolean"/>
- <xsd:element name="useTransactionCaching"
- type="xsd:boolean"/>
- <xsd:element name="useConnectionRequestInfo"
- type="xsd:boolean"/>
- <xsd:element name="useSubject"
- type="xsd:boolean"/>
+ <xsd:choice>
+ <xsd:element name="no-transaction"/>
+ <xsd:element name="local-transaction"/>
+ <xsd:element name="xa-transaction" type="ger:xatransaction-Type"/>
+ <xsd:element name="transaction-log"/>
+ </xsd:choice>
+ <xsd:choice>
+ <xsd:element name="no-pool"/>
+ <xsd:element name="single-pool" type="ger:singlepool-Type"/>
+ <xsd:element name="partitioned-pool" type="ger:partitionedpool-Type"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="xatransaction-Type">
+ <xsd:sequence>
+ <xsd:element name="transaction-caching" minOccurs="0"/>
+ <xsd:element name="thread-caching" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
+ <xsd:complexType name="singlepool-Type">
+ <xsd:sequence>
+ <xsd:element name="max-size" type="xsd:int"/>
+ <xsd:element name="blocking-timeout-milliseconds" type="xsd:int"/>
+ <xsd:choice>
+ <xsd:element name="match-one"/>
+ <xsd:element name="match-all"/>
+ <xsd:element name="select-one-assume-match"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="partitionedpool-Type">
+ <complexContent>
+ <extension base="ger:singlepool-Type">
+ <xsd:sequence>
+ <xsd:element name="partition-by-subject" minOccurs="0"/>
+ <xsd:element name="partition-by-connectionrequestinfo" minOccurs="0"/>
+ </xsd:sequence>
+ </extension>
+ </complexContent>
+ </xsd:complexType>
+
<!-- **************************************************** -->
<xsd:complexType name="connectorType">
@@ -359,8 +388,6 @@
<xsd:element name="connection-definition"
type="ger:connection-definitionType"
maxOccurs="unbounded"/>
- <xsd:element name="transaction-support"
- type="ger:transaction-supportType"/>
</xsd:sequence>
</xsd:complexType>