[hibernate-commits] Hibernate SVN: r18624 - in branches/Branch_3_2/HibernateExt/tools/src: java/org/hibernate/cfg/reveng and 2 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Jan 26 07:19:39 EST 2010


Author: max.andersen at 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());
+	}
+}



More information about the hibernate-commits mailing list