User: allsopp
Date: 01/01/31 23:59:49
Modified: src/main/org/jboss/resource ConnectionFactoryLoader.java
ConnectionFactoryLoaderMBean.java
Added: src/main/org/jboss/resource
ConnectionManagerFactoryLoader.java
ConnectionManagerFactoryLoaderMBean.java
JBossConnectionListenerImpl.java
JBossResourceSubjectFactory.java
Removed: src/main/org/jboss/resource ConnectionFactoryConfig.java
ConnectionManagerImpl.java
Log:
Preliminary support for the new pluggable ConnectionManager capability. The
old ConnectionManagerImpl is removed for now (it might come back later, but
Minerva is almost certainly going to be all we need).
This change breaks JCA. Be patient.
Revision Changes Path
1.2 +61 -67 jboss/src/main/org/jboss/resource/ConnectionFactoryLoader.java
Index: ConnectionFactoryLoader.java
===================================================================
RCS file:
/products/cvs/ejboss/jboss/src/main/org/jboss/resource/ConnectionFactoryLoader.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ConnectionFactoryLoader.java 2001/01/15 05:06:56 1.1
+++ ConnectionFactoryLoader.java 2001/02/01 07:59:44 1.2
@@ -58,7 +58,7 @@
*
* @see RARDeployer
* @author Toby Allsopp ([EMAIL PROTECTED])
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public class ConnectionFactoryLoader
extends ServiceMBeanSupport
@@ -68,40 +68,26 @@
// Attributes ----------------------------------------------------
- private MBeanServer server = null;
+ private MBeanServer server;
- private String resourceAdapterName = null;
- private String factoryName = null;
- private String properties = null;
- private String rarDeployerName = null;
+ private String resourceAdapterName;
+ private String factoryName;
+ private String properties;
+ private String rarDeployerName;
private String tmName = "java:/TransactionManager";
+ private String cmfName;
+ private String cmProps;
// Principal mapping parameters
private String princMapClass;
private String princMapProps;
- // Pool strategy parameters
- private String poolStrategy;
+ private ObjectName rarDeployerObjectName;
- // ObjectPool configuration parameters
- private int minSize;
- private int maxSize;
- private boolean blocking;
- private boolean gcEnabled;
- private long gcInterval;
- private long gcMinIdleTime;
- private boolean idleTimeoutEnabled;
- private long idleTimeout;
- private float maxIdleTimeoutPercent;
- private boolean invalidateOnError;
- private boolean timestampUsed;
-
- private ObjectName rarDeployerObjectName = null;
-
/** The JNDI name to which this connection factory is bound */
private String bindName;
- private ConnectionManagerImpl cm = null;
+ private JBossConnectionManager cm;
/** Maps factory name to <code>ConnectionFactory</code> instance
for JNDI lookups */
@@ -135,6 +121,12 @@
public String getTransactionManagerName() { return tmName; }
public void setTransactionManagerName(String n) { tmName = n; }
+ public String getConnectionManagerFactoryName() { return cmfName; }
+ public void setConnectionManagerFactoryName(String c) { cmfName = c; }
+
+ public String getConnectionManagerProperties() { return cmProps; }
+ public void setConnectionManagerProperties(String p) { cmProps = p; }
+
// Pincipal mapping settings
public String getPrincipalMappingClass() { return princMapClass; }
@@ -143,44 +135,6 @@
public String getPrincipalMappingProperties() { return princMapProps; }
public void setPrincipalMappingProperties(String p) { princMapProps = p; }
- // Object pool settings
-
- public String getPoolStrategy() { return poolStrategy; }
- public void setPoolStrategy(String strategy) { poolStrategy = strategy; }
-
- public int getMinSize() { return minSize; }
- public void setMinSize(int minSize) { this.minSize = minSize; }
-
- public int getMaxSize() { return maxSize; }
- public void setMaxSize(int maxSize) { this.maxSize = maxSize; }
-
- public boolean getBlocking() { return blocking; }
- public void setBlocking(boolean blocking) { this.blocking = blocking; }
-
- public boolean getGCEnabled() { return gcEnabled; }
- public void setGCEnabled(boolean gcEnabled) { this.gcEnabled = gcEnabled; }
-
- public long getGCInterval() { return gcInterval; }
- public void setGCInterval(long interval) { this.gcInterval = interval; }
-
- public long getGCMinIdleTime() { return gcMinIdleTime; }
- public void setGCMinIdleTime(long idleMillis) { gcMinIdleTime = idleMillis; }
-
- public boolean getIdleTimeoutEnabled() { return idleTimeoutEnabled; }
- public void setIdleTimeoutEnabled(boolean e) { idleTimeoutEnabled = e; }
-
- public long getIdleTimeout() { return idleTimeout; }
- public void setIdleTimeout(long idleMillis) { idleTimeout = idleMillis; }
-
- public float getMaxIdleTimeoutPercent() { return maxIdleTimeoutPercent; }
- public void setMaxIdleTimeoutPercent(float p) { maxIdleTimeoutPercent = p; }
-
- public boolean getInvalidateOnError() { return invalidateOnError; }
- public void setInvalidateOnError(boolean i) { invalidateOnError = i; }
-
- public boolean getTimestampUsed() { return timestampUsed; }
- public void setTimestampUsed(boolean tstamp) { timestampUsed = tstamp; }
-
// ServiceMBeanSupport overrides ---------------------------------
public String getName() { return "ConnectionFactoryLoader"; }
@@ -453,20 +407,60 @@
principalMapping.setRARMetaData(metaData);
principalMapping.setProperties(princMapProps);
- // Create the connection manager
+ // Find the connection manager factory
+ ConnectionManagerFactory cmf ;
try
{
- cm = new ConnectionManagerImpl(metaData, this, mcf, log, tm,
- principalMapping);
+ cmf = (ConnectionManagerFactory) ctx.lookup("java:/" + cmfName);
}
catch (Exception e)
{
- log.error("Unable to create connection manager");
+ log.error("Unable to find connection manager factory at 'java:/" +
+ cmfName + "'");
log.exception(e);
return;
}
+ // Configure the connection manager
+
+ ConnectorConfig cmConfig = new ConnectorConfig();
+
+ cmConfig.logWriter = logWriter;
+ cmConfig.rsf = new JBossResourceSubjectFactory(principalMapping);
+ cmConfig.isReauthenticationSupported =
+ metaData.getReauthenticationSupport();
+ JBossConnectionListenerImpl listener =
+ new JBossConnectionListenerImpl(mcf, log);
+ cmConfig.listener = listener;
+
+ Properties cmProperties = new Properties();
+ try
+ {
+ cmProperties.load(
+ new ByteArrayInputStream(cmProps.getBytes("ISO-8859-1")));
+ cmConfig.properties = cmProperties;
+ }
+ catch (IOException ioe)
+ {
+ log.error("Couldn't convert properties string '" + cmProps + "' to " +
+ "Properties");
+ log.exception(ioe);
+ }
+
+ try
+ {
+ cm = cmf.addManagedConnectionFactory(mcf, cmConfig, factoryName);
+ }
+ catch (ResourceException re)
+ {
+ log.error("Error initialising connection manager");
+ log.exception(re);
+ return;
+ }
+
+ listener.setConnectionManager(cm);
+
// Create us a connection factory
Object cf;
@@ -514,7 +508,7 @@
{
// Destroy any managed connections
- cm.shutdown();
+ cm.shutDown();
cfs.remove(factoryName);
log.log("Connection factory '" + factoryName + "' shut down.");
1.2 +34 -2
jboss/src/main/org/jboss/resource/ConnectionFactoryLoaderMBean.java
Index: ConnectionFactoryLoaderMBean.java
===================================================================
RCS file:
/products/cvs/ejboss/jboss/src/main/org/jboss/resource/ConnectionFactoryLoaderMBean.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ConnectionFactoryLoaderMBean.java 2001/01/15 05:06:56 1.1
+++ ConnectionFactoryLoaderMBean.java 2001/02/01 07:59:44 1.2
@@ -17,10 +17,10 @@
*
* @see RARDeployer
* @author Toby Allsopp ([EMAIL PROTECTED])
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public interface ConnectionFactoryLoaderMBean
- extends ServiceMBean, ConnectionFactoryConfig
+ extends ServiceMBean
{
String OBJECT_NAME = ":service=ConnectionFactoryLoader";
String DEPLOYMENT_NOTIFICATION = "org.jboss.resource.deployment";
@@ -66,4 +66,36 @@
*/
String getTransactionManagerName();
void setTransactionManagerName(String transactionManagerName);
+
+ /**
+ * The name of the connection manager factory to use. This is the
+ * same name specified in the corresponding
+ * <code>ConnectionManagerFactoryLoader</code> MBean.
+ */
+ String getConnectionManagerFactoryName();
+ void setConnectionManagerFactoryName(String connectionManagerFactoryName);
+
+ /**
+ * The properties to set on the connection manager.
+ */
+ String getConnectionManagerProperties();
+ void setConnectionManagerProperties(String properties);
+
+ /**
+ * The name of the class implementing {@link
+ * org.jboss.resource.security.PrincipalMapping} that is to be used
+ * for mapping caller principals to resource principals for this
+ * connection factory.
+ */
+ String getPrincipalMappingClass();
+ void setPrincipalMappingClass(String className);
+
+ /**
+ * A string in a format parseable by {@link
+ * java.util.Properties#load} that defines the properties to set on
+ * the <code>PrincipalMapping</code> for this connection factory
+ * instance.
+ */
+ String getPrincipalMappingProperties();
+ void setPrincipalMappingProperties(String properties);
}
1.1
jboss/src/main/org/jboss/resource/ConnectionManagerFactoryLoader.java
Index: ConnectionManagerFactoryLoader.java
===================================================================
/*
* JBoss, the OpenSource EJB server
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.resource;
import java.io.ByteArrayInputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;
import javax.transaction.TransactionManager;
import org.jboss.logging.Log;
import org.jboss.logging.LogWriter;
import org.jboss.util.ServiceMBeanSupport;
/**
* Binds a <code>ConnectionManagerFactory</code> instance into JNDI
* so that <code>ConnectionFactoryLoader</code>s can get at it.
*
* @author Toby Allsopp ([EMAIL PROTECTED])
* @version $Revision: 1.1 $
*/
public class ConnectionManagerFactoryLoader
extends ServiceMBeanSupport
implements ConnectionManagerFactoryLoaderMBean, ObjectFactory
{
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
private String factoryName;
private String factoryClass;
private String properties;
private String tmName = "java:/TransactionManager";
/** The JNDI name to which this connection manager factory is bound */
private String bindName;
private ConnectionManagerFactory cmf;
/** Maps factory name to <code>ConnectionManagerFactory</code>
instance for JNDI lookups */
private static Map cmfs = new HashMap();
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
// Public --------------------------------------------------------
// ConnectionManagerFactoryLoaderMBean implementation ------------
public String getFactoryName() { return factoryName; }
public void setFactoryName(String name) { this.factoryName = name; }
public String getProperties() { return properties; }
public void setProperties(String p) { this.properties = p; }
public String getTransactionManagerName() { return tmName; }
public void setTransactionManagerName(String n) { tmName = n; }
public String getFactoryClass() { return factoryClass; }
public void setFactoryClass(String c) { factoryClass = c; }
// ServiceMBeanSupport overrides ---------------------------------
public String getName() { return "ConnectionManagerFactoryLoader"; }
protected ObjectName getObjectName(MBeanServer server, ObjectName name)
{
if (name == null)
{
String nameStr = OBJECT_NAME + ",name=" + factoryName;
try
{
name = new ObjectName(nameStr);
}
catch (MalformedObjectNameException mone)
{
log.error("The name '" + nameStr + "' is malformed");
log.exception(mone);
}
}
return name;
}
protected void initService() throws Exception
{
log = Log.createLog(factoryName);
}
public void startService() throws Exception
{
Context ctx = new InitialContext();
Class cls = Class.forName(factoryClass);
cmf = (ConnectionManagerFactory) cls.newInstance();
PrintWriter writer = new LogWriter(log);
cmf.setLogWriter(writer);
TransactionManager tm = (TransactionManager) ctx.lookup(tmName);
cmf.setTransactionManager(tm);
if( properties != null )
{
Properties props = new Properties();
props.load(
new ByteArrayInputStream(properties.getBytes("IS0-8859-1")));
cmf.setProperties(props);
}
// Bind in JNDI
synchronized(cmfs)
{
cmfs.put(factoryName, cmf);
}
bind(ctx, "java:/" + factoryName,
new Reference(cmf.getClass().getName(), getClass().getName(), null));
log.log("Connection manager factory '" + factoryName + " bound to " +
"'java:/" + factoryName + "'");
}
public void stopService()
{
// Unbind from JNDI
try
{
new InitialContext().unbind("java:/" + factoryName);
log.log("Connection manager factory '" + factoryName +
"' removed from JNDI");
}
catch (NamingException e) { }
}
// ObjectFactory implementation ----------------------------------
public Object getObjectInstance(Object obj, Name name, Context nameCtx,
Hashtable environment)
{
// Return the connection factory with the requested name
Log.getLog().debug("ConnectionManagerLoader.getObjectInstance, name = '" +
name + "'");
synchronized (cmfs)
{
return cmfs.get(name.toString());
}
}
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
private void bind(Context ctx, String name, Object val)
throws NamingException
{
// Bind val to name in ctx, and make sure that all intermediate
// contexts exist
Name n = ctx.getNameParser("").parse(name);
while (n.size() > 1)
{
String ctxName = n.get(0);
try
{
ctx = (Context)ctx.lookup(ctxName);
} catch (NameNotFoundException e)
{
ctx = ctx.createSubcontext(ctxName);
}
n = n.getSuffix(1);
}
ctx.bind(n.get(0), val);
}
// Inner classes -------------------------------------------------
}
1.1
jboss/src/main/org/jboss/resource/ConnectionManagerFactoryLoaderMBean.java
Index: ConnectionManagerFactoryLoaderMBean.java
===================================================================
/*
* JBoss, the OpenSource EJB server
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.resource;
import org.jboss.util.ServiceMBean;
/**
* Binds a <code>ConnectionManagerFactory</code> instance into JNDI
* so that <code>ConnectionFactoryLoader</code>s can get at it.
*
* @see
* @author Toby Allsopp ([EMAIL PROTECTED])
* @version $Revision: 1.1 $
*/
public interface ConnectionManagerFactoryLoaderMBean
extends ServiceMBean
{
// Constants -----------------------------------------------------
String OBJECT_NAME = "JCA:service=ConnectionManagerFactoryLoader";
// Public --------------------------------------------------------
String getFactoryName();
void setFactoryName(String name);
String getProperties();
void setProperties(String p);
String getTransactionManagerName();
void setTransactionManagerName(String n);
String getFactoryClass();
void setFactoryClass(String c);
}
1.1
jboss/src/main/org/jboss/resource/JBossConnectionListenerImpl.java
Index: JBossConnectionListenerImpl.java
===================================================================
/*
* JBoss, the OpenSource EJB server
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.resource;
import javax.resource.spi.ManagedConnectionFactory;
import org.jboss.logging.Log;
/**
* There exists one instance of this class for each connection
* factory. This instance is notified by the connection manager when
* an application component is issued or closes a connectio handle
* obtained from the managed connection factory loaded by the
* connection factory.
*
* @see ConnectionManagerFactory
* @author Toby Allsopp ([EMAIL PROTECTED])
* @version $Revision: 1.1 $
*/
public class JBossConnectionListenerImpl
implements JBossConnectionListener
{
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
private ManagedConnectionFactory mcf;
private JBossConnectionManager cm;
private Log log;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
JBossConnectionListenerImpl(ManagedConnectionFactory mcf, Log log)
{
this.mcf = mcf;
this.log = log;
}
// Public --------------------------------------------------------
// JBossConnectionListener implementation ------------------------
public void connectionHandleIssued(Object connection)
{
log.debug("Connection handle '" + connection +
"' issued by connection manager '" + cm + "' from mcf '" +
mcf + "'");
}
public void connectionHandleClosed(Object connection)
{
log.debug("Connection handle '" + connection +
"' closed from connection manager '" + cm + "' from mcf '" +
mcf + "'");
}
// Package protected ---------------------------------------------
void setConnectionManager(JBossConnectionManager cm) { this.cm = cm; }
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}
1.1
jboss/src/main/org/jboss/resource/JBossResourceSubjectFactory.java
Index: JBossResourceSubjectFactory.java
===================================================================
/*
* JBoss, the OpenSource EJB server
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.resource;
import java.security.Principal;
import javax.security.auth.Subject;
import javax.resource.spi.ManagedConnectionFactory;
import org.jboss.resource.security.PrincipalMapping;
import org.jboss.security.SecurityAssociation;
/**
* Provides the configured (via <code>PrincipalMapping</code>)
* mapping from the principal an application component is running as
* to a <code>Subject</code> identifying the resource principal for
* container-managed resource sign-on.
*
* @author Toby Allsopp ([EMAIL PROTECTED])
* @version $Revision: 1.1 $
*/
public class JBossResourceSubjectFactory
implements ResourceSubjectFactory
{
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
private PrincipalMapping principalMapping;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
public JBossResourceSubjectFactory(PrincipalMapping principalMapping)
{
this.principalMapping = principalMapping;
}
// Public --------------------------------------------------------
// ResourceSubjectFactory implementation -------------------------
public Subject getSubject(ManagedConnectionFactory mcf, String cmName)
{
Principal callerPrincipal = SecurityAssociation.getPrincipal();
return principalMapping.createSubject(callerPrincipal);
}
// Y overrides ---------------------------------------------------
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}