[jbpm-commits] JBoss JBPM SVN: r5717 - in jbpm3/branches/jbpm-3.2-soa/modules: core/src/test/java/org/jbpm/context/exe and 2 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Oct 8 02:03:55 EDT 2009


Author: alex.guizar at jboss.com
Date: 2009-10-08 02:03:55 -0400 (Thu, 08 Oct 2009)
New Revision: 5717

Modified:
   jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/db/JbpmSchema.java
   jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/context/exe/CustomVariableLongIdDbTest.java
   jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/context/exe/CustomVariableStringIdDbTest.java
   jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/graph/node/JoinDbTest.java
   jbpm3/branches/jbpm-3.2-soa/modules/examples/src/test/java/org/jbpm/examples/taskinstance/CustomTaskInstanceTest.java
Log:
[JBPM-2563] workaround for HHH-4457

Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/db/JbpmSchema.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/db/JbpmSchema.java	2009-10-07 22:49:40 UTC (rev 5716)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/db/JbpmSchema.java	2009-10-08 06:03:55 UTC (rev 5717)
@@ -49,7 +49,10 @@
 import org.hibernate.connection.ConnectionProvider;
 import org.hibernate.connection.ConnectionProviderFactory;
 import org.hibernate.dialect.Dialect;
+import org.hibernate.engine.Mapping;
+import org.hibernate.mapping.Column;
 import org.hibernate.mapping.Table;
+import org.hibernate.tool.hbm2ddl.ColumnMetadata;
 import org.hibernate.tool.hbm2ddl.DatabaseMetadata;
 import org.hibernate.tool.hbm2ddl.TableMetadata;
 import org.hibernate.util.JDBCExceptionReporter;
@@ -122,8 +125,8 @@
     Connection connection = null;
     try {
       connection = createConnection();
-      return configuration.generateSchemaUpdateScript(getDialect(),
-          getDatabaseMetadata(connection));
+      return configuration
+        .generateSchemaUpdateScript(getDialect(), getDatabaseMetadata(connection));
     }
     catch (SQLException e) {
       exceptions.add(e);
@@ -307,8 +310,8 @@
 
       DatabaseMetaData metaData = connection.getMetaData();
       boolean storesLowerCaseIdentifiers = metaData.storesLowerCaseIdentifiers();
-      ResultSet resultSet = metaData.getTables(getDefaultCatalog(), getDefaultSchema(), null,
-          TABLE_TYPES);
+      ResultSet resultSet = metaData
+        .getTables(getDefaultCatalog(), getDefaultSchema(), null, TABLE_TYPES);
       try {
         while (resultSet.next()) {
           String tableName = resultSet.getString("TABLE_NAME");
@@ -339,8 +342,8 @@
       connection = createConnection();
 
       DatabaseMetaData metaData = connection.getMetaData();
-      ResultSet resultSet = metaData.getTables(getDefaultCatalog(), getDefaultSchema(),
-          tableName, TABLE_TYPES);
+      ResultSet resultSet = metaData
+        .getTables(getDefaultCatalog(), getDefaultSchema(), tableName, TABLE_TYPES);
       try {
         return resultSet.next();
       }
@@ -360,20 +363,24 @@
   }
 
   public void updateTable(String tableName) {
+    Table table = findTableMapping(tableName);
+
     Connection connection = null;
     try {
       connection = createConnection();
+      TableMetadata tableInfo = getTableMetadata(connection, table);
 
-      Table table = findTableMapping(tableName);
-      Iterator script = table.sqlAlterStrings(getDialect(), configuration.buildMapping(),
-          getTableMetadata(connection, table), getDefaultCatalog(), getDefaultSchema());
-
       Statement statement = connection.createStatement();
       try {
-        while (script.hasNext()) {
-          String sql = (String) script.next();
-          execute(sql, statement);
+        if (tableInfo != null) {
+          for (Iterator script = sqlAlterStrings(table, tableInfo); script.hasNext();) {
+            String sql = (String) script.next();
+            execute(sql, statement);
+          }
         }
+        else {
+          execute(sqlCreateString(table), statement);
+        }
       }
       finally {
         statement.close();
@@ -396,23 +403,92 @@
     throw new JbpmException("no mapping found for table: " + tableName);
   }
 
+  private TableMetadata getTableMetadata(Connection connection, Table table)
+    throws SQLException {
+    String tableSchema = table.getSchema();
+    if (tableSchema == null) tableSchema = getDefaultSchema();
+
+    String tableCatalog = table.getCatalog();
+    if (tableCatalog == null) tableCatalog = getDefaultCatalog();
+
+    return getDatabaseMetadata(connection)
+      .getTableMetadata(table.getName(), tableSchema, tableCatalog, table.isQuoted());
+  }
+
   private DatabaseMetadata getDatabaseMetadata(Connection connection) throws SQLException {
     return new DatabaseMetadata(connection, getDialect());
   }
 
-  private TableMetadata getTableMetadata(Connection connection, Table table)
-      throws SQLException {
-    String tableSchema = table.getSchema();
-    String tableCatalog = table.getCatalog();
-    return getDatabaseMetadata(connection).getTableMetadata(table.getName(),
-        tableSchema != null ? tableSchema : getDefaultSchema(),
-        tableCatalog != null ? tableCatalog : getDefaultCatalog(), table.isQuoted());
+  /**
+   * Workaround for bug in {@link Table#sqlAlterStrings}.
+   * 
+   * @param table TODO
+   * @param tableMetadata TODO
+   * @see <a
+   *      href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-4457">HHH-4457</a>
+   */
+  private Iterator sqlAlterStrings(Table table, TableMetadata tableMetadata)
+    throws SQLException {
+    Dialect dialect = getDialect();
+    Mapping mapping = configuration.buildMapping();
+
+    StringBuffer root = new StringBuffer("alter table ")
+      .append(table.getQualifiedName(dialect, getDefaultCatalog(), getDefaultSchema()))
+      .append(' ')
+      .append(dialect.getAddColumnString());
+    int rootLength = root.length();
+
+    List results = new ArrayList();
+    for (Iterator iter = table.getColumnIterator(); iter.hasNext();) {
+      Column column = (Column) iter.next();
+
+      ColumnMetadata columnInfo = tableMetadata.getColumnMetadata(column.getName());
+      if (columnInfo == null) {
+        // the column doesn't exist at all
+        root.setLength(rootLength);
+        StringBuffer alter = root
+          .append(' ')
+          .append(column.getQuotedName(dialect))
+          .append(' ')
+          .append(column.getSqlType(dialect, mapping));
+
+        String defaultValue = column.getDefaultValue();
+        if (defaultValue != null) {
+          alter.append(" default ").append(defaultValue);
+        }
+
+        if (column.isNullable()) {
+          alter.append(dialect.getNullColumnString());
+        }
+        else {
+          alter.append(" not null");
+        }
+
+        boolean useUniqueConstraint = column.isUnique()
+          && dialect.supportsUnique()
+          && (!column.isNullable() || dialect.supportsNotNullUnique());
+        if (useUniqueConstraint) {
+          alter.append(" unique");
+        }
+
+        if (column.hasCheckConstraint() && dialect.supportsColumnCheck()) {
+          alter.append(" check(").append(column.getCheckConstraint()).append(")");
+        }
+
+        String columnComment = column.getComment();
+        if (columnComment != null) {
+          alter.append(dialect.getColumnComment(columnComment));
+        }
+
+        results.add(alter.toString());
+      }
+    }
+    return results.iterator();
   }
 
   public void createTable(String tableName) {
     Table table = findTableMapping(tableName);
-    String sql = table.sqlCreateString(getDialect(), configuration.buildMapping(),
-        getDefaultCatalog(), getDefaultSchema());
+    String sql = sqlCreateString(table);
     try {
       execute(new String[] { sql });
     }
@@ -422,6 +498,11 @@
     }
   }
 
+  private String sqlCreateString(Table table) {
+    return table
+      .sqlCreateString(getDialect(), configuration.buildMapping(), getDefaultCatalog(), getDefaultSchema());
+  }
+
   public static void main(String[] args) {
     if (args.length > 0) {
       String action = args[0];
@@ -454,7 +535,8 @@
     System.err.println("JbpmSchema drop [<hibernate.cfg.xml> [<hibernate.properties>]]");
     System.err.println("JbpmSchema clean [<hibernate.cfg.xml> [<hibernate.properties>]]");
     System.err.println("JbpmSchema update [<hibernate.cfg.xml> [<hibernate.properties>]]");
-    System.err.println("JbpmSchema scripts <dir> <prefix> [<hibernate.cfg.xml> [<hibernate.properties>]]");
+    System.err
+      .println("JbpmSchema scripts <dir> <prefix> [<hibernate.cfg.xml> [<hibernate.properties>]]");
     System.exit(1);
   }
 
@@ -491,7 +573,8 @@
 
   private Connection createConnection() throws SQLException {
     try {
-      connectionProvider = ConnectionProviderFactory.newConnectionProvider(configuration.getProperties());
+      connectionProvider = ConnectionProviderFactory.newConnectionProvider(configuration
+        .getProperties());
     }
     catch (HibernateException e) {
       throw new SQLException(e.getMessage());

Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/context/exe/CustomVariableLongIdDbTest.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/context/exe/CustomVariableLongIdDbTest.java	2009-10-07 22:49:40 UTC (rev 5716)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/context/exe/CustomVariableLongIdDbTest.java	2009-10-08 06:03:55 UTC (rev 5717)
@@ -47,7 +47,7 @@
         configuration.addClass(CustomLongClass.class);
 
         JbpmSchema jbpmSchema = new JbpmSchema(configuration);
-        jbpmSchema.updateSchema();
+        jbpmSchema.createTable("JBPM_TEST_CUSTOMLONGID");
       }
       finally {
         jbpmContext.close();

Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/context/exe/CustomVariableStringIdDbTest.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/context/exe/CustomVariableStringIdDbTest.java	2009-10-07 22:49:40 UTC (rev 5716)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/context/exe/CustomVariableStringIdDbTest.java	2009-10-08 06:03:55 UTC (rev 5717)
@@ -47,7 +47,7 @@
         configuration.addClass(CustomStringClass.class);
 
         JbpmSchema jbpmSchema = new JbpmSchema(configuration);
-        jbpmSchema.updateSchema();
+        jbpmSchema.createTable("JBPM_TEST_CUSTOMSTRINGID");
       }
       finally {
         jbpmContext.close();

Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/graph/node/JoinDbTest.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/graph/node/JoinDbTest.java	2009-10-07 22:49:40 UTC (rev 5716)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/graph/node/JoinDbTest.java	2009-10-08 06:03:55 UTC (rev 5717)
@@ -78,7 +78,7 @@
             .getServiceFactory(Services.SERVICENAME_PERSISTENCE);
 
         JbpmSchema jbpmSchema = new JbpmSchema(persistenceServiceFactory.getConfiguration());
-        jbpmSchema.updateSchema();
+        jbpmSchema.updateTable("JBPM_NODE");
       }
       finally {
         jbpmContext.close();

Modified: jbpm3/branches/jbpm-3.2-soa/modules/examples/src/test/java/org/jbpm/examples/taskinstance/CustomTaskInstanceTest.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/examples/src/test/java/org/jbpm/examples/taskinstance/CustomTaskInstanceTest.java	2009-10-07 22:49:40 UTC (rev 5716)
+++ jbpm3/branches/jbpm-3.2-soa/modules/examples/src/test/java/org/jbpm/examples/taskinstance/CustomTaskInstanceTest.java	2009-10-08 06:03:55 UTC (rev 5717)
@@ -66,7 +66,7 @@
       configuration.addResource("taskinstance/CustomTaskInstance.hbm.xml");
 
       JbpmSchema jbpmSchema = new JbpmSchema(configuration);
-      jbpmSchema.updateSchema();
+      jbpmSchema.updateTable("JBPM_TASKINSTANCE");
     }
     return jbpmConfiguration;
   }



More information about the jbpm-commits mailing list