You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(22) |
Nov
(308) |
Dec
(131) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(369) |
Feb
(171) |
Mar
(236) |
Apr
(187) |
May
(218) |
Jun
(217) |
Jul
(127) |
Aug
(448) |
Sep
(270) |
Oct
(231) |
Nov
(422) |
Dec
(255) |
2004 |
Jan
(111) |
Feb
(73) |
Mar
(338) |
Apr
(351) |
May
(349) |
Jun
(495) |
Jul
(394) |
Aug
(1048) |
Sep
(499) |
Oct
(142) |
Nov
(269) |
Dec
(638) |
2005 |
Jan
(825) |
Feb
(1272) |
Mar
(593) |
Apr
(690) |
May
(950) |
Jun
(958) |
Jul
(767) |
Aug
(839) |
Sep
(525) |
Oct
(449) |
Nov
(585) |
Dec
(455) |
2006 |
Jan
(603) |
Feb
(656) |
Mar
(195) |
Apr
(114) |
May
(136) |
Jun
(100) |
Jul
(128) |
Aug
(68) |
Sep
(7) |
Oct
(1) |
Nov
(1) |
Dec
(8) |
2007 |
Jan
(4) |
Feb
(3) |
Mar
(8) |
Apr
(16) |
May
(5) |
Jun
(4) |
Jul
(6) |
Aug
(23) |
Sep
(15) |
Oct
(5) |
Nov
(7) |
Dec
(5) |
2008 |
Jan
(5) |
Feb
(1) |
Mar
(1) |
Apr
(5) |
May
(1) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2012 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
(1) |
Jul
(1) |
Aug
(1) |
Sep
|
Oct
(2) |
Nov
(3) |
Dec
(2) |
2013 |
Jan
(1) |
Feb
|
Mar
(2) |
Apr
(1) |
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(2) |
Jun
(1) |
Jul
|
Aug
(1) |
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2017 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <hib...@li...> - 2006-03-06 15:16:30
|
Author: ste...@jb... Date: 2006-03-06 10:16:27 -0500 (Mon, 06 Mar 2006) New Revision: 9557 Modified: trunk/Hibernate3/src/org/hibernate/exception/JDBCExceptionHelper.java trunk/Hibernate3/src/org/hibernate/exception/SQLStateConverter.java Log: lock acquisition SQLState codes Modified: trunk/Hibernate3/src/org/hibernate/exception/JDBCExceptionHelper.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/exception/JDBCExceptionHelper.java 2006-03-06 15:15:51 UTC (rev 9556) +++ trunk/Hibernate3/src/org/hibernate/exception/JDBCExceptionHelper.java 2006-03-06 15:16:27 UTC (rev 9557) @@ -82,13 +82,13 @@ * @return The SQLState class code, or null. */ public static String extractSqlStateClassCode(SQLException sqlException) { - String sqlState = extractSqlState( sqlException ); + return determineSqlStateClassCode( extractSqlState( sqlException ) ); + } + public static String determineSqlStateClassCode(String sqlState) { if ( sqlState == null || sqlState.length() < 2 ) { return sqlState; } - return sqlState.substring( 0, 2 ); } - } Modified: trunk/Hibernate3/src/org/hibernate/exception/SQLStateConverter.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/exception/SQLStateConverter.java 2006-03-06 15:15:51 UTC (rev 9556) +++ trunk/Hibernate3/src/org/hibernate/exception/SQLStateConverter.java 2006-03-06 15:16:27 UTC (rev 9557) @@ -57,23 +57,35 @@ * @return The resulting JDBCException. */ public JDBCException convert(SQLException sqlException, String message, String sql) { + String sqlState = JDBCExceptionHelper.extractSqlState( sqlException ); - String sqlStateClassCode = JDBCExceptionHelper.extractSqlStateClassCode( sqlException ); + if ( sqlState != null ) { + String sqlStateClassCode = JDBCExceptionHelper.determineSqlStateClassCode( sqlState ); - if ( sqlStateClassCode != null ) { - if ( SQL_GRAMMAR_CATEGORIES.contains( sqlStateClassCode ) ) { - return new SQLGrammarException( message, sqlException, sql ); + if ( sqlStateClassCode != null ) { + if ( SQL_GRAMMAR_CATEGORIES.contains( sqlStateClassCode ) ) { + return new SQLGrammarException( message, sqlException, sql ); + } + else if ( INTEGRITY_VIOLATION_CATEGORIES.contains( sqlStateClassCode ) ) { + String constraintName = extracter.extractConstraintName( sqlException ); + return new ConstraintViolationException( message, sqlException, sql, constraintName ); + } + else if ( CONNECTION_CATEGORIES.contains( sqlStateClassCode ) ) { + return new JDBCConnectionException( message, sqlException, sql ); + } + else if ( DATA_CATEGORIES.contains( sqlStateClassCode ) ) { + return new DataException( message, sqlException, sql ); + } } - else if ( INTEGRITY_VIOLATION_CATEGORIES.contains( sqlStateClassCode ) ) { - String constraintName = extracter.extractConstraintName( sqlException ); - return new ConstraintViolationException( message, sqlException, sql, constraintName ); + + if ( "40001".equals( sqlState ) ) { + return new LockAcquisitionException( message, sqlException, sql ); } - else if ( CONNECTION_CATEGORIES.contains( sqlStateClassCode ) ) { - return new JDBCConnectionException( message, sqlException, sql ); + + if ( "61000".equals( sqlState ) ) { + // oracle sql-state code for deadlock + return new LockAcquisitionException( message, sqlException, sql ); } - else if ( DATA_CATEGORIES.contains( sqlStateClassCode ) ) { - return new DataException( message, sqlException, sql ); - } } return handledNonSpecificException( sqlException, message, sql ); |
From: <hib...@li...> - 2006-03-06 15:15:53
|
Author: ste...@jb... Date: 2006-03-06 10:15:51 -0500 (Mon, 06 Mar 2006) New Revision: 9556 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/exception/JDBCExceptionHelper.java branches/Branch_3_1/Hibernate3/src/org/hibernate/exception/SQLStateConverter.java Log: lock acquisition SQLState codes Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/exception/JDBCExceptionHelper.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/exception/JDBCExceptionHelper.java 2006-03-06 14:44:18 UTC (rev 9555) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/exception/JDBCExceptionHelper.java 2006-03-06 15:15:51 UTC (rev 9556) @@ -82,12 +82,13 @@ * @return The SQLState class code, or null. */ public static String extractSqlStateClassCode(SQLException sqlException) { - String sqlState = extractSqlState( sqlException ); + return determineSqlStateClassCode( extractSqlState( sqlException ) ); + } + public static String determineSqlStateClassCode(String sqlState) { if ( sqlState == null || sqlState.length() < 2 ) { return sqlState; } - return sqlState.substring( 0, 2 ); } Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/exception/SQLStateConverter.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/exception/SQLStateConverter.java 2006-03-06 14:44:18 UTC (rev 9555) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/exception/SQLStateConverter.java 2006-03-06 15:15:51 UTC (rev 9556) @@ -57,23 +57,35 @@ * @return The resulting JDBCException. */ public JDBCException convert(SQLException sqlException, String message, String sql) { + String sqlState = JDBCExceptionHelper.extractSqlState( sqlException ); - String sqlStateClassCode = JDBCExceptionHelper.extractSqlStateClassCode( sqlException ); + if ( sqlState != null ) { + String sqlStateClassCode = JDBCExceptionHelper.determineSqlStateClassCode( sqlState ); - if ( sqlStateClassCode != null ) { - if ( SQL_GRAMMAR_CATEGORIES.contains( sqlStateClassCode ) ) { - return new SQLGrammarException( message, sqlException, sql ); + if ( sqlStateClassCode != null ) { + if ( SQL_GRAMMAR_CATEGORIES.contains( sqlStateClassCode ) ) { + return new SQLGrammarException( message, sqlException, sql ); + } + else if ( INTEGRITY_VIOLATION_CATEGORIES.contains( sqlStateClassCode ) ) { + String constraintName = extracter.extractConstraintName( sqlException ); + return new ConstraintViolationException( message, sqlException, sql, constraintName ); + } + else if ( CONNECTION_CATEGORIES.contains( sqlStateClassCode ) ) { + return new JDBCConnectionException( message, sqlException, sql ); + } + else if ( DATA_CATEGORIES.contains( sqlStateClassCode ) ) { + return new DataException( message, sqlException, sql ); + } } - else if ( INTEGRITY_VIOLATION_CATEGORIES.contains( sqlStateClassCode ) ) { - String constraintName = extracter.extractConstraintName( sqlException ); - return new ConstraintViolationException( message, sqlException, sql, constraintName ); + + if ( "40001".equals( sqlState ) ) { + return new LockAcquisitionException( message, sqlException, sql ); } - else if ( CONNECTION_CATEGORIES.contains( sqlStateClassCode ) ) { - return new JDBCConnectionException( message, sqlException, sql ); + + if ( "61000".equals( sqlState ) ) { + // oracle sql-state code for deadlock + return new LockAcquisitionException( message, sqlException, sql ); } - else if ( DATA_CATEGORIES.contains( sqlStateClassCode ) ) { - return new DataException( message, sqlException, sql ); - } } return handledNonSpecificException( sqlException, message, sql ); |
From: <hib...@li...> - 2006-03-06 14:44:21
|
Author: ste...@jb... Date: 2006-03-06 09:44:18 -0500 (Mon, 06 Mar 2006) New Revision: 9555 Modified: trunk/Hibernate3/build.xml Log: direct junit and clover output to build subdirectories Modified: trunk/Hibernate3/build.xml =================================================================== --- trunk/Hibernate3/build.xml 2006-03-05 07:22:56 UTC (rev 9554) +++ trunk/Hibernate3/build.xml 2006-03-06 14:44:18 UTC (rev 9555) @@ -36,9 +36,9 @@ <property name="testclasses.dir" value="${build.dir}/testclasses"/> <property name="generated.src" value="${build.dir}/gensrc"/> <property name="parser.src" value="${generated.src}/org/hibernate/hql/antlr"/> - <property name="test.out.dir" value="testout"/> - <property name="instrumenttest.out.dir" value="instrumenttestout"/> - <property name="clover.out.dir" value="cloverout"/> + <property name="test.out.dir" value="${build.dir}/testout"/> + <property name="instrumenttest.out.dir" value="${build.dir}/instrumenttestout"/> + <property name="clover.out.dir" value="${build.dir}/cloverout"/> <property name="dist.dir" value="../${name}-${version.major_minor}"/> <property name="doc.dir" value="doc"/> <property name="doc.api.dir" value="${doc.dir}/api"/> |
Author: max...@jb... Date: 2006-03-05 02:22:56 -0500 (Sun, 05 Mar 2006) New Revision: 9554 Added: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/SchemaSelection.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/DefaultSchemaCatalogTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/schemaselection.reveng.xml Log: HBX-613 and HBX-615 reveng.xml changes/addition Added: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/SchemaSelection.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/SchemaSelection.java 2006-03-05 07:21:47 UTC (rev 9553) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/SchemaSelection.java 2006-03-05 07:22:56 UTC (rev 9554) @@ -0,0 +1,42 @@ +package org.hibernate.cfg.reveng; + +public class SchemaSelection { + + String matchCatalog; + String matchSchema; + String matchTable; + + public SchemaSelection(String catalog, String schema) { + matchCatalog = catalog; + matchSchema = schema; + } + + public SchemaSelection() { + + } + + public String getMatchCatalog() { + return matchCatalog; + } + + public void setMatchCatalog(String catalogPattern) { + this.matchCatalog = catalogPattern; + } + + public String getMatchSchema() { + return matchSchema; + } + + public void setMatchSchema(String schemaPattern) { + this.matchSchema = schemaPattern; + } + + public String getMatchTable() { + return matchTable; + } + + public void setMatchTable(String tablePattern) { + this.matchTable = tablePattern; + } + +} Added: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/DefaultSchemaCatalogTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/DefaultSchemaCatalogTest.java 2006-03-05 07:21:47 UTC (rev 9553) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/DefaultSchemaCatalogTest.java 2006-03-05 07:22:56 UTC (rev 9554) @@ -0,0 +1,143 @@ +/* + * Created on 2004-12-01 + * + */ +package org.hibernate.tool.hbm2x; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.hibernate.cfg.Environment; +import org.hibernate.cfg.JDBCMetaDataConfiguration; +import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; +import org.hibernate.cfg.reveng.OverrideRepository; +import org.hibernate.cfg.reveng.SchemaSelection; +import org.hibernate.cfg.reveng.TableIdentifier; +import org.hibernate.mapping.Table; +import org.hibernate.tool.JDBCMetaDataBinderTestCase; + + + +/** + * @author max + * + */ +public class DefaultSchemaCatalogTest extends JDBCMetaDataBinderTestCase { + + + protected void configure(JDBCMetaDataConfiguration cfg) { + super.configure( cfg ); + } + + public void testReadOnlySpecificSchema() { + + JDBCMetaDataConfiguration configuration = new JDBCMetaDataConfiguration(); + + OverrideRepository or = new OverrideRepository(); + or.addSchemaSelection(new SchemaSelection(null, "OVRTEST")); + configuration.setReverseEngineeringStrategy(or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy())); + configuration.readFromJDBC(); + + List tables = getTables(configuration); + + assertEquals(2,tables.size()); + + Table catchild = (Table) tables.get(0); + Table catmaster = (Table) tables.get(1); + + if(catchild.getName().equals("CATMASTER")) { + catchild = (Table) tables.get(1); + catmaster = (Table) tables.get(0); + } + + TableIdentifier masterid = TableIdentifier.create(catmaster); + TableIdentifier childid = TableIdentifier.create(catchild); + + assertEquals(new TableIdentifier(null, "OVRTEST", "CATMASTER"), masterid); + assertEquals(new TableIdentifier(null, "OVRTEST", "CATCHILD"), childid); + + } + + public void testOverlapping() { + + JDBCMetaDataConfiguration configuration = new JDBCMetaDataConfiguration(); + + OverrideRepository or = new OverrideRepository(); + or.addSchemaSelection(new SchemaSelection(null, "OVRTEST")); + or.addSchemaSelection(new SchemaSelection(null, null)); + configuration.setReverseEngineeringStrategy(or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy())); + configuration.readFromJDBC(); + + Set tables = new HashSet(); + Iterator iter = configuration.getTableMappings(); + while(iter.hasNext()) { + Table element = (Table) iter.next(); + boolean added = tables.add(TableIdentifier.create(element)); + if(!added) fail("duplicate table found for " + element); + } + + assertEquals(4,tables.size()); + } + + public void testUseDefault() { + + JDBCMetaDataConfiguration configuration = new JDBCMetaDataConfiguration(); + configuration.setProperty(Environment.DEFAULT_SCHEMA, "OVRTEST"); + configuration.setProperty(Environment.DEFAULT_SCHEMA, "OVRTEST"); + configuration.readFromJDBC(); + + List tables = getTables(configuration); + + assertEquals(2,tables.size()); + + Table catchild = (Table) tables.get(0); + Table catmaster = (Table) tables.get(1); + + if(catchild.getName().equals("CATMASTER")) { + catchild = (Table) tables.get(1); + catmaster = (Table) tables.get(0); + } + + TableIdentifier masterid = TableIdentifier.create(catmaster); + TableIdentifier childid = TableIdentifier.create(catchild); + + assertEquals("jdbcreader has not nulled out according to default schema", new TableIdentifier(null, null, "CATMASTER"), masterid); + assertEquals("jdbcreader has not nulled out according to default schema", new TableIdentifier(null, null, "CATCHILD"), childid); + } + + private List getTables(JDBCMetaDataConfiguration metaDataConfiguration) { + List list = new ArrayList(); + Iterator iter = metaDataConfiguration.getTableMappings(); + while(iter.hasNext()) { + Table element = (Table) iter.next(); + list.add(element); + } + return list; + } + + protected String[] getCreateSQL() { + + return new String[] { + "create schema ovrtest AUTHORIZATION DBA ", + "create table ovrtest.catmaster ( id char not null, name varchar(20), primary key (id) )", + "create table ovrtest.catchild ( childid char not null, masterref char, primary key (childid), foreign key (masterref) references catmaster(id) )", + "create table master ( id char not null, name varchar(20), primary key (id) )", + "create table child ( childid char not null, masterref char, primary key (childid), foreign key (masterref) references master(id) )", + }; + } + + protected String[] getDropSQL() { + + return new String[] { + "drop table child", + "drop table master", + "drop table ovrtest.catchild", + "drop table ovrtest.catmaster", + "drop schema ovrtest" + }; + } + +} Added: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/schemaselection.reveng.xml =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/schemaselection.reveng.xml 2006-03-05 07:21:47 UTC (rev 9553) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/schemaselection.reveng.xml 2006-03-05 07:22:56 UTC (rev 9554) @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE hibernate-reverse-engineering SYSTEM "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" > + +<hibernate-reverse-engineering> + + <!-- a empty one is valid and means select everything without considering schema/catalog/table --> + <schema-selection/> + + <!-- Only for something matching in schema OVRTEST --> + <schema-selection match-schema="OVRTEST"/> + + <!-- Only for something matching in catalog UBERCATALOG and schema OVRTEST --> + <schema-selection match-catalog="UBERCATALOG" match-schema="OVRTEST"/> + + <!-- .* is valid, will be translated into % --> + <schema-selection match-catalog="PUBLIC.*" match-schema="OVRTEST" match-table=".*"/> + + + +</hibernate-reverse-engineering> \ No newline at end of file |
From: <hib...@li...> - 2006-03-05 07:21:54
|
Author: max...@jb... Date: 2006-03-05 02:21:47 -0500 (Sun, 05 Mar 2006) New Revision: 9553 Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/overridetest.reveng.xml Log: HBX-613 and HBX-615 reveng.xml changes/addition Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java 2006-03-05 04:30:55 UTC (rev 9552) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java 2006-03-05 07:21:47 UTC (rev 9553) @@ -401,7 +401,7 @@ try { progress.startSubTask("Finding tables in " + schemaSelection); - tableIterator = getMetaDataDialect().getTables(schemaSelection.getCatalogPattern(), schemaSelection.getSchemaPattern(), schemaSelection.getTablePattern()); + tableIterator = getMetaDataDialect().getTables(schemaSelection.getMatchCatalog(), schemaSelection.getMatchSchema(), schemaSelection.getMatchTable()); String[] lastQualifier = null; String[] foundQualifier = new String[2]; Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-03-05 04:30:55 UTC (rev 9552) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-03-05 07:21:47 UTC (rev 9553) @@ -51,9 +51,9 @@ while ( iterator.hasNext() ) { Element element = (Element) iterator.next(); SchemaSelection schemaSelection = new SchemaSelection(); - schemaSelection.setCatalogPattern( element.attributeValue("catalog") ); - schemaSelection.setSchemaPattern( element.attributeValue("schema") ); - schemaSelection.setTablePattern( element.attributeValue("table") ); + schemaSelection.setMatchCatalog( element.attributeValue("match-catalog") ); + schemaSelection.setMatchSchema( element.attributeValue("match-schema") ); + schemaSelection.setMatchTable( element.attributeValue("match-table") ); repository.addSchemaSelection(schemaSelection); Modified: trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2006-03-05 04:30:55 UTC (rev 9552) +++ trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2006-03-05 07:21:47 UTC (rev 9553) @@ -31,15 +31,15 @@ <!ATTLIST sql-type not-null (true|false) #IMPLIED > <!ATTLIST sql-type hibernate-type CDATA #REQUIRED > -<!-- Used to target the selection from the database. -Each schema-selection can be viewed as a "call" to DatabaseMetaData.getTables() --> +<!-- Used to target the selection from the database schema. +Each schema-selection can be viewed as a "call" to DatabaseMetaData.getTables(). --> <!ELEMENT schema-selection EMPTY> <!-- Catalog pattern for the selection --> -<!ATTLIST schema-selection catalog CDATA #IMPLIED > +<!ATTLIST schema-selection match-catalog CDATA #IMPLIED > <!-- Schema for the for the selection --> -<!ATTLIST schema-selection schema CDATA #IMPLIED > +<!ATTLIST schema-selection match-schema CDATA #IMPLIED > <!-- Table pattern for the selection --> -<!ATTLIST schema-selection table CDATA #IMPLIED > +<!ATTLIST schema-selection match-table CDATA #IMPLIED > <!ELEMENT table (primary-key?, column*, foreign-key*) > <!-- Catalog for the table --> @@ -57,13 +57,20 @@ <!ATTLIST column type CDATA #IMPLIED > <!ATTLIST column property CDATA #IMPLIED > <!ATTLIST column exclude (true|false) "false" > +<!-- too much flexibility to maintain; just use a foreign-key definition <!ATTLIST column foreign-catalog CDATA #IMPLIED > <!ATTLIST column foreign-schema CDATA #IMPLIED > <!ATTLIST column foreign-table CDATA #IMPLIED > -<!ATTLIST column foreign-column CDATA #IMPLIED > +<!ATTLIST column foreign-column CDATA #IMPLIED > --> -<!ELEMENT primary-key (generator?, column*) > +<!ELEMENT key-column EMPTY > +<!ATTLIST key-column name CDATA #REQUIRED > +<!ATTLIST key-column jdbc-type CDATA #IMPLIED > +<!ATTLIST key-column type CDATA #IMPLIED > +<!ATTLIST key-column property CDATA #IMPLIED > +<!ELEMENT primary-key (generator?, key-column*) > + <!ELEMENT generator (param*)> <!ATTLIST generator class CDATA #REQUIRED> <!ELEMENT param (#PCDATA)> @@ -81,8 +88,6 @@ <!ATTLIST column-ref local-column CDATA #REQUIRED > <!ATTLIST column-ref foreign-column CDATA #IMPLIED > - - <!-- a table-filter allows to explicitly exclude or include tables or complete catalog/schemas into the reverse engineering --> <!ELEMENT table-filter EMPTY > <!ATTLIST table-filter match-catalog CDATA ".*" > Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java 2006-03-05 04:30:55 UTC (rev 9552) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java 2006-03-05 07:21:47 UTC (rev 9553) @@ -97,24 +97,24 @@ SchemaSelection ss; ss = (SchemaSelection) schemaSelectors.get(0); - assertEquals(null,ss.getCatalogPattern()); - assertEquals(null,ss.getSchemaPattern()); - assertEquals(null,ss.getTablePattern()); + assertEquals(null,ss.getMatchCatalog()); + assertEquals(null,ss.getMatchSchema()); + assertEquals(null,ss.getMatchTable()); ss = (SchemaSelection) schemaSelectors.get(1); - assertEquals(null,ss.getCatalogPattern()); - assertEquals("OVRTEST",ss.getSchemaPattern()); - assertEquals(null,ss.getTablePattern()); + assertEquals(null,ss.getMatchCatalog()); + assertEquals("OVRTEST",ss.getMatchSchema()); + assertEquals(null,ss.getMatchTable()); ss = (SchemaSelection) schemaSelectors.get(2); - assertEquals("UBERCATALOG",ss.getCatalogPattern()); - assertEquals("OVRTEST",ss.getSchemaPattern()); - assertEquals(null,ss.getTablePattern()); + assertEquals("UBERCATALOG",ss.getMatchCatalog()); + assertEquals("OVRTEST",ss.getMatchSchema()); + assertEquals(null,ss.getMatchTable()); ss = (SchemaSelection) schemaSelectors.get(3); - assertEquals("PUBLIC.*",ss.getCatalogPattern()); - assertEquals("OVRTEST",ss.getSchemaPattern()); - assertEquals(".*",ss.getTablePattern()); + assertEquals("PUBLIC.*",ss.getMatchCatalog()); + assertEquals("OVRTEST",ss.getMatchSchema()); + assertEquals(".*",ss.getMatchTable()); } Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/overridetest.reveng.xml =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/overridetest.reveng.xml 2006-03-05 04:30:55 UTC (rev 9552) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/overridetest.reveng.xml 2006-03-05 07:21:47 UTC (rev 9553) @@ -48,9 +48,14 @@ <generator class="sequence"> <param name="table">seq_table</param> </generator> - <column name="CUSTID" foreign-table="CUSTOMER" foreign-column="CUSTID" /> +<!-- <column name="CUSTID" foreign-table="CUSTOMER" foreign-column="CUSTID" /> --> + <key-column name="CUSTID"/> </primary-key> <column name="NAME" property="orderName" type="string" /> + + <foreign-key foreign-table="CUSTOMER"> + <column-ref local-column="CUSTID" foreign-column="CUSTID"/> + </foreign-key> </table> |
From: <hib...@li...> - 2006-03-05 04:30:58
|
Author: tom...@jb... Date: 2006-03-04 23:30:55 -0500 (Sat, 04 Mar 2006) New Revision: 9552 Modified: / Log: grant fisheye access Property changes on: ___________________________________________________________________ Name: fisheye.access + allow |
From: <hib...@li...> - 2006-03-04 03:49:57
|
Author: ste...@jb... Date: 2006-03-03 22:49:55 -0500 (Fri, 03 Mar 2006) New Revision: 9551 Modified: trunk/Hibernate3/src/org/hibernate/engine/CollectionEntry.java Log: HHH-1540 : better error message Modified: trunk/Hibernate3/src/org/hibernate/engine/CollectionEntry.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/CollectionEntry.java 2006-03-04 03:49:28 UTC (rev 9550) +++ trunk/Hibernate3/src/org/hibernate/engine/CollectionEntry.java 2006-03-04 03:49:55 UTC (rev 9551) @@ -202,7 +202,7 @@ ignore = false; } else if ( !isProcessed() ) { - throw new AssertionFailure( "collection was not processed by flush()" ); + throw new AssertionFailure( "collection [" + collection.getRole() + "] was not processed by flush()" ); } collection.setSnapshot(loadedKey, role, snapshot); } |
From: <hib...@li...> - 2006-03-04 03:49:30
|
Author: ste...@jb... Date: 2006-03-03 22:49:28 -0500 (Fri, 03 Mar 2006) New Revision: 9550 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/CollectionEntry.java Log: HHH-1540 : better error message Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/CollectionEntry.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/CollectionEntry.java 2006-03-04 00:42:21 UTC (rev 9549) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/CollectionEntry.java 2006-03-04 03:49:28 UTC (rev 9550) @@ -202,7 +202,7 @@ ignore = false; } else if ( !isProcessed() ) { - throw new AssertionFailure( "collection was not processed by flush()" ); + throw new AssertionFailure( "collection [" + collection.getRole() + "] was not processed by flush()" ); } collection.setSnapshot(loadedKey, role, snapshot); } |
From: <hib...@li...> - 2006-03-04 00:42:23
|
Author: ste...@jb... Date: 2006-03-03 19:42:21 -0500 (Fri, 03 Mar 2006) New Revision: 9549 Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java Log: added CGLIBInstrumentationTest to AllTests (renamed from CGLIBTest) Copied: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java (from rev 9538, trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java) =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java 2006-03-04 00:17:57 UTC (rev 9538) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java 2006-03-04 00:42:21 UTC (rev 9549) @@ -0,0 +1,19 @@ +package org.hibernate.test.instrument.runtime; + +import org.hibernate.bytecode.BytecodeProvider; +import org.hibernate.bytecode.cglib.BytecodeProviderImpl; +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * @author Steve Ebersole + */ +public class CGLIBInstrumentationTest extends AbstractTransformingClassLoaderInstrumentTestCase { + protected BytecodeProvider buildBytecodeProvider() { + return new BytecodeProviderImpl(); + } + + public static Test suite() { + return new TestSuite( CGLIBInstrumentationTest.class ); + } +} |
From: <hib...@li...> - 2006-03-04 00:41:55
|
Author: ste...@jb... Date: 2006-03-03 19:41:53 -0500 (Fri, 03 Mar 2006) New Revision: 9548 Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java Log: added CGLIBInstrumentationTest to AllTests (renamed from CGLIBTest) Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-04 00:35:30 UTC (rev 9547) +++ trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-04 00:41:53 UTC (rev 9548) @@ -45,6 +45,7 @@ import org.hibernate.test.idclass.IdClassTest; import org.hibernate.test.immutable.ImmutableTest; import org.hibernate.test.instrument.buildtime.InstrumentTest; +import org.hibernate.test.instrument.runtime.CGLIBInstrumentationTest; import org.hibernate.test.interceptor.InterceptorTest; import org.hibernate.test.interfaceproxy.InterfaceProxyTest; import org.hibernate.test.iterate.IterateTest; @@ -157,51 +158,6 @@ } /** - * An inner class representing the legacy test suite. - */ - public static class LegacyTests { - - /** - * Returns the legacy test suite - * - * @return the legacy test suite - */ - public static Test suite() { - TestSuite suite = new TestSuite("Legacy tests suite"); - suite.addTest( FumTest.suite() ); - suite.addTest( MasterDetailTest.suite() ); - suite.addTest( ParentChildTest.suite() ); - suite.addTest( ABCTest.suite() ); - suite.addTest( ABCProxyTest.suite() ); - suite.addTest( SQLFunctionsTest.suite() ); - suite.addTest( SQLLoaderTest.suite() ); - suite.addTest( MultiTableTest.suite() ); - suite.addTest( MapTest.suite() ); - suite.addTest( QueryByExampleTest.suite() ); - suite.addTest( ComponentNotNullTest.suite() ); - suite.addTest( IJTest.suite() ); - suite.addTest( IJ2Test.suite() ); - suite.addTest( FooBarTest.suite() ); - suite.addTest( StatisticsTest.suite() ); - suite.addTest( CacheTest.suite() ); - suite.addTest( OneToOneCacheTest.suite() ); - suite.addTest( NonReflectiveBinderTest.suite() ); - suite.addTest( ConfigurationPerformanceTest.suite() ); // Added to ensure we can utilize the recommended performance tips ;) - return filter( suite ); -// return suite; - } - - /** - * Run the legacy test suite - * - * @param args n/a - */ - public static void main(String[] args) { - TestRunner.run( suite() ); - } - } - - /** * An inner class representing the new test suite. */ public static class NewTests { @@ -263,7 +219,7 @@ suite.addTest( org.hibernate.test.orphan.PropertyRefTest.suite() ); suite.addTest( SubclassPropertyRefTest.suite() ); suite.addTest( Db2SQLTest.suite() ); - suite.addTest( DataDirectOracleSQLTest.suite() ); + suite.addTest( DataDirectOracleSQLTest.suite() ); suite.addTest( OracleSQLTest.suite() ); suite.addTest( MSSQLTest.suite() ); suite.addTest( MySQLTest.suite() ); @@ -320,6 +276,7 @@ if ( InstrumentCacheTest2.isRunnable() ) { suite.addTest( InstrumentCacheTest2.suite() ); } + suite.addTest( CGLIBInstrumentationTest.suite() ); suite.addTest( SybaseTimestampVersioningTest.suite() ); suite.addTest( DbVersionTest.suite() ); suite.addTest( TimestampGeneratedValuesWithCachingTest.suite() ); @@ -346,6 +303,51 @@ } } + /** + * An inner class representing the legacy test suite. + */ + public static class LegacyTests { + + /** + * Returns the legacy test suite + * + * @return the legacy test suite + */ + public static Test suite() { + TestSuite suite = new TestSuite("Legacy tests suite"); + suite.addTest( FumTest.suite() ); + suite.addTest( MasterDetailTest.suite() ); + suite.addTest( ParentChildTest.suite() ); + suite.addTest( ABCTest.suite() ); + suite.addTest( ABCProxyTest.suite() ); + suite.addTest( SQLFunctionsTest.suite() ); + suite.addTest( SQLLoaderTest.suite() ); + suite.addTest( MultiTableTest.suite() ); + suite.addTest( MapTest.suite() ); + suite.addTest( QueryByExampleTest.suite() ); + suite.addTest( ComponentNotNullTest.suite() ); + suite.addTest( IJTest.suite() ); + suite.addTest( IJ2Test.suite() ); + suite.addTest( FooBarTest.suite() ); + suite.addTest( StatisticsTest.suite() ); + suite.addTest( CacheTest.suite() ); + suite.addTest( OneToOneCacheTest.suite() ); + suite.addTest( NonReflectiveBinderTest.suite() ); + suite.addTest( ConfigurationPerformanceTest.suite() ); // Added to ensure we can utilize the recommended performance tips ;) + return filter( suite ); +// return suite; + } + + /** + * Run the legacy test suite + * + * @param args n/a + */ + public static void main(String[] args) { + TestRunner.run( suite() ); + } + } + private static TestSuite filter(TestSuite testSuite) { FilterHandler handler = new FilterHandler(); TestSuiteVisitor visitor = new TestSuiteVisitor( handler ); |
From: <hib...@li...> - 2006-03-04 00:35:34
|
Author: ste...@jb... Date: 2006-03-03 19:35:30 -0500 (Fri, 03 Mar 2006) New Revision: 9547 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/mapping/Property.java Log: HHH-1435 : lazy="no-proxy" on many/one-to-one associations; use of ~transforming class loaders~ for runtime instrumentation of domain objects for testing purposes Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/mapping/Property.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/mapping/Property.java 2006-03-04 00:31:51 UTC (rev 9546) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/mapping/Property.java 2006-03-04 00:35:30 UTC (rev 9547) @@ -194,6 +194,15 @@ } public boolean isLazy() { + if ( value instanceof ToOne ) { + // both many-to-one and one-to-one are represented as a + // Property. EntityPersister is relying on this value to + // determine "lazy fetch groups" in terms of field-level + // interception. So we need to make sure that we return + // true here for the case of many-to-one and one-to-one + // with lazy="no-proxy" + return ( ( ToOne ) value ).isLazy(); + } return lazy; } |
From: <hib...@li...> - 2006-03-04 00:31:53
|
Author: ste...@jb... Date: 2006-03-03 19:31:51 -0500 (Fri, 03 Mar 2006) New Revision: 9546 Modified: trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java Log: fix mappings def after package moving Modified: trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java 2006-03-04 00:30:42 UTC (rev 9545) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java 2006-03-04 00:31:51 UTC (rev 9546) @@ -330,7 +330,7 @@ } protected String[] getMappings() { - return new String[] { "instrument/Documents.hbm.xml" }; + return new String[] { "instrument/domain/Documents.hbm.xml" }; } public static Test suite() { |
From: <hib...@li...> - 2006-03-04 00:30:44
|
Author: ste...@jb... Date: 2006-03-03 19:30:42 -0500 (Fri, 03 Mar 2006) New Revision: 9545 Modified: trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java Log: HHH-1435 : lazy="no-proxy" on many/one-to-one associations; use of ~transforming class loaders~ for runtime instrumentation of domain objects for testing purposes Modified: trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java 2006-03-04 00:23:51 UTC (rev 9544) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java 2006-03-04 00:30:42 UTC (rev 9545) @@ -2,7 +2,8 @@ package org.hibernate.test.instrument.buildtime; import java.util.HashSet; -import java.net.URL; +import java.util.List; +import java.util.Iterator; import junit.framework.Test; import junit.framework.TestSuite; @@ -11,8 +12,6 @@ import org.hibernate.LockMode; import org.hibernate.Session; import org.hibernate.Transaction; -import org.hibernate.HibernateException; -import org.hibernate.bytecode.cglib.BytecodeProviderImpl; import org.hibernate.intercept.FieldInterceptionHelper; import org.hibernate.test.TestCase; import org.hibernate.test.instrument.domain.Owner; @@ -24,71 +23,51 @@ */ public class InstrumentTest extends TestCase { - private ClassLoader dynamicLoader; - private BytecodeProviderImpl provider; - public InstrumentTest(String str) { super(str); } - protected void setUp() throws Exception { - // need to setup the specialized classloader - String myFileName = InstrumentTest.class.getName().replace( '.', '/' ) + ".class"; - URL fileURL = this.getClass().getClassLoader().getResource( myFileName ); - String filePath = fileURL.getPath(); - String classPath = filePath.substring( 0, filePath.length() - myFileName.length() ); - provider = new BytecodeProviderImpl(); - dynamicLoader = provider.generateDynamicFieldInterceptionClassLoader( - Thread.currentThread().getContextClassLoader(), - new String[] { classPath }, - new String[] { "org.hibernate.test" } - ); - super.setUp(); - } + public void testDirtyCheck() { + if ( !isRunnable() ) { + return; + } + Session s = openSession(); + Transaction t = s.beginTransaction(); + Folder pics = new Folder(); + pics.setName("pics"); + Folder docs = new Folder(); + docs.setName("docs"); + s.persist(docs); + s.persist(pics); + t.commit(); + s.close(); - protected void tearDown() throws Exception { - super.tearDown(); - provider.releaseDynamicFieldInterceptionClassLoader( dynamicLoader ); - dynamicLoader = null; - provider = null; - } + s = openSession(); + t = s.beginTransaction(); + List list = s.createCriteria(Folder.class).list(); + for ( Iterator iter = list.iterator(); iter.hasNext(); ) { + Folder f = (Folder) iter.next(); + assertFalse( f.nameWasread ); + } + t.commit(); + s.close(); - public void testDirtyCheck() { - executeExecutable( "org.hibernate.test.instrument.runtime.TestDirtyCheckExecutable" ); -// Session s = openSession(); -// Transaction t = s.beginTransaction(); -// Folder pics = new Folder(); -// pics.setName("pics"); -// Folder docs = new Folder(); -// docs.setName("docs"); -// s.persist(docs); -// s.persist(pics); -// t.commit(); -// s.close(); -// -// s = openSession(); -// t = s.beginTransaction(); -// List list = s.createCriteria(Folder.class).list(); -// for ( Iterator iter = list.iterator(); iter.hasNext(); ) { -// Folder f = (Folder) iter.next(); -// assertFalse( f.nameWasread ); -// } -// t.commit(); -// s.close(); -// -// for ( Iterator iter = list.iterator(); iter.hasNext(); ) { -// Folder f = (Folder) iter.next(); -// assertFalse( f.nameWasread ); -// } -// -// s = openSession(); -// t = s.beginTransaction(); -// s.createQuery("delete from Folder").executeUpdate(); -// t.commit(); -// s.close(); + for ( Iterator iter = list.iterator(); iter.hasNext(); ) { + Folder f = (Folder) iter.next(); + assertFalse( f.nameWasread ); + } + + s = openSession(); + t = s.beginTransaction(); + s.createQuery("delete from Folder").executeUpdate(); + t.commit(); + s.close(); } public void testFetchAll() throws Exception { + if ( !isRunnable() ) { + return; + } Session s = openSession(); Owner o = new Owner(); Document doc = new Document(); @@ -119,6 +98,9 @@ } public void testLazy() throws Exception { + if ( !isRunnable() ) { + return; + } Session s = openSession(); Transaction t = s.beginTransaction(); Owner o = new Owner(); @@ -277,6 +259,9 @@ } public void testLazyManyToOne() { + if ( !isRunnable() ) { + return; + } Session s = openSession(); Transaction t = s.beginTransaction(); Owner gavin = new Owner(); @@ -335,16 +320,19 @@ s.close(); } - protected String[] getMappings() { - return new String[] { "instrument/Documents.hbm.xml" }; - } - public void testSetFieldInterceptor() { + if ( !isRunnable() ) { + return; + } Document doc = new Document(); FieldInterceptionHelper.injectFieldInterceptor( doc, "Document", new HashSet(), null ); doc.getId(); } + protected String[] getMappings() { + return new String[] { "instrument/Documents.hbm.xml" }; + } + public static Test suite() { return new TestSuite(InstrumentTest.class); } @@ -352,19 +340,5 @@ public static boolean isRunnable() { return FieldInterceptionHelper.isInstrumented( new Document() ); } - - private static final Class[] SIG = new Class[] { TestCase.class }; - - public void executeExecutable(String name) { - try { - Class execClass = dynamicLoader.loadClass( name ); - Object executable = execClass.newInstance(); - execClass.getDeclaredMethod( "execute", SIG ).invoke( executable, new Object[] { this } ); - - } - catch( Throwable t ) { - throw new HibernateException( "could not load executable", t ); - } - } } |
From: <hib...@li...> - 2006-03-04 00:23:54
|
Author: ste...@jb... Date: 2006-03-03 19:23:51 -0500 (Fri, 03 Mar 2006) New Revision: 9544 Added: trunk/Hibernate3/src/org/hibernate/bytecode/javassist/TransformingClassLoader.java Modified: trunk/Hibernate3/src/org/hibernate/bytecode/BytecodeProvider.java trunk/Hibernate3/src/org/hibernate/bytecode/cglib/BytecodeProviderImpl.java trunk/Hibernate3/src/org/hibernate/bytecode/javassist/BytecodeProviderImpl.java Log: HHH-1435 : lazy="no-proxy" on many/one-to-one associations; use of ~transforming class loaders~ for runtime instrumentation of domain objects for testing purposes Modified: trunk/Hibernate3/src/org/hibernate/bytecode/BytecodeProvider.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/bytecode/BytecodeProvider.java 2006-03-04 00:22:05 UTC (rev 9543) +++ trunk/Hibernate3/src/org/hibernate/bytecode/BytecodeProvider.java 2006-03-04 00:23:51 UTC (rev 9544) @@ -14,6 +14,35 @@ */ public ProxyFactoryFactory getProxyFactoryFactory(); + /** + * Retrieve the ReflectionOptimizer delegate for this provider + * capable of generating reflection optimization components. + * + * @param clazz The class to be reflected upon. + * @param getterNames Names of all property getters to be accessed via reflection. + * @param setterNames Names of all property setters to be accessed via reflection. + * @param types The types of all properties to be accessed. + * @return The reflection optimization delegate. + */ public ReflectionOptimizer getReflectionOptimizer(Class clazz, String[] getterNames, String[] setterNames, Class[] types); + /** + * Generate a ClassLoader capable of performing dynamic bytecode manipulation + * on classes as they are loaded for the purpose of field-level interception. + * The returned ClassLoader is used for run-time bytecode manipulation as + * opposed to the more common build-time manipulation, since here we get + * into SecurityManager issues and such. + * <p/> + * Currently used only from the Hibernate test suite, although conceivably + * (SecurityManager concerns aside) could be used somehow in running systems. + * + * @param parent The parent classloader + * @param classpath The classpath to be searched + * @param packages can be null; use to limnit the packages to be loaded + * via this classloader (and transformed). + * @return The appropriate ClassLoader. + */ + public ClassLoader generateDynamicFieldInterceptionClassLoader(ClassLoader parent, String[] classpath, String[] packages); + + public void releaseDynamicFieldInterceptionClassLoader(ClassLoader classLoader); } Modified: trunk/Hibernate3/src/org/hibernate/bytecode/cglib/BytecodeProviderImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/bytecode/cglib/BytecodeProviderImpl.java 2006-03-04 00:22:05 UTC (rev 9543) +++ trunk/Hibernate3/src/org/hibernate/bytecode/cglib/BytecodeProviderImpl.java 2006-03-04 00:23:51 UTC (rev 9544) @@ -6,9 +6,16 @@ import org.hibernate.util.StringHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.objectweb.asm.Type; import net.sf.cglib.reflect.FastClass; import net.sf.cglib.beans.BulkBean; import net.sf.cglib.beans.BulkBeanException; +import net.sf.cglib.transform.TransformingClassLoader; +import net.sf.cglib.transform.ClassFilter; +import net.sf.cglib.transform.ClassTransformerFactory; +import net.sf.cglib.transform.ClassTransformer; +import net.sf.cglib.transform.impl.InterceptFieldTransformer; +import net.sf.cglib.transform.impl.InterceptFieldFilter; import java.lang.reflect.Modifier; @@ -76,4 +83,53 @@ return null; } } + + public ClassLoader generateDynamicFieldInterceptionClassLoader( + ClassLoader parent, + String[] classpath, + String[] packages) { + return new TransformingClassLoader( + parent, + new ClassLoaderClassFilter( packages ), + new ClassTransformerFactory() { + public ClassTransformer newInstance() { + return new InterceptFieldTransformer( + new InterceptFieldFilter() { + public boolean acceptRead(Type owner, String name) { + return true; + } + public boolean acceptWrite(Type owner, String name) { + return true; + } + } + ); + } + } + ); + } + + public void releaseDynamicFieldInterceptionClassLoader(ClassLoader classLoader) { + } + + private static class ClassLoaderClassFilter implements ClassFilter { + private final String[] packages; + + public ClassLoaderClassFilter(String[] packages) { + this.packages = packages; + } + + public boolean accept(String className) { + if ( packages == null ) { + return true; + } + else { + for ( int i = 0; i < packages.length; i++ ) { + if ( className.startsWith( packages[i] ) ) { + return true; + } + } + return false; + } + } + } } Modified: trunk/Hibernate3/src/org/hibernate/bytecode/javassist/BytecodeProviderImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/bytecode/javassist/BytecodeProviderImpl.java 2006-03-04 00:22:05 UTC (rev 9543) +++ trunk/Hibernate3/src/org/hibernate/bytecode/javassist/BytecodeProviderImpl.java 2006-03-04 00:23:51 UTC (rev 9544) @@ -73,4 +73,15 @@ return null; } } + + public ClassLoader generateDynamicFieldInterceptionClassLoader(ClassLoader parent, String[] classpath, String[] packages) { + return new TransformingClassLoader( parent, classpath ); + } + + public void releaseDynamicFieldInterceptionClassLoader(ClassLoader classLoader) { + if ( ! TransformingClassLoader.class.isAssignableFrom( classLoader.getClass() ) ) { + return; + } + ( ( TransformingClassLoader ) classLoader ).release(); + } } Added: trunk/Hibernate3/src/org/hibernate/bytecode/javassist/TransformingClassLoader.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/bytecode/javassist/TransformingClassLoader.java 2006-03-04 00:22:05 UTC (rev 9543) +++ trunk/Hibernate3/src/org/hibernate/bytecode/javassist/TransformingClassLoader.java 2006-03-04 00:23:51 UTC (rev 9544) @@ -0,0 +1,57 @@ +package org.hibernate.bytecode.javassist; + +import javassist.ClassPool; +import javassist.NotFoundException; +import javassist.CtClass; +import javassist.CannotCompileException; +import org.hibernate.HibernateException; + +import java.io.IOException; +import java.util.ArrayList; + +/** + * @author Steve Ebersole + */ +public class TransformingClassLoader extends ClassLoader { + private ClassLoader parent; + private ClassPool classPool; + + /*package*/ TransformingClassLoader(ClassLoader parent, String[] classpath) { + this.parent = parent; + classPool = new ClassPool( true ); + for ( int i = 0; i < classpath.length; i++ ) { + try { + classPool.appendClassPath( classpath[i] ); + } + catch ( NotFoundException e ) { + throw new HibernateException( + "Unable to resolve requested classpath for transformation [" + + classpath[i] + "] : " + e.getMessage() + ); + } + } + } + + protected Class findClass(String name) throws ClassNotFoundException { + try { + CtClass cc = classPool.get( name ); + // todo : modify the class definition if not already transformed... + byte[] b = cc.toBytecode(); + return defineClass( name, b, 0, b.length ); + } + catch ( NotFoundException e ) { + throw new ClassNotFoundException(); + } + catch ( IOException e ) { + throw new ClassNotFoundException(); + } + catch ( CannotCompileException e ) { + throw new ClassNotFoundException(); + } + } + + public void release() { + classPool = null; + parent = null; + } +} |
From: <hib...@li...> - 2006-03-04 00:22:08
|
Author: ste...@jb... Date: 2006-03-03 19:22:05 -0500 (Fri, 03 Mar 2006) New Revision: 9543 Modified: trunk/Hibernate3/build.xml Log: HHH-1435 : lazy="no-proxy" on many/one-to-one associations; use of ~transforming class loaders~ for runtime instrumentation of domain objects for testing purposes Modified: trunk/Hibernate3/build.xml =================================================================== --- trunk/Hibernate3/build.xml 2006-03-04 00:21:50 UTC (rev 9542) +++ trunk/Hibernate3/build.xml 2006-03-04 00:22:05 UTC (rev 9543) @@ -749,7 +749,7 @@ <target name="instrument" depends="compiletest" description="Instrument the persistent classes"> <!-- depends="jar" --> - <taskdef name="instrument" classname="org.hibernate.tool.instrument.InstrumentTask"> + <taskdef name="instrument" classname="org.hibernate.tool.instrument.cglib.InstrumentTask"> <classpath path="${jar.path}"/> <classpath path="${classes.dir}"/> <classpath refid="lib.class.path"/> |
From: <hib...@li...> - 2006-03-04 00:21:52
|
Author: ste...@jb... Date: 2006-03-03 19:21:50 -0500 (Fri, 03 Mar 2006) New Revision: 9542 Modified: trunk/Hibernate3/src/org/hibernate/mapping/Property.java Log: HHH-1435 : lazy="no-proxy" on many/one-to-one associations; use of ~transforming class loaders~ for runtime instrumentation of domain objects for testing purposes Modified: trunk/Hibernate3/src/org/hibernate/mapping/Property.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/mapping/Property.java 2006-03-04 00:20:44 UTC (rev 9541) +++ trunk/Hibernate3/src/org/hibernate/mapping/Property.java 2006-03-04 00:21:50 UTC (rev 9542) @@ -194,6 +194,15 @@ } public boolean isLazy() { + if ( value instanceof ToOne ) { + // both many-to-one and one-to-one are represented as a + // Property. EntityPersister is relying on this value to + // determine "lazy fetch groups" in terms of field-level + // interception. So we need to make sure that we return + // true here for the case of many-to-one and one-to-one + // with lazy="no-proxy" + return ( ( ToOne ) value ).isLazy(); + } return lazy; } |
From: <hib...@li...> - 2006-03-04 00:20:46
|
Author: ste...@jb... Date: 2006-03-03 19:20:44 -0500 (Fri, 03 Mar 2006) New Revision: 9541 Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java Log: HHH-1435 : lazy="no-proxy" on many/one-to-one associations; use of ~transforming class loaders~ for runtime instrumentation of domain objects for testing purposes Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-04 00:19:52 UTC (rev 9540) +++ trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-04 00:20:44 UTC (rev 9541) @@ -44,7 +44,7 @@ import org.hibernate.test.idbag.IdBagTest; import org.hibernate.test.idclass.IdClassTest; import org.hibernate.test.immutable.ImmutableTest; -import org.hibernate.test.instrument.InstrumentTest; +import org.hibernate.test.instrument.buildtime.InstrumentTest; import org.hibernate.test.interceptor.InterceptorTest; import org.hibernate.test.interfaceproxy.InterfaceProxyTest; import org.hibernate.test.iterate.IterateTest; |
From: <hib...@li...> - 2006-03-04 00:19:55
|
Author: ste...@jb... Date: 2006-03-03 19:19:52 -0500 (Fri, 03 Mar 2006) New Revision: 9540 Modified: trunk/Hibernate3/test/org/hibernate/test/TestCase.java Log: HHH-1435 : lazy="no-proxy" on many/one-to-one associations; use of ~transforming class loaders~ for runtime instrumentation of domain objects for testing purposes Modified: trunk/Hibernate3/test/org/hibernate/test/TestCase.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/TestCase.java 2006-03-04 00:18:28 UTC (rev 9539) +++ trunk/Hibernate3/test/org/hibernate/test/TestCase.java 2006-03-04 00:19:52 UTC (rev 9540) @@ -328,4 +328,8 @@ public String fullTestName() { return this.getName() + " (" + this.getClass().getName() + ")"; } + + protected SessionFactoryImplementor sfi() { + return ( SessionFactoryImplementor ) getSessions(); + } } \ No newline at end of file |
From: <hib...@li...> - 2006-03-04 00:18:30
|
Author: ste...@jb... Date: 2006-03-03 19:18:28 -0500 (Fri, 03 Mar 2006) New Revision: 9539 Added: trunk/Hibernate3/test/org/hibernate/test/AbstractClassLoaderIsolatedTestCase.java Log: HHH-1435 : lazy="no-proxy" on many/one-to-one associations; use of ~transforming class loaders~ for runtime instrumentation of domain objects for testing purposes Added: trunk/Hibernate3/test/org/hibernate/test/AbstractClassLoaderIsolatedTestCase.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/AbstractClassLoaderIsolatedTestCase.java 2006-03-04 00:17:57 UTC (rev 9538) +++ trunk/Hibernate3/test/org/hibernate/test/AbstractClassLoaderIsolatedTestCase.java 2006-03-04 00:18:28 UTC (rev 9539) @@ -0,0 +1,32 @@ +package org.hibernate.test; + +import junit.framework.TestCase; + +/** + * A specialized TestCase for running tests in an isolated class-loader + * + * @author Steve Ebersole + */ +public abstract class AbstractClassLoaderIsolatedTestCase extends TestCase { + private ClassLoader parentLoader; + private ClassLoader isolatedLoader; + + protected void setUp() throws Exception { + parentLoader = Thread.currentThread().getContextClassLoader(); + isolatedLoader = buildIsolatedClassLoader( parentLoader ); + Thread.currentThread().setContextClassLoader( isolatedLoader ); + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + Thread.currentThread().setContextClassLoader( parentLoader ); + releaseIsolatedClassLoader( isolatedLoader ); + parentLoader = null; + isolatedLoader = null; + } + + protected abstract ClassLoader buildIsolatedClassLoader(ClassLoader parent); + + protected abstract void releaseIsolatedClassLoader(ClassLoader isolatedLoader); +} |
From: <hib...@li...> - 2006-03-04 00:18:04
|
Author: ste...@jb... Date: 2006-03-03 19:17:57 -0500 (Fri, 03 Mar 2006) New Revision: 9538 Added: trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/ trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java trunk/Hibernate3/test/org/hibernate/test/instrument/domain/ trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Document.java trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Folder.java trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Owner.java trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/AbstractExecutable.java trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/AbstractTransformingClassLoaderInstrumentTestCase.java trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/Executable.java trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestDirtyCheckExecutable.java trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestFetchAllExecutable.java trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestInjectFieldInterceptorExecutable.java trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestLazyExecutable.java trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestLazyManyToOneExecutable.java Removed: trunk/Hibernate3/test/org/hibernate/test/instrument/Document.java trunk/Hibernate3/test/org/hibernate/test/instrument/Documents.hbm.xml trunk/Hibernate3/test/org/hibernate/test/instrument/Folder.java trunk/Hibernate3/test/org/hibernate/test/instrument/InstrumentTest.java trunk/Hibernate3/test/org/hibernate/test/instrument/Owner.java Log: HHH-1435 : lazy="no-proxy" on many/one-to-one associations; use of ~transforming class loaders~ for runtime instrumentation of domain objects for testing purposes Deleted: trunk/Hibernate3/test/org/hibernate/test/instrument/Document.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/Document.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/Document.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -1,110 +0,0 @@ -//$Id$ -package org.hibernate.test.instrument; - -import java.util.Date; - -/** - * @author Gavin King - */ -public class Document { - private Long id; - private String name; - private String upperCaseName; - private String summary; - private String text; - private Owner owner; - private Folder folder; - private Date lastTextModification = new Date(); - /** - * @return Returns the folder. - */ - public Folder getFolder() { - return folder; - } - /** - * @param folder The folder to set. - */ - public void setFolder(Folder folder) { - this.folder = folder; - } - /** - * @return Returns the owner. - */ - public Owner getOwner() { - return owner; - } - /** - * @param owner The owner to set. - */ - public void setOwner(Owner owner) { - this.owner = owner; - } - /** - * @return Returns the id. - */ - public Long getId() { - return id; - } - /** - * @param id The id to set. - */ - public void setId(Long id) { - this.id = id; - } - /** - * @return Returns the name. - */ - public String getName() { - return name; - } - /** - * @param name The name to set. - */ - public void setName(String name) { - this.name = name; - } - /** - * @return Returns the summary. - */ - public String getSummary() { - return summary; - } - /** - * @param summary The summary to set. - */ - public void setSummary(String summary) { - this.summary = summary; - } - /** - * @return Returns the text. - */ - public String getText() { - return text; - } - /** - * @param text The text to set. - */ - private void setText(String text) { - this.text = text; - } - /** - * @return Returns the upperCaseName. - */ - public String getUpperCaseName() { - return upperCaseName; - } - /** - * @param upperCaseName The upperCaseName to set. - */ - public void setUpperCaseName(String upperCaseName) { - this.upperCaseName = upperCaseName; - } - - public void updateText(String newText) { - if ( !newText.equals(text) ) { - this.text = newText; - lastTextModification = new Date(); - } - } - -} Deleted: trunk/Hibernate3/test/org/hibernate/test/instrument/Documents.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/Documents.hbm.xml 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/Documents.hbm.xml 2006-03-04 00:17:57 UTC (rev 9538) @@ -1,69 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE hibernate-mapping PUBLIC - "-//Hibernate/Hibernate Mapping DTD 3.0//EN" - "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> - -<!-- - - This mapping demonstrates - - (1) use of lazy properties - this feature requires buildtime - bytecode instrumentation; we don't think this is a very - necessary feature, but provide it for completeleness; if - Hibernate encounters uninstrumented classes, lazy property - fetching will be silently disabled, to enable testing - - (2) use of a formula to define a "derived property" - ---> - -<hibernate-mapping - package="org.hibernate.test.instrument" - default-access="field"> - - <class name="Folder" table="folders"> - <id name="id"> - <generator class="native"/> - </id> - <property name="name" - not-null="true" - length="50"/> - <many-to-one name="parent"/> - <bag name="subfolders" - inverse="true" - cascade="save-update"> - <key column="parent"/> - <one-to-many class="Folder"/> - </bag> - <bag name="documents" - inverse="true" - cascade="all-delete-orphan"> - <key column="folder"/> - <one-to-many class="Document"/> - </bag> - </class> - - <class name="Owner" table="owners" lazy="false"> - <id name="id"> - <generator class="native"/> - </id> - <property name="name" - not-null="true" - length="50"/> - </class> - - <class name="Document" table="documents"> - <id name="id"> - <generator class="native"/> - </id> - <property name="name" not-null="true" length="50"/> - <property name="upperCaseName" formula="upper(name)" lazy="true"/> - <property name="summary" not-null="true" length="200" lazy="true"/> - <many-to-one name="folder" not-null="true" lazy="no-proxy"/> - <many-to-one name="owner" not-null="true" lazy="no-proxy" fetch="select"/> - <property name="text" not-null="true" length="2000" lazy="true"/> - <property name="lastTextModification" not-null="true" lazy="true" access="field"/> - </class> - - -</hibernate-mapping> Deleted: trunk/Hibernate3/test/org/hibernate/test/instrument/Folder.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/Folder.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/Folder.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -1,79 +0,0 @@ -//$Id$ -package org.hibernate.test.instrument; - -import java.util.ArrayList; -import java.util.Collection; - -/** - * @author Gavin King - */ -public class Folder { - private Long id; - private String name; - private Folder parent; - private Collection subfolders = new ArrayList(); - private Collection documents = new ArrayList(); - boolean nameWasread; - - /** - * @return Returns the id. - */ - public Long getId() { - return id; - } - /** - * @param id The id to set. - */ - public void setId(Long id) { - this.id = id; - } - /** - * @return Returns the name. - */ - public String getName() { - nameWasread = true; - return name; - } - /** - * @param name The name to set. - */ - public void setName(String name) { - this.name = name; - } - /** - * @return Returns the documents. - */ - public Collection getDocuments() { - return documents; - } - /** - * @param documents The documents to set. - */ - public void setDocuments(Collection documents) { - this.documents = documents; - } - /** - * @return Returns the parent. - */ - public Folder getParent() { - return parent; - } - /** - * @param parent The parent to set. - */ - public void setParent(Folder parent) { - this.parent = parent; - } - /** - * @return Returns the subfolders. - */ - public Collection getSubfolders() { - return subfolders; - } - /** - * @param subfolders The subfolders to set. - */ - public void setSubfolders(Collection subfolders) { - this.subfolders = subfolders; - } -} Deleted: trunk/Hibernate3/test/org/hibernate/test/instrument/InstrumentTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/InstrumentTest.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/InstrumentTest.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -1,307 +0,0 @@ -//$Id$ -package org.hibernate.test.instrument; - -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; - -import junit.framework.Test; -import junit.framework.TestSuite; - -import org.hibernate.Hibernate; -import org.hibernate.LockMode; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.hibernate.intercept.FieldInterceptionHelper; -import org.hibernate.test.TestCase; - -/** - * @author Gavin King - */ -public class InstrumentTest extends TestCase { - - public InstrumentTest(String str) { - super(str); - } - - public void testDirtyCheck() { - Session s = openSession(); - Transaction t = s.beginTransaction(); - Folder pics = new Folder(); - pics.setName("pics"); - Folder docs = new Folder(); - docs.setName("docs"); - s.persist(docs); - s.persist(pics); - t.commit(); - s.close(); - - s = openSession(); - t = s.beginTransaction(); - List list = s.createCriteria(Folder.class).list(); - for ( Iterator iter = list.iterator(); iter.hasNext(); ) { - Folder f = (Folder) iter.next(); - assertFalse( f.nameWasread ); - } - t.commit(); - s.close(); - - for ( Iterator iter = list.iterator(); iter.hasNext(); ) { - Folder f = (Folder) iter.next(); - assertFalse( f.nameWasread ); - } - - s = openSession(); - t = s.beginTransaction(); - s.createQuery("delete from Folder").executeUpdate(); - t.commit(); - s.close(); - } - - public void testFetchAll() throws Exception { - Session s = openSession(); - Owner o = new Owner(); - Document doc = new Document(); - Folder fol = new Folder(); - o.setName("gavin"); - doc.setName("Hibernate in Action"); - doc.setSummary("blah"); - doc.updateText("blah blah"); - fol.setName("books"); - doc.setOwner(o); - doc.setFolder(fol); - fol.getDocuments().add(doc); - s.persist(o); - s.persist(fol); - s.flush(); - s.clear(); - doc = (Document) s.createQuery("from Document fetch all properties").uniqueResult(); - assertTrue( Hibernate.isPropertyInitialized( doc, "summary" ) ); - assertTrue( Hibernate.isPropertyInitialized( doc, "upperCaseName" ) ); - assertTrue( Hibernate.isPropertyInitialized( doc, "owner" ) ); - assertEquals( doc.getSummary(), "blah" ); - s.delete(doc); - s.delete( doc.getOwner() ); - s.delete( doc.getFolder() ); - s.flush(); - s.connection().commit(); - s.close(); - } - - public void testLazy() throws Exception { - Session s = openSession(); - Owner o = new Owner(); - Document doc = new Document(); - Folder fol = new Folder(); - o.setName("gavin"); - doc.setName("Hibernate in Action"); - doc.setSummary("blah"); - doc.updateText("blah blah"); - fol.setName("books"); - doc.setOwner(o); - doc.setFolder(fol); - fol.getDocuments().add(doc); - s.save(o); - s.save(fol); - s.flush(); - s.connection().commit(); - s.close(); - - getSessions().evict(Document.class); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - doc.getName(); - assertEquals( doc.getText(), "blah blah" ); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - doc.getName(); - assertFalse(Hibernate.isPropertyInitialized(doc, "text")); - assertFalse(Hibernate.isPropertyInitialized(doc, "summary")); - assertEquals( doc.getText(), "blah blah" ); - assertTrue(Hibernate.isPropertyInitialized(doc, "text")); - assertTrue(Hibernate.isPropertyInitialized(doc, "summary")); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - doc.setName("HiA"); - s.flush(); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - assertEquals( doc.getName(), "HiA" ); - assertEquals( doc.getText(), "blah blah" ); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - doc.getText(); - doc.setName("HiA second edition"); - s.flush(); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty")); - assertTrue(Hibernate.isPropertyInitialized(doc, "name")); - assertFalse(Hibernate.isPropertyInitialized(doc, "text")); - assertFalse(Hibernate.isPropertyInitialized(doc, "upperCaseName")); - //assertFalse(Hibernate.isPropertyInitialized(doc, "owner")); - assertEquals( doc.getName(), "HiA second edition" ); - assertEquals( doc.getText(), "blah blah" ); - assertEquals( doc.getUpperCaseName(), "HIA SECOND EDITION" ); - assertTrue(Hibernate.isPropertyInitialized(doc, "text")); - assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty")); - assertTrue(Hibernate.isPropertyInitialized(doc, "upperCaseName")); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - s.connection().commit(); - s.close(); - - assertFalse(Hibernate.isPropertyInitialized(doc, "text")); - - s = openSession(); - s.lock(doc, LockMode.NONE); - assertFalse(Hibernate.isPropertyInitialized(doc, "text")); - assertEquals( doc.getText(), "blah blah" ); - assertTrue(Hibernate.isPropertyInitialized(doc, "text")); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - s.connection().commit(); - s.close(); - - doc.setName("HiA2"); - - assertFalse(Hibernate.isPropertyInitialized(doc, "text")); - - s = openSession(); - s.saveOrUpdate(doc); - s.flush(); - assertFalse(Hibernate.isPropertyInitialized(doc, "text")); - assertEquals( doc.getText(), "blah blah" ); - assertTrue(Hibernate.isPropertyInitialized(doc, "text")); - doc.updateText("blah blah blah blah"); - s.flush(); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - assertEquals( doc.getName(), "HiA2" ); - assertEquals( doc.getText(), "blah blah blah blah" ); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.load( Document.class, doc.getId() ); - doc.getName(); - assertFalse(Hibernate.isPropertyInitialized(doc, "text")); - assertFalse(Hibernate.isPropertyInitialized(doc, "summary")); - s.connection().commit(); - s.close(); - - s = openSession(); - doc = (Document) s.createQuery("from Document").uniqueResult(); - //s.delete(doc); - s.delete( doc.getFolder() ); - s.delete( doc.getOwner() ); - s.flush(); - s.connection().commit(); - s.close(); - - } - - public void testLazyManyToOne() { - Session s = openSession(); - Transaction t = s.beginTransaction(); - Owner gavin = new Owner(); - Document hia = new Document(); - Folder fol = new Folder(); - gavin.setName("gavin"); - hia.setName("Hibernate in Action"); - hia.setSummary("blah"); - hia.updateText("blah blah"); - fol.setName("books"); - hia.setOwner(gavin); - hia.setFolder(fol); - fol.getDocuments().add(hia); - s.persist(gavin); - s.persist(fol); - t.commit(); - s.close(); - - s = openSession(); - t = s.beginTransaction(); - hia = (Document) s.createCriteria(Document.class).uniqueResult(); - assertEquals( hia.getFolder().getClass(), Folder.class); - fol = hia.getFolder(); - assertTrue( Hibernate.isInitialized(fol) ); - t.commit(); - s.close(); - - s = openSession(); - t = s.beginTransaction(); - hia = (Document) s.createCriteria(Document.class).uniqueResult(); - assertSame( hia.getFolder(), s.load(Folder.class, fol.getId()) ); - assertTrue( Hibernate.isInitialized( hia.getFolder() ) ); - t.commit(); - s.close(); - - s = openSession(); - t = s.beginTransaction(); - fol = (Folder) s.get(Folder.class, fol.getId()); - hia = (Document) s.createCriteria(Document.class).uniqueResult(); - assertSame( fol, hia.getFolder() ); - fol = hia.getFolder(); - assertTrue( Hibernate.isInitialized(fol) ); - t.commit(); - s.close(); - - s = openSession(); - t = s.beginTransaction(); - fol = (Folder) s.load(Folder.class, fol.getId()); - hia = (Document) s.createCriteria(Document.class).uniqueResult(); - assertNotSame( fol, hia.getFolder() ); - fol = hia.getFolder(); - assertTrue( Hibernate.isInitialized(fol) ); - s.delete(hia.getFolder()); - s.delete(hia.getOwner()); - t.commit(); - s.close(); - } - - protected String[] getMappings() { - return new String[] { "instrument/Documents.hbm.xml" }; - } - - public void testSetFieldInterceptor() { - Document doc = new Document(); - FieldInterceptionHelper.injectFieldInterceptor( doc, "Document", new HashSet(), null ); - doc.getId(); - } - - public static Test suite() { - return new TestSuite(InstrumentTest.class); - } - - public static boolean isRunnable() { - return FieldInterceptionHelper.isInstrumented( new Document() ); - } - -} - Deleted: trunk/Hibernate3/test/org/hibernate/test/instrument/Owner.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/Owner.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/Owner.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -1,34 +0,0 @@ -//$Id$ -package org.hibernate.test.instrument; - -/** - * @author Gavin King - */ -public class Owner { - private Long id; - private String name; - /** - * @return Returns the id. - */ - public Long getId() { - return id; - } - /** - * @param id The id to set. - */ - public void setId(Long id) { - this.id = id; - } - /** - * @return Returns the name. - */ - public String getName() { - return name; - } - /** - * @param name The name to set. - */ - public void setName(String name) { - this.name = name; - } -} Copied: trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java (from rev 9531, trunk/Hibernate3/test/org/hibernate/test/instrument/InstrumentTest.java) =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/InstrumentTest.java 2006-03-02 03:14:31 UTC (rev 9531) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,370 @@ +//$Id$ +package org.hibernate.test.instrument.buildtime; + +import java.util.HashSet; +import java.net.URL; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.hibernate.Hibernate; +import org.hibernate.LockMode; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.HibernateException; +import org.hibernate.bytecode.cglib.BytecodeProviderImpl; +import org.hibernate.intercept.FieldInterceptionHelper; +import org.hibernate.test.TestCase; +import org.hibernate.test.instrument.domain.Owner; +import org.hibernate.test.instrument.domain.Document; +import org.hibernate.test.instrument.domain.Folder; + +/** + * @author Gavin King + */ +public class InstrumentTest extends TestCase { + + private ClassLoader dynamicLoader; + private BytecodeProviderImpl provider; + + public InstrumentTest(String str) { + super(str); + } + + protected void setUp() throws Exception { + // need to setup the specialized classloader + String myFileName = InstrumentTest.class.getName().replace( '.', '/' ) + ".class"; + URL fileURL = this.getClass().getClassLoader().getResource( myFileName ); + String filePath = fileURL.getPath(); + String classPath = filePath.substring( 0, filePath.length() - myFileName.length() ); + provider = new BytecodeProviderImpl(); + dynamicLoader = provider.generateDynamicFieldInterceptionClassLoader( + Thread.currentThread().getContextClassLoader(), + new String[] { classPath }, + new String[] { "org.hibernate.test" } + ); + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + provider.releaseDynamicFieldInterceptionClassLoader( dynamicLoader ); + dynamicLoader = null; + provider = null; + } + + public void testDirtyCheck() { + executeExecutable( "org.hibernate.test.instrument.runtime.TestDirtyCheckExecutable" ); +// Session s = openSession(); +// Transaction t = s.beginTransaction(); +// Folder pics = new Folder(); +// pics.setName("pics"); +// Folder docs = new Folder(); +// docs.setName("docs"); +// s.persist(docs); +// s.persist(pics); +// t.commit(); +// s.close(); +// +// s = openSession(); +// t = s.beginTransaction(); +// List list = s.createCriteria(Folder.class).list(); +// for ( Iterator iter = list.iterator(); iter.hasNext(); ) { +// Folder f = (Folder) iter.next(); +// assertFalse( f.nameWasread ); +// } +// t.commit(); +// s.close(); +// +// for ( Iterator iter = list.iterator(); iter.hasNext(); ) { +// Folder f = (Folder) iter.next(); +// assertFalse( f.nameWasread ); +// } +// +// s = openSession(); +// t = s.beginTransaction(); +// s.createQuery("delete from Folder").executeUpdate(); +// t.commit(); +// s.close(); + } + + public void testFetchAll() throws Exception { + Session s = openSession(); + Owner o = new Owner(); + Document doc = new Document(); + Folder fol = new Folder(); + o.setName("gavin"); + doc.setName("Hibernate in Action"); + doc.setSummary("blah"); + doc.updateText("blah blah"); + fol.setName("books"); + doc.setOwner(o); + doc.setFolder(fol); + fol.getDocuments().add(doc); + s.persist(o); + s.persist(fol); + s.flush(); + s.clear(); + doc = (Document) s.createQuery("from Document fetch all properties").uniqueResult(); + assertTrue( Hibernate.isPropertyInitialized( doc, "summary" ) ); + assertTrue( Hibernate.isPropertyInitialized( doc, "upperCaseName" ) ); + assertTrue( Hibernate.isPropertyInitialized( doc, "owner" ) ); + assertEquals( doc.getSummary(), "blah" ); + s.delete(doc); + s.delete( doc.getOwner() ); + s.delete( doc.getFolder() ); + s.flush(); + s.connection().commit(); + s.close(); + } + + public void testLazy() throws Exception { + Session s = openSession(); + Transaction t = s.beginTransaction(); + Owner o = new Owner(); + Document doc = new Document(); + Folder fol = new Folder(); + o.setName("gavin"); + doc.setName("Hibernate in Action"); + doc.setSummary("blah"); + doc.updateText("blah blah"); + fol.setName("books"); + doc.setOwner(o); + doc.setFolder(fol); + fol.getDocuments().add(doc); + s.save(o); + s.save(fol); + t.commit(); + s.close(); + + getSessions().evict(Document.class); + + s = openSession(); + t = s.beginTransaction(); + doc = ( Document ) s.get( Document.class, doc.getId() ); + assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty")); + assertTrue(Hibernate.isPropertyInitialized(doc, "name")); + assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + assertFalse(Hibernate.isPropertyInitialized(doc, "upperCaseName")); + assertFalse(Hibernate.isPropertyInitialized(doc, "folder")); + assertFalse(Hibernate.isPropertyInitialized(doc, "owner")); + doc.getUpperCaseName(); // should force initialization + assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty")); + assertTrue(Hibernate.isPropertyInitialized(doc, "upperCaseName")); + assertTrue(Hibernate.isPropertyInitialized(doc, "folder")); + assertTrue(Hibernate.isPropertyInitialized(doc, "owner")); + t.commit(); + s.close(); + + getSessions().evict(Document.class); + + s = openSession(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + doc.getName(); + assertEquals( doc.getText(), "blah blah" ); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + doc.getName(); + assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + assertFalse(Hibernate.isPropertyInitialized(doc, "summary")); + assertEquals( doc.getText(), "blah blah" ); + assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + assertTrue(Hibernate.isPropertyInitialized(doc, "summary")); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = ( Document ) s.createQuery("from Document").uniqueResult(); + doc.setName("HiA"); + s.flush(); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + assertEquals( doc.getName(), "HiA" ); + assertEquals( doc.getText(), "blah blah" ); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + doc.getText(); + doc.setName("HiA second edition"); + s.flush(); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty")); + assertTrue(Hibernate.isPropertyInitialized(doc, "name")); + assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + assertFalse(Hibernate.isPropertyInitialized(doc, "upperCaseName")); + assertFalse(Hibernate.isPropertyInitialized(doc, "owner")); + assertEquals( doc.getName(), "HiA second edition" ); + assertEquals( doc.getText(), "blah blah" ); + assertEquals( doc.getUpperCaseName(), "HIA SECOND EDITION" ); + assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty")); + assertTrue(Hibernate.isPropertyInitialized(doc, "upperCaseName")); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + s.connection().commit(); + s.close(); + + assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + + s = openSession(); + s.lock(doc, LockMode.NONE); + assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + assertEquals( doc.getText(), "blah blah" ); + assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + s.connection().commit(); + s.close(); + + doc.setName("HiA2"); + + assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + + s = openSession(); + s.saveOrUpdate(doc); + s.flush(); + assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + assertEquals( doc.getText(), "blah blah" ); + assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + doc.updateText("blah blah blah blah"); + s.flush(); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + assertEquals( doc.getName(), "HiA2" ); + assertEquals( doc.getText(), "blah blah blah blah" ); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = (Document) s.load( Document.class, doc.getId() ); + doc.getName(); + assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + assertFalse(Hibernate.isPropertyInitialized(doc, "summary")); + s.connection().commit(); + s.close(); + + s = openSession(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + //s.delete(doc); + s.delete( doc.getFolder() ); + s.delete( doc.getOwner() ); + s.flush(); + s.connection().commit(); + s.close(); + + } + + public void testLazyManyToOne() { + Session s = openSession(); + Transaction t = s.beginTransaction(); + Owner gavin = new Owner(); + Document hia = new Document(); + Folder fol = new Folder(); + gavin.setName("gavin"); + hia.setName("Hibernate in Action"); + hia.setSummary("blah"); + hia.updateText("blah blah"); + fol.setName("books"); + hia.setOwner(gavin); + hia.setFolder(fol); + fol.getDocuments().add(hia); + s.persist(gavin); + s.persist(fol); + t.commit(); + s.close(); + + s = openSession(); + t = s.beginTransaction(); + hia = (Document) s.createCriteria(Document.class).uniqueResult(); + assertEquals( hia.getFolder().getClass(), Folder.class); + fol = hia.getFolder(); + assertTrue( Hibernate.isInitialized(fol) ); + t.commit(); + s.close(); + + s = openSession(); + t = s.beginTransaction(); + hia = (Document) s.createCriteria(Document.class).uniqueResult(); + assertSame( hia.getFolder(), s.load(Folder.class, fol.getId()) ); + assertTrue( Hibernate.isInitialized( hia.getFolder() ) ); + t.commit(); + s.close(); + + s = openSession(); + t = s.beginTransaction(); + fol = (Folder) s.get(Folder.class, fol.getId()); + hia = (Document) s.createCriteria(Document.class).uniqueResult(); + assertSame( fol, hia.getFolder() ); + fol = hia.getFolder(); + assertTrue( Hibernate.isInitialized(fol) ); + t.commit(); + s.close(); + + s = openSession(); + t = s.beginTransaction(); + fol = (Folder) s.load(Folder.class, fol.getId()); + hia = (Document) s.createCriteria(Document.class).uniqueResult(); + assertNotSame( fol, hia.getFolder() ); + fol = hia.getFolder(); + assertTrue( Hibernate.isInitialized(fol) ); + s.delete(hia.getFolder()); + s.delete(hia.getOwner()); + t.commit(); + s.close(); + } + + protected String[] getMappings() { + return new String[] { "instrument/Documents.hbm.xml" }; + } + + public void testSetFieldInterceptor() { + Document doc = new Document(); + FieldInterceptionHelper.injectFieldInterceptor( doc, "Document", new HashSet(), null ); + doc.getId(); + } + + public static Test suite() { + return new TestSuite(InstrumentTest.class); + } + + public static boolean isRunnable() { + return FieldInterceptionHelper.isInstrumented( new Document() ); + } + + private static final Class[] SIG = new Class[] { TestCase.class }; + + public void executeExecutable(String name) { + try { + Class execClass = dynamicLoader.loadClass( name ); + Object executable = execClass.newInstance(); + execClass.getDeclaredMethod( "execute", SIG ).invoke( executable, new Object[] { this } ); + + } + catch( Throwable t ) { + throw new HibernateException( "could not load executable", t ); + } + } +} + Property changes on: trunk/Hibernate3/test/org/hibernate/test/instrument/buildtime/InstrumentTest.java ___________________________________________________________________ Name: svn:executable + * Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Copied: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Document.java (from rev 9531, trunk/Hibernate3/test/org/hibernate/test/instrument/Document.java) =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/Document.java 2006-03-02 03:14:31 UTC (rev 9531) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Document.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,110 @@ +//$Id$ +package org.hibernate.test.instrument.domain; + +import java.util.Date; + +/** + * @author Gavin King + */ +public class Document { + private Long id; + private String name; + private String upperCaseName; + private String summary; + private String text; + private Owner owner; + private Folder folder; + private Date lastTextModification = new Date(); + /** + * @return Returns the folder. + */ + public Folder getFolder() { + return folder; + } + /** + * @param folder The folder to set. + */ + public void setFolder(Folder folder) { + this.folder = folder; + } + /** + * @return Returns the owner. + */ + public Owner getOwner() { + return owner; + } + /** + * @param owner The owner to set. + */ + public void setOwner(Owner owner) { + this.owner = owner; + } + /** + * @return Returns the id. + */ + public Long getId() { + return id; + } + /** + * @param id The id to set. + */ + public void setId(Long id) { + this.id = id; + } + /** + * @return Returns the name. + */ + public String getName() { + return name; + } + /** + * @param name The name to set. + */ + public void setName(String name) { + this.name = name; + } + /** + * @return Returns the summary. + */ + public String getSummary() { + return summary; + } + /** + * @param summary The summary to set. + */ + public void setSummary(String summary) { + this.summary = summary; + } + /** + * @return Returns the text. + */ + public String getText() { + return text; + } + /** + * @param text The text to set. + */ + private void setText(String text) { + this.text = text; + } + /** + * @return Returns the upperCaseName. + */ + public String getUpperCaseName() { + return upperCaseName; + } + /** + * @param upperCaseName The upperCaseName to set. + */ + public void setUpperCaseName(String upperCaseName) { + this.upperCaseName = upperCaseName; + } + + public void updateText(String newText) { + if ( !newText.equals(text) ) { + this.text = newText; + lastTextModification = new Date(); + } + } + +} Property changes on: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Document.java ___________________________________________________________________ Name: svn:executable + * Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Copied: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml (from rev 9531, trunk/Hibernate3/test/org/hibernate/test/instrument/Documents.hbm.xml) =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/Documents.hbm.xml 2006-03-02 03:14:31 UTC (rev 9531) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,67 @@ +<?xml version="1.0"?> +<!DOCTYPE hibernate-mapping PUBLIC + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> + +<!-- + + This mapping demonstrates + + (1) use of lazy properties - this feature requires buildtime + bytecode instrumentation; we don't think this is a very + necessary feature, but provide it for completeleness; if + Hibernate encounters uninstrumented classes, lazy property + fetching will be silently disabled, to enable testing + + (2) use of a formula to define a "derived property" + +--> + +<hibernate-mapping package="org.hibernate.test.instrument.domain" default-access="field"> + + <class name="Folder" table="folders"> + <id name="id"> + <generator class="native"/> + </id> + <property name="name" + not-null="true" + length="50"/> + <many-to-one name="parent"/> + <bag name="subfolders" + inverse="true" + cascade="save-update"> + <key column="parent"/> + <one-to-many class="Folder"/> + </bag> + <bag name="documents" + inverse="true" + cascade="all-delete-orphan"> + <key column="folder"/> + <one-to-many class="Document"/> + </bag> + </class> + + <class name="Owner" table="owners" lazy="false"> + <id name="id"> + <generator class="native"/> + </id> + <property name="name" + not-null="true" + length="50"/> + </class> + + <class name="Document" table="documents"> + <id name="id"> + <generator class="native"/> + </id> + <property name="name" not-null="true" length="50"/> + <property name="upperCaseName" formula="upper(name)" lazy="true"/> + <property name="summary" not-null="true" length="200" lazy="true"/> + <many-to-one name="folder" not-null="true" lazy="no-proxy"/> + <many-to-one name="owner" not-null="true" lazy="no-proxy" fetch="select"/> + <property name="text" not-null="true" length="2000" lazy="true"/> + <property name="lastTextModification" not-null="true" lazy="true" access="field"/> + </class> + + +</hibernate-mapping> Property changes on: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml ___________________________________________________________________ Name: svn:executable + * Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Copied: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Folder.java (from rev 9531, trunk/Hibernate3/test/org/hibernate/test/instrument/Folder.java) =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/Folder.java 2006-03-02 03:14:31 UTC (rev 9531) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Folder.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,80 @@ +//$Id$ +package org.hibernate.test.instrument.domain; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * @author Gavin King + */ +public class Folder { + private Long id; + private String name; + private Folder parent; + private Collection subfolders = new ArrayList(); + private Collection documents = new ArrayList(); + + public boolean nameWasread; + + /** + * @return Returns the id. + */ + public Long getId() { + return id; + } + /** + * @param id The id to set. + */ + public void setId(Long id) { + this.id = id; + } + /** + * @return Returns the name. + */ + public String getName() { + nameWasread = true; + return name; + } + /** + * @param name The name to set. + */ + public void setName(String name) { + this.name = name; + } + /** + * @return Returns the documents. + */ + public Collection getDocuments() { + return documents; + } + /** + * @param documents The documents to set. + */ + public void setDocuments(Collection documents) { + this.documents = documents; + } + /** + * @return Returns the parent. + */ + public Folder getParent() { + return parent; + } + /** + * @param parent The parent to set. + */ + public void setParent(Folder parent) { + this.parent = parent; + } + /** + * @return Returns the subfolders. + */ + public Collection getSubfolders() { + return subfolders; + } + /** + * @param subfolders The subfolders to set. + */ + public void setSubfolders(Collection subfolders) { + this.subfolders = subfolders; + } +} Property changes on: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Folder.java ___________________________________________________________________ Name: svn:executable + * Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Copied: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Owner.java (from rev 9531, trunk/Hibernate3/test/org/hibernate/test/instrument/Owner.java) =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/Owner.java 2006-03-02 03:14:31 UTC (rev 9531) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Owner.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,34 @@ +//$Id$ +package org.hibernate.test.instrument.domain; + +/** + * @author Gavin King + */ +public class Owner { + private Long id; + private String name; + /** + * @return Returns the id. + */ + public Long getId() { + return id; + } + /** + * @param id The id to set. + */ + public void setId(Long id) { + this.id = id; + } + /** + * @return Returns the name. + */ + public String getName() { + return name; + } + /** + * @param name The name to set. + */ + public void setName(String name) { + this.name = name; + } +} Property changes on: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Owner.java ___________________________________________________________________ Name: svn:executable + * Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/AbstractExecutable.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/AbstractExecutable.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/AbstractExecutable.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,29 @@ +package org.hibernate.test.instrument.runtime; + +import org.hibernate.SessionFactory; +import org.hibernate.test.instrument.runtime.Executable; +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.Environment; + +/** + * @author Steve Ebersole + */ +public abstract class AbstractExecutable implements Executable { + + private SessionFactory factory; + + public void prepare() { + factory = new Configuration() + .setProperty( Environment.HBM2DDL_AUTO, "create-drop" ) + .addResource( "org/hibernate/test/instrument/domain/Documents.hbm.xml" ) + .buildSessionFactory(); + } + + public void complete() { + factory.close(); + } + + protected SessionFactory getFactory() { + return factory; + } +} Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/AbstractTransformingClassLoaderInstrumentTestCase.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/AbstractTransformingClassLoaderInstrumentTestCase.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/AbstractTransformingClassLoaderInstrumentTestCase.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,97 @@ +package org.hibernate.test.instrument.runtime; + +import org.hibernate.test.AbstractClassLoaderIsolatedTestCase; +import org.hibernate.bytecode.BytecodeProvider; +import org.hibernate.HibernateException; + +import java.net.URL; +import java.lang.reflect.InvocationTargetException; + +/** + * @author Steve Ebersole + */ +public abstract class AbstractTransformingClassLoaderInstrumentTestCase extends AbstractClassLoaderIsolatedTestCase { + + private BytecodeProvider provider; + + protected ClassLoader buildIsolatedClassLoader(ClassLoader parent) { + String myFileName = AbstractTransformingClassLoaderInstrumentTestCase.class.getName().replace( '.', '/' ) + ".class"; + URL fileURL = this.getClass().getClassLoader().getResource( myFileName ); + String filePath = fileURL.getPath(); + String classPath = filePath.substring( 0, filePath.length() - myFileName.length() ); + provider = buildBytecodeProvider(); + return provider.generateDynamicFieldInterceptionClassLoader( + parent, + new String[] { classPath }, + new String[] { "org.hibernate.test.instrument" } + ); + } + + protected void releaseIsolatedClassLoader(ClassLoader isolatedLoader) { + provider.releaseDynamicFieldInterceptionClassLoader( isolatedLoader ); + provider = null; + } + + protected abstract BytecodeProvider buildBytecodeProvider(); + + + // the tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + public void testSetFieldInterceptor() { + executeExecutable( "org.hibernate.test.instrument.runtime.TestInjectFieldInterceptorExecutable" ); + } + + public void testDirtyCheck() { + executeExecutable( "org.hibernate.test.instrument.runtime.TestDirtyCheckExecutable" ); + } + + public void testFetchAll() throws Exception { + executeExecutable( "org.hibernate.test.instrument.runtime.TestFetchAllExecutable" ); + } + + public void testLazy() { + executeExecutable( "org.hibernate.test.instrument.runtime.TestLazyExecutable" ); + } + + public void testLazyManyToOne() { + executeExecutable( "org.hibernate.test.instrument.runtime.TestLazyManyToOneExecutable" ); + } + + + // reflection code to ensure isolation into the created classloader ~~~~~~~ + + private static final Class[] SIG = new Class[] {}; + private static final Object[] ARGS = new Object[] {}; + + public void executeExecutable(String name) { + Class execClass = null; + Object executable = null; + try { + execClass = Thread.currentThread().getContextClassLoader().loadClass( name ); + executable = execClass.newInstance(); + } + catch( Throwable t ) { + throw new HibernateException( "could not load executable", t ); + } + try { + execClass.getMethod( "prepare", SIG ).invoke( executable, ARGS ); + execClass.getMethod( "execute", SIG ).invoke( executable, ARGS ); + } + catch ( NoSuchMethodException e ) { + throw new HibernateException( "could not exeucte executable", e ); + } + catch ( IllegalAccessException e ) { + throw new HibernateException( "could not exeucte executable", e ); + } + catch ( InvocationTargetException e ) { + throw new HibernateException( "could not exeucte executable", e.getTargetException() ); + } + finally { + try { + execClass.getMethod( "complete", SIG ).invoke( executable, ARGS ); + } + catch ( Throwable ignore ) { + } + } + } +} Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,13 @@ +package org.hibernate.test.instrument.runtime; + +import org.hibernate.bytecode.BytecodeProvider; +import org.hibernate.bytecode.cglib.BytecodeProviderImpl; + +/** + * @author Steve Ebersole + */ +public class CGLIBTest extends AbstractTransformingClassLoaderInstrumentTestCase { + protected BytecodeProvider buildBytecodeProvider() { + return new BytecodeProviderImpl(); + } +} Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/Executable.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/Executable.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/Executable.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,10 @@ +package org.hibernate.test.instrument.runtime; + +/** + * @author Steve Ebersole + */ +public interface Executable { + public void prepare(); + public void execute(); + public void complete(); +} Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestDirtyCheckExecutable.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestDirtyCheckExecutable.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestDirtyCheckExecutable.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,50 @@ +package org.hibernate.test.instrument.runtime; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.test.instrument.runtime.AbstractExecutable; +import org.hibernate.test.instrument.domain.Folder; + +import java.util.List; +import java.util.Iterator; + +import junit.framework.Assert; + +/** + * @author Steve Ebersole + */ +public class TestDirtyCheckExecutable extends AbstractExecutable { + public void execute() { + Session s = getFactory().openSession(); + Transaction t = s.beginTransaction(); + Folder pics = new Folder(); + pics.setName("pics"); + Folder docs = new Folder(); + docs.setName("docs"); + s.persist(docs); + s.persist(pics); + t.commit(); + s.close(); + + s = getFactory().openSession(); + t = s.beginTransaction(); + List list = s.createCriteria(Folder.class).list(); + for ( Iterator iter = list.iterator(); iter.hasNext(); ) { + Folder f = (Folder) iter.next(); + Assert.assertFalse( f.nameWasread ); + } + t.commit(); + s.close(); + + for ( Iterator iter = list.iterator(); iter.hasNext(); ) { + Folder f = (Folder) iter.next(); + Assert.assertFalse( f.nameWasread ); + } + + s = getFactory().openSession(); + t = s.beginTransaction(); + s.createQuery("delete from Folder").executeUpdate(); + t.commit(); + s.close(); + } +} Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestFetchAllExecutable.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestFetchAllExecutable.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestFetchAllExecutable.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,47 @@ +package org.hibernate.test.instrument.runtime; + +import org.hibernate.Session; +import org.hibernate.Hibernate; +import org.hibernate.Transaction; +import org.hibernate.test.instrument.domain.Owner; +import org.hibernate.test.instrument.domain.Document; +import org.hibernate.test.instrument.domain.Folder; +import junit.framework.Assert; + +/** + * @author Steve Ebersole + */ +public class TestFetchAllExecutable extends AbstractExecutable { + public void execute() { + Session s = getFactory().openSession(); + Transaction t = s.beginTransaction(); + Owner o = new Owner(); + Document doc = new Document(); + Folder fol = new Folder(); + o.setName("gavin"); + doc.setName("Hibernate in Action"); + doc.setSummary("blah"); + doc.updateText("blah blah"); + fol.setName("books"); + doc.setOwner(o); + doc.setFolder(fol); + fol.getDocuments().add(doc); + s.persist(o); + s.persist(fol); + t.commit(); + s.close(); + + s = getFactory().openSession(); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document fetch all properties").uniqueResult(); + Assert.assertTrue( Hibernate.isPropertyInitialized( doc, "summary" ) ); + Assert.assertTrue( Hibernate.isPropertyInitialized( doc, "upperCaseName" ) ); + Assert.assertTrue( Hibernate.isPropertyInitialized( doc, "owner" ) ); + Assert.assertEquals( doc.getSummary(), "blah" ); + s.delete(doc); + s.delete( doc.getOwner() ); + s.delete( doc.getFolder() ); + t.commit(); + s.close(); + } +} Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestInjectFieldInterceptorExecutable.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestInjectFieldInterceptorExecutable.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestInjectFieldInterceptorExecutable.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,17 @@ +package org.hibernate.test.instrument.runtime; + +import org.hibernate.test.instrument.domain.Document; +import org.hibernate.intercept.FieldInterceptionHelper; + +import java.util.HashSet; + +/** + * @author Steve Ebersole + */ +public class TestInjectFieldInterceptorExecutable extends AbstractExecutable { + public void execute() { + Document doc = new Document(); + FieldInterceptionHelper.injectFieldInterceptor( doc, "Document", new HashSet(), null ); + doc.getId(); + } +} Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestLazyExecutable.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestLazyExecutable.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestLazyExecutable.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,197 @@ +package org.hibernate.test.instrument.runtime; + +import org.hibernate.test.TestCase; +import org.hibernate.test.instrument.runtime.AbstractExecutable; +import org.hibernate.test.instrument.domain.Owner; +import org.hibernate.test.instrument.domain.Document; +import org.hibernate.test.instrument.domain.Folder; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.Hibernate; +import org.hibernate.LockMode; +import org.hibernate.CacheMode; +import org.hibernate.SessionFactory; + +/** + * @author Steve Ebersole + */ +public class TestLazyExecutable extends AbstractExecutable { + public void execute() { + SessionFactory factory = getFactory(); + Session s = factory.openSession(); + Transaction t = s.beginTransaction(); + Owner o = new Owner(); + Document doc = new Document(); + Folder fol = new Folder(); + o.setName("gavin"); + doc.setName("Hibernate in Action"); + doc.setSummary("blah"); + doc.updateText("blah blah"); + fol.setName("books"); + doc.setOwner(o); + doc.setFolder(fol); + fol.getDocuments().add(doc); + s.save(o); + s.save(fol); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = ( Document ) s.get( Document.class, doc.getId() ); + TestCase.assertTrue( Hibernate.isPropertyInitialized(doc, "weirdProperty")); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "name")); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "upperCaseName")); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "folder")); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "owner")); + doc.getUpperCaseName(); // should force initialization + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty")); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "upperCaseName")); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "folder")); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "owner")); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + doc.getName(); + TestCase.assertEquals( doc.getText(), "blah blah" ); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + doc.getName(); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "summary")); + TestCase.assertEquals( doc.getText(), "blah blah" ); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "summary")); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + doc.setName("HiA"); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + TestCase.assertEquals( doc.getName(), "HiA" ); + TestCase.assertEquals( doc.getText(), "blah blah" ); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + doc.getText(); + doc.setName("HiA second edition"); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty")); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "name")); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "upperCaseName")); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "owner")); + TestCase.assertEquals( doc.getName(), "HiA second edition" ); + TestCase.assertEquals( doc.getText(), "blah blah" ); + TestCase.assertEquals( doc.getUpperCaseName(), "HIA SECOND EDITION" ); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty")); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "upperCaseName")); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + t.commit(); + s.close(); + + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + s.lock(doc, LockMode.NONE); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + TestCase.assertEquals( doc.getText(), "blah blah" ); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + t.commit(); + s.close(); + + doc.setName("HiA2"); + + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + s.saveOrUpdate(doc); + s.flush(); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + TestCase.assertEquals( doc.getText(), "blah blah" ); + TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text")); + doc.updateText("blah blah blah blah"); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = ( Document ) s.createQuery("from Document").uniqueResult(); + TestCase.assertEquals( doc.getName(), "HiA2" ); + TestCase.assertEquals( doc.getText(), "blah blah blah blah" ); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.load( Document.class, doc.getId() ); + doc.getName(); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text")); + TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "summary")); + t.commit(); + s.close(); + + s = factory.openSession(); + s.setCacheMode( CacheMode.IGNORE ); + t = s.beginTransaction(); + doc = (Document) s.createQuery("from Document").uniqueResult(); + //s.delete(doc); + s.delete( doc.getFolder() ); + s.delete( doc.getOwner() ); + s.flush(); + t.commit(); + s.close(); + } + +} Added: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestLazyManyToOneExecutable.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestLazyManyToOneExecutable.java 2006-03-03 10:51:04 UTC (rev 9537) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/TestLazyManyToOneExecutable.java 2006-03-04 00:17:57 UTC (rev 9538) @@ -0,0 +1,73 @@ +package org.hibernate.test.instrument.runtime; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.Hibernate; +import org.hibernate.test.instrument.domain.Owner; +import org.hibernate.test.instrument.domain.Document; +import org.hibernate.test.instrument.domain.Folder; +import junit.framework.Assert; + +/** + * @author Steve Ebersole + */ +public class TestLazyManyToOneExecutable extends AbstractExecutable { + public void execute() { + Session s = getFactory().openSession(); + Transaction t = s.beginTransaction(); + Owner gavin = new Owner(); + Document hia = new Document(); + Folder fol = new Folder(); + gavin.setName("gavin"); + hia.setName("Hibernate in Action"); + hia.setSummary("blah"); + hia.updateText("blah blah"); + fol.setName("books"); + hia.setOwner(gavin); + hia.setFolder(fol); + fol.getDocuments().add(hia); + s.persist(gavin); + s.persist(fol); + t.commit(); + s.close(); + + s = getFactory().openSession(); + t = s.beginTransaction(); +... [truncated message content] |
From: <hib...@li...> - 2006-03-03 10:51:18
|
Author: max...@jb... Date: 2006-03-03 05:51:04 -0500 (Fri, 03 Mar 2006) New Revision: 9537 Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/testsupport/seamtest-build.xml Log: HBX-613 Allow user to control initial schema selection for performance + misc Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -16,6 +16,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.DuplicateMappingException; import org.hibernate.FetchMode; import org.hibernate.MappingException; import org.hibernate.cfg.reveng.DatabaseCollector; @@ -46,6 +47,7 @@ import org.hibernate.type.TypeFactory; import org.hibernate.util.JoinedIterator; import org.hibernate.util.StringHelper; +import org.jgroups.util.GetNetworkInterfaces1_4; /** @@ -146,7 +148,14 @@ rc.setDiscriminatorValue( rc.getEntityName() ); rc.setTable(table); - mappings.addClass(rc); + try { + mappings.addClass(rc); + } catch(DuplicateMappingException dme) { + // TODO: detect this and generate a "permutation" of it ? + PersistentClass class1 = mappings.getClass(dme.getName()); + Table table2 = class1.getTable(); + throw new JDBCBinderException("Duplicate class name '" + rc.getEntityName() + "' generated for '" + table + "'. Same name where generated for '" + table2 + "'"); + } mappings.addImport( rc.getEntityName(), rc.getEntityName() ); Set processed = new HashSet(); Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -171,6 +171,8 @@ return AUTO_OPTIMISTICLOCK_COLUMNS.contains(column.toLowerCase())?Boolean.TRUE:Boolean.FALSE; } + public List getSchemaSelectors() { + return null; + } - } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -76,5 +76,9 @@ public Boolean useColumnForOptimisticLock(TableIdentifier identifier, String column) { return delegate==null?null:delegate.useColumnForOptimisticLock(identifier, column); + } + + public List getSchemaSelectors() { + return delegate==null?null:delegate.getSchemaSelectors(); } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -61,9 +61,18 @@ getMetaDataDialect().configure(provider, sec); revengStrategy.configure(provider, sec); - Set hasIndices = new HashSet(); - processTables(dbs, catalog, schema, hasIndices, progress); + Set hasIndices = new HashSet(); + List schemaSelectors = revengStrategy.getSchemaSelectors(); + if(schemaSelectors==null) { + processTables(dbs, new SchemaSelection(catalog, schema), hasIndices, progress); + } else { + for (Iterator iter = schemaSelectors.iterator(); iter.hasNext();) { + SchemaSelection selection = (SchemaSelection) iter.next(); + processTables(dbs, selection, hasIndices, progress); + } + } + Iterator tables = dbs.iterateTables(); while ( tables.hasNext() ) { Table table = (Table) tables.next(); @@ -383,16 +392,16 @@ return value.equals(tf); } - private void processTables(DatabaseCollector dbs, String catalog, String schema, Set hasIndices, ProgressListener progress) { + private void processTables(DatabaseCollector dbs, SchemaSelection schemaSelection, Set hasIndices, ProgressListener progress) { Map tableRs = null; Iterator tableIterator = null; List tables = new ArrayList(); boolean multiSchema = false; // TODO: the code below detects if the reveng is multischema'ed, but not used for anything yet. should be used to remove schema/catalog info from output if only one schema/catalog used. try { - progress.startSubTask("Finding tables in " + catalog + "." + schema); + progress.startSubTask("Finding tables in " + schemaSelection); - tableIterator = getMetaDataDialect().getTables(catalog, schema, null); + tableIterator = getMetaDataDialect().getTables(schemaSelection.getCatalogPattern(), schemaSelection.getSchemaPattern(), schemaSelection.getTablePattern()); String[] lastQualifier = null; String[] foundQualifier = new String[2]; @@ -402,7 +411,7 @@ String schemaName = (String) tableRs.get("TABLE_SCHEM"); String catalogName = (String) tableRs.get("TABLE_CAT"); - TableIdentifier ti = new TableIdentifier(catalogName, schemaName, tableName); + TableIdentifier ti = new TableIdentifier(catalogName, schemaName, tableName); if(revengStrategy.excludeTable(ti) ) { log.debug("Table " + ti + " excluded by strategy"); continue; @@ -447,28 +456,34 @@ String comment = (String) tableRs.get("REMARKS"); String tableType = (String) tableRs.get("TABLE_TYPE"); - if ( ("TABLE".equals(tableType) || "VIEW".equals(tableType) /*|| "SYNONYM".equals(tableType) */) ) { //|| - // ("SYNONYM".equals(tableType) && isOracle() ) ) { // only on oracle ? TODO: HBX-218 - // it's a regular table or a synonym - - // ensure schema and catalogname is truly empty (especially mysql returns null schema, "" catalog) - if(schemaName!=null && schemaName.trim().length()==0) { - schemaName = null; - } - if(catalogName!=null && catalogName.trim().length()==0) { - catalogName=null; + + if(dbs.getTable(schemaName, catalogName, tableName)!=null) { + log.debug("Ignoring " + tableName + " since it has already been processed"); + continue; + } else { + if ( ("TABLE".equals(tableType) || "VIEW".equals(tableType) /*|| "SYNONYM".equals(tableType) */) ) { //|| + // ("SYNONYM".equals(tableType) && isOracle() ) ) { // only on oracle ? TODO: HBX-218 + // it's a regular table or a synonym + + // ensure schema and catalogname is truly empty (especially mysql returns null schema, "" catalog) + if(schemaName!=null && schemaName.trim().length()==0) { + schemaName = null; + } + if(catalogName!=null && catalogName.trim().length()==0) { + catalogName=null; + } + log.debug("Adding table " + tableName + " of type " + tableType); + progress.startSubTask("Found " + tableName); + Table table = dbs.addTable(quote(getSchemaForModel(schemaName)), getCatalogForModel(catalogName), quote(tableName)); + table.setComment(comment); + if(tableType.equals("TABLE")) { + hasIndices.add(table); + } } - log.debug("Adding table " + tableName + " of type " + tableType); - progress.startSubTask("Found " + tableName); - Table table = dbs.addTable(quote(getSchemaForModel(schemaName)), getCatalogForModel(catalogName), quote(tableName)); - table.setComment(comment); - if(tableType.equals("TABLE")) { - hasIndices.add(table); + else { + log.debug("Ignoring table " + tableName + " of type " + tableType); } } - else { - log.debug("Ignoring table " + tableName + " of type " + tableType); - } } } @@ -757,18 +772,23 @@ return column; } + static class NoopProgressListener implements ProgressListener { + public void startSubTask(String name) { // noop }; + } + } + public DatabaseCollector readDatabaseSchema(DatabaseCollector dbs, String catalog, String schema) { - return readDatabaseSchema(dbs, catalog, schema, new ProgressListener() { - public void startSubTask(String name) { } - }); + return readDatabaseSchema(dbs, catalog, schema, new NoopProgressListener()); } + /** If catalog is equal to defaultCatalog then we return null so it will be null in the generated code. */ protected String getCatalogForModel(String catalog) { if(catalog==null) return null; if(catalog.equals(defaultCatalog)) return null; return catalog; } + /** If catalog is equal to defaultSchema then we return null so it will be null in the generated code. */ protected String getSchemaForModel(String schema) { if(schema==null) return null; if(schema.equals(defaultSchema)) return null; Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -24,28 +24,50 @@ Element rootElement = doc.getRootElement(); - Element element = rootElement.element("type-mapping"); + Element element; + List elements; + + elements = rootElement.elements("schema-selection"); + bindSchemaSelection(elements, repository); + element = rootElement.element("type-mapping"); + if(element!=null) { bindTypeMappings(element, repository); } - List filters = rootElement.elements("table-filter"); - bindTableFilters(filters, repository); + elements = rootElement.elements("table-filter"); + bindTableFilters(elements, repository); + List tables = rootElement.elements("table"); bindTables(tables, repository); } + private static void bindSchemaSelection(List selection, OverrideRepository repository) { + Iterator iterator = selection.iterator(); + + while ( iterator.hasNext() ) { + Element element = (Element) iterator.next(); + SchemaSelection schemaSelection = new SchemaSelection(); + schemaSelection.setCatalogPattern( element.attributeValue("catalog") ); + schemaSelection.setSchemaPattern( element.attributeValue("schema") ); + schemaSelection.setTablePattern( element.attributeValue("table") ); + + repository.addSchemaSelection(schemaSelection); + + } + } + private static void bindTables(List tables, OverrideRepository repository) { Iterator iterator = tables.iterator(); while ( iterator.hasNext() ) { Element element = (Element) iterator.next(); Table table = new Table(); - table.setCatalog( repository.getCatalog(element.attributeValue("catalog")) ); - table.setSchema( repository.getSchema(element.attributeValue("schema")) ); + table.setCatalog( element.attributeValue("catalog") ); + table.setSchema( element.attributeValue("schema") ); table.setName( element.attributeValue("name") ); String wantedClassName = element.attributeValue("class"); @@ -99,8 +121,8 @@ if(foreignTableName!=null) { Table foreignTable = new Table(); foreignTable.setName(foreignTableName); - foreignTable.setCatalog(getCatalog(repository,element.attributeValue( "foreign-catalog"), table.getCatalog()) ); - foreignTable.setSchema(getSchema(repository,element.attributeValue( "foreign-schema"), table.getSchema()) ); + foreignTable.setCatalog(getValue(element.attributeValue( "foreign-catalog"), table.getCatalog()) ); + foreignTable.setSchema(getValue(element.attributeValue( "foreign-schema"), table.getSchema()) ); List localColumns = new ArrayList(); List foreignColumns = new ArrayList(); @@ -127,22 +149,14 @@ } - private static String getSchema(OverrideRepository repository, String first, String second) { + private static String getValue(String first, String second) { if(first==null) { - return repository.getSchema(second); + return second; } else { return first; } } - private static String getCatalog(OverrideRepository repository, String first, String second) { - if(first==null) { - return repository.getCatalog(second); - } else { - return first; - } - } - private static List bindColumns(List columns, Table table, OverrideRepository repository) { Iterator iterator = columns.iterator(); List columnNames = new ArrayList(); @@ -178,8 +192,8 @@ Table foreignTable = new Table(); foreignTable.setName(foreignTableName); - foreignTable.setCatalog(getCatalog(repository,element.attributeValue( "foreign-catalog"),table.getCatalog()) ); - foreignTable.setSchema(getSchema(repository, element.attributeValue( "foreign-schema"), table.getSchema()) ); + foreignTable.setCatalog(getValue(element.attributeValue( "foreign-catalog"),table.getCatalog()) ); + foreignTable.setSchema(getValue(element.attributeValue( "foreign-schema"), table.getSchema()) ); String foreignColumnName = element.attributeValue("foreign-column"); if(foreignColumnName!=null) { Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -54,14 +54,18 @@ final private Map tableToClassName; - private String defaultCatalog; - private String defaultSchema; + final private List schemaSelections; + //private String defaultCatalog; + //private String defaultSchema; - public OverrideRepository(String defaultCatalog, String defaultSchema) { - this.defaultCatalog = null; - this.defaultSchema = null; + + + + public OverrideRepository() { + //this.defaultCatalog = null; + //this.defaultSchema = null; xmlHelper = new XMLHelper(); entityResolver = XMLHelper.DEFAULT_DTD_RESOLVER; typeMappings = new HashMap(); @@ -75,6 +79,7 @@ primaryKeyColumnsForTable = new HashMap(); tableToClassName = new HashMap(); excludedColumns = new HashSet(); + schemaSelections = new ArrayList(); } public OverrideRepository addFile(File xmlFile) { @@ -253,6 +258,14 @@ return excludedColumns.contains(TABLECOLUMN_KEY_FACTORY.newInstance(identifier, columnName)); } + public List getSchemaSelectors() { + if(schemaSelections.isEmpty()) { + return super.getSchemaSelectors(); + } else { + return schemaSelections; + } + } + public String columnToHibernateTypeName(TableIdentifier table, String columnName, int sqlType, int length, int precision, int scale, boolean nullable) { String result = null; String location = ""; @@ -409,12 +422,16 @@ } - public String getCatalog(String string) { + /*public String getCatalog(String string) { return string==null?defaultCatalog:string; - } + }*/ - public String getSchema(String string) { + /*public String getSchema(String string) { return string==null?defaultSchema:string; + }*/ + + public void addSchemaSelection(SchemaSelection schemaSelection) { + schemaSelections.add(schemaSelection); } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -99,5 +99,11 @@ public Boolean useColumnForOptimisticLock(TableIdentifier identifier, String column); + /** return list of SchemaSelctors + * + * @return null + */ + public List getSchemaSelectors(); + } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2006-03-03 10:51:04 UTC (rev 9537) @@ -16,7 +16,7 @@ --> <!ELEMENT hibernate-reverse-engineering ( - type-mapping?, + (schema-selection)*, type-mapping?, (table-filter)*, table*)> <!ELEMENT type-mapping ( sql-type+ ) > @@ -31,6 +31,16 @@ <!ATTLIST sql-type not-null (true|false) #IMPLIED > <!ATTLIST sql-type hibernate-type CDATA #REQUIRED > +<!-- Used to target the selection from the database. +Each schema-selection can be viewed as a "call" to DatabaseMetaData.getTables() --> +<!ELEMENT schema-selection EMPTY> +<!-- Catalog pattern for the selection --> +<!ATTLIST schema-selection catalog CDATA #IMPLIED > +<!-- Schema for the for the selection --> +<!ATTLIST schema-selection schema CDATA #IMPLIED > +<!-- Table pattern for the selection --> +<!ATTLIST schema-selection table CDATA #IMPLIED > + <!ELEMENT table (primary-key?, column*, foreign-key*) > <!-- Catalog for the table --> <!ATTLIST table catalog CDATA #IMPLIED > Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -56,7 +56,7 @@ if(revengFiles!=null) { Settings settings = configuration.buildSettings(); - OverrideRepository or = new OverrideRepository(null,null); + OverrideRepository or = new OverrideRepository(); String[] fileNames = revengFiles.list(); for (int i = 0; i < fileNames.length; i++) { Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -215,5 +215,23 @@ } return null; } - + + protected Table getTable(Configuration cfg, String schemaName, String tabName) { + Iterator iter = cfg.getTableMappings(); + while(iter.hasNext() ) { + Table table = (Table) iter.next(); + if(table.getName().equals(tabName) && safeEquals(schemaName, table.getSchema())) { + return table; + } + } + return null; + } + + private boolean safeEquals(Object value, Object tf) { + if(value==tf) return true; + if(value==null) return false; + return value.equals(tf); + } + + } Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -32,10 +32,6 @@ super("genfromjdbc"); } - protected void tearDown() throws Exception { - //if(outputdir!=null) TestHelper.deleteDir(outputdir); - super.tearDown(); - } protected String[] getCreateSQL() { Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -6,6 +6,7 @@ import java.sql.Types; import java.util.Iterator; +import java.util.List; import java.util.Map; import junit.framework.Test; @@ -19,6 +20,7 @@ import org.hibernate.cfg.reveng.OverrideRepository; import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; import org.hibernate.cfg.reveng.SQLTypeMapping; +import org.hibernate.cfg.reveng.SchemaSelection; import org.hibernate.cfg.reveng.TableFilter; import org.hibernate.cfg.reveng.TableIdentifier; import org.hibernate.mapping.Column; @@ -38,6 +40,7 @@ private static final String OVERRIDETEST_REVENG_XML = "org/hibernate/tool/test/jdbc2cfg/overridetest.reveng.xml"; private static final String TEST_REVENG_XML = "org/hibernate/tool/test/jdbc2cfg/test.reveng.xml"; private static final String DOC_REVENG_XML = "org/hibernate/tool/test/jdbc2cfg/docexample.reveng.xml"; + private static final String SCHEMA_REVENG_XML = "org/hibernate/tool/test/jdbc2cfg/schemaselection.reveng.xml"; public void testReadTypeMappings() { OverrideRepository or = buildOverrideRepository(); @@ -79,9 +82,43 @@ assertEquals("big_decimal", repository.columnToHibernateTypeName(null, "SALARY", Types.NUMERIC, SQLTypeMapping.UNKNOWN_LENGTH, 15, SQLTypeMapping.UNKNOWN_SCALE, true) ); assertEquals("java.lang.Long", repository.columnToHibernateTypeName(null, "AGE", Types.NUMERIC, SQLTypeMapping.UNKNOWN_LENGTH, 3, SQLTypeMapping.UNKNOWN_SCALE, true) ); - } + + public void testSchemaSelection() { + OverrideRepository or = buildOverrideRepository(); + + or.addResource(SCHEMA_REVENG_XML); + ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy()); + List schemaSelectors = repository.getSchemaSelectors(); + + assertNotNull(schemaSelectors); + assertEquals(4,schemaSelectors.size()); + + SchemaSelection ss; + ss = (SchemaSelection) schemaSelectors.get(0); + assertEquals(null,ss.getCatalogPattern()); + assertEquals(null,ss.getSchemaPattern()); + assertEquals(null,ss.getTablePattern()); + + ss = (SchemaSelection) schemaSelectors.get(1); + assertEquals(null,ss.getCatalogPattern()); + assertEquals("OVRTEST",ss.getSchemaPattern()); + assertEquals(null,ss.getTablePattern()); + + ss = (SchemaSelection) schemaSelectors.get(2); + assertEquals("UBERCATALOG",ss.getCatalogPattern()); + assertEquals("OVRTEST",ss.getSchemaPattern()); + assertEquals(null,ss.getTablePattern()); + + ss = (SchemaSelection) schemaSelectors.get(3); + assertEquals("PUBLIC.*",ss.getCatalogPattern()); + assertEquals("OVRTEST",ss.getSchemaPattern()); + assertEquals(".*",ss.getTablePattern()); + + } + + static Settings settings; private OverrideRepository buildOverrideRepository() { @@ -91,7 +128,7 @@ }.buildSettings(Environment.getProperties()); } //return new OverrideRepository(settings.getDefaultCatalogName(),settings.getDefaultSchemaName()); - return new OverrideRepository(null,null); + return new OverrideRepository(); } public void testColumnTypeMappings() { @@ -349,7 +386,7 @@ protected void configure(JDBCMetaDataConfiguration cfg) { super.configure(cfg); Settings s = cfg.buildSettings(); - OverrideRepository or = new OverrideRepository(null,null); + OverrideRepository or = new OverrideRepository(); or.addResource(OVERRIDETEST_REVENG_XML); cfg.setReverseEngineeringStrategy(or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy() ) ); } Modified: trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-03-03 10:51:04 UTC (rev 9537) @@ -99,4 +99,9 @@ // TODO Auto-generated method stub return false; } + + public List getSchemaSelectors() { + // TODO Auto-generated method stub + return null; + } } Modified: trunk/HibernateExt/tools/src/testsupport/seamtest-build.xml =================================================================== --- trunk/HibernateExt/tools/src/testsupport/seamtest-build.xml 2006-03-02 23:29:33 UTC (rev 9536) +++ trunk/HibernateExt/tools/src/testsupport/seamtest-build.xml 2006-03-03 10:51:04 UTC (rev 9537) @@ -40,6 +40,7 @@ drop table ISSUE if exists; create table ISSUE ( ID int not null, DATETIME timestamp, TEXT varchar(200), USER varchar(30), primary key (ID) ); CREATE TABLE comment ( id int not null, issue_id int not null, datetime timestamp, text varchar(200), user varchar(30), primary key (id), constraint issue_comments foreign key (issue_id) references ISSUE ); + SHUTDOWN; </sql> </target> |
From: <hib...@li...> - 2006-03-02 18:19:49
|
Author: nusco Date: 2006-03-02 13:19:29 -0500 (Thu, 02 Mar 2006) New Revision: 9535 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeFactory.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/SonOfBlob.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java Removed: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/Util.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironment.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java Log: Support for properties with unresolved types (not integrated) Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -20,7 +20,7 @@ */ Class<? extends Collection> getCollectionClass(); - // TODO We should probably try to reduce the following four methods to two or three at most. + // TODO We should probably try to reduce the following three methods to two. // the last one is particularly offensive /** * This property's XClass. Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -11,5 +11,5 @@ * @author Emmanuel Bernard */ public interface XMethod extends XMember { - Object invoke(Object target, Object[] parameters); + Object invoke(Object target, Object... parameters); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -19,4 +19,5 @@ */ String getName(); + boolean isTypeResolved(); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -65,7 +65,7 @@ List<XProperty> result = new LinkedList<XProperty>(); for ( Field f : toClass().getDeclaredFields() ) if ( JavaXProperty.isProperty( f, getTypeEnvironment().bind( f.getGenericType() ), filter ) ) - maybeAdd( f, result ); + maybeAdd( result, f ); return result; } @@ -73,14 +73,15 @@ List<XProperty> result = new LinkedList<XProperty>(); for ( Method m : toClass().getDeclaredMethods() ) if ( JavaXProperty.isProperty( m, getTypeEnvironment().bind( m.getGenericReturnType() ), filter ) ) - maybeAdd( m, result ); + maybeAdd( result, m ); return result; } - private void maybeAdd(Member m, List<XProperty> result) { - XProperty p = getFactory().getXProperty( m, this ); - if ( p != null ) - result.add( p ); + // TODO: remove to allow properties with unresolved types + private void maybeAdd(List<XProperty> result, Member m) { + XProperty property = getFactory().getXProperty( m, this ); + if( property.isTypeResolved() ) + result.add( property ); } public List<XProperty> getDeclaredProperties(String accessType) { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -19,6 +19,7 @@ import org.hibernate.reflection.java.generics.TypeEnvironment; import org.hibernate.reflection.java.generics.TypeEnvironmentFactory; import org.hibernate.reflection.java.generics.TypeSwitch; +import org.hibernate.reflection.java.generics.TypeUtils; import org.hibernate.util.ReflectHelper; /** @@ -219,7 +220,7 @@ } public Class<? extends Collection> getCollectionClass() { - return JavaXMember.getCollectionClass( propType ); + return TypeUtils.getCollectionClass( propType ); } public XClass getType() { @@ -285,13 +286,14 @@ } public PropertyTypeExtractor buildTypeExtractor(TypeEnvironment context, Type propType) { - if ( JavaXMember.isArrayType( propType ) ) + if ( TypeUtils.isArray( propType ) ) return buildArrayTypeExtractor( context, propType ); - if ( JavaXMember.isCollectionType( propType ) ) + if ( TypeUtils.isCollection( propType ) ) return buildCollectionTypeExtractor( context, propType ); - if ( JavaXMember.isBaseType( propType ) ) + if ( TypeUtils.isBase( propType ) ) return buildSimpleTypeExtractor( context, propType ); - return null; + // TODO: manage unresolved types and void.class + return buildSimpleTypeExtractor( context, propType ); } public boolean equals(XClass class1, Class class2) { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -2,17 +2,16 @@ package org.hibernate.reflection.java; import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Field; import java.lang.reflect.Member; +import java.lang.reflect.Method; import java.lang.reflect.Type; -import java.lang.reflect.GenericArrayType; -import java.lang.reflect.ParameterizedType; import java.lang.reflect.AccessibleObject; import java.util.Collection; import org.hibernate.reflection.XClass; import org.hibernate.reflection.XMember; import org.hibernate.reflection.java.generics.TypeEnvironment; -import org.hibernate.reflection.java.generics.TypeSwitch; /** * @author Emmanuel Bernard @@ -22,6 +21,14 @@ protected final TypeEnvironment env; protected final PropertyTypeExtractor propertyTypeExtractor; + protected static Type typeOf(Member member, TypeEnvironment env) { + if ( member instanceof Field ) + return env.bind( ( (Field) member ).getGenericType() ); + if ( member instanceof Method ) + return env.bind( ( (Method) member ).getGenericReturnType() ); + throw new IllegalArgumentException( "Member " + member + " is neither a field nor a method" ); + } + protected JavaXMember(Member member, Type type, TypeEnvironment env, JavaXFactory factory, PropertyTypeExtractor propertyTypeExtractor) { super( (AnnotatedElement) member, factory ); this.type = type; @@ -29,10 +36,8 @@ this.propertyTypeExtractor = propertyTypeExtractor; } - public XClass getType() { return propertyTypeExtractor.getType(); - //return getFactory().toXClass( getJavaType(), env ); } public abstract String getName(); @@ -49,88 +54,6 @@ return (Member) toAnnotatedElement(); } - static boolean isCollectionType(Type t) { - return getCollectionClass( t ) != null; - } - - static boolean isArrayType(Type t) { - return new TypeSwitch<Boolean>() { - @Override - public Boolean caseClass(Class clazz) { - return clazz.isArray(); - } - - @Override - public Boolean caseGenericArrayType(GenericArrayType genericArrayType) { - return isBaseType( genericArrayType.getGenericComponentType() ); - } - - @Override - public Boolean defaultCase(Type type) { - return false; - } - }.doSwitch( t ); - } - - static boolean isBaseType(Type type) { - return new TypeSwitch<Boolean>() { - @Override - public Boolean caseClass(Class classType) { - return ! ( isCollectionType( classType ) || isArrayType( classType ) );// hum probably not fully accurate - //return classType != void.class; - } - - @Override - public Boolean caseParameterizedType(ParameterizedType parameterizedType) { - for ( Type actualTypeArgument : parameterizedType.getActualTypeArguments() ) { - if ( !isBaseType( actualTypeArgument ) ) { - return false; - } - } - return true; - } - - @Override - public Boolean defaultCase(Type t) { - return false; - } - }.doSwitch( type ); - } - - static Class<? extends Collection> getCollectionClass(Type type) { - return new TypeSwitch<Class<? extends Collection>>() { - @Override - public Class<? extends Collection> caseClass(Class clazz) { - return isCollectionClass( clazz ) ? (Class<? extends Collection>) clazz : null; - } - - @Override - public Class<? extends Collection> caseParameterizedType(ParameterizedType parameterizedType) { - Class rawType = (Class) parameterizedType.getRawType(); - for ( Type actualTypeArgument : parameterizedType.getActualTypeArguments() ) { - if ( !isBaseType( actualTypeArgument ) ) { - return null; - } - } - return getCollectionClass( rawType ); - } - - @Override - public Class<? extends Collection> defaultCase(Type t) { - return null; - } - }.doSwitch( type ); - } - - static boolean isCollectionClass(Class<?> clazz) { - return clazz == Collection.class - || clazz == java.util.List.class - || clazz == java.util.Set.class - || clazz == java.util.Map.class - || clazz == java.util.SortedSet.class // extension to the specs - || clazz == java.util.SortedMap.class; // extension to the specs - } - public Class<? extends Collection> getCollectionClass() { return propertyTypeExtractor.getCollectionClass(); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -14,7 +14,7 @@ public class JavaXMethod extends JavaXMember implements XMethod { static JavaXMethod create(Member member, TypeEnvironment context, JavaXFactory factory) { - final Type propType = Util.typeOf( member, context ); + final Type propType = typeOf( member, context ); PropertyTypeExtractor typeExtractor = factory.buildTypeExtractor( context, propType ); if( typeExtractor == null ) return null; Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -7,9 +7,10 @@ import java.lang.reflect.Modifier; import java.lang.reflect.Type; +import org.hibernate.reflection.Filter; import org.hibernate.reflection.XProperty; -import org.hibernate.reflection.Filter; import org.hibernate.reflection.java.generics.TypeEnvironment; +import org.hibernate.reflection.java.generics.TypeUtils; /** * @author Paolo Perrotta @@ -25,7 +26,8 @@ } private static boolean isPropertyType(Type type) { - return isArrayType( type ) || isCollectionType( type ) || ( isBaseType( type ) && ! void.class.equals(type) ); +// return TypeUtils.isArray( type ) || TypeUtils.isCollection( type ) || ( TypeUtils.isBase( type ) && ! TypeUtils.isVoid( type ) ); + return !TypeUtils.isVoid( type ); } static boolean isProperty(Method m, Type boundType, Filter filter) { @@ -39,10 +41,8 @@ } static JavaXProperty create(Member member, final TypeEnvironment context, final JavaXFactory factory) { - final Type propType = Util.typeOf( member, context ); + final Type propType = typeOf( member, context ); PropertyTypeExtractor typeExtractor = factory.buildTypeExtractor( context, propType ); - if( typeExtractor == null ) - return null; return new JavaXProperty( member, propType, context, factory, typeExtractor ); } @@ -85,4 +85,7 @@ } } + public boolean isTypeResolved() { + return TypeUtils.isFullyResolved( env.bind( type ) ); + } } \ No newline at end of file Deleted: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/Util.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/Util.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/Util.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -1,24 +0,0 @@ -package org.hibernate.reflection.java; - -import java.lang.reflect.Field; -import java.lang.reflect.Member; -import java.lang.reflect.Method; -import java.lang.reflect.Type; - -import org.hibernate.reflection.java.generics.IdentityTypeEnvironment; -import org.hibernate.reflection.java.generics.TypeEnvironment; - -class Util { - - static Type typeOf(Member member) { - return typeOf( member, IdentityTypeEnvironment.INSTANCE ); - } - - static Type typeOf(Member member, TypeEnvironment env) { - if ( member instanceof Field ) - return env.bind( ( (Field) member ).getGenericType() ); - if ( member instanceof Method ) - return env.bind( ( (Method) member ).getGenericReturnType() ); - throw new IllegalArgumentException( "Member " + member + " is neither a field nor a method" ); - } -} Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -0,0 +1,91 @@ +package org.hibernate.reflection.java.generics; + +import java.lang.reflect.Array; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.lang.reflect.WildcardType; + +/** + * A <code>TypeEnvironment</code> decorator that always binds all the generic components of the given type. + * When this is not possible, it approximates the "unbindable" components to their nearest upper binding. + * <p> + * For example:<br> + * <code>T</code> becomes <code>Object</code>.<br> + * Array of <code>? extends Foo</code> becomes array of <code>Foo</code>.<br> + * <code>List<T></code> becomes <code>List<Object></code>.<br> + * <code>List<T extends Foo></code> becomes <code>List<Foo></code>.<p> + * + * If a wildcard or type variable has multiple upper bounds, it will be approximated to Object. + * Information on lower bounds is discarded during approximation.<p> + * + * Array of a generic type is approximated to an array of <code>Object</code>s. Example:<br> + * <code>List<T>[]</code> becomes <code>Object[]</code>. + * + * @return a type where the generic arguments have been replaced by raw classes. + * + * @author Paolo Perrotta + */ +public class ApproximatingTypeEnvironment implements TypeEnvironment { + + private final TypeEnvironment decoratedTypeEnvironment; + + public ApproximatingTypeEnvironment(TypeEnvironment decoratedTypeEnvironment) { + this.decoratedTypeEnvironment = decoratedTypeEnvironment; + } + + public Type bind(final Type type) { + Type unboundResult = decoratedTypeEnvironment.bind( type ); + Type result = new TypeSwitch<Type>() { + public Type caseWildcardType(WildcardType wildcardType) { + return collapseToUpperBound( wildcardType.getUpperBounds() ); + } + + @Override + public Type caseClass(Class classType) { + return classType; + } + + @Override + public Type caseGenericArrayType(GenericArrayType genericArrayType) { + if( TypeUtils.isFullyResolved( genericArrayType ) ) + return genericArrayType; + Type componentType = genericArrayType.getGenericComponentType(); + Type boundComponentType = bind( componentType ); + if( !( boundComponentType instanceof Class) ) + return Object[].class; // this is because I found no standard way to instance arrays of a generic type + return Array.newInstance( (Class)boundComponentType, 0 ).getClass(); + } + + @Override + public Type caseParameterizedType(ParameterizedType parameterizedType) { + if( TypeUtils.isFullyResolved( parameterizedType ) ) + return parameterizedType; + Type[] typeArguments = parameterizedType.getActualTypeArguments(); + Type[] boundTypeArguments = new Type[typeArguments.length]; + for(int i = 0; i < typeArguments.length; i++) + boundTypeArguments[i] = bind( typeArguments[i] ); + return TypeFactory.createParameterizedType( bind( parameterizedType.getRawType() ), boundTypeArguments, parameterizedType.getOwnerType() ); + } + + @Override + public Type caseTypeVariable(TypeVariable typeVariable) { + return collapseToUpperBound( typeVariable.getBounds() ); + } + + private Type collapseToUpperBound(Type[] upperBounds) { + if( upperBounds.length != 1 ) + return Object.class; // we can't do much about multiple upper bounds + return bind( upperBounds[0] ); + } + + @Override + public Type defaultCase(Type t) { + throw new IllegalArgumentException( "Unknown subclass of Type: " + t.getClass() ); + } + }.doSwitch( unboundResult ); + assert TypeUtils.isFullyResolved( result ); + return result; + } +} Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -5,7 +5,6 @@ import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.lang.reflect.WildcardType; -import java.util.Arrays; /** * @author Davide Marchignoli @@ -25,12 +24,13 @@ @Override public Type caseGenericArrayType(GenericArrayType genericArrayType) { - return createGenericArrayType( bind( genericArrayType.getGenericComponentType() ) ); + Type componentType = bind( genericArrayType.getGenericComponentType() ); + return TypeFactory.createArrayType( componentType ); } @Override public Type caseParameterizedType(ParameterizedType parameterizedType) { - return createParameterizedType( parameterizedType.getRawType(), substitute( parameterizedType + return TypeFactory.createParameterizedType( parameterizedType.getRawType(), substitute( parameterizedType .getActualTypeArguments() ), parameterizedType.getOwnerType() ); } @@ -58,66 +58,6 @@ formalArguments = formal; } - // We instance our own ParameterizedTypes and GenericArrayType. These - // are not supposed to be mixed with Java's implementations. If they - // did, we might have equality/identity problems. - - private ParameterizedType createParameterizedType(final Type rawType, final Type[] substTypeArgs, - final Type ownerType) { - return new ParameterizedType() { - - public Type[] getActualTypeArguments() { - return substTypeArgs; - } - - public Type getRawType() { - return rawType; - } - - public Type getOwnerType() { - return ownerType; - } - - @Override - public boolean equals(Object obj) { - ParameterizedType other = (ParameterizedType) obj; - return Arrays.equals( getActualTypeArguments(), other.getActualTypeArguments() ) - && getRawType().equals( other.getRawType() ) && getOwnerType().equals( other.getOwnerType() ); - } - - @Override - public int hashCode() { - return safeHashCode( getActualTypeArguments() ) ^ safeHashCode( getRawType() ) ^ safeHashCode( getOwnerType() ); - } - }; - } - - final private GenericArrayType createGenericArrayType(final Type componentType) { - return new GenericArrayType() { - - public Type getGenericComponentType() { - return componentType; - } - - @Override - public boolean equals(Object obj) { - GenericArrayType other = (GenericArrayType) obj; - return getGenericComponentType().equals( other.getGenericComponentType() ); - } - - @Override - public int hashCode() { - return safeHashCode( getGenericComponentType() ); - } - }; - } - - private int safeHashCode(Object o) { - if( o == null ) - return 1; - return o.hashCode(); - } - public Type bind(Type type) { return substitute.doSwitch( type ); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironment.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironment.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironment.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -12,11 +12,11 @@ * <blockquote> * * <pre> - * class Shop&ltT&gt{ - * List&ltT&gt getCatalog() { ... } + * class Shop<T>{ + * List<T> getCatalog() { ... } * } * - * class Bakery extends Shop&ltBread&gt{} + * class Bakery extends Shop<Bread>{} * </pre> * * </blockquote> Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeFactory.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeFactory.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -0,0 +1,89 @@ +package org.hibernate.reflection.java.generics; + +import java.lang.reflect.Array; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Arrays; + +/** + * This class instances our own <code>ParameterizedTypes</code> and <code>GenericArrayTypes</code>. + * These are not supposed to be mixed with Java's implementations - beware of + * equality/identity problems. + * + * @author Paolo Perrotta + */ +class TypeFactory { + + static ParameterizedType createParameterizedType(final Type rawType, final Type[] substTypeArgs, + final Type ownerType) { + return new ParameterizedType() { + + public Type[] getActualTypeArguments() { + return substTypeArgs; + } + + public Type getRawType() { + return rawType; + } + + public Type getOwnerType() { + return ownerType; + } + + @Override + public boolean equals(Object obj) { + if( !( obj instanceof ParameterizedType )) + return false; + ParameterizedType other = (ParameterizedType) obj; + return Arrays.equals( getActualTypeArguments(), other.getActualTypeArguments() ) + && safeEquals( getRawType(), other.getRawType() ) && safeEquals( getOwnerType(), other.getOwnerType() ); + } + + @Override + public int hashCode() { + return safeHashCode( getActualTypeArguments() ) ^ safeHashCode( getRawType() ) ^ safeHashCode( getOwnerType() ); + } + }; + } + + static Type createArrayType(Type componentType) { + if( componentType instanceof Class ) + return Array.newInstance( (Class)componentType, 0 ).getClass(); + return TypeFactory.createGenericArrayType( componentType ); + } + + private static GenericArrayType createGenericArrayType(final Type componentType) { + return new GenericArrayType() { + + public Type getGenericComponentType() { + return componentType; + } + + @Override + public boolean equals(Object obj) { + if( !( obj instanceof GenericArrayType )) + return false; + GenericArrayType other = (GenericArrayType) obj; + return safeEquals( getGenericComponentType(), other.getGenericComponentType() ); + } + + @Override + public int hashCode() { + return safeHashCode( getGenericComponentType() ); + } + }; + } + + private static boolean safeEquals(Type t1, Type t2) { + if( t1 == null ) + return t2 == null; + return t1.equals( t2 ); + } + + private static int safeHashCode(Object o) { + if( o == null ) + return 1; + return o.hashCode(); + } +} \ No newline at end of file Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -0,0 +1,130 @@ +package org.hibernate.reflection.java.generics; + +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.lang.reflect.WildcardType; +import java.util.Collection; + +public class TypeUtils { + + public static boolean isFullyResolved(Type t) { + return new TypeSwitch<Boolean>() { + @Override + public Boolean caseClass(Class classType) { + return true; + } + + @Override + public Boolean caseGenericArrayType(GenericArrayType genericArrayType) { + return isFullyResolved( genericArrayType.getGenericComponentType() ); + } + + @Override + public Boolean caseParameterizedType(ParameterizedType parameterizedType) { + Type[] typeArgs = parameterizedType.getActualTypeArguments(); + for ( Type arg : typeArgs ) + if( !isFullyResolved( arg )) + return false; + return isFullyResolved( parameterizedType.getRawType() ); + } + + @Override + public Boolean caseTypeVariable(TypeVariable typeVariable) { + return false; + } + + @Override + public Boolean caseWildcardType(WildcardType wildcardType) { + return false; + } + }.doSwitch( t ); + } + + public static Class<? extends Collection> getCollectionClass(Type type) { + return new TypeSwitch<Class<? extends Collection>>() { + @Override + public Class<? extends Collection> caseClass(Class clazz) { + return isCollectionClass( clazz ) ? (Class<? extends Collection>) clazz : null; + } + + @Override + public Class<? extends Collection> caseParameterizedType(ParameterizedType parameterizedType) { + Class rawType = (Class) parameterizedType.getRawType(); + for ( Type actualTypeArgument : parameterizedType.getActualTypeArguments() ) { + if ( !isBase( actualTypeArgument ) ) { + return null; + } + } + return getCollectionClass( rawType ); + } + + @Override + public Class<? extends Collection> defaultCase(Type t) { + return null; + } + }.doSwitch( type ); + } + + private static boolean isCollectionClass(Class<?> clazz) { + return clazz == Collection.class + || clazz == java.util.List.class + || clazz == java.util.Set.class + || clazz == java.util.Map.class + || clazz == java.util.SortedSet.class // extension to the specs + || clazz == java.util.SortedMap.class; // extension to the specs + } + + public static boolean isBase(Type type) { + return new TypeSwitch<Boolean>() { + @Override + public Boolean caseClass(Class clazz) { + return !clazz.isArray() && !isCollectionClass( clazz );// hum probably not fully accurate + //return classType != void.class; + } + + @Override + public Boolean caseParameterizedType(ParameterizedType parameterizedType) { + for ( Type actualTypeArgument : parameterizedType.getActualTypeArguments() ) { + if ( !isBase( actualTypeArgument ) ) { + return false; + } + } + return true; + } + + @Override + public Boolean defaultCase(Type t) { + return false; + } + }.doSwitch( type ); + } + + public static boolean isVoid(Type type) { + return void.class.equals( type ); + } + + public static boolean isArray(Type t) { + return new TypeSwitch<Boolean>() { + @Override + public Boolean caseClass(Class clazz) { + return clazz.isArray(); + } + + @Override + public Boolean caseGenericArrayType(GenericArrayType genericArrayType) { + return isBase( genericArrayType.getGenericComponentType() ); + } + + @Override + public Boolean defaultCase(Type type) { + return false; + } + }.doSwitch( t ); + } + + public static boolean isCollection(Type t) { + return getCollectionClass( t ) != null; + } +} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -63,10 +63,11 @@ assertEquals( 1, fieldProperties.size() ); } - public void testExtractsPublicMethodsAsProperties() { - List<XProperty> methodProperties = clazz.getDeclaredProperties( "property" ); - assertEquals( 7, methodProperties.size() ); - } + // TODO: uncomment ASAP +// public void testExtractsPublicMethodsAsProperties() { +// List<XProperty> methodProperties = clazz.getDeclaredProperties( "property" ); +// assertEquals( 7, methodProperties.size() ); +// } public void testCanBeAbstract() { assertFalse( clazz.isAbstract() ); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -20,6 +20,9 @@ public class JavaXPropertyTest extends XAnnotatedElementTest { private ReflectionManager factory = new JavaXFactory(); + + private XClass dadAsSeenFromItself = ReflectionManager.INSTANCE.toXClass( Dad.class ); + private XClass dadAsSeenFromSon = factory.toXClass( Son.class ).getSuperclass(); public void testFollowsJavaBeansConventionsForPropertyNames() throws Exception { @@ -40,11 +43,19 @@ assertEquals( "fieldProperty", field.getName() ); } - public void testPropertiesWithParametricTypesAreIgnored() { - assertEquals( 7, dadAsSeenFromSon.getDeclaredProperties( "property" ).size() ); - XClass dadAsSeenFromItself = ReflectionManager.INSTANCE.toXClass( Dad.class ); - assertEquals( 5, dadAsSeenFromItself.getDeclaredProperties( "property" ).size() ); - } + // TODO: uncomment ASAP +// public void testReturnsPropertiesWithUnresolvedParametricTypes() { +// assertEquals( 7, dadAsSeenFromItself.getDeclaredProperties( "property" ).size() ); +// } +// +// public void testKnowsWhetherItsTypesAreFullyResolved() { +// XProperty notFullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromItself +// .getDeclaredProperties( "property" ) ); +// assertFalse( notFullyResolvedProperty.isTypeResolved() ); +// XProperty fullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromSon +// .getDeclaredProperties( "property" ) ); +// assertTrue( fullyResolvedProperty.isTypeResolved() ); +// } public void testPropertiesFiltered() { assertEquals( 8, dadAsSeenFromSon.getDeclaredProperties( "property", new Filter() { @@ -62,9 +73,9 @@ public void testCanBeASimpleType() { List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "field" ); XProperty p = getPropertyNamed_from( "fieldProperty", declaredProperties ); - assertTrue( factory.equals( p.getType(), String.class )); - assertTrue( factory.equals( p.getElementClass(), String.class )); - assertTrue( factory.equals( p.getClassOrElementClass(), String.class )); + assertTrue( factory.equals( p.getType(), String.class ) ); + assertTrue( factory.equals( p.getElementClass(), String.class ) ); + assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) ); assertNull( p.getCollectionClass() ); assertFalse( p.isArray() ); assertFalse( p.isCollection() ); @@ -73,9 +84,9 @@ public void testResolveInterfaceType() { List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" ); XProperty p = getPropertyNamed_from( "language", declaredProperties ); - assertTrue( factory.equals( p.getType(), String.class )); - assertTrue( factory.equals( p.getElementClass(), String.class )); - assertTrue( factory.equals( p.getClassOrElementClass(), String.class )); + assertTrue( factory.equals( p.getType(), String.class ) ); + assertTrue( factory.equals( p.getElementClass(), String.class ) ); + assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) ); assertNull( p.getCollectionClass() ); assertFalse( p.isArray() ); assertFalse( p.isCollection() ); @@ -84,9 +95,9 @@ public void testCanBeAnArray() { List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" ); XProperty p = getPropertyNamed_from( "arrayProperty", declaredProperties ); - assertTrue( factory.equals( p.getType(), String[].class )); - assertTrue( factory.equals( p.getElementClass(), String.class )); - assertTrue( factory.equals( p.getClassOrElementClass(), String.class )); + assertTrue( factory.equals( p.getType(), String[].class ) ); + assertTrue( factory.equals( p.getElementClass(), String.class ) ); + assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) ); assertNull( p.getCollectionClass() ); assertTrue( p.isArray() ); assertFalse( p.isCollection() ); @@ -95,21 +106,21 @@ public void testCanBeAnArrayOfPrimitives() { List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" ); XProperty p = getPropertyNamed_from( "primitiveArrayProperty", declaredProperties ); - assertTrue( factory.equals( p.getType(), int[].class )); - assertTrue( factory.equals( p.getElementClass(), int.class )); - assertTrue( factory.equals( p.getClassOrElementClass(), int.class )); + assertTrue( factory.equals( p.getType(), int[].class ) ); + assertTrue( factory.equals( p.getElementClass(), int.class ) ); + assertTrue( factory.equals( p.getClassOrElementClass(), int.class ) ); assertNull( p.getCollectionClass() ); assertTrue( p.isArray() ); assertFalse( p.isCollection() ); } public void testCanBeACollection() { - //TODO we'll need to have access to the XClass key of a map either + // TODO we'll need to have access to the XClass key of a map either List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" ); XProperty p = getPropertyNamed_from( "collectionProperty", declaredProperties ); - assertTrue( factory.equals( p.getType(), Map.class )); - assertTrue( factory.equals( p.getElementClass(), String.class )); - assertTrue( factory.equals( p.getClassOrElementClass(), Map.class )); + assertTrue( factory.equals( p.getType(), Map.class ) ); + assertTrue( factory.equals( p.getElementClass(), String.class ) ); + assertTrue( factory.equals( p.getClassOrElementClass(), Map.class ) ); assertEquals( Map.class, p.getCollectionClass() ); assertFalse( p.isArray() ); assertTrue( p.isCollection() ); Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -0,0 +1,49 @@ +package org.hibernate.test.reflection.java.generics; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Map; + +import junit.framework.TestCase; + +import org.hibernate.reflection.java.generics.ApproximatingTypeEnvironment; +import org.hibernate.reflection.java.generics.TypeEnvironment; +import org.hibernate.reflection.java.generics.TypeEnvironmentFactory; + +public class ApproximatingTypeEnvironmentTest extends TestCase { + + TypeEnvironment unboundContext = new TypeEnvironmentFactory().getEnvironment( BigBlob.class ); + TypeEnvironment approximatingUnboundContext = new ApproximatingTypeEnvironment( unboundContext ); + + TypeEnvironment boundContext = new TypeEnvironmentFactory().getEnvironment( SonOfBlob.class ); + TypeEnvironment approximatingBoundContext = new ApproximatingTypeEnvironment( boundContext ); + + public void testDoesNothingOnClasses() throws SecurityException, NoSuchMethodException { + assertEquals( String[].class, approximatingUnboundContext.bind( String[].class ) ); + } + + public void testDoesNothingOnParameterizedTypesThatAreAlreadyFullyBound() throws Exception { + Type type = BigBlob.class.getMethod( "genTypeWithoutWildcards", new Class[0] ).getGenericReturnType(); + assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) ); + } + + public void testDoesNothingOnGenericArraysThatAreAlreadyFullyBound() throws Exception { + Type type = BigBlob.class.getMethod( "genArrayType", new Class[0] ).getGenericReturnType(); + assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) ); + } + + public void testApproximatesUnboundGenericArraysToArraysOfObjects() throws Exception { + Type type = BigBlob.class.getMethod( "genArrayType", new Class[0] ).getGenericReturnType(); + assertEquals( Object[].class, approximatingUnboundContext.bind( type ) ); + } + + public void testApproximatesUnboundParameterizedTypes() throws Exception { + Type type = BigBlob.class.getMethod( "genTypeWithWildcards", new Class[0] ).getGenericReturnType(); + ParameterizedType approxType = (ParameterizedType)approximatingUnboundContext.bind( type ); + assertEquals( Map.class, approxType.getRawType() ); + assertNull( approxType.getOwnerType() ); + assertEquals( 2, approxType.getActualTypeArguments().length ); + assertEquals( Object.class, approxType.getActualTypeArguments()[0] ); + assertEquals( Comparable.class, approxType.getActualTypeArguments()[1] ); + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -0,0 +1,13 @@ +package org.hibernate.test.reflection.java.generics; + +import java.util.List; +import java.util.Map; + +public class BigBlob<T, E> { + + public List<T> genTypeWithoutWildcards() { return null; } + + public Map<T, ? extends Comparable> genTypeWithWildcards() { return null; } + + public List<T>[] genArrayType() { return null; } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/SonOfBlob.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/SonOfBlob.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/SonOfBlob.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -0,0 +1,8 @@ +package org.hibernate.test.reflection.java.generics; + +import java.util.List; + + +public class SonOfBlob extends BigBlob<String, List<String>> { + +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java 2006-03-02 15:08:10 UTC (rev 9534) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java 2006-03-02 18:19:29 UTC (rev 9535) @@ -0,0 +1,32 @@ +package org.hibernate.test.reflection.java.generics; + +import java.lang.reflect.Type; + +import junit.framework.TestCase; + +import org.hibernate.reflection.java.generics.TypeEnvironment; +import org.hibernate.reflection.java.generics.TypeEnvironmentFactory; +import org.hibernate.reflection.java.generics.TypeUtils; + +public class TypeUtilsTest extends TestCase { + + TypeEnvironmentFactory env = new TypeEnvironmentFactory(); + TypeEnvironment dadContext = env.getEnvironment( Dad.class ); + TypeEnvironment sonContext = env.getEnvironment( Son.class ); + + public void testAClassIsAlwaysFullyResolved() throws Exception { + assertTrue( TypeUtils.isFullyResolved( Dad.class )); + } + + public void testKnowsIfAParametricTypeIsFullyResolved() throws Exception { + Type simpleType = Dad.class.getMethod( "returnsGeneric", new Class[0] ).getGenericReturnType(); + assertFalse( TypeUtils.isFullyResolved( dadContext.bind( simpleType )) ); + assertTrue( TypeUtils.isFullyResolved( sonContext.bind( simpleType )) ); + } + + public void testKnowsIfAnArrayTypeIsFullyResolved() throws Exception { + Type arrayType = Dad.class.getMethod( "getArrayProperty", new Class[0] ).getGenericReturnType(); + assertFalse( TypeUtils.isFullyResolved( dadContext.bind( arrayType )) ); + assertTrue( TypeUtils.isFullyResolved( sonContext.bind( arrayType )) ); + } +} |
From: <hib...@li...> - 2006-03-02 04:53:29
|
Author: epbernard Date: 2006-03-01 23:52:41 -0500 (Wed, 01 Mar 2006) New Revision: 9533 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/EntityTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/Flight.java Log: ANN-266 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2006-03-02 03:28:59 UTC (rev 9532) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2006-03-02 04:52:41 UTC (rev 9533) @@ -4,6 +4,8 @@ import java.io.Serializable; import java.sql.Types; import java.util.Properties; +import java.util.Date; +import java.util.Calendar; import javax.persistence.Enumerated; import javax.persistence.Lob; @@ -12,11 +14,14 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.AssertionFailure; +import org.hibernate.AnnotationException; +import org.hibernate.util.StringHelper; import org.hibernate.annotations.Parameter; import org.hibernate.annotations.Type; import org.hibernate.cfg.AnnotationBinder; import org.hibernate.cfg.Ejb3Column; import org.hibernate.cfg.Mappings; +import org.hibernate.cfg.NotYetImplementedException; import org.hibernate.mapping.SimpleValue; import org.hibernate.mapping.Table; import org.hibernate.reflection.ReflectionManager; @@ -74,15 +79,33 @@ String type = AnnotationBinder.ANNOTATION_STRING_DEFAULT; if ( property.isAnnotationPresent( Temporal.class ) ) { Temporal ann = property.getAnnotation( Temporal.class ); + boolean isDate; + if ( ReflectionManager.INSTANCE.equals( property.getType(), Date.class ) ) { + isDate = true; + } + else if ( ReflectionManager.INSTANCE.equals( property.getType(), Calendar.class ) ) { + isDate = false; + } + else { + throw new AnnotationException( + "@Temporal should be set on a java.util.Date or java.util.Calendar property: " + + StringHelper.qualify( persistentClassName, propertyName ) + ); + } + switch ( ann.value() ) { case DATE: - type = "date"; + type = isDate ? "date" : "calendar_date"; break; case TIME: type = "time"; + if ( ! isDate ) { + throw new NotYetImplementedException( "Calendar cannot persist TIME only" + + StringHelper.qualify( persistentClassName, propertyName ) ); + } break; case TIMESTAMP: - type = "timestamp"; + type = isDate ? "timestamp" : "calendar"; break; default: throw new AssertionFailure( "Unknown temporal type: " + ann.value() ); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/EntityTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/EntityTest.java 2006-03-02 03:28:59 UTC (rev 9532) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/EntityTest.java 2006-03-02 04:52:41 UTC (rev 9533) @@ -3,6 +3,8 @@ import java.util.Date; import java.util.List; +import java.util.GregorianCalendar; +import java.util.TimeZone; import org.hibernate.Hibernate; import org.hibernate.HibernateException; @@ -301,6 +303,8 @@ airFrance.setName("Paris-Amsterdam"); airFrance.setDuration( new Long(10) ); airFrance.setDepartureDate( new Date(05, 06, 21, 10, 0, 0) ); + airFrance.setAlternativeDepartureDate( new GregorianCalendar( 2006, 02, 03, 10, 00) ); + airFrance.getAlternativeDepartureDate().setTimeZone( TimeZone.getTimeZone( "GMT") ); airFrance.setFactor(25); s.persist(airFrance); tx.commit(); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/Flight.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/Flight.java 2006-03-02 03:28:59 UTC (rev 9532) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/Flight.java 2006-03-02 04:52:41 UTC (rev 9533) @@ -3,6 +3,7 @@ import java.io.Serializable; import java.util.Date; +import java.util.Calendar; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -35,6 +36,7 @@ String triggeredData; long factor; Date departureDate; + Calendar alternativeDepartureDate; @Id public Long getId() { @@ -126,4 +128,13 @@ this.factor = factor; } + @Temporal + public Calendar getAlternativeDepartureDate() { + return alternativeDepartureDate; + } + + public void setAlternativeDepartureDate(Calendar alternativeDepartureDate) { + this.alternativeDepartureDate = alternativeDepartureDate; + } + } \ No newline at end of file |
From: <hib...@li...> - 2006-03-02 03:29:03
|
Author: ste...@jb... Date: 2006-03-01 22:28:59 -0500 (Wed, 01 Mar 2006) New Revision: 9532 Removed: trunk/Hibernate3/.cvsignore Modified: trunk/Hibernate3/ Log: removed cvsignore file Property changes on: trunk/Hibernate3 ___________________________________________________________________ Name: svn:ignore - build testout *.ipr *.iws *.iml .classpath .project .nbattrs *.log .clover local *.properties + build testout *.ipr *.iws *.iml .classpath .project .nbattrs *.log .clover local *.properties Deleted: trunk/Hibernate3/.cvsignore =================================================================== --- trunk/Hibernate3/.cvsignore 2006-03-02 03:14:31 UTC (rev 9531) +++ trunk/Hibernate3/.cvsignore 2006-03-02 03:28:59 UTC (rev 9532) @@ -1,12 +0,0 @@ -build -testout -*.ipr -*.iws -*.iml -.classpath -.project -.nbattrs -*.log -.clover -local -*.properties \ No newline at end of file |
From: <hib...@li...> - 2006-03-02 03:14:34
|
Author: ste...@jb... Date: 2006-03-01 22:14:31 -0500 (Wed, 01 Mar 2006) New Revision: 9531 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/HQLTest.java Log: HHH-1248 : explicit joins to collections in subquery result in join conditions being dropped from sql Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java 2006-03-02 03:13:33 UTC (rev 9530) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java 2006-03-02 03:14:31 UTC (rev 9531) @@ -16,6 +16,7 @@ import org.hibernate.type.CollectionType; import org.hibernate.type.EntityType; import org.hibernate.type.Type; +import org.hibernate.util.StringHelper; import antlr.ASTFactory; import antlr.SemanticException; @@ -182,12 +183,15 @@ collectionType = queryableCollection.getCollectionType(); String roleAlias = fromClause.getAliasGenerator().createName( role ); - // Subqueries create 'special' implied from nodes - // because correlated subselects can't use an - // ANSI-style join + // Correlated subqueries create 'special' implied from nodes + // because correlated subselects can't use an ANSI-style join boolean explicitSubqueryFromElement = fromClause.isSubQuery() && !implied; if ( explicitSubqueryFromElement ) { - implied = true; + String pathRoot = StringHelper.root( path ); + FromElement origin = fromClause.getFromElement( pathRoot ); + if ( origin == null || origin.getFromClause() != fromClause ) { + implied = true; + } } Type elementType = queryableCollection.getElementType(); Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java 2006-03-02 03:13:33 UTC (rev 9530) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java 2006-03-02 03:14:31 UTC (rev 9531) @@ -67,6 +67,50 @@ }; } + public void testCollectionJoinsInSubselect() { + // HHH-1248 : initially FromElementFactory treated any explicit join + // as an implied join so that theta-style joins would always be used. + // This was because correlated subqueries cannot use ANSI-style joins + // for the correlation. However, this special treatment was not limited + // to only correlated subqueries; it was applied to any subqueries -> + // which in-and-of-itself is not necessarily bad. But somewhere later + // the choices made there caused joins to be dropped. + Session s = openSession(); + String qryString = + "select a.id, a.description" + + " from Animal a" + + " left join a.offspring" + + " where a in (" + + " select a1 from Animal a1" + + " left join a1.offspring o" + + " where a1.id=1" + + ")"; + s.createQuery( qryString ).list(); + qryString = + "select h.id, h.description" + + " from Human h" + + " left join h.friends" + + " where h in (" + + " select h1" + + " from Human h1" + + " left join h1.friends f" + + " where h1.id=1" + + ")"; + s.createQuery( qryString ).list(); + qryString = + "select h.id, h.description" + + " from Human h" + + " left join h.friends f" + + " where f in (" + + " select h1" + + " from Human h1" + + " left join h1.friends f1" + + " where h = f1" + + ")"; + s.createQuery( qryString ).list(); + s.close(); + } + public void testQueryMetadataRetrievalWithFetching() { // HHH-1464 : there was a problem due to the fact they we polled // the shallow version of the query plan to get the metadata. Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/HQLTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/HQLTest.java 2006-03-02 03:13:33 UTC (rev 9530) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/HQLTest.java 2006-03-02 03:14:31 UTC (rev 9531) @@ -53,7 +53,7 @@ assertTranslation( "select h from Human as h join fetch h.nickNames" ); } - public void testCollectionJoinsInSubselectFailureExpected() { + public void testCollectionJoinsInSubselect() { // caused by some goofiness in FromElementFactory that tries to // handle correlated subqueries (but fails miserably) even though this // is not a correlated subquery. HHH-1248 @@ -67,6 +67,17 @@ " where a1.id=1" + ")" ); + assertTranslation( + "select h.id, h.description" + + " from Human h" + + " left join h.friends" + + " where h in (" + + " select h1" + + " from Human h1" + + " left join h1.friends f" + + " where h1.id=1" + + ")" + ); } public void testEmptyInListFailureExpected() { |