Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 5825 invoked from network); 13 Nov 2005 03:56:57 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 13 Nov 2005 03:56:57 -0000 Received: (qmail 40082 invoked by uid 500); 13 Nov 2005 03:56:56 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 40055 invoked by uid 500); 13 Nov 2005 03:56:56 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 40044 invoked by uid 99); 13 Nov 2005 03:56:56 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 12 Nov 2005 19:56:56 -0800 X-ASF-Spam-Status: No, hits=-8.2 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME,WEIRD_QUOTING X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Sat, 12 Nov 2005 19:56:46 -0800 Received: (qmail 5694 invoked by uid 65534); 13 Nov 2005 03:56:32 -0000 Message-ID: <20051113035632.5693.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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... Date: Sun, 13 Nov 2005 03:56:28 -0000 To: scm@geronimo.apache.org From: ammulder@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N 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:","in.co.daffodil.db.jdbc.DaffodilDBDriver"), - new DatabaseInfo("DaffodilDB Server","jdbc:daffodilDB://:/","in.co.daffodil.db.rmi.RmiDaffodilDBDriver", 3456), - new DatabaseInfo("DB2","jdbc:db2://:/","com.ibm.db2.jcc.DB2Driver", 50000), - new DatabaseInfo("DB2 (DataDirect)","jdbc:datadirect:db2://:;DatabaseName=","com.ddtek.jdbc.db2.DB2Driver", 50000), - new DatabaseInfo("FrontBase","jdbc:FrontBase://:/","com.frontbase.jdbc.FBJDriver"), - new DatabaseInfo("HSQLDB embedded","jdbc:hsqldb:","org.hsqldb.jdbcDriver"), - new DatabaseInfo("HSQLDB server","jdbc:hsqldb:hsql://:/","org.hsqldb.jdbcDriver"), - new DatabaseInfo("Informix","jdbc:informix-sqli://:/:informixserver=","com.informix.jdbc.IfxDriver"), - new DatabaseInfo("Informix (DataDirect)","jdbc:datadirect:informix://:;informixServer=;DatabaseName=","com.ddtek.jdbc.informix.InformixDriver"), - new DatabaseInfo("InterSystems Cache","jdbc:Cache://:/","com.intersys.jdbc.CacheDriver"), + new DatabaseInfo("DaffodilDB Embedded","jdbc:daffodilDB_embedded:","in.co.daffodil.db.jdbc.DaffodilDBDriver"), + new DatabaseInfo("DaffodilDB Server","jdbc:daffodilDB://:/","in.co.daffodil.db.rmi.RmiDaffodilDBDriver", 3456), + new DatabaseInfo("DB2","jdbc:db2://:/","com.ibm.db2.jcc.DB2Driver", 50000), + new DatabaseInfo("DB2 (DataDirect)","jdbc:datadirect:db2://:;DatabaseName=","com.ddtek.jdbc.db2.DB2Driver", 50000), + new DatabaseInfo("Derby embedded","jdbc:derby:","org.apache.derby.jdbc.EmbeddedDriver"), + new DatabaseInfo("Derby network","jdbc:derby://:/","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://:/","com.frontbase.jdbc.FBJDriver"), + new DatabaseInfo("HSQLDB embedded","jdbc:hsqldb:","org.hsqldb.jdbcDriver"), + new DatabaseInfo("HSQLDB server","jdbc:hsqldb:hsql://:/","org.hsqldb.jdbcDriver"), + new DatabaseInfo("Informix","jdbc:informix-sqli://:/:informixserver=","com.informix.jdbc.IfxDriver"), + new DatabaseInfo("Informix (DataDirect)","jdbc:datadirect:informix://:;informixServer=;DatabaseName=","com.ddtek.jdbc.informix.InformixDriver"), + new DatabaseInfo("InterSystems Cache","jdbc:Cache://:/","com.intersys.jdbc.CacheDriver"), new DatabaseInfo("JDataStore","jdbc:borland:dslocal:","com.borland.datastore.jdbc.DataStoreDriver"), new DatabaseInfo("JDBC/ODBC Bridge","jdbc:odbc:","sun.jdbc.odbc.JdbcOdbcDriver"), - new DatabaseInfo("McKoi","jdbc:mckoi:///","com.mckoi.JDBCDriver"), - new DatabaseInfo("Mimer","jdbc:mimer://:/","com.mimer.jdbc.Driver"), - new DatabaseInfo("MySQL","jdbc:mysql://:/","com.mysql.jdbc.Driver", 3306), - new DatabaseInfo("Oracle Thin","jdbc:oracle:thin:@::","oracle.jdbc.OracleDriver", 1521), - new DatabaseInfo("Oracle OCI","jdbc:oracle:oci:@::","oracle.jdbc.OracleDriver", 1521), - new DatabaseInfo("Oracle (DataDirect)","jdbc:datadirect:oracle://:;ServiceName=","com.ddtek.jdbc.oracle.OracleDriver", 1521), - new DatabaseInfo("Pervasive","jdbc:pervasive://:/","com.pervasive.jdbc.v2.Driver"), - new DatabaseInfo("Pointbase server","jdbc:pointbase:server://:/","com.pointbase.jdbc.jdbcUniversalDriver"), - new DatabaseInfo("PostgreSQL","jdbc:postgresql://:/","org.postgresql.Driver", 5432), - new DatabaseInfo("Progress","jdbc:jdbcProgress:T:::","com.progress.sql.jdbc.JdbcProgressDriver"), - new DatabaseInfo("MaxDB","jdbc:sapdb://:/","com.sap.dbtech.jdbc.DriverSapDB"), - new DatabaseInfo("SQL Server","jdbc:microsoft:sqlserver://:;DatabaseName=","com.microsoft.jdbc.sqlserver.SQLServerDriver", 1433), - new DatabaseInfo("SQL Server (jTDS)","jdbc:jtds:sqlserver://:;DatabaseName=","net.sourceforge.jtds.jdbc.Driver", 1433), - new DatabaseInfo("SQL Server (DataDirect)","jdbc:datadirect:sqlserver://:;DatabaseName=","com.ddtek.jdbc.sqlserver.SQLServerDriver", 1433), - new DatabaseInfo("Sybase ASE","jdbc:sybase:Tds::/","com.sybase.jdbc3.jdbc.SybDriver", 2048), - new DatabaseInfo("Sybase ASA","jdbc:sybase:Tds::/","com.sybase.jdbc3.jdbc.SybDriver", 2638), - new DatabaseInfo("Sybase (DataDirect)","jdbc:datadirect:sybase://:;DatabaseName=","com.ddtek.jdbc.sybase.SybaseDriver"), + new DatabaseInfo("McKoi embedded","jdbc:mckoi:local:////","com.mckoi.JDBCDriver"), + new DatabaseInfo("McKoi server","jdbc:mckoi://://","com.mckoi.JDBCDriver"), + new DatabaseInfo("Mimer","jdbc:mimer://:/","com.mimer.jdbc.Driver"), + new DatabaseInfo("MySQL","jdbc:mysql://:/","com.mysql.jdbc.Driver", 3306), + new DatabaseInfo("Oracle Thin","jdbc:oracle:thin:@::","oracle.jdbc.OracleDriver", 1521), + new DatabaseInfo("Oracle OCI","jdbc:oracle:oci:@::","oracle.jdbc.OracleDriver", 1521), + new DatabaseInfo("Oracle (DataDirect)","jdbc:datadirect:oracle://:;ServiceName=","com.ddtek.jdbc.oracle.OracleDriver", 1521), + new DatabaseInfo("Pervasive","jdbc:pervasive://:/","com.pervasive.jdbc.v2.Driver"), + new DatabaseInfo("Pointbase server","jdbc:pointbase:server://:/","com.pointbase.jdbc.jdbcUniversalDriver"), + new DatabaseInfo("PostgreSQL","jdbc:postgresql://:/","org.postgresql.Driver", 5432), + new DatabaseInfo("Progress","jdbc:jdbcProgress:T:::","com.progress.sql.jdbc.JdbcProgressDriver"), + new DatabaseInfo("MaxDB","jdbc:sapdb://:/","com.sap.dbtech.jdbc.DriverSapDB"), + new DatabaseInfo("SQL Server","jdbc:microsoft:sqlserver://:;DatabaseName=","com.microsoft.jdbc.sqlserver.SQLServerDriver", 1433), + new DatabaseInfo("SQL Server (jTDS)","jdbc:jtds:sqlserver://:;DatabaseName=","net.sourceforge.jtds.jdbc.Driver", 1433), + new DatabaseInfo("SQL Server (DataDirect)","jdbc:datadirect:sqlserver://:;DatabaseName=","com.ddtek.jdbc.sqlserver.SQLServerDriver", 1433), + new DatabaseInfo("Sybase ASE","jdbc:sybase:Tds::/","com.sybase.jdbc3.jdbc.SybDriver", 2048), + new DatabaseInfo("Sybase ASA","jdbc:sybase:Tds::/","com.sybase.jdbc3.jdbc.SybDriver", 2638), + new DatabaseInfo("Sybase (DataDirect)","jdbc:datadirect:sybase://:;DatabaseName=","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 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 // + } 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 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 @@ + + + + + + @@ -75,9 +81,9 @@ - + - + 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 @@ + + + + + +
Typical JDBC URL:
${fn:substringAfter(prop.key,"property-")}:
${fn:substringAfter(prop.key,"urlproperty-")}:
@@ -85,14 +91,6 @@
- -

- - ">Test Connection

-

- - ">Skip Test & Save

-

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"%> @@ -13,28 +14,62 @@ - + + + + + - - + + - + + + + + + + + + + + <%-- This is a standard TranQL JDBC pool -- we know what parameters it wants --%> - + @@ -44,6 +79,8 @@ + <%-- Can't set JAR after deployment because we don't know how to dig through dependencies yet --%> + + + + + + @@ -86,8 +128,36 @@ - + + + <%-- This is an XA or other connection factory that we don't have special parameter handling for --%> + + + + + + + + + + + + + @@ -99,7 +169,7 @@ - + @@ -108,7 +178,7 @@ - + @@ -117,7 +187,7 @@ - + @@ -126,14 +196,29 @@ - + -
Name of Database Pool:
Pool Name:
+ <%-- Can't change the pool name after deployment because it's wired into all the ObjectNames --%> + + + + + + + +
A name that is different than the name for any other database pools in the serverA name that is different than the name for any other database pools in the server (no spaces in the name please).
Pool Type:
+
Basic Connection Properties
JDBC Driver Class:
+ + + + + + + + + +
Driver JAR:
@@ -61,6 +98,11 @@ )
JDBC Connect URL:
The password used to connect to the databaseThe 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 --%> + + + +
${pool.propertyNames[prop.key]}:
passwordtext" size="20" value="${prop.value}">
${ConfigParams[prop.key].description}
+ <%-- Just to be safe, save all the Generic properties since we're not going to edit them here --%> + + + + + +
Connection Pool Parameters
The minimum number of connections in the pool. Leave blank for default.The minimum number of connections in the pool. The default is 0.
The maximum number of connections in the pool. Leave blank for default.The maximum number of connections in the pool. The default is 10.
The length of time a caller will wait for a connection. Leave blank for default.The length of time a caller will wait for a connection. The default is 5000.
How long a connection can be idle before being closed. Leave blank for default.How long a connection can be idle before being closed. The default is 15.
+ + <%-- Don't know how to test a non-generic pool, so you can only save it --%> + + <%-- Can't test after deployment because we don't know what JAR to put on the ClassPath --%> + + + + + + + + + + + +
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 @@

This page lists all the available database pools.

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 @@ + + + + + + @@ -30,7 +36,7 @@ - + @@ -40,7 +46,6 @@ -
A name that is different than the name for any other database pools in the serverA name that is different than the name for any other database pools in the server (no spaces in the name please).