Author: max.andersen(a)jboss.com
Date: 2010-01-26 07:19:38 -0500 (Tue, 26 Jan 2010)
New Revision: 18624
Added:
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/MetaDataDialectFactory.java
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/MetaDataDialectFactoryTest.java
Modified:
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/HSQLMetaDataDialect.java
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/Jdbc2CfgAllTests.java
Log:
Fixed statement leak and quoting bug for JBIDE-4486 Primary Key or Idenity not being
respected
+ JBIDE-4426 Filtering Oracle's bogus $BIN tables
Modified:
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java
===================================================================
---
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java 2010-01-26
08:48:00 UTC (rev 18623)
+++
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java 2010-01-26
12:19:38 UTC (rev 18624)
@@ -4,18 +4,8 @@
import org.hibernate.cfg.reveng.JDBCReader;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
-import org.hibernate.cfg.reveng.dialect.H2MetaDataDialect;
-import org.hibernate.cfg.reveng.dialect.HSQLMetaDataDialect;
-import org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect;
import org.hibernate.cfg.reveng.dialect.MetaDataDialect;
-import org.hibernate.cfg.reveng.dialect.MySQLMetaDataDialect;
-import org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect;
import org.hibernate.dialect.Dialect;
-import org.hibernate.dialect.H2Dialect;
-import org.hibernate.dialect.HSQLDialect;
-import org.hibernate.dialect.MySQLDialect;
-import org.hibernate.dialect.Oracle9Dialect;
-import org.hibernate.util.ReflectHelper;
final public class JDBCReaderFactory {
@@ -33,30 +23,9 @@
.getSQLExceptionConverter(), settings.getDefaultCatalogName(),
settings.getDefaultSchemaName(), revengStrategy );
}
- public static MetaDataDialect newMetaDataDialect(Dialect dialect, Properties cfg) {
- String property = cfg.getProperty( "hibernatetool.metadatadialect" );
- if ( property != null ) {
- try {
- return (MetaDataDialect) ReflectHelper.classForName( property,
- JDBCReaderFactory.class ).newInstance();
- }
- catch (Exception e) {
- throw new JDBCBinderException(
- "Could not load MetaDataDialect: " + property, e );
- }
- }
- if(dialect!=null) { // temporary hack to enable dialect specific metadata dialects.
- if(dialect instanceof Oracle9Dialect) {
- return new OracleMetaDataDialect();
- } else if (dialect instanceof H2Dialect) {
- return new H2MetaDataDialect();
- } else if (dialect instanceof MySQLDialect) {
- return new MySQLMetaDataDialect();
- } else if (dialect instanceof HSQLDialect) {
- return new HSQLMetaDataDialect();
- }
- }
- return new JDBCMetaDataDialect();
+ public static MetaDataDialect newMetaDataDialect(Dialect dialect, Properties cfg) {
+ return new MetaDataDialectFactory().createMetaDataDialect(dialect, cfg);
+
}
-
+
}
Added:
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/MetaDataDialectFactory.java
===================================================================
---
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/MetaDataDialectFactory.java
(rev 0)
+++
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/MetaDataDialectFactory.java 2010-01-26
12:19:38 UTC (rev 18624)
@@ -0,0 +1,85 @@
+package org.hibernate.cfg;
+
+import java.util.Properties;
+
+import org.hibernate.cfg.reveng.dialect.H2MetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.HSQLMetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.MetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.MySQLMetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.Oracle8iDialect;
+import org.hibernate.dialect.Oracle9Dialect;
+import org.hibernate.util.ReflectHelper;
+
+public class MetaDataDialectFactory {
+
+ public MetaDataDialect createMetaDataDialect(Dialect dialect, Properties cfg) {
+ String property = cfg.getProperty( "hibernatetool.metadatadialect" );
+ MetaDataDialect mdd = fromClassName(property);
+ if(mdd==null) {
+ mdd = fromDialect(dialect);
+ }
+ if(mdd==null) {
+ mdd = fromDialectName(dialect.getClass().getName());
+ }
+ if(mdd==null) {
+ mdd = new JDBCMetaDataDialect();
+ }
+ return mdd;
+ }
+
+ private MetaDataDialect fromClassName(String property) {
+ if ( property != null ) {
+ try {
+ return (MetaDataDialect) ReflectHelper.classForName( property,
+ JDBCReaderFactory.class ).newInstance();
+ }
+ catch (Exception e) {
+ throw new JDBCBinderException(
+ "Could not load MetaDataDialect: " + property, e );
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public MetaDataDialect fromDialect(Dialect dialect) {
+ if(dialect!=null) {
+ if(dialect instanceof Oracle9Dialect) {
+ return new OracleMetaDataDialect();
+ } else if(dialect instanceof Oracle8iDialect) {
+ return new OracleMetaDataDialect();
+ } else if (dialect instanceof H2Dialect) {
+ return new H2MetaDataDialect();
+ } else if (dialect instanceof MySQLDialect) {
+ return new MySQLMetaDataDialect();
+ } else if (dialect instanceof HSQLDialect) {
+ return new HSQLMetaDataDialect();
+ }
+ }
+ return null;
+ }
+
+ public MetaDataDialect fromDialectName(String dialect) {
+ if (dialect.toLowerCase().contains("oracle")) {
+ return new OracleMetaDataDialect();
+ }
+ if (dialect.toLowerCase().contains("mysql")) {
+ return new MySQLMetaDataDialect();
+ }
+ if (dialect.toLowerCase().contains("h2")) {
+ return new H2MetaDataDialect();
+ }
+ if (dialect.toLowerCase().contains("hsql")) {
+ return new HSQLMetaDataDialect();
+ }
+ return null;
+ }
+
+
+}
Modified:
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java
===================================================================
---
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2010-01-26
08:48:00 UTC (rev 18623)
+++
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2010-01-26
12:19:38 UTC (rev 18624)
@@ -125,8 +125,7 @@
}
}
- public boolean excludeTable(TableIdentifier ti) {
- if(ti.getName().startsWith("BIN$")) return true; // hard code oracle recycle
bin names. Better than requiring users to do it manually. TODO: make it dependent on
dialect.
+ public boolean excludeTable(TableIdentifier ti) {
return false;
}
Modified:
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/HSQLMetaDataDialect.java
===================================================================
---
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/HSQLMetaDataDialect.java 2010-01-26
08:48:00 UTC (rev 18623)
+++
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/HSQLMetaDataDialect.java 2010-01-26
12:19:38 UTC (rev 18624)
@@ -10,6 +10,7 @@
import org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect;
import org.hibernate.cfg.reveng.dialect.ResultSetIterator;
+import org.hibernate.mapping.Table;
/**
* @author Dmitry Geraskov
@@ -17,6 +18,18 @@
*/
public class HSQLMetaDataDialect extends JDBCMetaDataDialect {
+ private String quote(String columnName) {
+ if(columnName==null) return columnName;
+ if(needQuote(columnName)) {
+ if(columnName.length()>1 && columnName.charAt(0)=='\"'
&& columnName.charAt(columnName.length()-1)=='\"') {
+ return columnName; // avoid double quoting
+ }
+ return "\"" + columnName + "\"";
+ } else {
+ return columnName;
+ }
+ }
+
public Iterator getSuggestedPrimaryKeyStrategyName(String catalog, String schema, String
table) {
String sql = null;
try {
@@ -27,30 +40,45 @@
//log.debug("geSuggestedPrimaryKeyStrategyName(" + catalog + "."
+ schema + "." + table + ")");
final String sc = schema;
+ final String cat = catalog;
return new ResultSetIterator(getMetaData().getTables(catalog, schema, table, new
String[]{"TABLE"}),
getSQLExceptionConverter()) {
Map element = new HashMap();
protected Object convertRow(ResultSet tableRs) throws SQLException{
String table = tableRs.getString("TABLE_NAME");
- String fullTableName = (sc == null ? "" : sc + '.') + table;
+ String fullTableName = Table.qualify(cat, sc, quote(table));
String sql ="SELECT * FROM " + fullTableName + " WHERE FALSE";
- PreparedStatement statement = getConnection().prepareStatement( sql );
-
- element.clear();
- element.put("TABLE_NAME", table);
- element.put("TABLE_SCHEM", sc);
- element.put("TABLE_CAT", null);
-
boolean isAutoIncrement = false;
- ResultSet rs = statement.executeQuery();
- ResultSetMetaData rsmd = rs.getMetaData();
- for (int i = 0; i < rsmd.getColumnCount(); i++) {
- isAutoIncrement = rsmd.isAutoIncrement(i + 1);
- if (isAutoIncrement) break;
- }
+ PreparedStatement statement = null;
+ try {
+ statement = getConnection().prepareStatement( sql );
+ element.clear();
+ element.put("TABLE_NAME", table);
+ element.put("TABLE_SCHEM", sc);
+ element.put("TABLE_CAT", null);
+
+ ResultSet rs = statement.executeQuery();
+ ResultSetMetaData rsmd = rs.getMetaData();
+ for (int i = 0; i < rsmd.getColumnCount(); i++) {
+ isAutoIncrement = rsmd.isAutoIncrement(i + 1);
+ if (isAutoIncrement) break;
+ }
+
+ } finally {
+ if(statement!=null) {
+ try {
+ statement.close();
+ }
+ catch (SQLException e) {
+ throw getSQLExceptionConverter().convert(e,
+ "Problem while closing prepared statement", null);
+ }
+ }
+ }
+
if(isAutoIncrement) {
element.put("HIBERNATE_STRATEGY", "identity");
} else {
Modified:
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/Jdbc2CfgAllTests.java
===================================================================
---
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/Jdbc2CfgAllTests.java 2010-01-26
08:48:00 UTC (rev 18623)
+++
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/Jdbc2CfgAllTests.java 2010-01-26
12:19:38 UTC (rev 18624)
@@ -1,5 +1,6 @@
package org.hibernate.tool.test.jdbc2cfg;
+
import junit.framework.Test;
import junit.framework.TestSuite;
@@ -28,6 +29,7 @@
suite.addTest(AutoQuoteTest.suite());
suite.addTest(KeyPropertyCompositeIdTest.suite());
suite.addTest(IndexTest.suite());
+ suite.addTest(new TestSuite(MetaDataDialectFactoryTest.class));
//$JUnit-END$
return suite;
}
Added:
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/MetaDataDialectFactoryTest.java
===================================================================
---
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/MetaDataDialectFactoryTest.java
(rev 0)
+++
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/MetaDataDialectFactoryTest.java 2010-01-26
12:19:38 UTC (rev 18624)
@@ -0,0 +1,120 @@
+package org.hibernate.tool.test.jdbc2cfg;
+
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.hibernate.cfg.JDBCBinderException;
+import org.hibernate.cfg.MetaDataDialectFactory;
+import org.hibernate.cfg.reveng.dialect.H2MetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.HSQLMetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.MySQLMetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.MySQL5Dialect;
+import org.hibernate.dialect.MySQL5InnoDBDialect;
+import org.hibernate.dialect.Oracle10gDialect;
+import org.hibernate.dialect.Oracle8iDialect;
+import org.hibernate.dialect.Oracle9Dialect;
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.dialect.OracleDialect;
+
+public class MetaDataDialectFactoryTest extends TestCase {
+
+ private MetaDataDialectFactory mdf;
+
+ static class NoNameDialect extends Dialect {
+
+ }
+
+ static class H2NamedDialect extends Dialect {
+
+ }
+
+ protected void setUp() throws Exception {
+ mdf = new MetaDataDialectFactory();
+ }
+
+ public void testCreateMetaDataDialect() {
+ assertSameClass("Generic metadata for dialects with no specifics",
JDBCMetaDataDialect.class, mdf.createMetaDataDialect(new NoNameDialect(), new
Properties()));
+ assertSameClass(H2MetaDataDialect.class, mdf.createMetaDataDialect(new
H2NamedDialect(), new Properties()));
+ assertSameClass(OracleMetaDataDialect.class, mdf.createMetaDataDialect(new
OracleDialect(), new Properties()));
+ assertSameClass(MySQLMetaDataDialect.class, mdf.createMetaDataDialect(new
MySQL5Dialect(), new Properties()));
+
+ Properties p = new Properties();
+ p.setProperty("hibernatetool.metadatadialect",
H2MetaDataDialect.class.getCanonicalName());
+ assertSameClass("property should override specific dialect",
H2MetaDataDialect.class, mdf.createMetaDataDialect(new MySQL5Dialect(), p));
+
+ }
+
+ public void testCreateMetaDataDialectNonExistingOverride(Properties p) {
+ p.setProperty("hibernatetool.metadatadialect", "DoesNotExists");
+ try {
+ mdf.createMetaDataDialect(new MySQL5Dialect(), p);
+ fail();
+ } catch (JDBCBinderException jbe) {
+ // expected
+ } catch(Exception e) {
+ fail();
+ }
+ }
+
+ public void testFromDialect() {
+ assertSameClass("Generic metadata for dialects with no specifics", null,
mdf.fromDialect(new NoNameDialect()));
+
+ assertSameClass(OracleMetaDataDialect.class, mdf.fromDialect(new Oracle8iDialect()));
+ assertSameClass(OracleMetaDataDialect.class, mdf.fromDialect(new Oracle9Dialect()));
+ assertSameClass(OracleMetaDataDialect.class, mdf.fromDialect(new Oracle10gDialect()));
+ assertSameClass(OracleMetaDataDialect.class, mdf.fromDialect(new Oracle9iDialect()));
+ assertSameClass(MySQLMetaDataDialect.class, mdf.fromDialect(new
MySQL5InnoDBDialect()));
+ assertSameClass(H2MetaDataDialect.class, mdf.fromDialect(new H2Dialect()));
+ assertSameClass(HSQLMetaDataDialect.class, mdf.fromDialect(new HSQLDialect()));
+
+ }
+
+ public void testFromDialectName() {
+ assertSameClass(null, mdf.fromDialectName("BlahBlah"));
+ assertSameClass(OracleMetaDataDialect.class,
mdf.fromDialectName("mYorAcleDialect"));
+ assertSameClass(OracleMetaDataDialect.class,
mdf.fromDialectName(Oracle8iDialect.class.getName()));
+ assertSameClass(OracleMetaDataDialect.class,
mdf.fromDialectName(Oracle9Dialect.class.getName()));
+ assertSameClass(MySQLMetaDataDialect.class,
mdf.fromDialectName(MySQL5InnoDBDialect.class.getName()));
+ assertSameClass(H2MetaDataDialect.class,
mdf.fromDialectName(H2Dialect.class.getName()));
+ assertSameClass(HSQLMetaDataDialect.class,
mdf.fromDialectName(HSQLDialect.class.getName()));
+
+ }
+
+ public void assertSameClass(Class clazz, Object instance) {
+ if(clazz==null && instance==null) {
+ assertEquals(null,null);
+ return;
+ }
+ if(clazz==null) {
+ assertEquals(null, instance);
+ return;
+ }
+ if(instance==null) {
+ assertEquals(clazz.getCanonicalName(), null);
+ return;
+ }
+ assertEquals(clazz.getCanonicalName(), instance.getClass().getName());
+ }
+
+ public void assertSameClass(String msg, Class clazz, Object instance) {
+ if(clazz==null && instance==null) {
+ assertEquals(null,null);
+ return;
+ }
+ if(clazz==null) {
+ assertEquals(msg, null, instance);
+ return;
+ }
+ if(instance==null) {
+ assertEquals(msg, clazz.getCanonicalName(), null);
+ return;
+ }
+ assertEquals(msg, clazz.getCanonicalName(), instance.getClass().getName());
+ }
+}