[exo-jcr-commits] exo-jcr SVN: r1589 - in jcr/trunk/exo.jcr.component.core/src: test/resources/conf/standalone and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Jan 27 07:58:07 EST 2010


Author: pnedonosko
Date: 2010-01-27 07:58:07 -0500 (Wed, 27 Jan 2010)
New Revision: 1589

Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/DBConstants.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java
   jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config-sjdbc.xml
   jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml
Log:
EXOJCR-310 database dialect detection for JDBC data container (but not for VCAS and conf persister yet)

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/DBConstants.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/DBConstants.java	2010-01-27 12:31:50 UTC (rev 1588)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/DBConstants.java	2010-01-27 12:58:07 UTC (rev 1589)
@@ -286,7 +286,7 @@
     * DB_DIALECT_HSQLDB.
     */
    public final static String DB_DIALECT_HSQLDB = "HSQLDB".intern();
-
+   
    /**
     * DB_DIALECT_DB2.
     */
@@ -316,6 +316,12 @@
     * DB_DIALECT_INGRES.
     */
    public final static String DB_DIALECT_INGRES = "Ingres".intern();
+   
+   /**
+    * DB_DIALECT_H2.
+    */
+   public final static String DB_DIALECT_H2 = "H2".intern();
+   
 
    /**
     * DB_DIALECTS.
@@ -323,6 +329,6 @@
    public final static String[] DB_DIALECTS =
       {DB_DIALECT_GENERIC, DB_DIALECT_ORACLE, DB_DIALECT_ORACLEOCI, DB_DIALECT_PGSQL, DB_DIALECT_MYSQL,
          DB_DIALECT_HSQLDB, DB_DIALECT_DB2, DB_DIALECT_DB2V8, DB_DIALECT_MSSQL, DB_DIALECT_SYBASE, DB_DIALECT_DERBY,
-         DB_DIALECT_MYSQL_UTF8, DB_DIALECT_INGRES};
+         DB_DIALECT_MYSQL_UTF8, DB_DIALECT_INGRES, DB_DIALECT_H2};
 
 }

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java	2010-01-27 12:31:50 UTC (rev 1588)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java	2010-01-27 12:58:07 UTC (rev 1589)
@@ -45,6 +45,9 @@
 import java.io.File;
 import java.io.IOException;
 import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.SQLException;
 
 import javax.jcr.RepositoryException;
 import javax.naming.InitialContext;
@@ -190,7 +193,7 @@
       String pDbDialect = null;
       try
       {
-         pDbDialect = detectDialect(wsConfig.getContainer().getParameterValue(DB_DIALECT));
+         pDbDialect = validateDialect(wsConfig.getContainer().getParameterValue(DB_DIALECT));
          LOG.info("Using a dialect '" + pDbDialect + "'");
       }
       catch (RepositoryConfigurationException e)
@@ -198,7 +201,6 @@
          LOG.info("Using a default dialect '" + DBConstants.DB_DIALECT_GENERIC + "'");
          pDbDialect = DBConstants.DB_DIALECT_GENERIC;
       }
-      this.dbDialect = pDbDialect;
 
       String pDbDriver = null;
       String pDbUrl = null;
@@ -233,6 +235,42 @@
          this.dbPassword = pDbPassword;
          this.dbSourceName = null;
          LOG.info("Connect to JCR database as user '" + this.dbUserName + "'");
+
+         if (pDbDialect == DBConstants.DB_DIALECT_GENERIC)
+         {
+            // try to detect via JDBC metadata
+            Connection jdbcConn = null;
+            try
+            {
+               jdbcConn =
+                  dbUserName != null ? DriverManager.getConnection(dbUrl, dbUserName, dbPassword) : DriverManager
+                     .getConnection(dbUrl);
+
+               this.dbDialect = detectDialect(jdbcConn.getMetaData());
+            }
+            catch (SQLException e)
+            {
+               throw new RepositoryException(e);
+            }
+            finally
+            {
+               if (jdbcConn != null)
+               {
+                  try
+                  {
+                     jdbcConn.close();
+                  }
+                  catch (SQLException e)
+                  {
+                     throw new RepositoryException(e);
+                  }
+               }
+            }
+         }
+         else
+         {
+            this.dbDialect = pDbDialect;
+         }
       }
       else
       {
@@ -252,6 +290,47 @@
             // remove in rel.2.0
          }
          this.dbSourceName = sn;
+
+         if (pDbDialect == DBConstants.DB_DIALECT_GENERIC)
+         {
+            // try to detect via JDBC metadata
+            DataSource ds = (DataSource)new InitialContext().lookup(dbSourceName);
+            if (ds != null)
+            {
+               Connection jdbcConn = null;
+               try
+               {
+                  jdbcConn = ds.getConnection();
+                  this.dbDialect = detectDialect(jdbcConn.getMetaData());
+               }
+               catch (SQLException e)
+               {
+                  throw new RepositoryException(e);
+               }
+               finally
+               {
+                  if (jdbcConn != null)
+                  {
+                     try
+                     {
+                        jdbcConn.close();
+                     }
+                     catch (SQLException e)
+                     {
+                        throw new RepositoryException(e);
+                     }
+                  }
+               }
+            }
+            else
+            {
+               throw new RepositoryException("Datasource '" + dbSourceName + "' is not bound in this context.");
+            }
+         }
+         else
+         {
+            this.dbDialect = pDbDialect;
+         }
       }
 
       // ------------- Values swap config ------------------
@@ -301,6 +380,100 @@
    }
 
    /**
+    * Detect databse dialect using JDBC metadata. Based on code of 
+    * http://svn.jboss.org/repos/hibernate/core/trunk/core/src/main/java/org/hibernate/dialect/resolver/StandardDialectResolver.java 
+    * 
+    * @param jdbcConn Connection 
+    * @return String
+    * @throws SQLException if error occurs
+    */
+   protected String detectDialect(DatabaseMetaData metaData) throws SQLException
+   {
+      String databaseName = metaData.getDatabaseProductName();
+
+      if ("HSQL Database Engine".equals(databaseName))
+      {
+         return DBConstants.DB_DIALECT_HSQLDB;
+      }
+
+      if ("H2".equals(databaseName))
+      {
+         return DBConstants.DB_DIALECT_H2;
+      }
+
+      if ("MySQL".equals(databaseName))
+      {
+         // TODO doesn't detect MySQL_UTF8
+         return DBConstants.DB_DIALECT_MYSQL;
+      }
+
+      if ("PostgreSQL".equals(databaseName))
+      {
+         return DBConstants.DB_DIALECT_PGSQL;
+      }
+
+      if ("Apache Derby".equals(databaseName))
+      {
+         return DBConstants.DB_DIALECT_DERBY;
+      }
+
+      if ("ingres".equalsIgnoreCase(databaseName))
+      {
+         return DBConstants.DB_DIALECT_INGRES;
+      }
+
+      if (databaseName.startsWith("Microsoft SQL Server"))
+      {
+         return DBConstants.DB_DIALECT_MSSQL;
+      }
+
+      if ("Sybase SQL Server".equals(databaseName) || "Adaptive Server Enterprise".equals(databaseName))
+      {
+         return DBConstants.DB_DIALECT_SYBASE;
+      }
+
+      if (databaseName.startsWith("Adaptive Server Anywhere"))
+      {
+         // TODO not implemented anything special for
+         return DBConstants.DB_DIALECT_SYBASE;
+      }
+
+      // TODO Informix not supported now
+      //if ( "Informix Dynamic Server".equals( databaseName ) ) {
+      //   return new InformixDialect();
+      //}
+
+      if (databaseName.startsWith("DB2/"))
+      {
+         // TODO doesn't detect DB2 v8 
+         return DBConstants.DB_DIALECT_DB2;
+      }
+
+      if ("Oracle".equals(databaseName))
+      {
+         // TODO doesn't detect Oracle OCI (experimental support still)
+         return DBConstants.DB_DIALECT_ORACLE;
+
+         //         int databaseMajorVersion = metaData.getDatabaseMajorVersion();
+         //         switch ( databaseMajorVersion ) {
+         //            case 11:
+         //               log.warn( "Oracle 11g is not yet fully supported; using 10g dialect" );
+         //               return new Oracle10gDialect();
+         //            case 10:
+         //               return new Oracle10gDialect();
+         //            case 9:
+         //               return new Oracle9iDialect();
+         //            case 8:
+         //               return new Oracle8iDialect();
+         //            default:
+         //               log.warn( "unknown Oracle major version [" + databaseMajorVersion + "]" );
+         //         }
+      }
+
+      return DBConstants.DB_DIALECT_GENERIC;
+   }
+
+   /**
     * Prepare sefault connection factory.
     * 
     * @return GenericConnectionFactory
@@ -618,12 +791,14 @@
       return connFactory;
    }
 
-   protected String detectDialect(String confParam)
+   protected String validateDialect(String confParam)
    {
       for (String dbType : DBConstants.DB_DIALECTS)
       {
          if (dbType.equalsIgnoreCase(confParam))
+         {
             return dbType;
+         }
       }
 
       return DBConstants.DB_DIALECT_GENERIC; // by default

Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config-sjdbc.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config-sjdbc.xml	2010-01-27 12:31:50 UTC (rev 1588)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config-sjdbc.xml	2010-01-27 12:58:07 UTC (rev 1589)
@@ -32,7 +32,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcr" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="false" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -79,7 +78,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcr" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="false" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -124,7 +122,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcr" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="false" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -170,7 +167,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcr" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="false" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -240,7 +236,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcrtck" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="false" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -296,7 +291,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcrtck" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="false" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -343,7 +337,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcrtck" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="false" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />

Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml	2010-01-27 12:31:50 UTC (rev 1588)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml	2010-01-27 12:58:07 UTC (rev 1589)
@@ -33,7 +33,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcr" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="true" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -90,7 +89,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcr1" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="true" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -134,7 +132,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcr2" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="true" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -180,7 +177,6 @@
 						class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
 						<properties>
 							<property name="source-name" value="jdbcjcr3" />
-							<property name="dialect" value="hsqldb" />
 							<property name="multi-db" value="true" />
 							<property name="update-storage" value="false" />
 							<property name="max-buffer-size" value="200k" />
@@ -264,7 +260,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcrtck" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="true" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -315,7 +310,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcr1tck" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="true" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />
@@ -365,7 +359,6 @@
                <container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
                   <properties>
                      <property name="source-name" value="jdbcjcr2tck" />
-                     <property name="dialect" value="hsqldb" />
                      <property name="multi-db" value="true" />
                      <property name="update-storage" value="false" />
                      <property name="max-buffer-size" value="200k" />



More information about the exo-jcr-commits mailing list