You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by am...@apache.org on 2005/11/13 04:56:28 UTC

svn commit: r332881 [1/2] - in /geronimo/trunk: applications/console-core/src/java/org/apache/geronimo/console/util/ applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/ applications/console-standard/src/java/org/a...

Author: ammulder
Date: Sat Nov 12 19:56:12 2005
New Revision: 332881

URL: http://svn.apache.org/viewcvs?rev=332881&view=rev
Log:
GERONIMO-1160 : Finish the first pass at the database pools portlet
 - Better access to dynamic GBean properties (used by connectors)
 - Connector MCF can navigate you to ConnectionManager
 - ResourceAdapterModule captures some basic info from the J2EE DD
 - Added Derby to known databases
 - Now handles XA and non-TranQL JDBC resource adapters
 - Now editing an existing pool works

Added:
    geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/ResourceAdapterModule.java   (with props)
Modified:
    geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java
    geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java
    geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabaseInfo.java
    geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabasePoolPortlet.java
    geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java
    geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/basicParams.jsp
    geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/confirmURL.jsp
    geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/edit.jsp
    geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/list.jsp
    geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/selectDatabase.jsp
    geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/selectDownload.jsp
    geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/testConnection.jsp
    geronimo/trunk/modules/connector-builder/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java
    geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/ResourceAdapterModuleImpl.java
    geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/ResourceAdapterModuleImplGBean.java
    geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionFactoryWrapper.java
    geronimo/trunk/modules/deploy-tool/src/java/org/apache/geronimo/deployment/cli/CommandLogin.java
    geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/DynamicGBeanDelegate.java
    geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/JCAManagedConnectionFactory.java

Modified: geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java (original)
+++ geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java Sat Nov 12 19:56:12 2005
@@ -27,7 +27,6 @@
 import org.apache.geronimo.management.AppClientModule;
 import org.apache.geronimo.management.WebModule;
 import org.apache.geronimo.management.EJBModule;
-import org.apache.geronimo.management.ResourceAdapterModule;
 import org.apache.geronimo.management.J2EEResource;
 import org.apache.geronimo.management.JCAResource;
 import org.apache.geronimo.management.JDBCResource;
@@ -42,6 +41,7 @@
 import org.apache.geronimo.management.geronimo.J2EEServer;
 import org.apache.geronimo.management.geronimo.J2EEApplication;
 import org.apache.geronimo.management.geronimo.JVM;
+import org.apache.geronimo.management.geronimo.ResourceAdapterModule;
 import org.apache.geronimo.management.geronimo.WebContainer;
 import org.apache.geronimo.management.geronimo.WebConnector;
 import org.apache.geronimo.management.geronimo.WebManager;
@@ -285,6 +285,62 @@
             log.error("Unable to look up related GBean", e);
         }
         return (ResourceAdapterModule[]) list.toArray(new ResourceAdapterModule[list.size()]);
+    }
+
+    public JCAManagedConnectionFactory[] getOutboundFactories(ResourceAdapterModule module) {
+        List list = new ArrayList();
+        try {
+            ResourceAdapter[] adapters = getResourceAdapters(module);
+            for (int j = 0; j < adapters.length; j++) {
+                ResourceAdapter adapter = adapters[j];
+                JCAResource[] resources = getRAResources(adapter);
+                for (int k = 0; k < resources.length; k++) {
+                    JCAResource resource = resources[k];
+                    JCAConnectionFactory[] factories = getConnectionFactories(resource);
+                    for (int l = 0; l < factories.length; l++) {
+                        JCAConnectionFactory factory = factories[l];
+                        JCAManagedConnectionFactory mcf = getManagedConnectionFactory(factory);
+                        list.add(mcf);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("Unable to look up related GBean", e);
+        }
+        return (JCAManagedConnectionFactory[]) list.toArray(new JCAManagedConnectionFactory[list.size()]);
+    }
+
+    public JCAManagedConnectionFactory[] getOutboundFactories(ResourceAdapterModule module, String connectionFactoryInterface) {
+        List list = new ArrayList();
+        try {
+            ResourceAdapter[] adapters = getResourceAdapters(module);
+            for (int j = 0; j < adapters.length; j++) {
+                ResourceAdapter adapter = adapters[j];
+                JCAResource[] resources = getRAResources(adapter);
+                for (int k = 0; k < resources.length; k++) {
+                    JCAResource resource = resources[k];
+                    JCAConnectionFactory[] factories = getConnectionFactories(resource);
+                    for (int l = 0; l < factories.length; l++) {
+                        JCAConnectionFactory factory = factories[l];
+                        JCAManagedConnectionFactory mcf = getManagedConnectionFactory(factory);
+                        if(mcf.getConnectionFactoryInterface().equals(connectionFactoryInterface)) {
+                            list.add(mcf);
+                            continue;
+                        }
+                        for (int m = 0; m < mcf.getImplementedInterfaces().length; m++) {
+                            String iface = mcf.getImplementedInterfaces()[m];
+                            if(iface.equals(connectionFactoryInterface)) {
+                                list.add(mcf);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("Unable to look up related GBean", e);
+        }
+        return (JCAManagedConnectionFactory[]) list.toArray(new JCAManagedConnectionFactory[list.size()]);
     }
 
     public J2EEResource[] getResources(J2EEServer server) {

Modified: geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java (original)
+++ geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java Sat Nov 12 19:56:12 2005
@@ -16,27 +16,39 @@
  */
 package org.apache.geronimo.console.util;
 
-import org.apache.geronimo.management.J2EEDomain;
-import org.apache.geronimo.management.J2EEDeployedObject;
-import org.apache.geronimo.management.J2EEResource;
+import org.apache.geronimo.kernel.repository.Repository;
 import org.apache.geronimo.management.AppClientModule;
-import org.apache.geronimo.management.WebModule;
+import org.apache.geronimo.management.EJB;
 import org.apache.geronimo.management.EJBModule;
-import org.apache.geronimo.management.ResourceAdapterModule;
+import org.apache.geronimo.management.J2EEDeployedObject;
+import org.apache.geronimo.management.J2EEDomain;
 import org.apache.geronimo.management.J2EEModule;
+import org.apache.geronimo.management.J2EEResource;
+import org.apache.geronimo.management.JCAConnectionFactory;
 import org.apache.geronimo.management.JCAResource;
-import org.apache.geronimo.management.JDBCResource;
-import org.apache.geronimo.management.JMSResource;
 import org.apache.geronimo.management.JDBCDataSource;
 import org.apache.geronimo.management.JDBCDriver;
-import org.apache.geronimo.management.JCAConnectionFactory;
-import org.apache.geronimo.management.EJB;
-import org.apache.geronimo.management.Servlet;
+import org.apache.geronimo.management.JDBCResource;
+import org.apache.geronimo.management.JMSResource;
 import org.apache.geronimo.management.ResourceAdapter;
-import org.apache.geronimo.management.geronimo.*;
-import org.apache.geronimo.system.logging.SystemLog;
+import org.apache.geronimo.management.Servlet;
+import org.apache.geronimo.management.WebModule;
+import org.apache.geronimo.management.geronimo.EJBConnector;
+import org.apache.geronimo.management.geronimo.EJBManager;
+import org.apache.geronimo.management.geronimo.J2EEApplication;
+import org.apache.geronimo.management.geronimo.J2EEServer;
+import org.apache.geronimo.management.geronimo.JCAManagedConnectionFactory;
+import org.apache.geronimo.management.geronimo.JMSBroker;
+import org.apache.geronimo.management.geronimo.JMSConnector;
+import org.apache.geronimo.management.geronimo.JMSManager;
+import org.apache.geronimo.management.geronimo.JVM;
+import org.apache.geronimo.management.geronimo.ResourceAdapterModule;
+import org.apache.geronimo.management.geronimo.WebAccessLog;
+import org.apache.geronimo.management.geronimo.WebConnector;
+import org.apache.geronimo.management.geronimo.WebContainer;
+import org.apache.geronimo.management.geronimo.WebManager;
 import org.apache.geronimo.pool.GeronimoExecutor;
-import org.apache.geronimo.kernel.repository.Repository;
+import org.apache.geronimo.system.logging.SystemLog;
 
 /**
  * A helper interface to navigate between management objects.  This is not
@@ -112,6 +124,8 @@
     EJB[] getEJBs(EJBModule module);
     Servlet[] getServlets(WebModule module);
     ResourceAdapter[] getResourceAdapters(ResourceAdapterModule module);
+    JCAManagedConnectionFactory[] getOutboundFactories(ResourceAdapterModule module);
+    JCAManagedConnectionFactory[] getOutboundFactories(ResourceAdapterModule module, String connectionFactoryInterface);
 
     // resource adapter properties
     JCAResource[] getRAResources(ResourceAdapter adapter);

Modified: geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabaseInfo.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabaseInfo.java?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabaseInfo.java (original)
+++ geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabaseInfo.java Sat Nov 12 19:56:12 2005
@@ -27,36 +27,50 @@
  * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $
  */
 public class DatabaseInfo {
+    /**
+     * todo: EVIL!!!  Should be replaced with something, somehow!
+     */
+    private final static String TRANQL_RAR_NAME = "tranql/rars/tranql-connector-1.0.rar";
+    private final static String DERBY_EMBEDDED_RAR_NAME = "tranql/rars/tranql-connector-derby-embed-xa-1.0.rar";
+    private final static String DERBY_NETWORK_RAR_NAME = "tranql/rars/tranql-connector-derby-client-xa-1.0.rar";
+
+    //todo: Load this from a config file or something
     public static final DatabaseInfo[] ALL_DATABASES = new DatabaseInfo[]{
-        new DatabaseInfo("DaffodilDB Embedded","jdbc:daffodilDB_embedded:<database>","in.co.daffodil.db.jdbc.DaffodilDBDriver"),
-        new DatabaseInfo("DaffodilDB Server","jdbc:daffodilDB://<host>:<port>/<database>","in.co.daffodil.db.rmi.RmiDaffodilDBDriver", 3456),
-        new DatabaseInfo("DB2","jdbc:db2://<host>:<port>/<database>","com.ibm.db2.jcc.DB2Driver", 50000),
-        new DatabaseInfo("DB2 (DataDirect)","jdbc:datadirect:db2://<host>:<port>;DatabaseName=<database>","com.ddtek.jdbc.db2.DB2Driver", 50000),
-        new DatabaseInfo("FrontBase","jdbc:FrontBase://<host>:<port>/<database>","com.frontbase.jdbc.FBJDriver"),
-        new DatabaseInfo("HSQLDB embedded","jdbc:hsqldb:<database>","org.hsqldb.jdbcDriver"),
-        new DatabaseInfo("HSQLDB server","jdbc:hsqldb:hsql://<host>:<port>/<database>","org.hsqldb.jdbcDriver"),
-        new DatabaseInfo("Informix","jdbc:informix-sqli://<host>:<port>/<database>:informixserver=<dbservername>","com.informix.jdbc.IfxDriver"),
-        new DatabaseInfo("Informix (DataDirect)","jdbc:datadirect:informix://<host>:<port>;informixServer=<dbservername>;DatabaseName=<database>","com.ddtek.jdbc.informix.InformixDriver"),
-        new DatabaseInfo("InterSystems Cache","jdbc:Cache://<host>:<port>/<namespace>","com.intersys.jdbc.CacheDriver"),
+        new DatabaseInfo("DaffodilDB Embedded","jdbc:daffodilDB_embedded:<Database>","in.co.daffodil.db.jdbc.DaffodilDBDriver"),
+        new DatabaseInfo("DaffodilDB Server","jdbc:daffodilDB://<Host>:<Port>/<Database>","in.co.daffodil.db.rmi.RmiDaffodilDBDriver", 3456),
+        new DatabaseInfo("DB2","jdbc:db2://<Host>:<Port>/<Database>","com.ibm.db2.jcc.DB2Driver", 50000),
+        new DatabaseInfo("DB2 (DataDirect)","jdbc:datadirect:db2://<Host>:<Port>;DatabaseName=<Database>","com.ddtek.jdbc.db2.DB2Driver", 50000),
+        new DatabaseInfo("Derby embedded","jdbc:derby:<Database>","org.apache.derby.jdbc.EmbeddedDriver"),
+        new DatabaseInfo("Derby network","jdbc:derby://<Host>:<Port>/<Database>","org.apache.derby.jdbc.ClientDriver", 1527),
+        new DatabaseInfo("Derby embedded XA", DERBY_EMBEDDED_RAR_NAME),
+        new DatabaseInfo("Derby network XA", DERBY_NETWORK_RAR_NAME),
+        new DatabaseInfo("FrontBase","jdbc:FrontBase://<Host>:<Port>/<Database>","com.frontbase.jdbc.FBJDriver"),
+        new DatabaseInfo("HSQLDB embedded","jdbc:hsqldb:<Database>","org.hsqldb.jdbcDriver"),
+        new DatabaseInfo("HSQLDB server","jdbc:hsqldb:hsql://<Host>:<Port>/<Database>","org.hsqldb.jdbcDriver"),
+        new DatabaseInfo("Informix","jdbc:informix-sqli://<Host>:<Port>/<Database>:informixserver=<dbservername>","com.informix.jdbc.IfxDriver"),
+        new DatabaseInfo("Informix (DataDirect)","jdbc:datadirect:informix://<Host>:<Port>;informixServer=<dbservername>;DatabaseName=<Database>","com.ddtek.jdbc.informix.InformixDriver"),
+        new DatabaseInfo("InterSystems Cache","jdbc:Cache://<Host>:<Port>/<namespace>","com.intersys.jdbc.CacheDriver"),
         new DatabaseInfo("JDataStore","jdbc:borland:dslocal:<file>","com.borland.datastore.jdbc.DataStoreDriver"),
         new DatabaseInfo("JDBC/ODBC Bridge","jdbc:odbc:<datasource>","sun.jdbc.odbc.JdbcOdbcDriver"),
-        new DatabaseInfo("McKoi","jdbc:mckoi://<host>/","com.mckoi.JDBCDriver"),
-        new DatabaseInfo("Mimer","jdbc:mimer://<host>:<port>/<database>","com.mimer.jdbc.Driver"),
-        new DatabaseInfo("MySQL","jdbc:mysql://<host>:<port>/<database>","com.mysql.jdbc.Driver", 3306),
-        new DatabaseInfo("Oracle Thin","jdbc:oracle:thin:@<host>:<port>:<sid>","oracle.jdbc.OracleDriver", 1521),
-        new DatabaseInfo("Oracle OCI","jdbc:oracle:oci:@<host>:<port>:<sid>","oracle.jdbc.OracleDriver", 1521),
-        new DatabaseInfo("Oracle (DataDirect)","jdbc:datadirect:oracle://<host>:<port>;ServiceName=<sid>","com.ddtek.jdbc.oracle.OracleDriver", 1521),
-        new DatabaseInfo("Pervasive","jdbc:pervasive://<host>:<port>/<database>","com.pervasive.jdbc.v2.Driver"),
-        new DatabaseInfo("Pointbase server","jdbc:pointbase:server://<host>:<port>/<database>","com.pointbase.jdbc.jdbcUniversalDriver"),
-        new DatabaseInfo("PostgreSQL","jdbc:postgresql://<host>:<port>/<database>","org.postgresql.Driver", 5432),
-        new DatabaseInfo("Progress","jdbc:jdbcProgress:T:<host>:<port>:<database>","com.progress.sql.jdbc.JdbcProgressDriver"),
-        new DatabaseInfo("MaxDB","jdbc:sapdb://<host>:<port>/<database>","com.sap.dbtech.jdbc.DriverSapDB"),
-        new DatabaseInfo("SQL Server","jdbc:microsoft:sqlserver://<host>:<port>;DatabaseName=<database>","com.microsoft.jdbc.sqlserver.SQLServerDriver", 1433),
-        new DatabaseInfo("SQL Server (jTDS)","jdbc:jtds:sqlserver://<host>:<port>;DatabaseName=<database>","net.sourceforge.jtds.jdbc.Driver", 1433),
-        new DatabaseInfo("SQL Server (DataDirect)","jdbc:datadirect:sqlserver://<host>:<port>;DatabaseName=<database>","com.ddtek.jdbc.sqlserver.SQLServerDriver", 1433),
-        new DatabaseInfo("Sybase ASE","jdbc:sybase:Tds:<host>:<port>/<database>","com.sybase.jdbc3.jdbc.SybDriver", 2048),
-        new DatabaseInfo("Sybase ASA","jdbc:sybase:Tds:<host>:<port>/<database>","com.sybase.jdbc3.jdbc.SybDriver", 2638),
-        new DatabaseInfo("Sybase (DataDirect)","jdbc:datadirect:sybase://<host>:<port>;DatabaseName=<database>","com.ddtek.jdbc.sybase.SybaseDriver"),
+        new DatabaseInfo("McKoi embedded","jdbc:mckoi:local://<ConfigPath>/<Schema>/","com.mckoi.JDBCDriver"),
+        new DatabaseInfo("McKoi server","jdbc:mckoi://<Host>:<Port>/<Schema>/","com.mckoi.JDBCDriver"),
+        new DatabaseInfo("Mimer","jdbc:mimer://<Host>:<Port>/<Database>","com.mimer.jdbc.Driver"),
+        new DatabaseInfo("MySQL","jdbc:mysql://<Host>:<Port>/<Database>","com.mysql.jdbc.Driver", 3306),
+        new DatabaseInfo("Oracle Thin","jdbc:oracle:thin:@<Host>:<Port>:<SID>","oracle.jdbc.OracleDriver", 1521),
+        new DatabaseInfo("Oracle OCI","jdbc:oracle:oci:@<Host>:<Port>:<SID>","oracle.jdbc.OracleDriver", 1521),
+        new DatabaseInfo("Oracle (DataDirect)","jdbc:datadirect:oracle://<Host>:<Port>;ServiceName=<SID>","com.ddtek.jdbc.oracle.OracleDriver", 1521),
+        new DatabaseInfo("Pervasive","jdbc:pervasive://<Host>:<Port>/<Database>","com.pervasive.jdbc.v2.Driver"),
+        new DatabaseInfo("Pointbase server","jdbc:pointbase:server://<Host>:<Port>/<Database>","com.pointbase.jdbc.jdbcUniversalDriver"),
+        new DatabaseInfo("PostgreSQL","jdbc:postgresql://<Host>:<Port>/<Database>","org.postgresql.Driver", 5432),
+        new DatabaseInfo("Progress","jdbc:jdbcProgress:T:<Host>:<Port>:<Database>","com.progress.sql.jdbc.JdbcProgressDriver"),
+        new DatabaseInfo("MaxDB","jdbc:sapdb://<Host>:<Port>/<Database>","com.sap.dbtech.jdbc.DriverSapDB"),
+        new DatabaseInfo("SQL Server","jdbc:microsoft:sqlserver://<Host>:<Port>;DatabaseName=<Database>","com.microsoft.jdbc.sqlserver.SQLServerDriver", 1433),
+        new DatabaseInfo("SQL Server (jTDS)","jdbc:jtds:sqlserver://<Host>:<Port>;DatabaseName=<Database>","net.sourceforge.jtds.jdbc.Driver", 1433),
+        new DatabaseInfo("SQL Server (DataDirect)","jdbc:datadirect:sqlserver://<Host>:<Port>;DatabaseName=<Database>","com.ddtek.jdbc.sqlserver.SQLServerDriver", 1433),
+        new DatabaseInfo("Sybase ASE","jdbc:sybase:Tds:<Host>:<Port>/<Database>","com.sybase.jdbc3.jdbc.SybDriver", 2048),
+        new DatabaseInfo("Sybase ASA","jdbc:sybase:Tds:<Host>:<Port>/<Database>","com.sybase.jdbc3.jdbc.SybDriver", 2638),
+        new DatabaseInfo("Sybase (DataDirect)","jdbc:datadirect:sybase://<Host>:<Port>;DatabaseName=<Database>","com.ddtek.jdbc.sybase.SybaseDriver"),
+        new DatabaseInfo("Other","",""),
     };
     private final static Pattern PARAM_PATTERN = Pattern.compile("<.+?>");
 
@@ -64,11 +78,15 @@
     private String url;
     private String driverClass;
     private int defaultPort;
+    private boolean xa;
+    private String rarPath;
 
     public DatabaseInfo(String name, String url, String driverClass) {
         this.name = name;
         this.url = url;
         this.driverClass = driverClass;
+        xa = false;
+        rarPath = TRANQL_RAR_NAME;
     }
 
     public DatabaseInfo(String name, String url, String driverClass, int defaultPort) {
@@ -76,6 +94,14 @@
         this.url = url;
         this.driverClass = driverClass;
         this.defaultPort = defaultPort;
+        xa = false;
+        rarPath = TRANQL_RAR_NAME;
+    }
+
+    public DatabaseInfo(String name, String rarPath) {
+        this.name = name;
+        xa = true;
+        this.rarPath = rarPath;
     }
 
     public String getName() {
@@ -92,6 +118,14 @@
 
     public int getDefaultPort() {
         return defaultPort;
+    }
+
+    public boolean isXA() {
+        return xa;
+    }
+
+    public String getRarPath() {
+        return rarPath;
     }
 
     public String[] getUrlParameters() {

Modified: geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabasePoolPortlet.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabasePoolPortlet.java?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabasePoolPortlet.java (original)
+++ geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/databasemanager/wizard/DatabasePoolPortlet.java Sat Nov 12 19:56:12 2005
@@ -23,12 +23,12 @@
 import java.io.File;
 import java.io.BufferedOutputStream;
 import java.io.FileOutputStream;
+import java.io.StringReader;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Properties;
 import java.net.URISyntaxException;
@@ -58,9 +58,13 @@
 import javax.enterprise.deploy.spi.TargetModuleID;
 import javax.enterprise.deploy.spi.status.ProgressObject;
 import javax.enterprise.deploy.model.DDBeanRoot;
+import javax.enterprise.deploy.model.DDBean;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
 import org.apache.geronimo.console.BasePortlet;
 import org.apache.geronimo.console.util.PortletManager;
 import org.apache.geronimo.management.geronimo.JCAManagedConnectionFactory;
+import org.apache.geronimo.management.geronimo.ResourceAdapterModule;
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
 import org.apache.geronimo.kernel.repository.ListableRepository;
 import org.apache.geronimo.kernel.repository.Repository;
@@ -76,8 +80,14 @@
 import org.apache.geronimo.connector.deployment.jsr88.ConfigPropertySetting;
 import org.apache.geronimo.connector.deployment.jsr88.ConnectionManager;
 import org.apache.geronimo.connector.deployment.jsr88.SinglePool;
+import org.apache.geronimo.connector.outbound.PoolingAttributes;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
 
 /**
  * A portlet that lets you configure and deploy JDBC connection pools.
@@ -85,14 +95,10 @@
  * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $
  */
 public class DatabasePoolPortlet extends BasePortlet {
-    /**
-     * todo: EVIL!!!  Should be replaced with something, somehow!
-     */
-    private final static String TRANQL_RAR_NAME = "tranql/rars/tranql-connector-1.0.rar";
-
     private final static Log log = LogFactory.getLog(DatabasePoolPortlet.class);
     private final static String[] SKIP_ENTRIES_WITH = new String[]{"geronimo", "tomcat", "tranql", "commons", "directory", "activemq"};
     private final static String DRIVER_SESSION_KEY = "org.apache.geronimo.console.dbpool.Drivers";
+    private final static String CONFIG_SESSION_KEY = "org.apache.geronimo.console.dbpool.ConfigParam";
     private final static String DRIVER_INFO_URL    = "http://people.apache.org/~ammulder/driver-downloads.properties";
     private static final String LIST_VIEW            = "/WEB-INF/view/dbwizard/list.jsp";
     private static final String EDIT_VIEW            = "/WEB-INF/view/dbwizard/edit.jsp";
@@ -108,6 +114,7 @@
     private static final String CONFIRM_URL_MODE     = "url";
     private static final String TEST_CONNECTION_MODE = "test";
     private static final String DOWNLOAD_MODE        = "download";
+    private static final String EDIT_EXISTING_MODE   = "editExisting";
     private static final String SAVE_MODE            = "save";
     private static final String MODE_KEY = "mode";
 
@@ -157,22 +164,62 @@
         return results;
     }
 
+    /**
+     * Loads data about a resource adapter.  Depending on what we already have, may load
+     * the name and description, but always loads the config property descriptions.
+     * @param request            Pass it or die
+     * @param rarPath            If we're creating a new RA, the path to identify it
+     * @param displayName        If we're editing an existing RA, its name
+     * @param adapterObjectName  If we're editing an existing RA, its ObjectName
+     * @return
+     */
+    public ResourceAdapterParams getRARConfiguration(PortletRequest request, String rarPath, String displayName, String adapterObjectName) {
+        PortletSession session = request.getPortletSession(true);
+        if(rarPath != null && !rarPath.equals("")) {
+            ResourceAdapterParams results = (ResourceAdapterParams) session.getAttribute(CONFIG_SESSION_KEY+"-"+rarPath, PortletSession.APPLICATION_SCOPE);
+            if(results == null) {
+                results = loadConfigPropertiesByPath(request, rarPath);
+                session.setAttribute(CONFIG_SESSION_KEY+"-"+rarPath, results, PortletSession.APPLICATION_SCOPE);
+                session.setAttribute(CONFIG_SESSION_KEY+"-"+results.displayName, results, PortletSession.APPLICATION_SCOPE);
+            }
+            return results;
+        } else if(displayName != null && !displayName.equals("") && adapterObjectName != null && !adapterObjectName.equals("")) {
+            ResourceAdapterParams results = (ResourceAdapterParams) session.getAttribute(CONFIG_SESSION_KEY+"-"+displayName, PortletSession.APPLICATION_SCOPE);
+            if(results == null) {
+                results = loadConfigPropertiesByObjectName(request, adapterObjectName);
+                session.setAttribute(CONFIG_SESSION_KEY+"-"+displayName, results, PortletSession.APPLICATION_SCOPE);
+            }
+            return results;
+        } else {
+            throw new IllegalArgumentException();
+        }
+    }
+
     public void processAction(ActionRequest actionRequest,
             ActionResponse actionResponse) throws PortletException, IOException {
         String mode = actionRequest.getParameter(MODE_KEY);
         PoolData data = new PoolData();
         data.load(actionRequest);
         if(mode.equals("process-"+SELECT_RDBMS_MODE)) {
-            if(data.getDbtype().equals("Other")) {
-                actionResponse.setRenderParameter(MODE_KEY, EDIT_MODE);
-            } else {
-                DatabaseInfo info = null;
-                info = getDatabaseInfo(data);
-                if(info != null) {
-                    data.driverClass = info.getDriverClass();
-                    data.urlPrototype = info.getUrl();
+            DatabaseInfo info = null;
+            info = getDatabaseInfo(data);
+            if(info != null) {
+                data.rarPath = info.getRarPath();
+                if(info.isXA()) {
+                    data.adapterDisplayName="Unknown"; // will pick these up when we process the RA type in the render request
+                    data.adapterDescription="Unknown";
+                    actionResponse.setRenderParameter(MODE_KEY, EDIT_MODE);
+                } else {
+                    if(data.getDbtype().equals("Other")) {
+                        actionResponse.setRenderParameter(MODE_KEY, EDIT_MODE);
+                    } else {
+                        data.driverClass = info.getDriverClass();
+                        data.urlPrototype = info.getUrl();
+                        actionResponse.setRenderParameter(MODE_KEY, BASIC_PARAMS_MODE);
+                    }
                 }
-                actionResponse.setRenderParameter(MODE_KEY, BASIC_PARAMS_MODE);
+            } else {
+                actionResponse.setRenderParameter(MODE_KEY, SELECT_RDBMS_MODE);
             }
         } else if(mode.equals("process-"+DOWNLOAD_MODE)) {
             String name = actionRequest.getParameter("driverName");
@@ -209,12 +256,16 @@
                     log.error("Unable to download JDBC driver", e);
                 }
             }
-            actionResponse.setRenderParameter(MODE_KEY, BASIC_PARAMS_MODE);
+            if(data.getDbtype() == null || data.getDbtype().equals("Other")) {
+                actionResponse.setRenderParameter(MODE_KEY, EDIT_MODE);
+            } else {
+                actionResponse.setRenderParameter(MODE_KEY, BASIC_PARAMS_MODE);
+            }
         } else if(mode.equals("process-"+BASIC_PARAMS_MODE)) {
             DatabaseInfo info = null;
             info = getDatabaseInfo(data);
             if(info != null) {
-                data.url = populateURL(info.getUrl(), info.getUrlParameters(), data.getProperties());
+                data.url = populateURL(info.getUrl(), info.getUrlParameters(), data.getUrlProperties());
             }
             if(attemptDriverLoad(actionRequest, data) != null) {
                 actionResponse.setRenderParameter(MODE_KEY, CONFIRM_URL_MODE);
@@ -245,12 +296,158 @@
             }
         } else if(mode.equals(SAVE_MODE)) {
             save(actionRequest, data);
+        } else if(mode.equals(EDIT_EXISTING_MODE)) {
+            final String name = actionRequest.getParameter("adapterObjectName");
+            loadConnectionFactory(actionRequest, name, data.getObjectName(), data);
+            actionResponse.setRenderParameter("adapterObjectName", name);
+            actionResponse.setRenderParameter(MODE_KEY, EDIT_MODE);
+        } else if(mode.equals(SELECT_RDBMS_MODE)) {
+            if(data.getAdapterDisplayName() == null) { // Set a default for a new pool
+                data.adapterDisplayName = "TranQL Generic JDBC Resource Adapter";
+            }
+            actionResponse.setRenderParameter(MODE_KEY, mode);
         } else {
             actionResponse.setRenderParameter(MODE_KEY, mode);
         }
         data.store(actionResponse);
     }
 
+    private ResourceAdapterParams loadConfigPropertiesByPath(PortletRequest request, String rarPath) {
+        DeploymentManager mgr = PortletManager.getDeploymentManager(request);
+        try {
+            URL url = getRAR(request, rarPath);
+            ConnectorDeployable deployable = new ConnectorDeployable(url);
+            final DDBeanRoot ddBeanRoot = deployable.getDDBeanRoot();
+            String adapterName = null, adapterDesc = null;
+            String[] test = ddBeanRoot.getText("connector/display-name");
+            if(test != null && test.length > 0) {
+                adapterName = test[0];
+            }
+            test = ddBeanRoot.getText("connector/description");
+            if(test != null && test.length > 0) {
+                adapterDesc = test[0];
+            }
+            DDBean[] definitions = ddBeanRoot.getChildBean("connector/resourceadapter/outbound-resourceadapter/connection-definition");
+            List configs = new ArrayList();
+            if(definitions != null) {
+                for (int i = 0; i < definitions.length; i++) {
+                    DDBean definition = definitions[i];
+                    String iface = definition.getText("connectionfactory-interface")[0];
+                    if(iface.equals("javax.sql.DataSource")) {
+                        DDBean[] beans = definition.getChildBean("config-property");
+                        for (int j = 0; j < beans.length; j++) {
+                            DDBean bean = beans[j];
+                            String name = bean.getText("config-property-name")[0].trim();
+                            String type = bean.getText("config-property-type")[0].trim();
+                            test = bean.getText("config-property-value");
+                            String value = test == null || test.length == 0 ? null : test[0].trim();
+                            test = bean.getText("description");
+                            String desc = test == null || test.length == 0 ? null : test[0].trim();
+                            configs.add(new ConfigParam(name, type, desc, value));
+                        }
+                    }
+                }
+            }
+            return new ResourceAdapterParams(adapterName, adapterDesc, (ConfigParam[]) configs.toArray(new ConfigParam[configs.size()]));
+        } catch (Exception e) {
+            log.error("Unable to read configuration properties", e);
+            return null;
+        } finally {
+            if(mgr != null) mgr.release();
+        }
+    }
+
+    private ResourceAdapterParams loadConfigPropertiesByObjectName(PortletRequest request, String objectName) {
+        ResourceAdapterModule module = (ResourceAdapterModule) PortletManager.getManagedBean(request, objectName);
+        String dd = module.getDeploymentDescriptor();
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setValidating(false);
+        factory.setNamespaceAware(true);
+        try {
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            final StringReader reader = new StringReader(dd);
+            Document doc = builder.parse(new InputSource(reader));
+            reader.close();
+            Element elem = doc.getDocumentElement(); // connector
+            String displayName = getFirstText(elem.getElementsByTagName("display-name"));
+            String description = getFirstText(elem.getElementsByTagName("description"));
+            elem = (Element) elem.getElementsByTagName("resourceadapter").item(0);
+            elem = (Element) elem.getElementsByTagName("outbound-resourceadapter").item(0);
+            NodeList defs = elem.getElementsByTagName("connection-definition");
+            List all = new ArrayList();
+            for(int i=0; i<defs.getLength(); i++) {
+                final Element def = (Element)defs.item(i);
+                String iface = getFirstText(def.getElementsByTagName("connectionfactory-interface")).trim();
+                if(iface.equals("javax.sql.DataSource")) {
+                    NodeList configs = def.getElementsByTagName("config-property");
+                    for(int j=0; j<configs.getLength(); j++) {
+                        Element config = (Element) configs.item(j);
+                        String name = getFirstText(config.getElementsByTagName("config-property-name")).trim();
+                        String type = getFirstText(config.getElementsByTagName("config-property-type")).trim();
+                        String test = getFirstText(config.getElementsByTagName("config-property-value"));
+                        String value = test == null ? null : test.trim();
+                        test = getFirstText(config.getElementsByTagName("description"));
+                        String desc = test == null ? null : test.trim();
+                        all.add(new ConfigParam(name, type, desc, value));
+                    }
+                }
+            }
+            return new ResourceAdapterParams(displayName, description, (ConfigParam[]) all.toArray(new ConfigParam[all.size()]));
+        } catch (Exception e) {
+            log.error("Unable to read resource adapter DD", e);
+            return null;
+        }
+    }
+
+    private String getFirstText(NodeList list) {
+        if(list.getLength() == 0) {
+            return null;
+        }
+        Element first = (Element) list.item(0);
+        StringBuffer buf = new StringBuffer();
+        NodeList all = first.getChildNodes();
+        for(int i=0; i<all.getLength(); i++) {
+            Node node = all.item(i);
+            if(node.getNodeType() == Node.TEXT_NODE) {
+                buf.append(node.getNodeValue());
+            }
+        }
+        return buf.toString();
+    }
+
+    private void loadConnectionFactory(ActionRequest actionRequest, String adapterName, String factoryName, PoolData data) {
+        ResourceAdapterModule adapter = (ResourceAdapterModule) PortletManager.getManagedBean(actionRequest, adapterName);
+        JCAManagedConnectionFactory factory = (JCAManagedConnectionFactory) PortletManager.getManagedBean(actionRequest, factoryName);
+        data.adapterDisplayName = adapter.getDisplayName();
+        data.adapterDescription = adapter.getDescription();
+        try {
+            ObjectName oname = ObjectName.getInstance(factoryName);
+            data.name = oname.getKeyProperty("name");
+            if(data.isGeneric()) {
+                data.url = (String) factory.getConfigProperty("connectionURL");
+                data.driverClass = (String) factory.getConfigProperty("driver");
+                data.user = (String) factory.getConfigProperty("userName");
+                data.password = (String) factory.getConfigProperty("password");
+            } else {
+                ResourceAdapterParams params = getRARConfiguration(actionRequest, data.getRarPath(), data.getAdapterDisplayName(), adapterName);
+                for(int i=0; i<params.getConfigParams().length; i++) {
+                    ConfigParam cp = params.getConfigParams()[i];
+                    Object value = factory.getConfigProperty(cp.getName());
+                    data.properties.put("property-"+cp.getName(), value == null ? null : value.toString());
+                }
+            }
+        } catch (Exception e) {
+            log.error("Unable to look up connection property", e);
+        }
+        //todo: push the lookup into ManagementHelper
+        PoolingAttributes pool = (PoolingAttributes) PortletManager.getManagedBean(actionRequest, factory.getConnectionManager());
+        data.minSize = Integer.toString(pool.getPartitionMinSize());
+        data.maxSize = Integer.toString(pool.getPartitionMaxSize());
+        data.blockingTimeout = Integer.toString(pool.getBlockingTimeoutMilliseconds());
+        data.idleTimeout = Integer.toString(pool.getIdleTimeoutMinutes());
+
+    }
+
     protected void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException {
         if (WindowState.MINIMIZED.equals(renderRequest.getWindowState())) {
             return;
@@ -266,7 +463,7 @@
             if(mode.equals(LIST_MODE)) {
                 renderList(renderRequest, renderResponse);
             } else if(mode.equals(EDIT_MODE)) {
-                renderEdit(renderRequest, renderResponse);
+                renderEdit(renderRequest, renderResponse, data);
             } else if(mode.equals(SELECT_RDBMS_MODE)) {
                 renderSelectRDBMS(renderRequest, renderResponse);
             } else if(mode.equals(DOWNLOAD_MODE)) {
@@ -284,23 +481,49 @@
     }
 
     private void renderList(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException {
-        JCAManagedConnectionFactory[] databases = PortletManager.getOutboundFactories(renderRequest, "javax.sql.DataSource");
-        ConnectionPool[] pools = new ConnectionPool[databases.length];
-        for (int i = 0; i < databases.length; i++) {
-            JCAManagedConnectionFactory db = databases[i];
-            try {
-                ObjectName name = ObjectName.getInstance(db.getObjectName());
-                pools[i] = new ConnectionPool(name.getCanonicalName(), name.getKeyProperty(NameFactory.J2EE_NAME));
-            } catch (MalformedObjectNameException e) {
-                e.printStackTrace();
+        ResourceAdapterModule[] modules = PortletManager.getOutboundRAModules(renderRequest, "javax.sql.DataSource");
+        List list = new ArrayList();
+        for (int i = 0; i < modules.length; i++) {
+            ResourceAdapterModule module = modules[i];
+            JCAManagedConnectionFactory[] databases = PortletManager.getOutboundFactoriesForRA(renderRequest, module, "javax.sql.DataSource");
+            for (int j = 0; j < databases.length; j++) {
+                JCAManagedConnectionFactory db = databases[j];
+                try {
+                    ObjectName name = ObjectName.getInstance(db.getObjectName());
+                    list.add(new ConnectionPool(module.getObjectName(), db.getObjectName(), name.getKeyProperty(NameFactory.J2EE_NAME)));
+                } catch (MalformedObjectNameException e) {
+                    e.printStackTrace();
+                }
             }
         }
-        renderRequest.setAttribute("pools", pools);
+        Collections.sort(list);
+        renderRequest.setAttribute("pools", list);
         listView.include(renderRequest, renderResponse);
     }
 
-    private void renderEdit(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException {
-        loadDriverJARList(renderRequest);
+    private void renderEdit(RenderRequest renderRequest, RenderResponse renderResponse, PoolData data) throws IOException, PortletException {
+        if(data.objectName == null || data.objectName.equals("")) {
+            loadDriverJARList(renderRequest);
+        }
+        if(!data.isGeneric()) {
+            ResourceAdapterParams params = getRARConfiguration(renderRequest, data.getRarPath(), data.getAdapterDisplayName(), renderRequest.getParameter("adapterObjectName"));
+            data.adapterDisplayName = params.getDisplayName();
+            data.adapterDescription = params.getDescription();
+            Map map = new HashMap();
+            boolean more = false;
+            for (int i = 0; i < params.getConfigParams().length; i++) {
+                ConfigParam param = params.getConfigParams()[i];
+                if(!data.properties.containsKey("property-"+param.getName())) {
+                    data.properties.put("property-"+param.getName(), param.getDefaultValue());
+                    more = true;
+                }
+                map.put("property-"+param.getName(), param);
+            }
+            if(more) {
+                data.loadPropertyNames();
+            }
+            renderRequest.setAttribute("ConfigParams", map);
+        }
         editView.include(renderRequest, renderResponse);
     }
 
@@ -322,9 +545,9 @@
             String[] params = info.getUrlParameters();
             for (int i = 0; i < params.length; i++) {
                 String param = params[i];
-                final String key = "property-"+param;
-                if(!data.getProperties().containsKey(key)) {
-                    data.getProperties().put(key, param.equals("port") && info.getDefaultPort() > 0 ? new Integer(info.getDefaultPort()) : null);
+                final String key = "urlproperty-"+param;
+                if(!data.getUrlProperties().containsKey(key)) {
+                    data.getUrlProperties().put(key, param.equalsIgnoreCase("port") && info.getDefaultPort() > 0 ? new Integer(info.getDefaultPort()) : null);
                 }
             }
         }
@@ -391,98 +614,131 @@
     }
 
     private static void save(PortletRequest request, PoolData data) {
-        URL url = getTranQLRAR(request);
-        DeploymentManager mgr = PortletManager.getDeploymentManager(request);
-        try {
-            ConnectorDeployable deployable = new ConnectorDeployable(url);
-            DeploymentConfiguration config = mgr.createConfiguration(deployable);
-            final DDBeanRoot ddBeanRoot = deployable.getDDBeanRoot();
-            Connector15DCBRoot root = (Connector15DCBRoot) config.getDConfigBeanRoot(ddBeanRoot);
-            ConnectorDCB connector = (ConnectorDCB) root.getDConfigBean(ddBeanRoot.getChildBean(root.getXpaths()[0])[0]);
-            connector.setConfigID("DatabasePool"+data.getName());
-            connector.setParentID("org/apache/geronimo/Server");
-            if(data.jar1 != null && !data.jar1.equals("")) {
-                Dependency dep = new Dependency();
-                connector.setDependency(new Dependency[]{dep});
-                dep.setURI(data.jar1);
-            }
-            if(data.jar2 != null && !data.jar2.equals("")) {
-                Dependency dep = new Dependency();
-                Dependency[] old = connector.getDependency();
-                Dependency[] longer = new Dependency[old.length+1];
-                System.arraycopy(old, 0, longer, 0, old.length);
-                longer[old.length] = dep;
-                connector.setDependency(longer);
-                dep.setURI(data.jar2);
-            }
-            if(data.jar3 != null && !data.jar3.equals("")) {
-                Dependency dep = new Dependency();
-                Dependency[] old = connector.getDependency();
-                Dependency[] longer = new Dependency[old.length+1];
-                System.arraycopy(old, 0, longer, 0, old.length);
-                longer[old.length] = dep;
-                connector.setDependency(longer);
-                dep.setURI(data.jar3);
-            }
-            ResourceAdapter adapter = connector.getResourceAdapter()[0];
-            ConnectionDefinition definition = new ConnectionDefinition();
-            adapter.setConnectionDefinition(new ConnectionDefinition[]{definition});
-            definition.setConnectionFactoryInterface("javax.sql.DataSource");
-            ConnectionDefinitionInstance instance = new ConnectionDefinitionInstance();
-            definition.setConnectionInstance(new ConnectionDefinitionInstance[]{instance});
-            instance.setName(data.getName());
-            ConfigPropertySetting[] settings = instance.getConfigPropertySetting();
-            for (int i = 0; i < settings.length; i++) {
-                ConfigPropertySetting setting = settings[i];
-                if(setting.getName().equals("UserName")) {
-                    setting.setValue(data.user);
-                } else if(setting.getName().equals("Password")) {
-                    setting.setValue(data.password);
-                } else if(setting.getName().equals("ConnectionURL")) {
-                    setting.setValue(data.url);
-                } else if(setting.getName().equals("Driver")) {
-                    setting.setValue(data.driverClass);
-                }
-            }
-            ConnectionManager manager = instance.getConnectionManager();
-            manager.setTransactionLocal(true);
-            SinglePool pool = new SinglePool();
-            manager.setPoolSingle(pool);
-            pool.setMatchOne(true);
-            if(data.minSize != null && !data.minSize.equals("")) {
-                pool.setMinSize(new Integer(data.minSize));
-            }
-            if(data.maxSize != null && !data.maxSize.equals("")) {
-                pool.setMaxSize(new Integer(data.maxSize));
-            }
-            if(data.blockingTimeout != null && !data.blockingTimeout.equals("")) {
-                pool.setBlockingTimeoutMillis(new Integer(data.blockingTimeout));
-            }
-            if(data.idleTimeout != null && !data.idleTimeout.equals("")) {
-                pool.setIdleTimeoutMinutes(new Integer(data.idleTimeout));
-            }
-            File tempFile = File.createTempFile("console-deployment",".xml");
-            tempFile.deleteOnExit();
-            log.debug("Writing database pool deployment plan to "+tempFile.getAbsolutePath());
-            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(tempFile));
-            config.save(out);
-            out.flush();
-            out.close();
-            Target[] targets = mgr.getTargets();
-            ProgressObject po = mgr.distribute(targets, new File(url.getPath()), tempFile);
-            waitForProgress(po);
-            if(po.getDeploymentStatus().isCompleted()) {
-                TargetModuleID[] ids = po.getResultTargetModuleIDs();
-                po = mgr.start(ids);
+        if(data.objectName == null || data.objectName.equals("")) { // we're creating a new pool
+            data.name = data.name.replaceAll("\\s", "");
+            DeploymentManager mgr = PortletManager.getDeploymentManager(request);
+            try {
+                URL url = getRAR(request, data.getRarPath());
+                ConnectorDeployable deployable = new ConnectorDeployable(url);
+                DeploymentConfiguration config = mgr.createConfiguration(deployable);
+                final DDBeanRoot ddBeanRoot = deployable.getDDBeanRoot();
+                Connector15DCBRoot root = (Connector15DCBRoot) config.getDConfigBeanRoot(ddBeanRoot);
+                ConnectorDCB connector = (ConnectorDCB) root.getDConfigBean(ddBeanRoot.getChildBean(root.getXpaths()[0])[0]);
+                connector.setConfigID("DatabasePool"+data.getName());
+                connector.setParentID("org/apache/geronimo/Server");
+                if(data.jar1 != null && !data.jar1.equals("")) {
+                    Dependency dep = new Dependency();
+                    connector.setDependency(new Dependency[]{dep});
+                    dep.setURI(data.jar1);
+                }
+                if(data.jar2 != null && !data.jar2.equals("")) {
+                    Dependency dep = new Dependency();
+                    Dependency[] old = connector.getDependency();
+                    Dependency[] longer = new Dependency[old.length+1];
+                    System.arraycopy(old, 0, longer, 0, old.length);
+                    longer[old.length] = dep;
+                    connector.setDependency(longer);
+                    dep.setURI(data.jar2);
+                }
+                if(data.jar3 != null && !data.jar3.equals("")) {
+                    Dependency dep = new Dependency();
+                    Dependency[] old = connector.getDependency();
+                    Dependency[] longer = new Dependency[old.length+1];
+                    System.arraycopy(old, 0, longer, 0, old.length);
+                    longer[old.length] = dep;
+                    connector.setDependency(longer);
+                    dep.setURI(data.jar3);
+                }
+                ResourceAdapter adapter = connector.getResourceAdapter()[0];
+                ConnectionDefinition definition = new ConnectionDefinition();
+                adapter.setConnectionDefinition(new ConnectionDefinition[]{definition});
+                definition.setConnectionFactoryInterface("javax.sql.DataSource");
+                ConnectionDefinitionInstance instance = new ConnectionDefinitionInstance();
+                definition.setConnectionInstance(new ConnectionDefinitionInstance[]{instance});
+                instance.setName(data.getName());
+                ConfigPropertySetting[] settings = instance.getConfigPropertySetting();
+                if(data.isGeneric()) { // it's a generic TranQL JDBC pool
+                    for (int i = 0; i < settings.length; i++) {
+                        ConfigPropertySetting setting = settings[i];
+                        if(setting.getName().equals("UserName")) {
+                            setting.setValue(data.user);
+                        } else if(setting.getName().equals("Password")) {
+                            setting.setValue(data.password);
+                        } else if(setting.getName().equals("ConnectionURL")) {
+                            setting.setValue(data.url);
+                        } else if(setting.getName().equals("Driver")) {
+                            setting.setValue(data.driverClass);
+                        }
+                    }
+                } else { // it's an XA driver or non-TranQL RA
+                    for (int i = 0; i < settings.length; i++) {
+                        ConfigPropertySetting setting = settings[i];
+                        String value = (String) data.properties.get("property-"+setting.getName());
+                        setting.setValue(value == null ? "" : value);
+                    }
+                }
+                ConnectionManager manager = instance.getConnectionManager();
+                manager.setTransactionLocal(true);
+                SinglePool pool = new SinglePool();
+                manager.setPoolSingle(pool);
+                pool.setMatchOne(true);
+                if(data.minSize != null && !data.minSize.equals("")) {
+                    pool.setMinSize(new Integer(data.minSize));
+                }
+                if(data.maxSize != null && !data.maxSize.equals("")) {
+                    pool.setMaxSize(new Integer(data.maxSize));
+                }
+                if(data.blockingTimeout != null && !data.blockingTimeout.equals("")) {
+                    pool.setBlockingTimeoutMillis(new Integer(data.blockingTimeout));
+                }
+                if(data.idleTimeout != null && !data.idleTimeout.equals("")) {
+                    pool.setIdleTimeoutMinutes(new Integer(data.idleTimeout));
+                }
+                File tempFile = File.createTempFile("console-deployment",".xml");
+                tempFile.deleteOnExit();
+                log.debug("Writing database pool deployment plan to "+tempFile.getAbsolutePath());
+                BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(tempFile));
+                config.save(out);
+                out.flush();
+                out.close();
+                Target[] targets = mgr.getTargets();
+                ProgressObject po = mgr.distribute(targets, new File(url.getPath()), tempFile);
                 waitForProgress(po);
                 if(po.getDeploymentStatus().isCompleted()) {
-                    System.out.println("Deployment completed successfully!");
+                    TargetModuleID[] ids = po.getResultTargetModuleIDs();
+                    po = mgr.start(ids);
+                    waitForProgress(po);
+                    if(po.getDeploymentStatus().isCompleted()) {
+                        System.out.println("Deployment completed successfully!");
+                    }
                 }
+            } catch (Exception e) {
+                log.error("Unable to save connection pool", e);
+            } finally {
+                if(mgr != null) mgr.release();
+            }
+        } else { // We're saving updates to an existing pool
+            try {
+                JCAManagedConnectionFactory factory = (JCAManagedConnectionFactory) PortletManager.getManagedBean(request, data.getObjectName());
+                if(data.isGeneric()) {
+                    factory.setConfigProperty("connectionURL", data.getUrl());
+                    factory.setConfigProperty("userName", data.getUser());
+                    factory.setConfigProperty("password", data.getPassword());
+                } else {
+                    for (Iterator it = data.getProperties().entrySet().iterator(); it.hasNext();) {
+                        Map.Entry entry = (Map.Entry) it.next();
+                        factory.setConfigProperty(((String) entry.getKey()).substring("property-".length()), entry.getValue());
+                    }
+                }
+                //todo: push the lookup into ManagementHelper
+                PoolingAttributes pool = (PoolingAttributes) PortletManager.getManagedBean(request, factory.getConnectionManager());
+                pool.setPartitionMinSize(data.minSize == null || data.minSize.equals("") ? 0 : Integer.parseInt(data.minSize));
+                pool.setPartitionMaxSize(data.maxSize == null || data.maxSize.equals("") ? 10 : Integer.parseInt(data.maxSize));
+                pool.setBlockingTimeoutMilliseconds(data.blockingTimeout == null || data.blockingTimeout.equals("") ? 5000 : Integer.parseInt(data.blockingTimeout));
+                pool.setIdleTimeoutMinutes(data.idleTimeout == null || data.idleTimeout.equals("") ? 15 : Integer.parseInt(data.idleTimeout));
+            } catch (Exception e) {
+                log.error("Unable to save connection pool", e);
             }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if(mgr != null) mgr.release();
         }
     }
 
@@ -496,13 +752,9 @@
         }
     }
 
-    /**
-     * todo: This is not ideal...  Should look up the RAR name somehow...
-     * Maybe eventually should not assume the RAR is on the local filesystem...
-     */
-    private static URL getTranQLRAR(PortletRequest request) {
+    private static URL getRAR(PortletRequest request, String rarPath) {
         try {
-            URI uri = new URI(TRANQL_RAR_NAME);
+            URI uri = new URI(rarPath);
             Repository[] repos = PortletManager.getRepositories(request);
             for (int i = 0; i < repos.length; i++) {
                 Repository repo = repos[i];
@@ -573,8 +825,8 @@
     private static String populateURL(String url, String[] keys, Map properties) {
         for (int i = 0; i < keys.length; i++) {
             String key = keys[i];
-            String value = (String) properties.get("property-"+key);
-            if(value == null) {
+            String value = (String) properties.get("urlproperty-"+key);
+            if(value == null || value.equals("")) {
                 int begin = url.indexOf("<"+key+">");
                 int end = begin + key.length() + 2;
                 for(int j=begin-1; j>=0; j--) {
@@ -583,6 +835,9 @@
                         begin = j;
                         break;
                     } else if(c == '/') {
+                        if(url.length() >= end && url.charAt(end) == '/') {
+                            begin = j; // Don't leave // if foo is null for /<foo>/
+                        }
                         break;
                     }
                 }
@@ -611,7 +866,9 @@
         private String dbtype;
         private String user;
         private String password;
-        private Map properties = new HashMap();
+        private Map properties = new HashMap(); // Configuration for non-Generic drivers
+        private Map urlProperties = new HashMap(); // URL substitution for Generic drivers
+        private Map propertyNames; //todo: store these in the ConfigParam instead
         private String driverClass;
         private String url;
         private String urlPrototype;
@@ -622,6 +879,10 @@
         private String maxSize;
         private String blockingTimeout;
         private String idleTimeout;
+        private String objectName;
+        private String adapterDisplayName;
+        private String adapterDescription;
+        private String rarPath;
 
         public void load(PortletRequest request) {
             name = request.getParameter("name");
@@ -638,13 +899,53 @@
             maxSize = request.getParameter("maxSize");
             blockingTimeout = request.getParameter("blockingTimeout");
             idleTimeout = request.getParameter("idleTimeout");
+            objectName = request.getParameter("objectName");
+            adapterDisplayName = request.getParameter("adapterDisplayName");
+            adapterDescription = request.getParameter("adapterDescription");
+            rarPath = request.getParameter("rarPath");
             Map map = request.getParameterMap();
+            propertyNames = new HashMap();
             for (Iterator it = map.keySet().iterator(); it.hasNext();) {
                 String key = (String) it.next();
-                if(key.startsWith("property-")) {
+                if(key.startsWith("urlproperty-")) {
+                    urlProperties.put(key, request.getParameter(key));
+                } else if(key.startsWith("property-")) {
                     properties.put(key, request.getParameter(key));
+                    propertyNames.put(key, getPropertyName(key));
+                }
+            }
+        }
+
+        public void loadPropertyNames() {
+            propertyNames = new HashMap();
+            for (Iterator it = properties.keySet().iterator(); it.hasNext();) {
+                String key = (String) it.next();
+                propertyNames.put(key, getPropertyName(key));
+            }
+        }
+
+        private static String getPropertyName(String key) {
+            int pos = key.indexOf('-');
+            key = Character.toUpperCase(key.charAt(pos+1))+key.substring(pos+2);
+            StringBuffer buf = new StringBuffer();
+            pos = 0;
+            for(int i=1; i<key.length(); i++) {
+                if(Character.isUpperCase(key.charAt(i))) {
+                    if(Character.isUpperCase(key.charAt(i-1))) { // ongoing capitalized word
+
+                    } else { // start of a new word
+                        buf.append(key.substring(pos, i)).append(" ");
+                        pos = i;
+                    }
+                } else {
+                    if(Character.isUpperCase(key.charAt(i-1)) && i-pos > 1) { // first lower-case after a series of caps
+                        buf.append(key.substring(pos, i-1)).append(" ");
+                        pos = i-1;
+                    }
                 }
             }
+            buf.append(key.substring(pos));
+            return buf.toString();
         }
 
         public void store(ActionResponse response) {
@@ -653,8 +954,8 @@
             if(driverClass != null) response.setRenderParameter("driverClass", driverClass);
             if(user != null) response.setRenderParameter("user", user);
             if(password != null) response.setRenderParameter("password", password);
-            if(url != null) response.setRenderParameter("urlPrototype", urlPrototype);
-            if(urlPrototype != null) response.setRenderParameter("url", url);
+            if(url != null) response.setRenderParameter("url", url);
+            if(urlPrototype != null) response.setRenderParameter("urlPrototype", urlPrototype);
             if(jar1 != null) response.setRenderParameter("jar1", jar1);
             if(jar2 != null) response.setRenderParameter("jar2", jar2);
             if(jar3 != null) response.setRenderParameter("jar3", jar3);
@@ -662,6 +963,16 @@
             if(maxSize != null) response.setRenderParameter("maxSize", maxSize);
             if(blockingTimeout != null) response.setRenderParameter("blockingTimeout", blockingTimeout);
             if(idleTimeout != null) response.setRenderParameter("idleTimeout", idleTimeout);
+            if(objectName != null) response.setRenderParameter("objectName", objectName);
+            if(adapterDisplayName != null) response.setRenderParameter("adapterDisplayName", adapterDisplayName);
+            if(adapterDescription != null) response.setRenderParameter("adapterDescription", adapterDescription);
+            if(rarPath != null) response.setRenderParameter("rarPath", rarPath);
+            for (Iterator it = urlProperties.entrySet().iterator(); it.hasNext();) {
+                Map.Entry entry = (Map.Entry) it.next();
+                if(entry.getValue() != null) {
+                    response.setRenderParameter((String)entry.getKey(), (String)entry.getValue());
+                }
+            }
             for (Iterator it = properties.entrySet().iterator(); it.hasNext();) {
                 Map.Entry entry = (Map.Entry) it.next();
                 if(entry.getValue() != null) {
@@ -690,6 +1001,14 @@
             return properties;
         }
 
+        public Map getPropertyNames() {
+            return propertyNames;
+        }
+
+        public Map getUrlProperties() {
+            return urlProperties;
+        }
+
         public String getUrl() {
             return url;
         }
@@ -730,44 +1049,107 @@
             return urlPrototype;
         }
 
-        public String toString() {
-            String temp= "NAME="+name+"\n"+
-                    "DB="+dbtype+"\n"+
-                    "CLASS="+driverClass+"\n"+
-                    "FORMAT="+urlPrototype+"\n"+
-                    "URL="+url+"\n"+
-                    "USER="+user+"\n"+
-                    "PASS="+password+"\n"+
-                    "JAR1="+jar1+"\n"+
-                    "JAR2="+jar2+"\n"+
-                    "JAR3="+jar3+"\n"+
-                    "MIN="+minSize+"\n"+
-                    "MAX="+maxSize+"\n"+
-                    "BLOCK="+blockingTimeout+"\n"+
-                    "IDLE="+idleTimeout;
-            for (Iterator it = properties.entrySet().iterator(); it.hasNext();) {
-                Map.Entry entry = (Map.Entry) it.next();
-                temp+="\n"+entry.getKey()+"="+entry.getValue();
-            }
-            return temp;
+        public String getObjectName() {
+            return objectName;
+        }
+
+        public String getAdapterDisplayName() {
+            return adapterDisplayName;
+        }
+
+        public String getAdapterDescription() {
+            return adapterDescription;
+        }
+
+        public String getRarPath() {
+            return rarPath;
+        }
+
+        public boolean isGeneric() {
+            //todo: is there any better way to tell?
+            return adapterDisplayName == null || adapterDisplayName.equals("TranQL Generic JDBC Resource Adapter");
         }
     }
 
-    public static class ConnectionPool implements Serializable {
-        private String objectName;
-        private String name;
+    public static class ConnectionPool implements Serializable, Comparable {
+        private final String adapterObjectName;
+        private final String factoryObjectName;
+        private final String name;
 
-        public ConnectionPool(String objectName, String name) {
-            this.objectName = objectName;
+        public ConnectionPool(String adapterObjectName, String factoryObjectName, String name) {
+            this.adapterObjectName = adapterObjectName;
+            this.factoryObjectName = factoryObjectName;
             this.name = name;
         }
 
-        public String getObjectName() {
-            return objectName;
+        public String getAdapterObjectName() {
+            return adapterObjectName;
+        }
+
+        public String getFactoryObjectName() {
+            return factoryObjectName;
         }
 
         public String getName() {
             return name;
+        }
+
+        public int compareTo(Object o) {
+            return name.compareTo(((ConnectionPool)o).name);
+        }
+    }
+
+    public static class ResourceAdapterParams {
+        private String displayName;
+        private String description;
+        private ConfigParam[] configParams;
+
+        public ResourceAdapterParams(String displayName, String description, ConfigParam[] configParams) {
+            this.displayName = displayName;
+            this.description = description;
+            this.configParams = configParams;
+        }
+
+        public String getDisplayName() {
+            return displayName;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public ConfigParam[] getConfigParams() {
+            return configParams;
+        }
+    }
+
+    public static class ConfigParam {
+        private String name;
+        private String type;
+        private String description;
+        private String defaultValue;
+
+        public ConfigParam(String name, String type, String description, String defaultValue) {
+            this.name = name;
+            this.type = type;
+            this.description = description;
+            this.defaultValue = defaultValue;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public String getDefaultValue() {
+            return defaultValue;
         }
     }
 }

Modified: geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java (original)
+++ geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java Sat Nov 12 19:56:12 2005
@@ -16,29 +16,39 @@
  */
 package org.apache.geronimo.console.util;
 
-import java.util.List;
 import java.util.ArrayList;
-import javax.portlet.PortletRequest;
-import javax.portlet.PortletSession;
+import java.util.List;
+import javax.enterprise.deploy.spi.DeploymentManager;
+import javax.enterprise.deploy.spi.exceptions.DeploymentManagerCreationException;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletSession;
 import javax.servlet.http.HttpSession;
-import javax.enterprise.deploy.spi.DeploymentManager;
-import javax.enterprise.deploy.spi.exceptions.DeploymentManagerCreationException;
-import org.apache.geronimo.kernel.KernelRegistry;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.geronimo.deployment.plugin.factories.DeploymentFactoryImpl;
 import org.apache.geronimo.kernel.Kernel;
-import org.apache.geronimo.kernel.repository.Repository;
+import org.apache.geronimo.kernel.KernelRegistry;
+import org.apache.geronimo.kernel.proxy.GeronimoManagedBean;
 import org.apache.geronimo.kernel.repository.ListableRepository;
+import org.apache.geronimo.kernel.repository.Repository;
 import org.apache.geronimo.kernel.repository.WriteableRepository;
-import org.apache.geronimo.kernel.proxy.GeronimoManagedBean;
 import org.apache.geronimo.management.J2EEDomain;
-import org.apache.geronimo.management.ResourceAdapterModule;
-import org.apache.geronimo.management.geronimo.*;
-import org.apache.geronimo.system.logging.SystemLog;
+import org.apache.geronimo.management.geronimo.EJBManager;
+import org.apache.geronimo.management.geronimo.J2EEServer;
+import org.apache.geronimo.management.geronimo.JCAManagedConnectionFactory;
+import org.apache.geronimo.management.geronimo.JMSBroker;
+import org.apache.geronimo.management.geronimo.JMSConnector;
+import org.apache.geronimo.management.geronimo.JMSManager;
+import org.apache.geronimo.management.geronimo.JVM;
+import org.apache.geronimo.management.geronimo.ResourceAdapterModule;
+import org.apache.geronimo.management.geronimo.WebAccessLog;
+import org.apache.geronimo.management.geronimo.WebConnector;
+import org.apache.geronimo.management.geronimo.WebContainer;
+import org.apache.geronimo.management.geronimo.WebManager;
 import org.apache.geronimo.pool.GeronimoExecutor;
-import org.apache.geronimo.deployment.plugin.factories.DeploymentFactoryImpl;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.geronimo.system.logging.SystemLog;
 
 /**
  * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $
@@ -166,9 +176,29 @@
         return helper.getOutboundRAModules(getCurrentServer(request), iface);
     }
 
-    public static JCAManagedConnectionFactory[] getOutboundFactories(PortletRequest request, String iface) {
+    public static JCAManagedConnectionFactory[] getOutboundFactoriesOfType(PortletRequest request, String iface) {
         ManagementHelper helper = getManagementHelper(request);
         return helper.getOutboundFactories(getCurrentServer(request), iface);
+    }
+
+    public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, String resourceAdapterModuleName) {
+        ManagementHelper helper = getManagementHelper(request);
+        return helper.getOutboundFactories((ResourceAdapterModule)helper.getObject(resourceAdapterModuleName));
+    }
+
+    public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, String resourceAdapterModuleName, String iface) {
+        ManagementHelper helper = getManagementHelper(request);
+        return helper.getOutboundFactories((ResourceAdapterModule)helper.getObject(resourceAdapterModuleName), iface);
+    }
+
+    public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, ResourceAdapterModule module) {
+        ManagementHelper helper = getManagementHelper(request);
+        return helper.getOutboundFactories(module);
+    }
+
+    public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, ResourceAdapterModule module, String iface) {
+        ManagementHelper helper = getManagementHelper(request);
+        return helper.getOutboundFactories(module, iface);
     }
 
     public static String[] getWebManagerNames(PortletRequest request) {

Modified: geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/basicParams.jsp
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/basicParams.jsp?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/basicParams.jsp (original)
+++ geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/basicParams.jsp Sat Nov 12 19:56:12 2005
@@ -18,6 +18,12 @@
     <input type="hidden" name="maxSize" value="${pool.maxSize}" />
     <input type="hidden" name="idleTimeout" value="${pool.idleTimeout}" />
     <input type="hidden" name="blockingTimeout" value="${pool.blockingTimeout}" />
+    <input type="hidden" name="adapterDisplayName" value="${pool.adapterDisplayName}" />
+    <input type="hidden" name="adapterDescription" value="${pool.adapterDescription}" />
+    <input type="hidden" name="rarPath" value="${pool.rarPath}" />
+  <c:forEach var="prop" items="${pool.properties}">
+    <input type="hidden" name="${prop.key}" value="${prop.value}" />
+  </c:forEach>
     <table border="0">
     <!-- ENTRY FIELD: Driver Class -->
       <tr>
@@ -75,9 +81,9 @@
         <th><div align="right">Typical JDBC URL:</div></th>
         <td><c:out value="${pool.urlPrototype}" /></td>
       </tr>
-  <c:forEach var="prop" items="${pool.properties}">
+  <c:forEach var="prop" items="${pool.urlProperties}">
       <tr>
-        <th><div align="right">${fn:substringAfter(prop.key,"property-")}:</div></th>
+        <th><div align="right">${fn:substringAfter(prop.key,"urlproperty-")}:</div></th>
         <td><input name="${prop.key}" type="text" size="20" value="${prop.value}"></td>
       </tr>
       <tr>

Modified: geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/confirmURL.jsp
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/confirmURL.jsp?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/confirmURL.jsp (original)
+++ geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/confirmURL.jsp Sat Nov 12 19:56:12 2005
@@ -17,9 +17,15 @@
     <input type="hidden" name="jar1" value="${pool.jar1}" />
     <input type="hidden" name="jar2" value="${pool.jar2}" />
     <input type="hidden" name="jar3" value="${pool.jar3}" />
+    <input type="hidden" name="adapterDisplayName" value="${pool.adapterDisplayName}" />
+    <input type="hidden" name="adapterDescription" value="${pool.adapterDescription}" />
+    <input type="hidden" name="rarPath" value="${pool.rarPath}" />
   <c:forEach var="prop" items="${pool.properties}">
     <input type="hidden" name="${prop.key}" value="${prop.value}" />
   </c:forEach>
+  <c:forEach var="prop" items="${pool.urlProperties}">
+    <input type="hidden" name="${prop.key}" value="${prop.value}" />
+  </c:forEach>
     <table border="0">
     <!-- ENTRY FIELD: URL -->
       <tr>
@@ -85,14 +91,6 @@
     </table>
 </form>
 <!--   END OF FORM TO COLLECT DATA FOR THIS PAGE   -->
-
-<p><a href="<portlet:actionURL portletMode="view">
-              <portlet:param name="mode" value="test" />
-            </portlet:actionURL>">Test Connection</a></p>
-<p><a href="<portlet:actionURL portletMode="view">
-              <portlet:param name="mode" value="save" />
-            </portlet:actionURL>">Skip Test & Save</a></p>
-
 
 <p><a href="<portlet:actionURL portletMode="view">
               <portlet:param name="mode" value="list" />

Modified: geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/edit.jsp
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/edit.jsp?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/edit.jsp (original)
+++ geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/edit.jsp Sat Nov 12 19:56:12 2005
@@ -1,4 +1,5 @@
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
 <%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
 <portlet:defineObjects/>
 
@@ -13,28 +14,62 @@
     <input type="hidden" name="urlPrototype" value="${pool.urlPrototype}" />
     <input type="hidden" name="jar2" value="${pool.jar2}" />
     <input type="hidden" name="jar3" value="${pool.jar3}" />
-  <c:forEach var="prop" items="${pool.properties}">
+  <c:forEach var="prop" items="${pool.urlProperties}">
     <input type="hidden" name="${prop.key}" value="${prop.value}" />
   </c:forEach>
+    <input type="hidden" name="objectName" value="${pool.objectName}" />
+    <input type="hidden" name="adapterDisplayName" value="${pool.adapterDisplayName}" />
+    <input type="hidden" name="adapterDescription" value="${pool.adapterDescription}" />
+    <input type="hidden" name="rarPath" value="${pool.rarPath}" />
 
     <table border="0">
     <!-- ENTRY FIELD: NAME -->
       <tr>
-        <th><div align="right">Name of Database Pool:</div></th>
-        <td><input name="name" type="text" size="30" value="${pool.name}"></td>
+        <th><div align="right">Pool Name:</div></th>
+        <td>
+      <c:choose> <%-- Can't change the pool name after deployment because it's wired into all the ObjectNames --%>
+        <c:when test="${empty pool.objectName}">
+          <input name="name" type="text" size="30" value="${pool.name}">
+        </c:when>
+        <c:otherwise>
+          <b><c:out value="${pool.name}" /></b>
+        </c:otherwise>
+      </c:choose>
+        </td>
       </tr>
       <tr>
         <td></td>
-        <td>A name that is different than the name for any other database pools in the server</td>
+        <td>A name that is different than the name for any other database pools in the server (no spaces in the name please).</td>
+      </tr>
+    <!-- STATUS FIELD: Display Name -->
+      <tr>
+        <th><div align="right">Pool Type:</div></th>
+        <td><i><c:out value="${pool.adapterDisplayName}" /></i></td>
+      </tr>
+      <tr>
+        <td />
+        <td><c:out value="${pool.adapterDescription}" /></td>
       </tr>
     <!-- HEADER -->
       <tr>
         <th colspan="2">Basic Connection Properties</th>
       </tr>
+<c:choose>
+  <c:when test="${pool.generic}"> <%-- This is a standard TranQL JDBC pool -- we know what parameters it wants --%>
     <!-- ENTRY FIELD: Driver Class -->
       <tr>
         <th><div align="right">JDBC Driver Class:</div></th>
-        <td><input name="driverClass" type="text" size="30" value="${pool.driverClass}"></td>
+        <td>
+      <c:choose>
+        <c:when test="${empty pool.objectName}">
+          <input name="driverClass" type="text" size="30" value="${pool.driverClass}">
+        </c:when>
+        <c:otherwise>
+          <input type="hidden" name="driverClass" value="${pool.driverClass}" />
+          <i><c:out value="${pool.driverClass}" /></i>
+        </c:otherwise>
+      </c:choose>
+        </td>
       </tr>
       <tr>
         <td></td>
@@ -44,6 +79,8 @@
         </td>
       </tr>
     <!-- ENTRY FIELD: Driver JAR -->
+  <c:choose> <%-- Can't set JAR after deployment because we don't know how to dig through dependencies yet --%>
+    <c:when test="${empty pool.objectName}">
       <tr>
         <th><div align="right">Driver JAR:</div></th>
         <td>
@@ -61,6 +98,11 @@
           <input type="button" value="Download a Driver" onclick="document.<portlet:namespace/>DatabaseForm.mode.value='download';document.<portlet:namespace/>DatabaseForm.submit();return false;" />)
         </td>
       </tr>
+    </c:when>
+    <c:otherwise>
+      <input type="hidden" name="jar1" value="${pool.jar1}" />
+    </c:otherwise>
+  </c:choose>
     <!-- ENTRY FIELD: URL -->
       <tr>
         <th><div align="right">JDBC Connect URL:</div></th>
@@ -86,8 +128,36 @@
       </tr>
       <tr>
         <td></td>
-        <td>The password used to connect to the database</td>
+        <td>The password used to connect to the database
+
+        <%-- Just to be safe, save all the non-Generic properties since we're not going to edit them here --%>
+  <c:forEach var="prop" items="${pool.properties}">
+    <input type="hidden" name="${prop.key}" value="${prop.value}" />
+  </c:forEach>
+        </td>
       </tr>
+  </c:when>
+  <c:otherwise> <%-- This is an XA or other connection factory that we don't have special parameter handling for --%>
+    <c:forEach var="prop" items="${pool.properties}">
+      <tr>
+        <th><div align="right">${pool.propertyNames[prop.key]}:</div></th>
+        <td><input name="${prop.key}" type="<c:choose><c:when test="${fn:containsIgnoreCase(prop.key, 'password')}">password</c:when><c:otherwise>text</c:otherwise></c:choose>" size="20" value="${prop.value}"></td>
+      </tr>
+      <tr>
+        <td></td>
+        <td>${ConfigParams[prop.key].description}</td>
+      </tr>
+    </c:forEach>
+      <tr><td colspan="2">
+        <%-- Just to be safe, save all the Generic properties since we're not going to edit them here --%>
+        <input type="hidden" name="user" value="${pool.user}" />
+        <input type="hidden" name="password" value="${pool.password}" />
+        <input type="hidden" name="driverClass" value="${pool.driverClass}" />
+        <input type="hidden" name="url" value="${pool.url}" />
+        <input type="hidden" name="jar1" value="${pool.jar1}" />
+      </td></tr>
+  </c:otherwise>
+</c:choose>
     <!-- HEADER -->
       <tr>
         <th colspan="2">Connection Pool Parameters</th>
@@ -99,7 +169,7 @@
       </tr>
       <tr>
         <td></td>
-        <td>The minimum number of connections in the pool.  Leave blank for default.</td>
+        <td>The minimum number of connections in the pool.  The default is 0.</td>
       </tr>
     <!-- ENTRY FIELD: Max Size -->
       <tr>
@@ -108,7 +178,7 @@
       </tr>
       <tr>
         <td></td>
-        <td>The maximum number of connections in the pool.  Leave blank for default.</td>
+        <td>The maximum number of connections in the pool.  The default is 10.</td>
       </tr>
     <!-- ENTRY FIELD: Blocking Timeout -->
       <tr>
@@ -117,7 +187,7 @@
       </tr>
       <tr>
         <td></td>
-        <td>The length of time a caller will wait for a connection.  Leave blank for default.</td>
+        <td>The length of time a caller will wait for a connection.  The default is 5000.</td>
       </tr>
     <!-- ENTRY FIELD: Idle timeout -->
       <tr>
@@ -126,14 +196,29 @@
       </tr>
       <tr>
         <td></td>
-        <td>How long a connection can be idle before being closed.  Leave blank for default.</td>
+        <td>How long a connection can be idle before being closed.  The default is 15.</td>
       </tr>
 
     <!-- SUBMIT BUTTON -->
       <tr>
         <td></td>
-        <td><input type="submit" value="Test Connection" />
+        <td>
+<c:choose> <%-- Don't know how to test a non-generic pool, so you can only save it --%>
+  <c:when test="${pool.generic}">
+    <c:choose> <%-- Can't test after deployment because we don't know what JAR to put on the ClassPath --%>
+      <c:when test="${empty pool.objectName}">
+          <input type="submit" value="Test Connection" />
           <input type="button" value="Skip Test" onclick="document.<portlet:namespace/>DatabaseForm.test.value='false';document.<portlet:namespace/>DatabaseForm.submit();return false;" />
+      </c:when>
+      <c:otherwise>
+          <input type="button" value="Save" onclick="document.<portlet:namespace/>DatabaseForm.mode.value='save';document.<portlet:namespace/>DatabaseForm.submit();return false;" />
+      </c:otherwise>
+    </c:choose>
+  </c:when>
+  <c:otherwise>
+          <input type="button" value="Save" onclick="document.<portlet:namespace/>DatabaseForm.mode.value='save';document.<portlet:namespace/>DatabaseForm.submit();return false;" />
+  </c:otherwise>
+</c:choose>
         </td>
       </tr>
     </table>

Modified: geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/list.jsp
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/list.jsp?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/list.jsp (original)
+++ geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/list.jsp Sat Nov 12 19:56:12 2005
@@ -5,7 +5,11 @@
 <p>This page lists all the available database pools.</p>
 <ul>
 <c:forEach var="pool" items="${pools}">
-  <li>${pool.name}</li>
+  <li>${pool.name} (<a href="<portlet:actionURL portletMode="view">
+              <portlet:param name="mode" value="editExisting" />
+              <portlet:param name="adapterObjectName" value="${pool.adapterObjectName}" />
+              <portlet:param name="objectName" value="${pool.factoryObjectName}" />
+            </portlet:actionURL>">edit</a>)</li>
 </c:forEach>
 </ul>
 

Modified: geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/selectDatabase.jsp
URL: http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/selectDatabase.jsp?rev=332881&r1=332880&r2=332881&view=diff
==============================================================================
--- geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/selectDatabase.jsp (original)
+++ geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/dbwizard/selectDatabase.jsp Sat Nov 12 19:56:12 2005
@@ -19,9 +19,15 @@
     <input type="hidden" name="maxSize" value="${pool.maxSize}" />
     <input type="hidden" name="idleTimeout" value="${pool.idleTimeout}" />
     <input type="hidden" name="blockingTimeout" value="${pool.blockingTimeout}" />
+    <input type="hidden" name="adapterDisplayName" value="${pool.adapterDisplayName}" />
+    <input type="hidden" name="adapterDescription" value="${pool.adapterDescription}" />
+    <input type="hidden" name="rarPath" value="${pool.rarPath}" />
   <c:forEach var="prop" items="${pool.properties}">
     <input type="hidden" name="${prop.key}" value="${prop.value}" />
   </c:forEach>
+  <c:forEach var="prop" items="${pool.urlProperties}">
+    <input type="hidden" name="${prop.key}" value="${prop.value}" />
+  </c:forEach>
     <table border="0">
     <!-- ENTRY FIELD: NAME -->
       <tr>
@@ -30,7 +36,7 @@
       </tr>
       <tr>
         <td></td>
-        <td>A name that is different than the name for any other database pools in the server</td>
+        <td>A name that is different than the name for any other database pools in the server (no spaces in the name please).</td>
       </tr>
     <!-- ENTRY FIELD: DB TYPE -->
       <tr>
@@ -40,7 +46,6 @@
         <c:forEach var="db" items="${databases}">
             <option <c:if test="${db.name == pool.dbtype}">selected</c:if>>${db.name}</option>
         </c:forEach>
-            <option>Other</option>
           </select>
         </td>
       </tr>