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-04-18 16:44:12
|
Author: epbernard Date: 2006-04-18 12:44:02 -0400 (Tue, 18 Apr 2006) New Revision: 9760 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java Log: ANN-306 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-04-18 12:42:33 UTC (rev 9759) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-04-18 16:44:02 UTC (rev 9760) @@ -871,7 +871,7 @@ log.debug( "Processing " + propertyHolder.getEntityName() + " " + accessType + " annotation" ); List<XProperty> properties = annotatedClass.getDeclaredProperties(accessType); for ( XProperty p : properties ) { - if( !p.isTypeResolved() && !hasExplicitTargetEntity( p ) ) + if( !p.isTypeResolved() && !hasExplicitTargetEntity( p ) && !mustBeSkipped( p ) ) throw new IllegalStateException( "Property " + p + " has an unbound type and no explicit target entity."); final boolean currentHasIdentifier = addProperty( p, elements, localPropertyAccessor ); hasIdentifier = hasIdentifier || currentHasIdentifier; |
From: <hib...@li...> - 2006-04-18 12:42:37
|
Author: pgmjsd Date: 2006-04-18 08:42:33 -0400 (Tue, 18 Apr 2006) New Revision: 9759 Modified: branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java Log: Flattened property reference sub-trees. Modified: branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g 2006-04-18 10:36:27 UTC (rev 9758) +++ branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g 2006-04-18 12:42:33 UTC (rev 9759) @@ -32,6 +32,7 @@ tokens { + PROPERTY_REF; BOGUS; } @@ -47,6 +48,7 @@ protected void popContext() { } protected void defineRange(AST range,String path,AST alias, AST fetch) { } + } // The main statement rule. @@ -111,7 +113,7 @@ ; join - : #(JOIN (joinType )? (FETCH)? propertyRef (ALIAS)? (FETCH)? (WITH)? ) + : #(JOIN (joinType )? (FETCH)? propertyRef [true] (ALIAS)? (FETCH)? (WITH)? ) ; joinType @@ -129,7 +131,7 @@ ; whereClause - : #(WHERE (subtree)* ) + : #(WHERE logicalExpr ) ; groupClause @@ -144,12 +146,143 @@ : #(SET (subtree)* ) ; +logicalExpr + : #(AND logicalExpr logicalExpr) + | #(OR logicalExpr logicalExpr) + | #(NOT logicalExpr) + | comparisonExpr + ; -propertyRef - : #(DOT propertyRef propertyName ) - | identifier +comparisonExpr + : + ( #(EQ exprOrSubquery exprOrSubquery) + | #(NE exprOrSubquery exprOrSubquery) + | #(LT exprOrSubquery exprOrSubquery) + | #(GT exprOrSubquery exprOrSubquery) + | #(LE exprOrSubquery exprOrSubquery) + | #(GE exprOrSubquery exprOrSubquery) + | #(LIKE exprOrSubquery expr ( #(ESCAPE expr) )? ) + | #(NOT_LIKE exprOrSubquery expr ( #(ESCAPE expr) )? ) + | #(BETWEEN exprOrSubquery exprOrSubquery exprOrSubquery) + | #(NOT_BETWEEN exprOrSubquery exprOrSubquery exprOrSubquery) + | #(IN exprOrSubquery inRhs ) + | #(NOT_IN exprOrSubquery inRhs ) + | #(IS_NULL exprOrSubquery) + | #(IS_NOT_NULL exprOrSubquery) + | #(EXISTS ( expr | collectionFunctionOrSubselect ) ) + ) ; +inRhs + : #(IN_LIST ( collectionFunctionOrSubselect | ( (expr)* ) ) ) + ; + +exprOrSubquery + : expr + | query + | #(ANY collectionFunctionOrSubselect) + | #(ALL collectionFunctionOrSubselect) + | #(SOME collectionFunctionOrSubselect) + ; + +collectionFunctionOrSubselect + : collectionFunction + | query + ; + +collectionFunction + : #(ELEMENTS propertyRef [true] ) + | #(INDICES propertyRef [true] ) + ; + +count + : #(COUNT ( DISTINCT | ALL )? ( aggregateExpr | ROW_STAR ) ) + ; + +aggregateExpr + : expr + | collectionFunction + ; + +expr + : addrExpr + | #( VECTOR_EXPR (expr)* ) + | constant + | arithmeticExpr + | functionCall // Function call, not in the SELECT clause. + | parameter + | count // Count, not in the SELECT clause. + ; + +arithmeticExpr + : #(PLUS expr expr) + | #(MINUS expr expr) + | #(DIV expr expr) + | #(STAR expr expr) + | #(UNARY_MINUS expr) + | caseExpr + ; + +caseExpr + : #(CASE (#(WHEN logicalExpr expr))+ (#(ELSE expr))?) + | #(CASE2 expr (#(WHEN expr expr))+ (#(ELSE expr))?) + ; + +addrExpr + : propertyRef [true] + | #(INDEX_OP addrExprLhs expr) + ; + +addrExprLhs + : addrExpr + ; + +constant + : literal + | NULL + | TRUE + | FALSE + ; + +literal + : NUM_INT + | NUM_LONG + | NUM_FLOAT + | NUM_DOUBLE + | QUOTED_STRING + ; + +parameter + : #(COLON identifier) + | #(PARAM (NUM_INT)?) + ; + +functionCall + : #(METHOD_CALL pathAsIdent ( #(EXPR_LIST (expr)* ) )? ) + | #(AGGREGATE aggregateExpr ) + ; + +propertyRef! [ boolean root ] + : i:identifier { + if (root) { // Make the tree very regular, property refs always have a child. + #propertyRef = #([PROPERTY_REF,#i.getText()],#i); + } + else { // Otherwise, just construct the tree. + #propertyRef = #i; + } + } + | #(d:DOT lhs:propertyRef [ false ] rhs:propertyName ) { + // Flatten nested DOTs... + AST first = (#lhs.getType() == DOT) ? #lhs.getFirstChild() : #lhs; + if (root) { // If this is the root of the path tree, then make a property ref node. + #propertyRef = #([PROPERTY_REF,#d.getText()],first,#rhs); + } + else { // If this is not the root of the path tree, then just flatten it. + #propertyRef = #(#d,first,#rhs); + } + } + ; + propertyName : identifier | CLASS @@ -159,13 +292,6 @@ // Matches a path and returns the normalized string for the path (usually // fully qualified a class name). -path - : identifier - | #(DOT path identifier) - ; - -// Matches a path and returns the normalized string for the path (usually -// fully qualified a class name). pathAsString returns [String p] { p = "???"; String x = "?x?"; @@ -178,6 +304,15 @@ } ; +// Returns a path as a single identifier node. +pathAsIdent { + String text = "?text?"; + } + : text=pathAsString { + #pathAsIdent = #([IDENT,text]); + } + ; + identifier : (IDENT | WEIRD_IDENT) ; Modified: branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java 2006-04-18 10:36:27 UTC (rev 9758) +++ branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java 2006-04-18 12:42:33 UTC (rev 9759) @@ -30,10 +30,20 @@ // First, get an AST by parsing some HQL text. AST ast = resolve("from Animal"); // Assert: - // * The root node should be a statement. + // The root node should be a statement. assertTrue(ast instanceof StatementNode); } + public void testSimpleImplicitJoin() throws Exception { + AST ast = resolve("from Animal a where a.mother.name like '%mary%'"); + // The root node should be a statement. + assertTrue(ast instanceof StatementNode); + + ast = resolve("from Animal a where a.mother.mother.name like '%weeble%'"); + // The root node should be a statement. + assertTrue(ast instanceof StatementNode); + } + private AST resolve(String hql) throws RecognitionException, TokenStreamException { AST hqlAst = HqlParserTest.doParse(hql,false); // Now, pass it though the resolver phase, which yeilds |
From: <hib...@li...> - 2006-04-18 10:36:38
|
Author: max...@jb... Date: 2006-04-18 06:36:27 -0400 (Tue, 18 Apr 2006) New Revision: 9758 Modified: trunk/Hibernate3/doc/reference/en/modules/tutorial.xml Log: minor - missing ../ Modified: trunk/Hibernate3/doc/reference/en/modules/tutorial.xml =================================================================== --- trunk/Hibernate3/doc/reference/en/modules/tutorial.xml 2006-04-18 03:14:36 UTC (rev 9757) +++ trunk/Hibernate3/doc/reference/en/modules/tutorial.xml 2006-04-18 10:36:27 UTC (rev 9758) @@ -331,7 +331,7 @@ <para> Create a directory called <literal>data</literal> in the root of the development directory - this is where HSQL DB will store its data files. Now start the database by running - <literal>java -classpath lib/hsqldb.jar org.hsqldb.Server</literal> in this data directory. + <literal>java -classpath ../lib/hsqldb.jar org.hsqldb.Server</literal> in this data directory. You can see it start up and bind to a TCP/IP socket, this is where our application will connect later. If you want to start with a fresh database during this tutorial, shutdown HSQL DB (press <literal>CTRL + C</literal> in the window), delete all files in the |
From: <hib...@li...> - 2006-04-18 03:14:47
|
Author: epbernard Date: 2006-04-17 23:14:36 -0400 (Mon, 17 Apr 2006) New Revision: 9757 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml Log: Support xml overriding for exclude * listeners Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-17 23:15:32 UTC (rev 9756) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-18 03:14:36 UTC (rev 9757) @@ -37,6 +37,8 @@ import javax.persistence.EntityResult; import javax.persistence.FieldResult; import javax.persistence.ColumnResult; +import javax.persistence.ExcludeDefaultListeners; +import javax.persistence.ExcludeSuperclassListeners; import org.dom4j.Element; import org.dom4j.Attribute; @@ -90,6 +92,8 @@ annotationToXml.put( NamedNativeQueries.class, "named-native-query" ); annotationToXml.put( SqlResultSetMapping.class, "sql-result-set-mapping" ); annotationToXml.put( SqlResultSetMappings.class, "sql-result-set-mapping" ); + annotationToXml.put( ExcludeDefaultListeners.class, "exclude-default-listeners" ); + annotationToXml.put( ExcludeSuperclassListeners.class, "exclude-superclass-listeners" ); } private XMLContext xmlContext; @@ -198,6 +202,10 @@ if ( current != null ) annotationList.add( current ); current = getSqlResultSetMappings( tree, defaults ); if ( current != null ) annotationList.add( current ); + current = getExcludeDefaultListeners( tree, defaults ); + if ( current != null ) annotationList.add( current ); + current = getExcludeSuperclassListeners( tree, defaults ); + if ( current != null ) annotationList.add( current ); this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] ); } else if ( propertyName != null ) { @@ -210,6 +218,28 @@ } } + private ExcludeSuperclassListeners getExcludeSuperclassListeners(Element tree, XMLContext.Default defaults) { + return (ExcludeSuperclassListeners) getMarkerAnnotation(ExcludeSuperclassListeners.class, tree, defaults); + } + + private ExcludeDefaultListeners getExcludeDefaultListeners(Element tree, XMLContext.Default defaults) { + return (ExcludeDefaultListeners) getMarkerAnnotation(ExcludeDefaultListeners.class, tree, defaults); + } + + private Annotation getMarkerAnnotation(Class<? extends Annotation> clazz, Element element, XMLContext.Default defaults) { + Element subelement = element == null ? null : element.element( annotationToXml.get( clazz ) ); + if (subelement != null) { + return AnnotationFactory.create( new AnnotationDescriptor( clazz ) ); + } + else if ( defaults.canUseJavaAnnotations() ) { + //TODO wonder whether it should be excluded so that user can undone it + return super.getAnnotation( clazz ); + } + else { + return null; + } + } + private SqlResultSetMappings getSqlResultSetMappings(Element tree, XMLContext.Default defaults) { List<SqlResultSetMapping> results = (List<SqlResultSetMapping>) buildSqlResultsetMappings( tree ); if ( defaults.canUseJavaAnnotations() ) { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-17 23:15:32 UTC (rev 9756) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-18 03:14:36 UTC (rev 9757) @@ -23,6 +23,8 @@ import javax.persistence.SqlResultSetMappings; import javax.persistence.Table; import javax.persistence.TableGenerator; +import javax.persistence.ExcludeSuperclassListeners; +import javax.persistence.ExcludeDefaultListeners; import junit.framework.TestCase; import org.dom4j.DocumentException; @@ -88,6 +90,8 @@ assertNotNull( reader.getAnnotation( SqlResultSetMappings.class ) ); assertEquals( "competitor1Point", reader.getAnnotation( SqlResultSetMappings.class ).value()[0].columns()[0].name() ); assertEquals( "competitor1Point", reader.getAnnotation( SqlResultSetMappings.class ).value()[0].entities()[0].fields()[0].column() ); + assertNotNull( reader.getAnnotation( ExcludeSuperclassListeners.class ) ); + assertNotNull( reader.getAnnotation( ExcludeDefaultListeners.class ) ); reader = new EJB3OverridenAnnotationReader(Competition.class, context); assertNotNull( reader.getAnnotation( MappedSuperclass.class) ); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-17 23:15:32 UTC (rev 9756) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-18 03:14:36 UTC (rev 9757) @@ -53,6 +53,8 @@ </entity-result> <column-result name="competitor1Point"/> </sql-result-set-mapping> + <exclude-default-listeners/> + <exclude-superclass-listeners/> </entity> <entity class="TennisMatch"> <primary-key-join-column name="id"/> |
From: <hib...@li...> - 2006-04-17 23:15:36
|
Author: epbernard Date: 2006-04-17 19:15:32 -0400 (Mon, 17 Apr 2006) New Revision: 9756 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml Log: Support xml overriding for named(native)queries and sqlresultsetmappings Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-17 19:44:22 UTC (rev 9755) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-17 23:15:32 UTC (rev 9756) @@ -17,26 +17,36 @@ import javax.persistence.SecondaryTable; import javax.persistence.SecondaryTables; import javax.persistence.Table; -import javax.persistence.UniqueConstraint; import javax.persistence.PrimaryKeyJoinColumns; import javax.persistence.IdClass; import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; import javax.persistence.DiscriminatorValue; import javax.persistence.DiscriminatorColumn; -import javax.persistence.DiscriminatorType; import javax.persistence.SequenceGenerator; import javax.persistence.TableGenerator; +import javax.persistence.NamedQuery; +import javax.persistence.NamedQueries; +import javax.persistence.QueryHint; +import javax.persistence.DiscriminatorType; +import javax.persistence.InheritanceType; +import javax.persistence.UniqueConstraint; +import javax.persistence.NamedNativeQuery; +import javax.persistence.NamedNativeQueries; +import javax.persistence.SqlResultSetMapping; +import javax.persistence.SqlResultSetMappings; +import javax.persistence.EntityResult; +import javax.persistence.FieldResult; +import javax.persistence.ColumnResult; +import org.dom4j.Element; import org.dom4j.Attribute; -import org.dom4j.Element; import org.hibernate.annotationfactory.AnnotationDescriptor; import org.hibernate.annotationfactory.AnnotationFactory; import org.hibernate.reflection.Filter; import org.hibernate.reflection.java.xml.XMLContext; +import org.hibernate.AnnotationException; import org.hibernate.util.StringHelper; import org.hibernate.util.ReflectHelper; -import org.hibernate.AnnotationException; /** * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor. @@ -47,6 +57,7 @@ */ public class EJB3OverridenAnnotationReader extends JavaAnnotationReader { private static final Map<Class, String> annotationToXml; + private static final String SCHEMA_VALIDATION = "Activate schema validation for more informations"; private static final Filter FILTER = new Filter() { public boolean returnStatic() { return false; @@ -73,6 +84,12 @@ annotationToXml.put( DiscriminatorColumn.class, "discriminator-column" ); annotationToXml.put( SequenceGenerator.class, "sequence-generator" ); annotationToXml.put( TableGenerator.class, "table-generator" ); + annotationToXml.put( NamedQuery.class, "named-query" ); + annotationToXml.put( NamedQueries.class, "named-query" ); + annotationToXml.put( NamedNativeQuery.class, "named-native-query" ); + annotationToXml.put( NamedNativeQueries.class, "named-native-query" ); + annotationToXml.put( SqlResultSetMapping.class, "sql-result-set-mapping" ); + annotationToXml.put( SqlResultSetMappings.class, "sql-result-set-mapping" ); } private XMLContext xmlContext; @@ -175,6 +192,12 @@ if ( current != null ) annotationList.add( current ); current = getTableGenerator( tree, defaults ); if ( current != null ) annotationList.add( current ); + current = getNamedQueries( tree, defaults ); + if ( current != null ) annotationList.add( current ); + current = getNamedNativeQueries( tree, defaults ); + if ( current != null ) annotationList.add( current ); + current = getSqlResultSetMappings( tree, defaults ); + if ( current != null ) annotationList.add( current ); this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] ); } else if ( propertyName != null ) { @@ -187,17 +210,214 @@ } } + private SqlResultSetMappings getSqlResultSetMappings(Element tree, XMLContext.Default defaults) { + List<SqlResultSetMapping> results = (List<SqlResultSetMapping>) buildSqlResultsetMappings( tree ); + if ( defaults.canUseJavaAnnotations() ) { + SqlResultSetMapping annotation = super.getAnnotation( SqlResultSetMapping.class ); + addSqlResultsetMappingIfNeeded( annotation, results ); + SqlResultSetMappings annotations = super.getAnnotation( SqlResultSetMappings.class ); + if (annotations != null) { + for (SqlResultSetMapping current : annotations.value() ) { + addSqlResultsetMappingIfNeeded( current, results ); + } + } + } + if (results.size() > 0) { + AnnotationDescriptor ad = new AnnotationDescriptor( SqlResultSetMappings.class ); + ad.setValue( "value", results.toArray( new SqlResultSetMapping[ results.size() ] ) ); + return AnnotationFactory.create( ad ); + } + else { + return null; + } + } + + private List<SqlResultSetMapping> buildSqlResultsetMappings(Element element) { + if (element == null) return new ArrayList<SqlResultSetMapping>(); + List resultsetElementList = element.elements( "sql-result-set-mapping" ); + List<SqlResultSetMapping> resultsets = new ArrayList<SqlResultSetMapping>(); + Iterator it = resultsetElementList.listIterator(); + while ( it.hasNext() ) { + Element subelement = (Element) it.next(); + AnnotationDescriptor ann = new AnnotationDescriptor(SqlResultSetMapping.class); + copyStringAttribute( ann, subelement, "name", true ); + List<Element> elements = subelement.elements( "entity-result" ); + List<EntityResult> entityResults = new ArrayList<EntityResult>( elements.size() ); + for (Element entityResult : elements) { + AnnotationDescriptor entityResultDescriptor = new AnnotationDescriptor( EntityResult.class ); + String clazzName = entityResult.attributeValue( "entity-class" ); + if (clazzName == null) + throw new AnnotationException("<entity-result> without entity-class. " + SCHEMA_VALIDATION); + Class clazz = null; + try { + clazz = ReflectHelper.classForName( clazzName, this.getClass() ); + } + catch( ClassNotFoundException e ) { + throw new AnnotationException( "Unable to find entity-class: " + clazzName, e ); + } + entityResultDescriptor.setValue( "entityClass", clazz); + copyStringAttribute( entityResultDescriptor, entityResult, "discriminator-column", false ); + List<FieldResult> fieldResults = new ArrayList<FieldResult>(); + for(Element fieldResult : (List<Element>) entityResult.elements( "field-result" ) ) { + AnnotationDescriptor fieldResultDescriptor = new AnnotationDescriptor( FieldResult.class ); + copyStringAttribute( fieldResultDescriptor, fieldResult, "name", true ); + copyStringAttribute( fieldResultDescriptor, fieldResult, "column", true ); + fieldResults.add( (FieldResult) AnnotationFactory.create( fieldResultDescriptor ) ); + } + entityResultDescriptor.setValue( "fields", fieldResults.toArray( new FieldResult[ fieldResults.size() ] ) ); + entityResults.add( (EntityResult) AnnotationFactory.create( entityResultDescriptor ) ); + } + ann.setValue( "entities", entityResults.toArray( new EntityResult[ entityResults.size() ] ) ); + + elements = subelement.elements( "column-result" ); + List<ColumnResult> columnResults = new ArrayList<ColumnResult>( elements.size() ); + for (Element columnResult : elements) { + AnnotationDescriptor columnResultDescriptor = new AnnotationDescriptor( ColumnResult.class ); + copyStringAttribute( columnResultDescriptor, columnResult, "name", true ); + columnResults.add( (ColumnResult) AnnotationFactory.create( columnResultDescriptor ) ); + } + ann.setValue( "columns", columnResults.toArray( new ColumnResult[ columnResults.size() ] ) ); + copyStringAttribute( ann, subelement, "result-class", false ); + copyStringAttribute( ann, subelement, "result-set-mapping", false ); + resultsets.add( (SqlResultSetMapping) AnnotationFactory.create( ann ) ); + } + return resultsets; + } + + private void addSqlResultsetMappingIfNeeded(SqlResultSetMapping annotation, List<SqlResultSetMapping> resultsets) { + if (annotation != null) { + String resultsetName = annotation.name(); + boolean present = false; + for (SqlResultSetMapping current : resultsets ) { + if ( current.name().equals( resultsetName ) ) { + present = true; + break; + } + } + if (!present) resultsets.add(annotation); + } + } + + private NamedQueries getNamedQueries(Element tree, XMLContext.Default defaults) { + List<NamedQuery> queries = (List<NamedQuery>) buildNamedQueries( tree, false ); + if ( defaults.canUseJavaAnnotations() ) { + NamedQuery annotation = super.getAnnotation( NamedQuery.class ); + addNamedQueryIfNeeded( annotation, queries ); + NamedQueries annotations = super.getAnnotation( NamedQueries.class ); + if (annotations != null) { + for (NamedQuery current : annotations.value() ) { + addNamedQueryIfNeeded( current, queries ); + } + } + } + if (queries.size() > 0) { + AnnotationDescriptor ad = new AnnotationDescriptor( NamedQueries.class ); + ad.setValue( "value", queries.toArray( new NamedQuery[ queries.size() ] ) ); + return AnnotationFactory.create( ad ); + } + else { + return null; + } + } + + private void addNamedQueryIfNeeded(NamedQuery annotation, List<NamedQuery> queries) { + if (annotation != null) { + String queryName = annotation.name(); + boolean present = false; + for (NamedQuery current : queries) { + if ( current.name().equals( queryName ) ) { + present = true; + break; + } + } + if (!present) queries.add(annotation); + } + } + + private NamedNativeQueries getNamedNativeQueries(Element tree, XMLContext.Default defaults) { + List<NamedNativeQuery> queries = (List<NamedNativeQuery>) buildNamedQueries( tree, true ); + if ( defaults.canUseJavaAnnotations() ) { + NamedNativeQuery annotation = super.getAnnotation( NamedNativeQuery.class ); + addNamedNativeQueryIfNeeded( annotation, queries ); + NamedNativeQueries annotations = super.getAnnotation( NamedNativeQueries.class ); + if (annotations != null) { + for (NamedNativeQuery current : annotations.value() ) { + addNamedNativeQueryIfNeeded( current, queries ); + } + } + } + if (queries.size() > 0) { + AnnotationDescriptor ad = new AnnotationDescriptor( NamedNativeQueries.class ); + ad.setValue( "value", queries.toArray( new NamedNativeQuery[ queries.size() ] ) ); + return AnnotationFactory.create( ad ); + } + else { + return null; + } + } + + private void addNamedNativeQueryIfNeeded(NamedNativeQuery annotation, List<NamedNativeQuery> queries) { + if (annotation != null) { + String queryName = annotation.name(); + boolean present = false; + for (NamedNativeQuery current : queries) { + if ( current.name().equals( queryName ) ) { + present = true; + break; + } + } + if (!present) queries.add(annotation); + } + } + + private List buildNamedQueries(Element element, boolean isNative) { + if (element == null) return new ArrayList(); + List namedQueryElementList = isNative ? + element.elements( "named-native-query" ) : + element.elements( "named-query" ); + List namedQueries = new ArrayList(); + int index = 0; + Iterator it = namedQueryElementList.listIterator(); + while ( it.hasNext() ) { + Element subelement = (Element) it.next(); + AnnotationDescriptor ann = new AnnotationDescriptor( + isNative? NamedNativeQuery.class : NamedQuery.class + ); + copyStringAttribute( ann, subelement, "name", false ); + Element queryElt = subelement.element( "query" ); + if (queryElt == null) throw new AnnotationException("No <query> element found." + SCHEMA_VALIDATION); + ann.setValue( "query", queryElt.getTextTrim() ); + List<Element> elements = subelement.elements( "hint" ); + List<QueryHint> queryHints = new ArrayList<QueryHint>( elements.size() ); + for (Element hint : elements) { + AnnotationDescriptor hintDescriptor = new AnnotationDescriptor( QueryHint.class ); + String value = hint.attributeValue( "name" ); + if ( value == null ) throw new AnnotationException("<hint> without name. " + SCHEMA_VALIDATION); + hintDescriptor.setValue( "name", value ); + value = hint.attributeValue( "value" ); + if ( value == null ) throw new AnnotationException("<hint> without value. " + SCHEMA_VALIDATION); + hintDescriptor.setValue( "value", value ); + queryHints.add( (QueryHint) AnnotationFactory.create( hintDescriptor) ); + } + ann.setValue( "hints", queryHints.toArray( new QueryHint[ queryHints.size() ] ) ); + copyStringAttribute( ann, subelement, "result-class", false ); + copyStringAttribute( ann, subelement, "result-set-mapping", false ); + namedQueries.add( AnnotationFactory.create( ann ) ); + } + return namedQueries; + } + private TableGenerator getTableGenerator(Element tree, XMLContext.Default defaults) { Element element = tree != null ? tree.element( annotationToXml.get(TableGenerator.class) ) : null; if ( element != null ) { AnnotationDescriptor ad = new AnnotationDescriptor( TableGenerator.class ); - copyStringAttribute( ad, element, "name" ); - copyStringAttribute( ad, element, "table" ); - copyStringAttribute( ad, element, "catalog" ); - copyStringAttribute( ad, element, "schema" ); - copyStringAttribute( ad, element, "pk-column-name" ); - copyStringAttribute( ad, element, "value-column-name" ); - copyStringAttribute( ad, element, "pk-column-value" ); + copyStringAttribute( ad, element, "name", false ); + copyStringAttribute( ad, element, "table", false ); + copyStringAttribute( ad, element, "catalog", false ); + copyStringAttribute( ad, element, "schema", false ); + copyStringAttribute( ad, element, "pk-column-name", false ); + copyStringAttribute( ad, element, "value-column-name", false ); + copyStringAttribute( ad, element, "pk-column-value", false ); copyIntegerAttribute( ad, element, "initial-value" ); copyIntegerAttribute( ad, element, "allocation-size" ); buildUniqueConstraints( ad, element ); @@ -249,8 +469,8 @@ Element element = tree != null ? tree.element( annotationToXml.get(SequenceGenerator.class) ) : null; if ( element != null ) { AnnotationDescriptor ad = new AnnotationDescriptor( SequenceGenerator.class ); - copyStringAttribute( ad, element, "name" ); - copyStringAttribute( ad, element, "sequence-name" ); + copyStringAttribute( ad, element, "name", false ); + copyStringAttribute( ad, element, "sequence-name", false ); copyIntegerAttribute( ad, element, "initial-value" ); copyIntegerAttribute( ad, element, "allocation-size" ); return AnnotationFactory.create( ad ); @@ -267,8 +487,8 @@ Element element = tree != null ? tree.element( "discriminator-column" ) : null; if ( element != null ) { AnnotationDescriptor ad = new AnnotationDescriptor( DiscriminatorColumn.class ); - copyStringAttribute( ad, element, "name" ); - copyStringAttribute( ad, element, "column-definition" ); + copyStringAttribute( ad, element, "name", false ); + copyStringAttribute( ad, element, "column-definition", false ); String value = element.attributeValue( "discriminator-type" ); DiscriminatorType type = DiscriminatorType.STRING; if (value != null) { @@ -282,7 +502,7 @@ type = DiscriminatorType.INTEGER; } else { - throw new AnnotationException( "Unknown DiscrimiatorType in XML, activate schema validation: " + value ); + throw new AnnotationException( "Unknown DiscrimiatorType in XML: " + value + " (" + SCHEMA_VALIDATION + ")"); } } ad.setValue( "discriminatorType", type ); @@ -330,7 +550,7 @@ strategy = InheritanceType.TABLE_PER_CLASS; } else { - throw new AnnotationException( "Unknown InheritanceType in XML, activate schema validation: " + value ); + throw new AnnotationException( "Unknown InheritanceType in XML: " + value + " (" + SCHEMA_VALIDATION + ")" ); } } ad.setValue( "strategy", strategy ); @@ -361,7 +581,7 @@ return AnnotationFactory.create( ad ); } else { - throw new AnnotationException("id-class without class, please ensure schema validation"); + throw new AnnotationException("id-class without class. " + SCHEMA_VALIDATION); } } else if ( defaults.canUseJavaAnnotations() ) { @@ -401,7 +621,7 @@ else { if ( "entity".equals( tree.getName() ) ) { AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class ); - copyStringAttribute( entity, tree, "name" ); + copyStringAttribute( entity, tree, "name", false ); if ( defaults.canUseJavaAnnotations() && StringHelper.isEmpty( (String) entity.valueOf( "name" ) ) ) { Entity javaAnn = super.getAnnotation( Entity.class ); @@ -481,13 +701,13 @@ else { //ignore java annotation, an element is defined AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class ); - copyStringAttribute( annotation, subelement, "name" ); - copyStringAttribute( annotation, subelement, "catalog" ); + copyStringAttribute( annotation, subelement, "name", false ); + copyStringAttribute( annotation, subelement, "catalog", false ); if ( StringHelper.isNotEmpty( defaults.getCatalog() ) && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) { annotation.setValue( "catalog", defaults.getCatalog() ); } - copyStringAttribute( annotation, subelement, "schema" ); + copyStringAttribute( annotation, subelement, "schema", false ); if ( StringHelper.isNotEmpty( defaults.getSchema() ) && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) { annotation.setValue( "schema", defaults.getSchema() ); @@ -504,13 +724,13 @@ List<SecondaryTable> secondaryTables = new ArrayList<SecondaryTable>( 3 ); for ( Element element : elements ) { AnnotationDescriptor annotation = new AnnotationDescriptor( SecondaryTable.class ); - copyStringAttribute( annotation, element, "name" ); - copyStringAttribute( annotation, element, "catalog" ); + copyStringAttribute( annotation, element, "name", false ); + copyStringAttribute( annotation, element, "catalog", false ); if ( StringHelper.isNotEmpty( defaults.getCatalog() ) && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) { annotation.setValue( "catalog", defaults.getCatalog() ); } - copyStringAttribute( annotation, element, "schema" ); + copyStringAttribute( annotation, element, "schema", false ); if ( StringHelper.isNotEmpty( defaults.getSchema() ) && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) { annotation.setValue( "schema", defaults.getSchema() ); @@ -603,26 +823,33 @@ while ( pkIt.hasNext() ) { Element subelement = (Element) pkIt.next(); AnnotationDescriptor pkAnn = new AnnotationDescriptor( PrimaryKeyJoinColumn.class ); - copyStringAttribute( pkAnn, subelement, "name"); - copyStringAttribute( pkAnn, subelement, "referenced-column-name"); - copyStringAttribute( pkAnn, subelement, "column-definition"); + copyStringAttribute( pkAnn, subelement, "name", false ); + copyStringAttribute( pkAnn, subelement, "referenced-column-name", false ); + copyStringAttribute( pkAnn, subelement, "column-definition", false ); pkJoinColumns[index++] = AnnotationFactory.create( pkAnn ); } return pkJoinColumns; } - private void copyStringAttribute(AnnotationDescriptor annotation, Element element, String attributeName) { + private void copyStringAttribute( + AnnotationDescriptor annotation, Element element, String attributeName, boolean mandatory + ) { String attribute = element.attributeValue( attributeName ); if (attribute != null) { StringBuilder annotationAttributeName = new StringBuilder( attributeName ); int index = annotationAttributeName.indexOf( WORD_SEPARATOR ); while ( index != -1 ) { annotationAttributeName.deleteCharAt( index ); - annotationAttributeName.setCharAt( index, Character.toUpperCase( annotationAttributeName.charAt( index ) )); + annotationAttributeName.setCharAt( index, Character.toUpperCase( annotationAttributeName.charAt( index ) ) ); index = annotationAttributeName.indexOf( WORD_SEPARATOR ); } annotation.setValue( annotationAttributeName.toString(), attribute ); } + else { + if (mandatory) { + throw new AnnotationException( element.getName() + "." + attributeName + " is mandatory in XML overring. " + SCHEMA_VALIDATION ); + } + } } private void copyIntegerAttribute(AnnotationDescriptor annotation, Element element, String attributeName) { @@ -641,7 +868,7 @@ annotation.setValue( annotationAttributeName.toString(), length ); } catch (NumberFormatException e) { - throw new AnnotationException( attributeName + " not parseable, activate schema validation: " + attribute ); + throw new AnnotationException( attributeName + " not parseable: " + attribute + " (" + SCHEMA_VALIDATION + ")" ); } } } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-17 19:44:22 UTC (rev 9755) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-17 23:15:32 UTC (rev 9756) @@ -1,37 +1,39 @@ //$Id: $ package org.hibernate.test.reflection.java.xml; -import java.io.InputStream; import java.io.BufferedInputStream; import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; import java.util.List; -import java.util.ArrayList; - +import javax.persistence.DiscriminatorColumn; +import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; -import javax.persistence.Table; +import javax.persistence.IdClass; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import javax.persistence.MappedSuperclass; -import javax.persistence.SecondaryTables; -import javax.persistence.SecondaryTable; +import javax.persistence.NamedNativeQueries; +import javax.persistence.NamedQueries; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.PrimaryKeyJoinColumns; -import javax.persistence.IdClass; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; -import javax.persistence.DiscriminatorValue; -import javax.persistence.DiscriminatorColumn; +import javax.persistence.SecondaryTable; +import javax.persistence.SecondaryTables; import javax.persistence.SequenceGenerator; +import javax.persistence.SqlResultSetMappings; +import javax.persistence.Table; import javax.persistence.TableGenerator; import junit.framework.TestCase; +import org.dom4j.DocumentException; +import org.dom4j.io.SAXReader; +import org.hibernate.cfg.EJB3DTDEntityResolver; +import org.hibernate.reflection.java.EJB3OverridenAnnotationReader; +import org.hibernate.reflection.java.xml.XMLContext; import org.hibernate.util.XMLHelper; -import org.hibernate.reflection.java.xml.XMLContext; -import org.hibernate.reflection.java.EJB3OverridenAnnotationReader; -import org.hibernate.cfg.EJB3DTDEntityResolver; -import org.dom4j.io.SAXReader; -import org.dom4j.DocumentException; -import org.xml.sax.SAXNotSupportedException; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import org.xml.sax.SAXNotSupportedException; /** @@ -75,12 +77,26 @@ ); assertNotNull( reader.getAnnotation( Inheritance.class ) ); assertEquals( "inheritance strategy not overriden", InheritanceType.JOINED, reader.getAnnotation( Inheritance.class ).strategy() ); + assertNotNull( "NamedQuery not overriden", reader.getAnnotation( NamedQueries.class ) ); + assertEquals( "No deduplication", 3, reader.getAnnotation( NamedQueries.class ).value().length ); + assertEquals( "deduplication kept the Java version", 1, reader.getAnnotation( NamedQueries.class ).value()[1].hints().length ); + assertEquals( "org.hibernate.timeout", reader.getAnnotation( NamedQueries.class ).value()[1].hints()[0].name() ); + assertNotNull( "NamedNativeQuery not overriden", reader.getAnnotation( NamedNativeQueries.class ) ); + assertEquals( "No deduplication", 3, reader.getAnnotation( NamedNativeQueries.class ).value().length ); + assertEquals( "deduplication kept the Java version", 1, reader.getAnnotation( NamedNativeQueries.class ).value()[1].hints().length ); + assertEquals( "org.hibernate.timeout", reader.getAnnotation( NamedNativeQueries.class ).value()[1].hints()[0].name() ); + assertNotNull( reader.getAnnotation( SqlResultSetMappings.class ) ); + assertEquals( "competitor1Point", reader.getAnnotation( SqlResultSetMappings.class ).value()[0].columns()[0].name() ); + assertEquals( "competitor1Point", reader.getAnnotation( SqlResultSetMappings.class ).value()[0].entities()[0].fields()[0].column() ); + reader = new EJB3OverridenAnnotationReader(Competition.class, context); assertNotNull( reader.getAnnotation( MappedSuperclass.class) ); + reader = new EJB3OverridenAnnotationReader(TennisMatch.class, context); assertNull( "Mutualize PKJC into PKJCs", reader.getAnnotation( PrimaryKeyJoinColumn.class) ); assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class) ); assertEquals( "PrimaryKeyJoinColumn overrden", "id", reader.getAnnotation( PrimaryKeyJoinColumns.class).value()[0].name() ); + reader = new EJB3OverridenAnnotationReader(SocialSecurityPhysicalAccount.class, context); assertNotNull( reader.getAnnotation( IdClass.class ) ); assertEquals( "id-class not used", SocialSecurityNumber.class, reader.getAnnotation( IdClass.class ).value() ); @@ -98,6 +114,7 @@ assertNotNull( reader.getAnnotation( Table.class) ); assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() ); assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() ); + reader = new EJB3OverridenAnnotationReader(Match.class, context); assertNotNull( reader.getAnnotation( Table.class) ); assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() ); @@ -106,11 +123,16 @@ assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTable.class ) ); assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTables.class ) ); assertNull( "Ignore Java annotation", reader.getAnnotation( Inheritance.class ) ); + assertNull( reader.getAnnotation( NamedQueries.class ) ); + assertNull( reader.getAnnotation( NamedNativeQueries.class ) ); + reader = new EJB3OverridenAnnotationReader(TennisMatch.class, context); assertNull( reader.getAnnotation( PrimaryKeyJoinColumn.class) ); assertNull( reader.getAnnotation( PrimaryKeyJoinColumns.class) ); + reader = new EJB3OverridenAnnotationReader(Competition.class, context); assertNull( reader.getAnnotation( MappedSuperclass.class) ); + reader = new EJB3OverridenAnnotationReader(SocialSecurityMoralAccount.class, context); assertNull( reader.getAnnotation( IdClass.class ) ); assertNull( reader.getAnnotation( DiscriminatorValue.class ) ); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java 2006-04-17 19:44:22 UTC (rev 9755) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java 2006-04-17 23:15:32 UTC (rev 9756) @@ -2,10 +2,14 @@ package org.hibernate.test.reflection.java.xml; import javax.persistence.Entity; -import javax.persistence.Table; -import javax.persistence.SecondaryTable; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.NamedQuery; +import javax.persistence.SecondaryTable; +import javax.persistence.Table; +import javax.persistence.NamedQueries; +import javax.persistence.NamedNativeQueries; +import javax.persistence.NamedNativeQuery; /** * @author Emmanuel Bernard @@ -14,5 +18,14 @@ @Table(name="matchtable", schema = "matchschema") @SecondaryTable(name="extendedMatch") @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) +@NamedQueries( { + @NamedQuery(name="matchbyid", query="select m from Match m where m.id = :id"), + @NamedQuery(name="getAllMatches2", query="select m from Match m") + }) +@NamedNativeQueries( { + @NamedNativeQuery(name="matchbyid", query="select m from Match m where m.id = :id", resultSetMapping = "matchrs"), + @NamedNativeQuery(name="getAllMatches2", query="select m from Match m", resultSetMapping = "matchrs") + }) public class Match extends Competition { + public String competitor1Point; } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-17 19:44:22 UTC (rev 9755) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-17 23:15:32 UTC (rev 9756) @@ -31,6 +31,28 @@ </entity> <entity class="Match"> <inheritance strategy="JOINED"/> + <named-query name="allmatches"> + <query>select m from Match m</query> + <hint name="org.hibernate.timeout" value="200"/> + </named-query> + <named-query name="matchbyid"> + <query>select m from Match m where m.id = :id</query> + <hint name="org.hibernate.timeout" value="200"/> + </named-query> + <named-native-query name="allmatches" result-set-mapping="matchrs"> + <query>select m from Match m</query> + <hint name="org.hibernate.timeout" value="200"/> + </named-native-query> + <named-native-query name="matchbyid" result-set-mapping="matchrs"> + <query>select m from Match m where m.id = :id</query> + <hint name="org.hibernate.timeout" value="200"/> + </named-native-query> + <sql-result-set-mapping name="matchrs"> + <entity-result entity-class="org.hibernate.test.reflection.java.xml.Match"> + <field-result name="competitor1Point" column="competitor1Point"/> + </entity-result> + <column-result name="competitor1Point"/> + </sql-result-set-mapping> </entity> <entity class="TennisMatch"> <primary-key-join-column name="id"/> |
From: <hib...@li...> - 2006-04-17 19:44:25
|
Author: epbernard Date: 2006-04-17 15:44:22 -0400 (Mon, 17 Apr 2006) New Revision: 9755 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java trunk/HibernateExt/metadata/src/test/messages_en.properties trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/Address.java trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/ValidatorTest.java Log: ANN-316 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-04-16 16:57:40 UTC (rev 9754) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-04-17 19:44:22 UTC (rev 9755) @@ -476,18 +476,23 @@ } private String replace(String message, Annotation parameters) { - StringTokenizer tokens = new StringTokenizer( message, "{}", true ); + StringTokenizer tokens = new StringTokenizer( message, "#{}", true ); StringBuilder buf = new StringBuilder( 30 ); boolean escaped = false; + boolean el = false; while ( tokens.hasMoreTokens() ) { String token = tokens.nextToken(); - if ( "{".equals( token ) ) { + if ( !escaped && "#".equals( token ) ) { + el = true; + } + if ( !el && "{".equals( token ) ) { escaped = true; } - else if ( "}".equals( token ) ) { + else if ( escaped && "}".equals( token ) ) { escaped = false; } else if ( !escaped ) { + if ( "{".equals( token ) ) el = false; buf.append( token ); } else { Modified: trunk/HibernateExt/metadata/src/test/messages_en.properties =================================================================== --- trunk/HibernateExt/metadata/src/test/messages_en.properties 2006-04-16 16:57:40 UTC (rev 9754) +++ trunk/HibernateExt/metadata/src/test/messages_en.properties 2006-04-17 19:44:22 UTC (rev 9755) @@ -1,7 +1,7 @@ long=is too damn long floor.name=Floor out.of.range=lower that {min} and greater than {max} -floor.out.of.range={floor.name} cannot be {out.of.range} +floor.out.of.range={floor.name} cannot (escaping #{el}) be {out.of.range} validator.assertFalse=assertion failed validator.assertTrue=assertion failed Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/Address.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/Address.java 2006-04-16 16:57:40 UTC (rev 9754) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/Address.java 2006-04-17 19:44:22 UTC (rev 9755) @@ -29,7 +29,7 @@ private String country; private long id; private boolean internalValid = true; - @Range(min = -2, max = 50, message = "{floor.out.of.range}") + @Range(min = -2, max = 50, message = "{floor.out.of.range} (escaping #{el})") public int floor; public String getCountry() { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/ValidatorTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/ValidatorTest.java 2006-04-16 16:57:40 UTC (rev 9754) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/ValidatorTest.java 2006-04-17 19:44:22 UTC (rev 9755) @@ -13,6 +13,7 @@ * @author Gavin King */ public class ValidatorTest extends TestCase { + public static final String ESCAPING_EL = "(escaping #{el})"; public void testValidator() { Address a = new Address(); Address.blacklistedZipCode = null; @@ -48,10 +49,9 @@ a.floor = 4000; validationMessages = classValidator.getInvalidValues( a ); assertEquals( 1, validationMessages.length ); - if ( Locale.getDefault().toString().startsWith( "en" ) ) { - assertEquals( "Floor cannot be lower that -2 and greater than 50", validationMessages[0].getMessage() ); - } - + assertEquals( "Floor cannot " + ESCAPING_EL + + " be lower that -2 and greater than 50 " + ESCAPING_EL, + validationMessages[0].getMessage() ); } public void testCircularity() throws Exception { |
From: <hib...@li...> - 2006-04-16 16:58:43
|
Author: epbernard Date: 2006-04-16 12:57:40 -0400 (Sun, 16 Apr 2006) New Revision: 9754 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml Log: add table generator support for xml overriding Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-16 16:14:07 UTC (rev 9753) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-16 16:57:40 UTC (rev 9754) @@ -26,6 +26,7 @@ import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; import javax.persistence.SequenceGenerator; +import javax.persistence.TableGenerator; import org.dom4j.Attribute; import org.dom4j.Element; @@ -71,6 +72,7 @@ annotationToXml.put( DiscriminatorValue.class, "discriminator-value" ); annotationToXml.put( DiscriminatorColumn.class, "discriminator-column" ); annotationToXml.put( SequenceGenerator.class, "sequence-generator" ); + annotationToXml.put( TableGenerator.class, "table-generator" ); } private XMLContext xmlContext; @@ -171,6 +173,8 @@ if ( current != null ) annotationList.add( current ); current = getSequenceGenerator( tree, defaults ); if ( current != null ) annotationList.add( current ); + current = getTableGenerator( tree, defaults ); + if ( current != null ) annotationList.add( current ); this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] ); } else if ( propertyName != null ) { @@ -183,6 +187,64 @@ } } + private TableGenerator getTableGenerator(Element tree, XMLContext.Default defaults) { + Element element = tree != null ? tree.element( annotationToXml.get(TableGenerator.class) ) : null; + if ( element != null ) { + AnnotationDescriptor ad = new AnnotationDescriptor( TableGenerator.class ); + copyStringAttribute( ad, element, "name" ); + copyStringAttribute( ad, element, "table" ); + copyStringAttribute( ad, element, "catalog" ); + copyStringAttribute( ad, element, "schema" ); + copyStringAttribute( ad, element, "pk-column-name" ); + copyStringAttribute( ad, element, "value-column-name" ); + copyStringAttribute( ad, element, "pk-column-value" ); + copyIntegerAttribute( ad, element, "initial-value" ); + copyIntegerAttribute( ad, element, "allocation-size" ); + buildUniqueConstraints( ad, element ); + if ( StringHelper.isEmpty( (String) ad.valueOf( "schema" ) ) + && StringHelper.isNotEmpty( defaults.getSchema() ) ) { + ad.setValue( "schema", defaults.getSchema() ); + } + if ( StringHelper.isEmpty( (String) ad.valueOf( "catalog" ) ) + && StringHelper.isNotEmpty( defaults.getCatalog() ) ) { + ad.setValue( "catalog", defaults.getCatalog() ); + } + return AnnotationFactory.create( ad ); + } + else if ( defaults.canUseJavaAnnotations() && super.isAnnotationPresent( TableGenerator.class ) ) { + TableGenerator tableAnn = super.getAnnotation( TableGenerator.class ); + if ( StringHelper.isNotEmpty( defaults.getSchema() ) + || StringHelper.isNotEmpty( defaults.getCatalog() ) ) { + AnnotationDescriptor annotation = new AnnotationDescriptor( TableGenerator.class ); + annotation.setValue( "name", tableAnn.name() ); + annotation.setValue( "table", tableAnn.table() ); + annotation.setValue( "catalog", tableAnn.table() ); + if ( StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) + && StringHelper.isNotEmpty( defaults.getCatalog() ) ) { + annotation.setValue( "catalog", defaults.getCatalog() ); + } + annotation.setValue( "schema", tableAnn.table() ); + if ( StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) + && StringHelper.isNotEmpty( defaults.getSchema() ) ) { + annotation.setValue( "catalog", defaults.getSchema() ); + } + annotation.setValue( "pkColumnName", tableAnn.pkColumnName() ); + annotation.setValue( "valueColumnName", tableAnn.valueColumnName() ); + annotation.setValue( "pkColumnValue", tableAnn.pkColumnValue() ); + annotation.setValue( "initialValue", tableAnn.initialValue() ); + annotation.setValue( "allocationSize", tableAnn.allocationSize() ); + annotation.setValue( "uniqueConstraints", tableAnn.uniqueConstraints() ); + return AnnotationFactory.create( annotation ); + } + else { + return tableAnn; + } + } + else { + return null; + } + } + private SequenceGenerator getSequenceGenerator(Element tree, XMLContext.Default defaults) { Element element = tree != null ? tree.element( annotationToXml.get(SequenceGenerator.class) ) : null; if ( element != null ) { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-16 16:14:07 UTC (rev 9753) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-16 16:57:40 UTC (rev 9754) @@ -20,6 +20,7 @@ import javax.persistence.DiscriminatorValue; import javax.persistence.DiscriminatorColumn; import javax.persistence.SequenceGenerator; +import javax.persistence.TableGenerator; import junit.framework.TestCase; import org.hibernate.util.XMLHelper; @@ -59,6 +60,10 @@ assertNotNull( "Sequence Overriding not working", reader.getAnnotation( SequenceGenerator.class ) ); assertEquals( "wrong sequence name", "seqhilo", reader.getAnnotation( SequenceGenerator.class ).sequenceName() ); assertEquals( "default fails", 50, reader.getAnnotation( SequenceGenerator.class ).allocationSize() ); + assertNotNull( "TableOverriding not working", reader.getAnnotation( TableGenerator.class ) ); + assertEquals( "wrong tble name", "tablehilo", reader.getAnnotation( TableGenerator.class ).table() ); + assertEquals( "no schema overriding", "myschema", reader.getAnnotation( TableGenerator.class ).schema() ); + reader = new EJB3OverridenAnnotationReader(Match.class, context); assertNotNull( reader.getAnnotation( Table.class) ); assertEquals( "Java annotation not taken into account", "matchtable", reader.getAnnotation( Table.class ).name() ); @@ -111,6 +116,7 @@ assertNull( reader.getAnnotation( DiscriminatorValue.class ) ); assertNull( reader.getAnnotation( DiscriminatorColumn.class ) ); assertNull( reader.getAnnotation( SequenceGenerator.class ) ); + assertNull( reader.getAnnotation( TableGenerator.class ) ); } private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-16 16:14:07 UTC (rev 9753) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-16 16:57:40 UTC (rev 9754) @@ -5,6 +5,7 @@ import javax.persistence.IdClass; import javax.persistence.DiscriminatorValue; import javax.persistence.SequenceGenerator; +import javax.persistence.TableGenerator; /** * @author Emmanuel Bernard @@ -13,6 +14,7 @@ @IdClass(SocialSecurityNumber.class) @DiscriminatorValue("Moral") @SequenceGenerator(name="seq") +@TableGenerator(name="table") public class SocialSecurityMoralAccount { public String number; public String countryCode; Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-16 16:14:07 UTC (rev 9753) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-16 16:57:40 UTC (rev 9754) @@ -27,6 +27,7 @@ </unique-constraint> </secondary-table> <sequence-generator name="seqhilo" sequence-name="seqhilo"/> + <table-generator name="table" table="tablehilo"/> </entity> <entity class="Match"> <inheritance strategy="JOINED"/> |
From: <hib...@li...> - 2006-04-16 16:14:26
|
Author: epbernard Date: 2006-04-16 12:14:07 -0400 (Sun, 16 Apr 2006) New Revision: 9753 Modified: trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml Log: Wrong documentation about @OrderBy and List semantic Modified: trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml =================================================================== --- trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml 2006-04-16 14:51:51 UTC (rev 9752) +++ trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml 2006-04-16 16:14:07 UTC (rev 9753) @@ -1178,7 +1178,7 @@ <entry>java.util.List</entry> <entry>@org.hibernate.annotations.CollectionOfElements, - @OneToMany, @ManyToMany + @OrderBy, + @OneToMany, @ManyToMany + @org.hibernate.annotations.IndexColumn</entry> </row> @@ -1203,7 +1203,7 @@ </tgroup> </table> - <remark>So specifically, java.util.List collections wo @OrderBy nor + <remark>So specifically, java.util.List collections without @org.hibernate.annotations.IndexColumn are going to be considered as bags.</remark> |
From: <hib...@li...> - 2006-04-16 14:52:59
|
Author: epbernard Date: 2006-04-16 10:51:51 -0400 (Sun, 16 Apr 2006) New Revision: 9752 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml Log: Support for sequence generator xml overriding Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-16 06:02:33 UTC (rev 9751) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-16 14:51:51 UTC (rev 9752) @@ -25,6 +25,7 @@ import javax.persistence.DiscriminatorValue; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; +import javax.persistence.SequenceGenerator; import org.dom4j.Attribute; import org.dom4j.Element; @@ -69,6 +70,7 @@ annotationToXml.put( Inheritance.class, "inheritance" ); annotationToXml.put( DiscriminatorValue.class, "discriminator-value" ); annotationToXml.put( DiscriminatorColumn.class, "discriminator-column" ); + annotationToXml.put( SequenceGenerator.class, "sequence-generator" ); } private XMLContext xmlContext; @@ -76,6 +78,7 @@ private String propertyName; private boolean isFieldAccess; private transient Annotation[] annotations; + private static final String WORD_SEPARATOR = "-"; public EJB3OverridenAnnotationReader(AnnotatedElement el, XMLContext xmlContext) { super( el ); @@ -166,6 +169,8 @@ if ( current != null ) annotationList.add( current ); current = getDiscriminatorColumn( tree, defaults ); if ( current != null ) annotationList.add( current ); + current = getSequenceGenerator( tree, defaults ); + if ( current != null ) annotationList.add( current ); this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] ); } else if ( propertyName != null ) { @@ -178,22 +183,33 @@ } } + private SequenceGenerator getSequenceGenerator(Element tree, XMLContext.Default defaults) { + Element element = tree != null ? tree.element( annotationToXml.get(SequenceGenerator.class) ) : null; + if ( element != null ) { + AnnotationDescriptor ad = new AnnotationDescriptor( SequenceGenerator.class ); + copyStringAttribute( ad, element, "name" ); + copyStringAttribute( ad, element, "sequence-name" ); + copyIntegerAttribute( ad, element, "initial-value" ); + copyIntegerAttribute( ad, element, "allocation-size" ); + return AnnotationFactory.create( ad ); + } + else if ( defaults.canUseJavaAnnotations() ) { + return super.getAnnotation( SequenceGenerator.class ); + } + else { + return null; + } + } + private DiscriminatorColumn getDiscriminatorColumn(Element tree, XMLContext.Default defaults) { Element element = tree != null ? tree.element( "discriminator-column" ) : null; if ( element != null ) { AnnotationDescriptor ad = new AnnotationDescriptor( DiscriminatorColumn.class ); - Attribute attr = element.attribute( "name" ); - if (attr != null) { - ad.setValue( "name", attr.getValue() ); - } - attr = element.attribute( "column-definition" ); - if (attr != null) { - ad.setValue( "columnDefinition", attr.getValue() ); - } - attr = element.attribute( "discriminator-type" ); + copyStringAttribute( ad, element, "name" ); + copyStringAttribute( ad, element, "column-definition" ); + String value = element.attributeValue( "discriminator-type" ); DiscriminatorType type = DiscriminatorType.STRING; - if (attr != null) { - String value = attr.getValue(); + if (value != null) { if ( "STRING".equals( value ) ) { type = DiscriminatorType.STRING; } @@ -208,16 +224,7 @@ } } ad.setValue( "discriminatorType", type ); - attr = element.attribute( "length" ); - if (attr != null) { - try { - int length = Integer.parseInt( attr.getValue() ); - ad.setValue( "length", length ); - } - catch (NumberFormatException e) { - throw new AnnotationException( "column length not parsable, activate schema validation: " + attr.getValue() ); - } - } + copyIntegerAttribute( ad, element, "length" ); return AnnotationFactory.create( ad ); } else if ( defaults.canUseJavaAnnotations() ) { @@ -232,8 +239,7 @@ Element element = tree != null ? tree.element( "discriminator-value" ) : null; if ( element != null ) { AnnotationDescriptor ad = new AnnotationDescriptor( DiscriminatorValue.class ); - String discr = element.getTextTrim(); - ad.setValue( "value", discr ); + copyStringElement( element, ad, "value" ); return AnnotationFactory.create( ad ); } else if ( defaults.canUseJavaAnnotations() ) { @@ -333,7 +339,7 @@ else { if ( "entity".equals( tree.getName() ) ) { AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class ); - copyAttribute( entity, tree, "name" ); + copyStringAttribute( entity, tree, "name" ); if ( defaults.canUseJavaAnnotations() && StringHelper.isEmpty( (String) entity.valueOf( "name" ) ) ) { Entity javaAnn = super.getAnnotation( Entity.class ); @@ -413,13 +419,13 @@ else { //ignore java annotation, an element is defined AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class ); - copyAttribute( annotation, subelement, "name" ); - copyAttribute( annotation, subelement, "catalog" ); + copyStringAttribute( annotation, subelement, "name" ); + copyStringAttribute( annotation, subelement, "catalog" ); if ( StringHelper.isNotEmpty( defaults.getCatalog() ) && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) { annotation.setValue( "catalog", defaults.getCatalog() ); } - copyAttribute( annotation, subelement, "schema" ); + copyStringAttribute( annotation, subelement, "schema" ); if ( StringHelper.isNotEmpty( defaults.getSchema() ) && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) { annotation.setValue( "schema", defaults.getSchema() ); @@ -436,13 +442,13 @@ List<SecondaryTable> secondaryTables = new ArrayList<SecondaryTable>( 3 ); for ( Element element : elements ) { AnnotationDescriptor annotation = new AnnotationDescriptor( SecondaryTable.class ); - copyAttribute( annotation, element, "name" ); - copyAttribute( annotation, element, "catalog" ); + copyStringAttribute( annotation, element, "name" ); + copyStringAttribute( annotation, element, "catalog" ); if ( StringHelper.isNotEmpty( defaults.getCatalog() ) && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) { annotation.setValue( "catalog", defaults.getCatalog() ); } - copyAttribute( annotation, element, "schema" ); + copyStringAttribute( annotation, element, "schema" ); if ( StringHelper.isNotEmpty( defaults.getSchema() ) && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) { annotation.setValue( "schema", defaults.getSchema() ); @@ -535,24 +541,51 @@ while ( pkIt.hasNext() ) { Element subelement = (Element) pkIt.next(); AnnotationDescriptor pkAnn = new AnnotationDescriptor( PrimaryKeyJoinColumn.class ); - Attribute attribute = subelement.attribute( "name" ); - if ( attribute != null ) { - pkAnn.setValue( "name", attribute.getValue() ); + copyStringAttribute( pkAnn, subelement, "name"); + copyStringAttribute( pkAnn, subelement, "referenced-column-name"); + copyStringAttribute( pkAnn, subelement, "column-definition"); + pkJoinColumns[index++] = AnnotationFactory.create( pkAnn ); + } + return pkJoinColumns; + } + + private void copyStringAttribute(AnnotationDescriptor annotation, Element element, String attributeName) { + String attribute = element.attributeValue( attributeName ); + if (attribute != null) { + StringBuilder annotationAttributeName = new StringBuilder( attributeName ); + int index = annotationAttributeName.indexOf( WORD_SEPARATOR ); + while ( index != -1 ) { + annotationAttributeName.deleteCharAt( index ); + annotationAttributeName.setCharAt( index, Character.toUpperCase( annotationAttributeName.charAt( index ) )); + index = annotationAttributeName.indexOf( WORD_SEPARATOR ); } - attribute = subelement.attribute( "referenced-column-name" ); - if ( attribute != null ) { - pkAnn.setValue( "referencedColumnName", attribute.getValue() ); + annotation.setValue( annotationAttributeName.toString(), attribute ); + } + } + + private void copyIntegerAttribute(AnnotationDescriptor annotation, Element element, String attributeName) { + String attribute = element.attributeValue( attributeName ); + if (attribute != null) { + StringBuilder annotationAttributeName = new StringBuilder( attributeName ); + int index = annotationAttributeName.indexOf( WORD_SEPARATOR ); + while ( index != -1 ) { + annotationAttributeName.deleteCharAt( index ); + annotationAttributeName.setCharAt( index, Character.toUpperCase( annotationAttributeName.charAt( index ) )); + index = annotationAttributeName.indexOf( WORD_SEPARATOR ); } - attribute = subelement.attribute( "column-definition" ); - if ( attribute != null ) { - pkAnn.setValue( "columnDefinition", attribute.getValue() ); + annotation.setValue( annotationAttributeName.toString(), attribute ); + try { + int length = Integer.parseInt( attribute ); + annotation.setValue( annotationAttributeName.toString(), length ); } - pkJoinColumns[index++] = AnnotationFactory.create( pkAnn ); + catch (NumberFormatException e) { + throw new AnnotationException( attributeName + " not parseable, activate schema validation: " + attribute ); + } } - return pkJoinColumns; } - private void copyAttribute(AnnotationDescriptor annotation, Element element, String attributeName) { - annotation.setValue( attributeName, element.attributeValue( attributeName, "" ) ); + private void copyStringElement(Element element, AnnotationDescriptor ad, String annotationAttribute) { + String discr = element.getTextTrim(); + ad.setValue( annotationAttribute, discr ); } } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-16 06:02:33 UTC (rev 9751) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-16 14:51:51 UTC (rev 9752) @@ -19,6 +19,7 @@ import javax.persistence.InheritanceType; import javax.persistence.DiscriminatorValue; import javax.persistence.DiscriminatorColumn; +import javax.persistence.SequenceGenerator; import junit.framework.TestCase; import org.hibernate.util.XMLHelper; @@ -55,6 +56,9 @@ assertEquals( "unique constraints ignored", 1, tables[0].uniqueConstraints().length ); assertEquals( "pk join column ignored", 1, tables[0].pkJoinColumns().length ); assertEquals( "pk join column ignored", "admin_id", tables[0].pkJoinColumns()[0].name() ); + assertNotNull( "Sequence Overriding not working", reader.getAnnotation( SequenceGenerator.class ) ); + assertEquals( "wrong sequence name", "seqhilo", reader.getAnnotation( SequenceGenerator.class ).sequenceName() ); + assertEquals( "default fails", 50, reader.getAnnotation( SequenceGenerator.class ).allocationSize() ); reader = new EJB3OverridenAnnotationReader(Match.class, context); assertNotNull( reader.getAnnotation( Table.class) ); assertEquals( "Java annotation not taken into account", "matchtable", reader.getAnnotation( Table.class ).name() ); @@ -106,6 +110,7 @@ assertNull( reader.getAnnotation( IdClass.class ) ); assertNull( reader.getAnnotation( DiscriminatorValue.class ) ); assertNull( reader.getAnnotation( DiscriminatorColumn.class ) ); + assertNull( reader.getAnnotation( SequenceGenerator.class ) ); } private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-16 06:02:33 UTC (rev 9751) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-16 14:51:51 UTC (rev 9752) @@ -4,6 +4,7 @@ import javax.persistence.Entity; import javax.persistence.IdClass; import javax.persistence.DiscriminatorValue; +import javax.persistence.SequenceGenerator; /** * @author Emmanuel Bernard @@ -11,6 +12,7 @@ @Entity @IdClass(SocialSecurityNumber.class) @DiscriminatorValue("Moral") +@SequenceGenerator(name="seq") public class SocialSecurityMoralAccount { public String number; public String countryCode; Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-16 06:02:33 UTC (rev 9751) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-16 14:51:51 UTC (rev 9752) @@ -26,6 +26,7 @@ <column-name>address</column-name> </unique-constraint> </secondary-table> + <sequence-generator name="seqhilo" sequence-name="seqhilo"/> </entity> <entity class="Match"> <inheritance strategy="JOINED"/> |
From: <hib...@li...> - 2006-04-16 06:14:51
|
Author: epbernard Date: 2006-04-16 02:02:33 -0400 (Sun, 16 Apr 2006) New Revision: 9751 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml Log: Support for discriminator value and column xml overriding Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-16 04:31:43 UTC (rev 9750) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-16 06:02:33 UTC (rev 9751) @@ -22,6 +22,9 @@ import javax.persistence.IdClass; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.DiscriminatorValue; +import javax.persistence.DiscriminatorColumn; +import javax.persistence.DiscriminatorType; import org.dom4j.Attribute; import org.dom4j.Element; @@ -38,6 +41,7 @@ * * @author Paolo Perrotta * @author Davide Marchignoli + * @author Emmanuel Bernard */ public class EJB3OverridenAnnotationReader extends JavaAnnotationReader { private static final Map<Class, String> annotationToXml; @@ -63,6 +67,8 @@ annotationToXml.put( PrimaryKeyJoinColumns.class, "primary-key-join-column" ); annotationToXml.put( IdClass.class, "id-class" ); annotationToXml.put( Inheritance.class, "inheritance" ); + annotationToXml.put( DiscriminatorValue.class, "discriminator-value" ); + annotationToXml.put( DiscriminatorColumn.class, "discriminator-column" ); } private XMLContext xmlContext; @@ -156,6 +162,10 @@ if ( current != null ) annotationList.add( current ); current = getInheritance( tree, defaults ); if ( current != null ) annotationList.add( current ); + current = getDiscriminatorValue( tree, defaults ); + if ( current != null ) annotationList.add( current ); + current = getDiscriminatorColumn( tree, defaults ); + if ( current != null ) annotationList.add( current ); this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] ); } else if ( propertyName != null ) { @@ -168,6 +178,72 @@ } } + private DiscriminatorColumn getDiscriminatorColumn(Element tree, XMLContext.Default defaults) { + Element element = tree != null ? tree.element( "discriminator-column" ) : null; + if ( element != null ) { + AnnotationDescriptor ad = new AnnotationDescriptor( DiscriminatorColumn.class ); + Attribute attr = element.attribute( "name" ); + if (attr != null) { + ad.setValue( "name", attr.getValue() ); + } + attr = element.attribute( "column-definition" ); + if (attr != null) { + ad.setValue( "columnDefinition", attr.getValue() ); + } + attr = element.attribute( "discriminator-type" ); + DiscriminatorType type = DiscriminatorType.STRING; + if (attr != null) { + String value = attr.getValue(); + if ( "STRING".equals( value ) ) { + type = DiscriminatorType.STRING; + } + else if ( "CHAR".equals( value ) ) { + type = DiscriminatorType.CHAR; + } + else if ( "INTEGER".equals( value ) ) { + type = DiscriminatorType.INTEGER; + } + else { + throw new AnnotationException( "Unknown DiscrimiatorType in XML, activate schema validation: " + value ); + } + } + ad.setValue( "discriminatorType", type ); + attr = element.attribute( "length" ); + if (attr != null) { + try { + int length = Integer.parseInt( attr.getValue() ); + ad.setValue( "length", length ); + } + catch (NumberFormatException e) { + throw new AnnotationException( "column length not parsable, activate schema validation: " + attr.getValue() ); + } + } + return AnnotationFactory.create( ad ); + } + else if ( defaults.canUseJavaAnnotations() ) { + return super.getAnnotation( DiscriminatorColumn.class ); + } + else { + return null; + } + } + + private DiscriminatorValue getDiscriminatorValue(Element tree, XMLContext.Default defaults) { + Element element = tree != null ? tree.element( "discriminator-value" ) : null; + if ( element != null ) { + AnnotationDescriptor ad = new AnnotationDescriptor( DiscriminatorValue.class ); + String discr = element.getTextTrim(); + ad.setValue( "value", discr ); + return AnnotationFactory.create( ad ); + } + else if ( defaults.canUseJavaAnnotations() ) { + return super.getAnnotation( DiscriminatorValue.class ); + } + else { + return null; + } + } + private Inheritance getInheritance(Element tree, XMLContext.Default defaults) { Element element = tree != null ? tree.element( "inheritance" ) : null; if ( element != null ) { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-16 04:31:43 UTC (rev 9750) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-16 06:02:33 UTC (rev 9751) @@ -17,6 +17,8 @@ import javax.persistence.IdClass; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.DiscriminatorValue; +import javax.persistence.DiscriminatorColumn; import junit.framework.TestCase; import org.hibernate.util.XMLHelper; @@ -73,6 +75,10 @@ reader = new EJB3OverridenAnnotationReader(SocialSecurityPhysicalAccount.class, context); assertNotNull( reader.getAnnotation( IdClass.class ) ); assertEquals( "id-class not used", SocialSecurityNumber.class, reader.getAnnotation( IdClass.class ).value() ); + assertEquals( "discriminator-value not used", "Physical", reader.getAnnotation( DiscriminatorValue.class ).value() ); + assertNotNull( "discriminator-column not used", reader.getAnnotation( DiscriminatorColumn.class ) ); + assertEquals( "discriminator-column.name default value broken", "DTYPE", reader.getAnnotation( DiscriminatorColumn.class ).name() ); + assertEquals( "discriminator-column.length broken", 34, reader.getAnnotation( DiscriminatorColumn.class ).length() ); } public void testEntityRelatedAnnotationsMetadataComplete() throws Exception { @@ -98,6 +104,8 @@ assertNull( reader.getAnnotation( MappedSuperclass.class) ); reader = new EJB3OverridenAnnotationReader(SocialSecurityMoralAccount.class, context); assertNull( reader.getAnnotation( IdClass.class ) ); + assertNull( reader.getAnnotation( DiscriminatorValue.class ) ); + assertNull( reader.getAnnotation( DiscriminatorColumn.class ) ); } private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-16 04:31:43 UTC (rev 9750) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-16 06:02:33 UTC (rev 9751) @@ -3,12 +3,14 @@ import javax.persistence.Entity; import javax.persistence.IdClass; +import javax.persistence.DiscriminatorValue; /** * @author Emmanuel Bernard */ @Entity @IdClass(SocialSecurityNumber.class) +@DiscriminatorValue("Moral") public class SocialSecurityMoralAccount { public String number; public String countryCode; Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-16 04:31:43 UTC (rev 9750) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-16 06:02:33 UTC (rev 9751) @@ -35,5 +35,7 @@ </entity> <entity class="SocialSecurityPhysicalAccount"> <id-class class="org.hibernate.test.reflection.java.xml.SocialSecurityNumber"/> + <discriminator-value>Physical</discriminator-value> + <discriminator-column length="34"/> </entity> </entity-mappings> \ No newline at end of file |
Author: epbernard Date: 2006-04-16 00:31:43 -0400 (Sun, 16 Apr 2006) New Revision: 9750 Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityNumber.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityPhysicalAccount.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml Log: Support for id-class and inheritance xml overriding Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-15 22:46:15 UTC (rev 9749) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-16 04:31:43 UTC (rev 9750) @@ -19,6 +19,9 @@ import javax.persistence.Table; import javax.persistence.UniqueConstraint; import javax.persistence.PrimaryKeyJoinColumns; +import javax.persistence.IdClass; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import org.dom4j.Attribute; import org.dom4j.Element; @@ -27,6 +30,8 @@ import org.hibernate.reflection.Filter; import org.hibernate.reflection.java.xml.XMLContext; import org.hibernate.util.StringHelper; +import org.hibernate.util.ReflectHelper; +import org.hibernate.AnnotationException; /** * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor. @@ -56,6 +61,8 @@ annotationToXml.put( SecondaryTables.class, "secondary-table" ); annotationToXml.put( PrimaryKeyJoinColumn.class, "primary-key-join-column" ); annotationToXml.put( PrimaryKeyJoinColumns.class, "primary-key-join-column" ); + annotationToXml.put( IdClass.class, "id-class" ); + annotationToXml.put( Inheritance.class, "inheritance" ); } private XMLContext xmlContext; @@ -145,6 +152,10 @@ if ( current != null ) annotationList.add( current ); current = getPrimaryKeyJoinColumns( tree, defaults ); if ( current != null ) annotationList.add( current ); + current = getIdClass( tree, defaults ); + if ( current != null ) annotationList.add( current ); + current = getInheritance( tree, defaults ); + if ( current != null ) annotationList.add( current ); this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] ); } else if ( propertyName != null ) { @@ -157,9 +168,69 @@ } } + private Inheritance getInheritance(Element tree, XMLContext.Default defaults) { + Element element = tree != null ? tree.element( "inheritance" ) : null; + if ( element != null ) { + AnnotationDescriptor ad = new AnnotationDescriptor( Inheritance.class ); + Attribute attr = element.attribute( "strategy" ); + InheritanceType strategy = InheritanceType.SINGLE_TABLE; + if (attr != null) { + String value = attr.getValue(); + if ( "SINGLE_TABLE".equals( value ) ) { + strategy = InheritanceType.SINGLE_TABLE; + } + else if ( "JOINED".equals( value ) ) { + strategy = InheritanceType.JOINED; + } + else if ( "TABLE_PER_CLASS".equals( value ) ) { + strategy = InheritanceType.TABLE_PER_CLASS; + } + else { + throw new AnnotationException( "Unknown InheritanceType in XML, activate schema validation: " + value ); + } + } + ad.setValue( "strategy", strategy ); + return AnnotationFactory.create( ad ); + } + else if ( defaults.canUseJavaAnnotations() ) { + return super.getAnnotation( Inheritance.class ); + } + else { + return null; + } + } + + private IdClass getIdClass(Element tree, XMLContext.Default defaults) { + Element element = tree == null ? null : tree.element( "id-class" ); + if (element != null) { + Attribute attr = element.attribute( "class" ); + if ( attr != null ) { + AnnotationDescriptor ad = new AnnotationDescriptor( IdClass.class ); + Class clazz = null; + try { + clazz = ReflectHelper.classForName( attr.getValue(), this.getClass() ); + } + catch( ClassNotFoundException e ) { + throw new AnnotationException( "Unable to find id-class: " + attr.getValue(), e ); + } + ad.setValue( "value", clazz ); + return AnnotationFactory.create( ad ); + } + else { + throw new AnnotationException("id-class without class, please ensure schema validation"); + } + } + else if ( defaults.canUseJavaAnnotations() ) { + return super.getAnnotation( IdClass.class ); + } + else { + return null; + } + } + private PrimaryKeyJoinColumns getPrimaryKeyJoinColumns(Element element, XMLContext.Default defaults) { PrimaryKeyJoinColumn[] columns = buildPrimaryKeyJoinColumns( element ); - if (columns.length == 0 && ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) { + if (columns.length == 0 && defaults.canUseJavaAnnotations() ) { PrimaryKeyJoinColumn annotation = super.getAnnotation( PrimaryKeyJoinColumn.class ); if (annotation != null) { columns = new PrimaryKeyJoinColumn[] { annotation }; @@ -181,13 +252,13 @@ private Entity getEntity(Element tree, XMLContext.Default defaults) { if ( tree == null ) { - return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( Entity.class ) : null; + return defaults.canUseJavaAnnotations() ? super.getAnnotation( Entity.class ) : null; } else { if ( "entity".equals( tree.getName() ) ) { AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class ); copyAttribute( entity, tree, "name" ); - if ( ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) + if ( defaults.canUseJavaAnnotations() && StringHelper.isEmpty( (String) entity.valueOf( "name" ) ) ) { Entity javaAnn = super.getAnnotation( Entity.class ); if ( javaAnn != null ) entity.setValue( "name", javaAnn.name() ); @@ -202,9 +273,7 @@ private MappedSuperclass getMappedSuperclass(Element tree, XMLContext.Default defaults) { if ( tree == null ) { - return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( - MappedSuperclass.class - ) : null; + return defaults.canUseJavaAnnotations() ? super.getAnnotation(MappedSuperclass.class) : null; } else { if ( "mapped-superclass".equals( tree.getName() ) ) { @@ -219,9 +288,7 @@ private Embeddable getEmbeddable(Element tree, XMLContext.Default defaults) { if ( tree == null ) { - return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( - Embeddable.class - ) : null; + return defaults.canUseJavaAnnotations() ? super.getAnnotation(Embeddable.class) : null; } else { if ( "embeddable".equals( tree.getName() ) ) { @@ -241,7 +308,7 @@ if ( StringHelper.isNotEmpty( defaults.getCatalog() ) || StringHelper.isNotEmpty( defaults.getSchema() ) ) { AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class ); - if ( ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) { + if ( defaults.canUseJavaAnnotations() ) { Table table = super.getAnnotation( Table.class ); if ( table != null ) { annotation.setValue( "name", table.name() ); @@ -260,7 +327,7 @@ } return AnnotationFactory.create( annotation ); } - else if ( ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) { + else if ( defaults.canUseJavaAnnotations() ) { return super.getAnnotation( Table.class ); } else { @@ -312,7 +379,7 @@ * You can't have both secondary table in XML and Java, * since there would be no way to "remove" a secondary table */ - if ( secondaryTables.size() == 0 && ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) { + if ( secondaryTables.size() == 0 && defaults.canUseJavaAnnotations() ) { SecondaryTable secTableAnn = super.getAnnotation( SecondaryTable.class ); overridesDefaultInSecondaryTable( secTableAnn, defaults, secondaryTables ); SecondaryTables secTablesAnn = super.getAnnotation( SecondaryTables.class ); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-04-15 22:46:15 UTC (rev 9749) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-04-16 04:31:43 UTC (rev 9750) @@ -156,6 +156,10 @@ return metadataComplete; } + public boolean canUseJavaAnnotations() { + return ! Boolean.TRUE.equals( metadataComplete ); + } + protected void setMetadataComplete(Boolean metadataComplete) { this.metadataComplete = metadataComplete; } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-15 22:46:15 UTC (rev 9749) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-16 04:31:43 UTC (rev 9750) @@ -14,6 +14,9 @@ import javax.persistence.SecondaryTable; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.PrimaryKeyJoinColumns; +import javax.persistence.IdClass; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import junit.framework.TestCase; import org.hibernate.util.XMLHelper; @@ -59,12 +62,17 @@ assertEquals( "Default schema not taken into account", "myschema", reader.getAnnotation( SecondaryTables.class ).value()[0].schema() ); + assertNotNull( reader.getAnnotation( Inheritance.class ) ); + assertEquals( "inheritance strategy not overriden", InheritanceType.JOINED, reader.getAnnotation( Inheritance.class ).strategy() ); reader = new EJB3OverridenAnnotationReader(Competition.class, context); assertNotNull( reader.getAnnotation( MappedSuperclass.class) ); reader = new EJB3OverridenAnnotationReader(TennisMatch.class, context); assertNull( "Mutualize PKJC into PKJCs", reader.getAnnotation( PrimaryKeyJoinColumn.class) ); assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class) ); assertEquals( "PrimaryKeyJoinColumn overrden", "id", reader.getAnnotation( PrimaryKeyJoinColumns.class).value()[0].name() ); + reader = new EJB3OverridenAnnotationReader(SocialSecurityPhysicalAccount.class, context); + assertNotNull( reader.getAnnotation( IdClass.class ) ); + assertEquals( "id-class not used", SocialSecurityNumber.class, reader.getAnnotation( IdClass.class ).value() ); } public void testEntityRelatedAnnotationsMetadataComplete() throws Exception { @@ -82,11 +90,14 @@ assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() ); assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTable.class ) ); assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTables.class ) ); + assertNull( "Ignore Java annotation", reader.getAnnotation( Inheritance.class ) ); reader = new EJB3OverridenAnnotationReader(TennisMatch.class, context); assertNull( reader.getAnnotation( PrimaryKeyJoinColumn.class) ); assertNull( reader.getAnnotation( PrimaryKeyJoinColumns.class) ); reader = new EJB3OverridenAnnotationReader(Competition.class, context); assertNull( reader.getAnnotation( MappedSuperclass.class) ); + reader = new EJB3OverridenAnnotationReader(SocialSecurityMoralAccount.class, context); + assertNull( reader.getAnnotation( IdClass.class ) ); } private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java 2006-04-15 22:46:15 UTC (rev 9749) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java 2006-04-16 04:31:43 UTC (rev 9750) @@ -4,6 +4,8 @@ import javax.persistence.Entity; import javax.persistence.Table; import javax.persistence.SecondaryTable; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; /** * @author Emmanuel Bernard @@ -11,5 +13,6 @@ @Entity @Table(name="matchtable", schema = "matchschema") @SecondaryTable(name="extendedMatch") +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class Match extends Competition { } Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-15 22:46:15 UTC (rev 9749) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-16 04:31:43 UTC (rev 9750) @@ -0,0 +1,15 @@ +//$Id: $ +package org.hibernate.test.reflection.java.xml; + +import javax.persistence.Entity; +import javax.persistence.IdClass; + +/** + * @author Emmanuel Bernard + */ +@Entity +@IdClass(SocialSecurityNumber.class) +public class SocialSecurityMoralAccount { + public String number; + public String countryCode; +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityNumber.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityNumber.java 2006-04-15 22:46:15 UTC (rev 9749) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityNumber.java 2006-04-16 04:31:43 UTC (rev 9750) @@ -0,0 +1,33 @@ +//$Id: $ +package org.hibernate.test.reflection.java.xml; + +import java.io.Serializable; +import javax.persistence.Embeddable; + +/** + * @author Emmanuel Bernard + */ +@Embeddable +public class SocialSecurityNumber implements Serializable { + public String number; + public String countryCode; + + public boolean equals(Object o) { + if ( this == o ) return true; + if ( o == null || getClass() != o.getClass() ) return false; + + final SocialSecurityNumber that = (SocialSecurityNumber) o; + + if ( !countryCode.equals( that.countryCode ) ) return false; + if ( !number.equals( that.number ) ) return false; + + return true; + } + + public int hashCode() { + int result; + result = number.hashCode(); + result = 29 * result + countryCode.hashCode(); + return result; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityPhysicalAccount.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityPhysicalAccount.java 2006-04-15 22:46:15 UTC (rev 9749) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityPhysicalAccount.java 2006-04-16 04:31:43 UTC (rev 9750) @@ -0,0 +1,13 @@ +//$Id: $ +package org.hibernate.test.reflection.java.xml; + +import javax.persistence.Entity; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class SocialSecurityPhysicalAccount { + public String number; + public String countryCode; +} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml 2006-04-15 22:46:15 UTC (rev 9749) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml 2006-04-16 04:31:43 UTC (rev 9750) @@ -18,4 +18,5 @@ </entity> <entity class="Match"> </entity> + <entity class="SocialSecurityMoralAccount"/> </entity-mappings> \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-15 22:46:15 UTC (rev 9749) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-16 04:31:43 UTC (rev 9750) @@ -28,8 +28,12 @@ </secondary-table> </entity> <entity class="Match"> + <inheritance strategy="JOINED"/> </entity> <entity class="TennisMatch"> <primary-key-join-column name="id"/> </entity> + <entity class="SocialSecurityPhysicalAccount"> + <id-class class="org.hibernate.test.reflection.java.xml.SocialSecurityNumber"/> + </entity> </entity-mappings> \ No newline at end of file |
Author: epbernard Date: 2006-04-15 18:46:15 -0400 (Sat, 15 Apr 2006) New Revision: 9749 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/ejb/ trunk/HibernateExt/metadata/src/java/org/hibernate/ejb/orm_1_0.xsd trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/TennisMatch.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml Log: Support for PrimaryKeyJoinColumn xml overriding Added: trunk/HibernateExt/metadata/src/java/org/hibernate/ejb/orm_1_0.xsd =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/ejb/orm_1_0.xsd 2006-04-15 16:31:35 UTC (rev 9748) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/ejb/orm_1_0.xsd 2006-04-15 22:46:15 UTC (rev 9749) @@ -0,0 +1,1516 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Java Persistence API object-relational mapping file schema --> +<xsd:schema targetNamespace="http://java.sun.com/xml/ns/persistence/orm" + xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified" + attributeFormDefault="unqualified" + version="1.0"> + + <xsd:annotation> + <xsd:documentation> + @(#)orm_1_0.xsd 1.0 Feb 14 2006 + </xsd:documentation> + </xsd:annotation> + <xsd:annotation> + <xsd:documentation><![CDATA[ + + This is the XML Schema for the persistence object-relational + mapping file. + The file may be named "META-INF/orm.xml" in the persistence + archive or it may be named some other name which would be + used to locate the file as resource on the classpath. + + ]]></xsd:documentation> + </xsd:annotation> + + <xsd:complexType name="emptyType"/> + + <xsd:simpleType name="versionType"> + <xsd:restriction base="xsd:token"> + <xsd:pattern value="[0-9]+(\.[0-9]+)*"/> + </xsd:restriction> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:element name="entity-mappings"> + <xsd:complexType> + <xsd:annotation> + <xsd:documentation> + + The entity-mappings element is the root element of an mapping + file. It contains the following four types of elements: + + 1. The persistence-unit-metadata element contains metadata + for the entire persistence unit. It is undefined if this element + occurs in multiple mapping files within the same persistence unit. + + 2. The package, schema, catalog and access elements apply to all of + the entity, mapped-superclass and embeddable elements defined in + the same file in which they occur. + + 3. The sequence-generator, table-generator, named-query, + named-native-query and sql-result-set-mapping elements are global + to the persistence unit. It is undefined to have more than one + sequence-generator or table-generator of the same name in the same + or different mapping files in a persistence unit. It is also + undefined to have more than one named-query or named-native-query + of the same name in the same or different mapping files in a + persistence unit. + + 4. The entity, mapped-superclass and embeddable elements each define + the mapping information for a managed persistent class. The mapping + information contained in these elements may be complete or it may + be partial. + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="description" type="xsd:string" + minOccurs="0"/> + <xsd:element name="persistence-unit-metadata" + type="orm:persistence-unit-metadata" + minOccurs="0"/> + <xsd:element name="package" type="xsd:string" + minOccurs="0"/> + <xsd:element name="schema" type="xsd:string" + minOccurs="0"/> + <xsd:element name="catalog" type="xsd:string" + minOccurs="0"/> + <xsd:element name="access" type="orm:access-type" + minOccurs="0"/> + <xsd:element name="sequence-generator" type="orm:sequence-generator" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="table-generator" type="orm:table-generator" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="named-query" type="orm:named-query" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="named-native-query" type="orm:named-native-query" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="sql-result-set-mapping" + type="orm:sql-result-set-mapping" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="mapped-superclass" type="orm:mapped-superclass" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="entity" type="orm:entity" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="embeddable" type="orm:embeddable" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="version" type="orm:versionType" + fixed="1.0" use="required"/> + </xsd:complexType> + </xsd:element> + + <!-- **************************************************** --> + + <xsd:complexType name="persistence-unit-metadata"> + <xsd:annotation> + <xsd:documentation> + + Metadata that applies to the persistence unit and not just to + the mapping file in which it is contained. + + If the xml-mapping-metadata-complete element is specified then + the complete set of mapping metadata for the persistence unit + is contained in the XML mapping files for the persistence unit. + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="xml-mapping-metadata-complete" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="persistence-unit-defaults" + type="orm:persistence-unit-defaults" + minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="persistence-unit-defaults"> + <xsd:annotation> + <xsd:documentation> + + These defaults are applied to the persistence unit as a whole + unless they are overridden by local annotation or XML + element settings. + + schema - Used as the schema for all tables or secondary tables + that apply to the persistence unit + catalog - Used as the catalog for all tables or secondary tables + that apply to the persistence unit + access - Used as the access type for all managed classes in + the persistence unit + cascade-persist - Adds cascade-persist to the set of cascade options + in entity relationships of the persistence unit + entity-listeners - List of default entity listeners to be invoked + on each entity in the persistence unit. + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="schema" type="xsd:string" + minOccurs="0"/> + <xsd:element name="catalog" type="xsd:string" + minOccurs="0"/> + <xsd:element name="access" type="orm:access-type" + minOccurs="0"/> + <xsd:element name="cascade-persist" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="entity-listeners" type="orm:entity-listeners" + minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="entity"> + <xsd:annotation> + <xsd:documentation> + + Defines the settings and mappings for an entity. Is allowed to be + sparsely populated and used in conjunction with the annotations. + Alternatively, the metadata-complete attribute can be used to + indicate that no annotations on the entity class (and its fields + or properties) are to be processed. If this is the case then + the defaulting rules for the entity and its subelements will + be recursively applied. + + @Target(TYPE) @Retention(RUNTIME) + public @interface Entity { + String name() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="description" type="xsd:string" minOccurs="0"/> + <xsd:element name="table" type="orm:table" + minOccurs="0"/> + <xsd:element name="secondary-table" type="orm:secondary-table" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="primary-key-join-column" + type="orm:primary-key-join-column" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/> + <xsd:element name="inheritance" type="orm:inheritance" minOccurs="0"/> + <xsd:element name="discriminator-value" type="orm:discriminator-value" + minOccurs="0"/> + <xsd:element name="discriminator-column" + type="orm:discriminator-column" + minOccurs="0"/> + <xsd:element name="sequence-generator" type="orm:sequence-generator" + minOccurs="0"/> + <xsd:element name="table-generator" type="orm:table-generator" + minOccurs="0"/> + <xsd:element name="named-query" type="orm:named-query" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="named-native-query" type="orm:named-native-query" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="sql-result-set-mapping" + type="orm:sql-result-set-mapping" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="exclude-default-listeners" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="exclude-superclass-listeners" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="entity-listeners" type="orm:entity-listeners" + minOccurs="0"/> + <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/> + <xsd:element name="post-persist" type="orm:post-persist" + minOccurs="0"/> + <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/> + <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/> + <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/> + <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/> + <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/> + <xsd:element name="attribute-override" type="orm:attribute-override" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="association-override" + type="orm:association-override" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="attributes" type="orm:attributes" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="class" type="xsd:string" use="required"/> + <xsd:attribute name="access" type="orm:access-type"/> + <xsd:attribute name="metadata-complete" type="xsd:boolean"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="attributes"> + <xsd:annotation> + <xsd:documentation> + + This element contains the entity field or property mappings. + It may be sparsely populated to include only a subset of the + fields or properties. If metadata-complete for the entity is true + then the remainder of the attributes will be defaulted according + to the default rules. + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:choice> + <xsd:element name="id" type="orm:id" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="embedded-id" type="orm:embedded-id" + minOccurs="0"/> + </xsd:choice> + <xsd:element name="basic" type="orm:basic" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="version" type="orm:version" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="many-to-one" type="orm:many-to-one" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="one-to-many" type="orm:one-to-many" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="one-to-one" type="orm:one-to-one" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="many-to-many" type="orm:many-to-many" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="embedded" type="orm:embedded" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="transient" type="orm:transient" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:simpleType name="access-type"> + <xsd:annotation> + <xsd:documentation> + + This element determines how the persistence provider accesses the + state of an entity or embedded object. + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="PROPERTY"/> + <xsd:enumeration value="FIELD"/> + </xsd:restriction> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:complexType name="entity-listeners"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface EntityListeners { + Class[] value(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="entity-listener" type="orm:entity-listener" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="entity-listener"> + <xsd:annotation> + <xsd:documentation> + + Defines an entity listener to be invoked at lifecycle events + for the entities that list this listener. + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/> + <xsd:element name="post-persist" type="orm:post-persist" + minOccurs="0"/> + <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/> + <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/> + <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/> + <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/> + <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="class" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="pre-persist"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PrePersist {} + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="method-name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="post-persist"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PostPersist {} + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="method-name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="pre-remove"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PreRemove {} + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="method-name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="post-remove"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PostRemove {} + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="method-name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="pre-update"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PreUpdate {} + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="method-name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="post-update"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PostUpdate {} + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="method-name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="post-load"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PostLoad {} + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="method-name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="query-hint"> + <xsd:annotation> + <xsd:documentation> + + @Target({}) @Retention(RUNTIME) + public @interface QueryHint { + String name(); + String value(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="value" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="named-query"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface NamedQuery { + String name(); + String query(); + QueryHint[] hints() default {}; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="query" type="xsd:string"/> + <xsd:element name="hint" type="orm:query-hint" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="named-native-query"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface NamedNativeQuery { + String name(); + String query(); + QueryHint[] hints() default {}; + Class resultClass() default void.class; + String resultSetMapping() default ""; //named SqlResultSetMapping + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="query" type="xsd:string"/> + <xsd:element name="hint" type="orm:query-hint" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="result-class" type="xsd:string"/> + <xsd:attribute name="result-set-mapping" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="sql-result-set-mapping"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface SqlResultSetMapping { + String name(); + EntityResult[] entities() default {}; + ColumnResult[] columns() default {}; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="entity-result" type="orm:entity-result" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="column-result" type="orm:column-result" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="entity-result"> + <xsd:annotation> + <xsd:documentation> + + @Target({}) @Retention(RUNTIME) + public @interface EntityResult { + Class entityClass(); + FieldResult[] fields() default {}; + String discriminatorColumn() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="field-result" type="orm:field-result" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="entity-class" type="xsd:string" use="required"/> + <xsd:attribute name="discriminator-column" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="field-result"> + <xsd:annotation> + <xsd:documentation> + + @Target({}) @Retention(RUNTIME) + public @interface FieldResult { + String name(); + String column(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="column" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="column-result"> + <xsd:annotation> + <xsd:documentation> + + @Target({}) @Retention(RUNTIME) + public @interface ColumnResult { + String name(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="table"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface Table { + String name() default ""; + String catalog() default ""; + String schema() default ""; + UniqueConstraint[] uniqueConstraints() default {}; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="unique-constraint" type="orm:unique-constraint" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="catalog" type="xsd:string"/> + <xsd:attribute name="schema" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="secondary-table"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface SecondaryTable { + String name(); + String catalog() default ""; + String schema() default ""; + PrimaryKeyJoinColumn[] pkJoinColumns() default {}; + UniqueConstraint[] uniqueConstraints() default {}; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="primary-key-join-column" + type="orm:primary-key-join-column" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="unique-constraint" type="orm:unique-constraint" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="catalog" type="xsd:string"/> + <xsd:attribute name="schema" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="unique-constraint"> + <xsd:annotation> + <xsd:documentation> + + @Target({}) @Retention(RUNTIME) + public @interface UniqueConstraint { + String[] columnNames(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="column-name" type="xsd:string" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="column"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Column { + String name() default ""; + boolean unique() default false; + boolean nullable() default true; + boolean insertable() default true; + boolean updatable() default true; + String columnDefinition() default ""; + String table() default ""; + int length() default 255; + int precision() default 0; // decimal precision + int scale() default 0; // decimal scale + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="unique" type="xsd:boolean"/> + <xsd:attribute name="nullable" type="xsd:boolean"/> + <xsd:attribute name="insertable" type="xsd:boolean"/> + <xsd:attribute name="updatable" type="xsd:boolean"/> + <xsd:attribute name="column-definition" type="xsd:string"/> + <xsd:attribute name="table" type="xsd:string"/> + <xsd:attribute name="length" type="xsd:int"/> + <xsd:attribute name="precision" type="xsd:int"/> + <xsd:attribute name="scale" type="xsd:int"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="join-column"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface JoinColumn { + String name() default ""; + String referencedColumnName() default ""; + boolean unique() default false; + boolean nullable() default true; + boolean insertable() default true; + boolean updatable() default true; + String columnDefinition() default ""; + String table() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="referenced-column-name" type="xsd:string"/> + <xsd:attribute name="unique" type="xsd:boolean"/> + <xsd:attribute name="nullable" type="xsd:boolean"/> + <xsd:attribute name="insertable" type="xsd:boolean"/> + <xsd:attribute name="updatable" type="xsd:boolean"/> + <xsd:attribute name="column-definition" type="xsd:string"/> + <xsd:attribute name="table" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:simpleType name="generation-type"> + <xsd:annotation> + <xsd:documentation> + + public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO }; + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="TABLE"/> + <xsd:enumeration value="SEQUENCE"/> + <xsd:enumeration value="IDENTITY"/> + <xsd:enumeration value="AUTO"/> + </xsd:restriction> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:complexType name="attribute-override"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface AttributeOverride { + String name(); + Column column(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="column" type="orm:column"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="association-override"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface AssociationOverride { + String name(); + JoinColumn[] joinColumns(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="join-column" type="orm:join-column" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="id-class"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface IdClass { + Class value(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="class" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="id"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Id {} + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="column" type="orm:column" + minOccurs="0"/> + <xsd:element name="generated-value" type="orm:generated-value" + minOccurs="0"/> + <xsd:element name="temporal" type="orm:temporal" + minOccurs="0"/> + <xsd:element name="table-generator" type="orm:table-generator" + minOccurs="0"/> + <xsd:element name="sequence-generator" type="orm:sequence-generator" + minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="embedded-id"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface EmbeddedId {} + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="attribute-override" type="orm:attribute-override" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="transient"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Transient {} + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="version"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Version {} + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="column" type="orm:column" minOccurs="0"/> + <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="basic"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Basic { + FetchType fetch() default EAGER; + boolean optional() default true; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="column" type="orm:column" minOccurs="0"/> + <xsd:choice> + <xsd:element name="lob" type="orm:lob" minOccurs="0"/> + <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/> + <xsd:element name="enumerated" type="orm:enumerated" minOccurs="0"/> + </xsd:choice> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="fetch" type="orm:fetch-type"/> + <xsd:attribute name="optional" type="xsd:boolean"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:simpleType name="fetch-type"> + <xsd:annotation> + <xsd:documentation> + + public enum FetchType { LAZY, EAGER }; + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="LAZY"/> + <xsd:enumeration value="EAGER"/> + </xsd:restriction> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:complexType name="lob"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Lob {} + + </xsd:documentation> + </xsd:annotation> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:simpleType name="temporal"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Temporal { + TemporalType value(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="orm:temporal-type"/> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:simpleType name="temporal-type"> + <xsd:annotation> + <xsd:documentation> + + public enum TemporalType { + DATE, // java.sql.Date + TIME, // java.sql.Time + TIMESTAMP // java.sql.Timestamp + } + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="DATE"/> + <xsd:enumeration value="TIME"/> + <xsd:enumeration value="TIMESTAMP"/> + </xsd:restriction> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:simpleType name="enumerated"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Enumerated { + EnumType value() default ORDINAL; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="orm:enum-type"/> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:simpleType name="enum-type"> + <xsd:annotation> + <xsd:documentation> + + public enum EnumType { + ORDINAL, + STRING + } + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="ORDINAL"/> + <xsd:enumeration value="STRING"/> + </xsd:restriction> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:complexType name="many-to-one"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface ManyToOne { + Class targetEntity() default void.class; + CascadeType[] cascade() default {}; + FetchType fetch() default EAGER; + boolean optional() default true; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:choice> + <xsd:element name="join-column" type="orm:join-column" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="join-table" type="orm:join-table" + minOccurs="0"/> + </xsd:choice> + <xsd:element name="cascade" type="orm:cascade-type" + minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="target-entity" type="xsd:string"/> + <xsd:attribute name="fetch" type="orm:fetch-type"/> + <xsd:attribute name="optional" type="xsd:boolean"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="cascade-type"> + <xsd:annotation> + <xsd:documentation> + + public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH}; + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="cascade-all" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="cascade-persist" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="cascade-merge" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="cascade-remove" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="cascade-refresh" type="orm:emptyType" + minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="one-to-one"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface OneToOne { + Class targetEntity() default void.class; + CascadeType[] cascade() default {}; + FetchType fetch() default EAGER; + boolean optional() default true; + String mappedBy() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:choice> + <xsd:element name="primary-key-join-column" + type="orm:primary-key-join-column" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="join-column" type="orm:join-column" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="join-table" type="orm:join-table" + minOccurs="0"/> + </xsd:choice> + <xsd:element name="cascade" type="orm:cascade-type" + minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="target-entity" type="xsd:string"/> + <xsd:attribute name="fetch" type="orm:fetch-type"/> + <xsd:attribute name="optional" type="xsd:boolean"/> + <xsd:attribute name="mapped-by" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="one-to-many"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface OneToMany { + Class targetEntity() default void.class; + CascadeType[] cascade() default {}; + FetchType fetch() default LAZY; + String mappedBy() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="order-by" type="orm:order-by" + minOccurs="0"/> + <xsd:element name="map-key" type="orm:map-key" + minOccurs="0"/> + <xsd:choice> + <xsd:element name="join-table" type="orm:join-table" + minOccurs="0"/> + <xsd:element name="join-column" type="orm:join-column" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + <xsd:element name="cascade" type="orm:cascade-type" + minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="target-entity" type="xsd:string"/> + <xsd:attribute name="fetch" type="orm:fetch-type"/> + <xsd:attribute name="mapped-by" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="join-table"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface JoinTable { + String name() default ""; + String catalog() default ""; + String schema() default ""; + JoinColumn[] joinColumns() default {}; + JoinColumn[] inverseJoinColumns() default {}; + UniqueConstraint[] uniqueConstraints() default {}; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="join-column" type="orm:join-column" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="inverse-join-column" type="orm:join-column" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="unique-constraint" type="orm:unique-constraint" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="catalog" type="xsd:string"/> + <xsd:attribute name="schema" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="many-to-many"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface ManyToMany { + Class targetEntity() default void.class; + CascadeType[] cascade() default {}; + FetchType fetch() default LAZY; + String mappedBy() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="order-by" type="orm:order-by" + minOccurs="0"/> + <xsd:element name="map-key" type="orm:map-key" + minOccurs="0"/> + <xsd:element name="join-table" type="orm:join-table" + minOccurs="0"/> + <xsd:element name="cascade" type="orm:cascade-type" + minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="target-entity" type="xsd:string"/> + <xsd:attribute name="fetch" type="orm:fetch-type"/> + <xsd:attribute name="mapped-by" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="generated-value"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface GeneratedValue { + GenerationType strategy() default AUTO; + String generator() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="strategy" type="orm:generation-type"/> + <xsd:attribute name="generator" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="map-key"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface MapKey { + String name() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:simpleType name="order-by"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface OrderBy { + String value() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:complexType name="inheritance"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface Inheritance { + InheritanceType strategy() default SINGLE_TABLE; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="strategy" type="orm:inheritance-type"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:simpleType name="inheritance-type"> + <xsd:annotation> + <xsd:documentation> + + public enum InheritanceType + { SINGLE_TABLE, JOINED, TABLE_PER_CLASS}; + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="SINGLE_TABLE"/> + <xsd:enumeration value="JOINED"/> + <xsd:enumeration value="TABLE_PER_CLASS"/> + </xsd:restriction> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:simpleType name="discriminator-value"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface DiscriminatorValue { + String value(); + } + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:simpleType name="discriminator-type"> + <xsd:annotation> + <xsd:documentation> + + public enum DiscriminatorType { STRING, CHAR, INTEGER }; + + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="STRING"/> + <xsd:enumeration value="CHAR"/> + <xsd:enumeration value="INTEGER"/> + </xsd:restriction> + </xsd:simpleType> + + <!-- **************************************************** --> + + <xsd:complexType name="primary-key-join-column"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface PrimaryKeyJoinColumn { + String name() default ""; + String referencedColumnName() default ""; + String columnDefinition() default ""; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="referenced-column-name" type="xsd:string"/> + <xsd:attribute name="column-definition" type="xsd:string"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="discriminator-column"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE}) @Retention(RUNTIME) + public @interface DiscriminatorColumn { + String name() default "DTYPE"; + DiscriminatorType discriminatorType() default STRING; + String columnDefinition() default ""; + int length() default 31; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="discriminator-type" type="orm:discriminator-type"/> + <xsd:attribute name="column-definition" type="xsd:string"/> + <xsd:attribute name="length" type="xsd:int"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="embeddable"> + <xsd:annotation> + <xsd:documentation> + + Defines the settings and mappings for embeddable objects. Is + allowed to be sparsely populated and used in conjunction with + the annotations. Alternatively, the metadata-complete attribute + can be used to indicate that no annotations are to be processed + in the class. If this is the case then the defaulting rules will + be recursively applied. + + @Target({TYPE}) @Retention(RUNTIME) + public @interface Embeddable {} + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="description" type="xsd:string" minOccurs="0"/> + <xsd:element name="attributes" type="orm:embeddable-attributes" + minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="class" type="xsd:string" use="required"/> + <xsd:attribute name="access" type="orm:access-type"/> + <xsd:attribute name="metadata-complete" type="xsd:boolean"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="embeddable-attributes"> + <xsd:sequence> + <xsd:element name="basic" type="orm:basic" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="transient" type="orm:transient" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="embedded"> + <xsd:annotation> + <xsd:documentation> + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Embedded {} + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="attribute-override" type="orm:attribute-override" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="mapped-superclass"> + <xsd:annotation> + <xsd:documentation> + + Defines the settings and mappings for a mapped superclass. Is + allowed to be sparsely populated and used in conjunction with + the annotations. Alternatively, the metadata-complete attribute + can be used to indicate that no annotations are to be processed + If this is the case then the defaulting rules will be recursively + applied. + + @Target(TYPE) @Retention(RUNTIME) + public @interface MappedSuperclass{} + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="description" type="xsd:string" minOccurs="0"/> + <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/> + <xsd:element name="exclude-default-listeners" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="exclude-superclass-listeners" type="orm:emptyType" + minOccurs="0"/> + <xsd:element name="entity-listeners" type="orm:entity-listeners" + minOccurs="0"/> + <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/> + <xsd:element name="post-persist" type="orm:post-persist" + minOccurs="0"/> + <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/> + <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/> + <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/> + <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/> + <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/> + <xsd:element name="attributes" type="orm:attributes" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="class" type="xsd:string" use="required"/> + <xsd:attribute name="access" type="orm:access-type"/> + <xsd:attribute name="metadata-complete" type="xsd:boolean"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="sequence-generator"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface SequenceGenerator { + String name(); + String sequenceName() default ""; + int initialValue() default 1; + int allocationSize() default 50; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="sequence-name" type="xsd:string"/> + <xsd:attribute name="initial-value" type="xsd:int"/> + <xsd:attribute name="allocation-size" type="xsd:int"/> + </xsd:complexType> + + <!-- **************************************************** --> + + <xsd:complexType name="table-generator"> + <xsd:annotation> + <xsd:documentation> + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface TableGenerator { + String name(); + String table() default ""; + String catalog() default ""; + String schema() default ""; + String pkColumnName() default ""; + String valueColumnName() default ""; + String pkColumnValue() default ""; + int initialValue() default 0; + int allocationSize() default 50; + UniqueConstraint[] uniqueConstraints() default {}; + } + + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="unique-constraint" type="orm:unique-constraint" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="table" type="xsd:string"/> + <xsd:attribute name="catalog" type="xsd:string"/> + <xsd:attribute name="schema" type="xsd:string"/> + <xsd:attribute name="pk-column-name" type="xsd:string"/> + <xsd:attribute name="value-column-name" type="xsd:string"/> + <xsd:attribute name="pk-column-value" type="xsd:string"/> + <xsd:attribute name="initial-value" type="xsd:int"/> + <xsd:attribute name="allocation-size" type="xsd:int"/> + </xsd:complexType> + +</xsd:schema> + + Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-15 16:31:35 UTC (rev 9748) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-15 22:46:15 UTC (rev 9749) @@ -18,6 +18,7 @@ import javax.persistence.SecondaryTables; import javax.persistence.Table; import javax.persistence.UniqueConstraint; +import javax.persistence.PrimaryKeyJoinColumns; import org.dom4j.Attribute; import org.dom4j.Element; @@ -53,6 +54,8 @@ annotationToXml.put( Table.class, "table" ); annotationToXml.put( SecondaryTable.class, "secondary-table" ); annotationToXml.put( SecondaryTables.class, "secondary-table" ); + annotationToXml.put( PrimaryKeyJoinColumn.class, "primary-key-join-column" ); + annotationToXml.put( PrimaryKeyJoinColumns.class, "primary-key-join-column" ); } private XMLContext xmlContext; @@ -140,6 +143,8 @@ if ( current != null ) annotationList.add( current ); current = getSecondaryTables( tree, defaults ); if ( current != null ) annotationList.add( current ); + current = getPrimaryKeyJoinColumns( tree, defaults ); + if ( current != null ) annotationList.add( current ); this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] ); } else if ( propertyName != null ) { @@ -152,6 +157,28 @@ } } + private PrimaryKeyJoinColumns getPrimaryKeyJoinColumns(Element element, XMLContext.Default defaults) { + PrimaryKeyJoinColumn[] columns = buildPrimaryKeyJoinColumns( element ); + if (columns.length == 0 && ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) { + PrimaryKeyJoinColumn annotation = super.getAnnotation( PrimaryKeyJoinColumn.class ); + if (annotation != null) { + columns = new PrimaryKeyJoinColumn[] { annotation }; + } + else { + PrimaryKeyJoinColumns annotations = super.getAnnotation( PrimaryKeyJoinColumns.class ); + columns = annotations != null ? annotations.value() : columns; + } + } + if (columns.length > 0) { + AnnotationDescriptor ad = new AnnotationDescriptor( PrimaryKeyJoinColumns.class ); + ad.setValue( "value", columns ); + return AnnotationFactory.create( ad ); + } + else { + return null; + } + } + private Entity getEntity(Element tree, XMLContext.Default defaults) { if ( tree == null ) { return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( Entity.class ) : null; @@ -278,7 +305,7 @@ annotation.setValue( "schema", defaults.getSchema() ); } buildUniqueConstraints( annotation, element ); - buildPrimaryKeyJoinColumns( annotation, element ); + annotation.setValue( "pkJoinColumns", buildPrimaryKeyJoinColumns(element) ); secondaryTables.add( (SecondaryTable) AnnotationFactory.create( annotation ) ); } /* @@ -356,7 +383,8 @@ annotation.setValue( "uniqueConstraints", uniqueConstraints ); } - private void buildPrimaryKeyJoinColumns(AnnotationDescriptor annotation, Element element) { + private PrimaryKeyJoinColumn[] buildPrimaryKeyJoinColumns(Element element) { + if (element == null) return new PrimaryKeyJoinColumn[] {}; List pkJoinColumnElementList = element.elements( "primary-key-join-column" ); PrimaryKeyJoinColumn[] pkJoinColumns = new PrimaryKeyJoinColumn[ pkJoinColumnElementList.size() ]; int index = 0; @@ -378,7 +406,7 @@ } pkJoinColumns[index++] = AnnotationFactory.create( pkAnn ); } - annotation.setValue( "pkJoinColumns", pkJoinColumns ); + return pkJoinColumns; } private void copyAttribute(AnnotationDescriptor annotation, Element element, String attributeName) { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-15 16:31:35 UTC (rev 9748) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-15 22:46:15 UTC (rev 9749) @@ -12,6 +12,8 @@ import javax.persistence.MappedSuperclass; import javax.persistence.SecondaryTables; import javax.persistence.SecondaryTable; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.PrimaryKeyJoinColumns; import junit.framework.TestCase; import org.hibernate.util.XMLHelper; @@ -59,6 +61,10 @@ ); reader = new EJB3OverridenAnnotationReader(Competition.class, context); assertNotNull( reader.getAnnotation( MappedSuperclass.class) ); + reader = new EJB3OverridenAnnotationReader(TennisMatch.class, context); + assertNull( "Mutualize PKJC into PKJCs", reader.getAnnotation( PrimaryKeyJoinColumn.class) ); + assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class) ); + assertEquals( "PrimaryKeyJoinColumn overrden", "id", reader.getAnnotation( PrimaryKeyJoinColumns.class).value()[0].name() ); } public void testEntityRelatedAnnotationsMetadataComplete() throws Exception { @@ -74,6 +80,11 @@ assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() ); assertEquals( "Overriding not taken into account", "myschema", reader.getAnnotation( Table.class ).schema() ); assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() ); + assertNull( "Ignore Java annotation", read... [truncated message content] |
Author: epbernard Date: 2006-04-15 12:31:35 -0400 (Sat, 15 Apr 2006) New Revision: 9748 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Administration.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Competition.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/XMLContextTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml Removed: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java Log: Starting support for XML file overriding Deleted: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java 2006-04-13 12:14:07 UTC (rev 9747) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java 2006-04-15 16:31:35 UTC (rev 9748) @@ -1,103 +0,0 @@ -package org.hibernate.reflection.java; - -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; -import java.util.Map; -import java.util.HashMap; -import java.util.List; -import java.util.ArrayList; - -import javax.persistence.Entity; -import javax.persistence.MappedSuperclass; -import javax.persistence.Embeddable; - -import org.dom4j.Element; -import org.hibernate.annotationfactory.AnnotationDescriptor; -import org.hibernate.annotationfactory.AnnotationFactory; -import org.hibernate.reflection.java.xml.XMLContext; - -/** - * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor. - * - * @author Paolo Perrotta - * @author Davide Marchignoli - */ -class EJB3ClassAnnotationReader extends JavaAnnotationReader { - private XMLContext xmlContext; - private String className; - private static final Map<Class, String> annotationToXml; - - static { - annotationToXml = new HashMap<Class, String>(); - annotationToXml.put(Entity.class, "entity"); - annotationToXml.put(MappedSuperclass.class, "mapped-superclass"); - annotationToXml.put(Embeddable.class, "embeddable"); - } - - public EJB3ClassAnnotationReader( AnnotatedElement el, XMLContext xmlContext ) { - super( el ); - this.xmlContext = xmlContext; - if (el instanceof Class) { - Class clazz = (Class) el; - className = clazz.getName(); - } - } - - public <T extends Annotation> T getAnnotation(Class<T> annotationType) { - - return super.getAnnotation( annotationType ); - } - - public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) { - return super.isAnnotationPresent( annotationType ); - } - - public Annotation[] getAnnotations() { - XMLContext.Default defaults = xmlContext.getDefault(className); - Element tree = xmlContext.getXMLTree( className, null); - Annotation[] annotations = super.getAnnotations(); - List<Annotation> annotationList = new ArrayList<Annotation>(annotations.length + 5); - for (Annotation annotation : annotations) { - if (! annotationToXml.containsKey( annotation ) ) { - //unknown annotations are left over - annotationList.add(annotation); - } - } - Annotation current = getEntity(tree, defaults); - if (current != null) annotationList.add(current); - return super.getAnnotations(); - } - - private Entity getEntity(Element tree, XMLContext.Default defaults) { - if (tree == null) { - return Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( Entity.class ) : null; - } - else { - if ( "entity".equals( tree.getName() ) ) { - AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class ); - entity.setValue( "name", tree.attributeValue( "name", "" ) ); - return AnnotationFactory.create( entity ); - } - else { - return null; //this is not an entity - } - } - } - - private Annotation getTopLevelElement(Class<Annotation> annotation, Element tree, XMLContext.Default defaults) { - if (tree == null) { - return getAnnotation( annotation ); - } - else { - if ( tree.getName().equals( annotationToXml.get( annotation ) ) ) { - //TODO resume *********************************** - return null; - } - else { - return null; //this is not an entity - } - } - } - - -} Copied: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java (from rev 9709, trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java) =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java 2006-03-29 03:32:24 UTC (rev 9709) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-15 16:31:35 UTC (rev 9748) @@ -0,0 +1,387 @@ +package org.hibernate.reflection.java; + +import java.beans.Introspector; +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import javax.persistence.Embeddable; +import javax.persistence.Entity; +import javax.persistence.MappedSuperclass; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.SecondaryTable; +import javax.persistence.SecondaryTables; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +import org.dom4j.Attribute; +import org.dom4j.Element; +import org.hibernate.annotationfactory.AnnotationDescriptor; +import org.hibernate.annotationfactory.AnnotationFactory; +import org.hibernate.reflection.Filter; +import org.hibernate.reflection.java.xml.XMLContext; +import org.hibernate.util.StringHelper; + +/** + * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor. + * + * @author Paolo Perrotta + * @author Davide Marchignoli + */ +public class EJB3OverridenAnnotationReader extends JavaAnnotationReader { + private static final Map<Class, String> annotationToXml; + private static final Filter FILTER = new Filter() { + public boolean returnStatic() { + return false; + } + + public boolean returnTransient() { + return false; + } + }; + + static { + annotationToXml = new HashMap<Class, String>(); + annotationToXml.put( Entity.class, "entity" ); + annotationToXml.put( MappedSuperclass.class, "mapped-superclass" ); + annotationToXml.put( Embeddable.class, "embeddable" ); + annotationToXml.put( Table.class, "table" ); + annotationToXml.put( SecondaryTable.class, "secondary-table" ); + annotationToXml.put( SecondaryTables.class, "secondary-table" ); + } + + private XMLContext xmlContext; + private String className; + private String propertyName; + private boolean isFieldAccess; + private transient Annotation[] annotations; + + public EJB3OverridenAnnotationReader(AnnotatedElement el, XMLContext xmlContext) { + super( el ); + this.xmlContext = xmlContext; + if ( el instanceof Class ) { + Class clazz = (Class) el; + className = clazz.getName(); + } + else if ( el instanceof Field ) { + propertyName = ( (Field) el ).getName(); + isFieldAccess = true; + } + else if ( el instanceof Method ) { + Method method = (Method) el; + propertyName = method.getName(); + if ( JavaXProperty.isProperty( + method, + null, //this is yukky!! we'd rather get the TypeEnvironment() + FILTER + ) ) { + if ( propertyName.startsWith( "get" ) ) { + propertyName = Introspector.decapitalize( propertyName.substring( "get".length() ) ); + } + if ( propertyName.startsWith( "is" ) ) { + propertyName = Introspector.decapitalize( propertyName.substring( "is".length() ) ); + } + throw new RuntimeException( "Method " + propertyName + " is not a property getter" ); + } + isFieldAccess = true; + } + else { + className = null; + propertyName = null; + } + } + + public <T extends Annotation> T getAnnotation(Class<T> annotationType) { + initAnnotations(); + for ( Annotation annotation : annotations ) { + if ( annotation.annotationType().equals( annotationType ) ) return (T) annotation; + } + return null; + } + + public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) { + initAnnotations(); + for ( Annotation annotation : annotations ) { + if ( annotation.getClass().equals( annotationType ) ) return true; + } + return false; + } + + public Annotation[] getAnnotations() { + initAnnotations(); + return annotations; + } + + private void initAnnotations() { + if ( annotations == null ) { + XMLContext.Default defaults = xmlContext.getDefault( className ); + if ( className != null ) { + Element tree = xmlContext.getXMLTree( className, null ); + Annotation[] annotations = super.getAnnotations(); + List<Annotation> annotationList = new ArrayList<Annotation>( annotations.length + 5 ); + for ( Annotation annotation : annotations ) { + if ( ! annotationToXml.containsKey( annotation.annotationType() ) ) { + //unknown annotations are left over + annotationList.add( annotation ); + } + } + Annotation current = getEntity( tree, defaults ); + if ( current != null ) annotationList.add( current ); + current = getMappedSuperclass( tree, defaults ); + if ( current != null ) annotationList.add( current ); + current = getEmbeddable( tree, defaults ); + if ( current != null ) annotationList.add( current ); + current = getTable( tree, defaults ); + if ( current != null ) annotationList.add( current ); + current = getSecondaryTables( tree, defaults ); + if ( current != null ) annotationList.add( current ); + this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] ); + } + else if ( propertyName != null ) { + //TODO do it + this.annotations = super.getAnnotations(); + } + else { + this.annotations = super.getAnnotations(); + } + } + } + + private Entity getEntity(Element tree, XMLContext.Default defaults) { + if ( tree == null ) { + return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( Entity.class ) : null; + } + else { + if ( "entity".equals( tree.getName() ) ) { + AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class ); + copyAttribute( entity, tree, "name" ); + if ( ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) + && StringHelper.isEmpty( (String) entity.valueOf( "name" ) ) ) { + Entity javaAnn = super.getAnnotation( Entity.class ); + if ( javaAnn != null ) entity.setValue( "name", javaAnn.name() ); + } + return AnnotationFactory.create( entity ); + } + else { + return null; //this is not an entity + } + } + } + + private MappedSuperclass getMappedSuperclass(Element tree, XMLContext.Default defaults) { + if ( tree == null ) { + return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( + MappedSuperclass.class + ) : null; + } + else { + if ( "mapped-superclass".equals( tree.getName() ) ) { + AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class ); + return AnnotationFactory.create( entity ); + } + else { + return null; //this is not an entity + } + } + } + + private Embeddable getEmbeddable(Element tree, XMLContext.Default defaults) { + if ( tree == null ) { + return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( + Embeddable.class + ) : null; + } + else { + if ( "embeddable".equals( tree.getName() ) ) { + AnnotationDescriptor entity = new AnnotationDescriptor( Embeddable.class ); + return AnnotationFactory.create( entity ); + } + else { + return null; //this is not an entity + } + } + } + + private Table getTable(Element tree, XMLContext.Default defaults) { + Element subelement = tree == null ? null : tree.element( "table" ); + if ( subelement == null ) { + //no element but might have some default or some annotation + if ( StringHelper.isNotEmpty( defaults.getCatalog() ) + || StringHelper.isNotEmpty( defaults.getSchema() ) ) { + AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class ); + if ( ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) { + Table table = super.getAnnotation( Table.class ); + if ( table != null ) { + annotation.setValue( "name", table.name() ); + annotation.setValue( "schema", table.schema() ); + annotation.setValue( "catalog", table.catalog() ); + annotation.setValue( "uniqueConstraints", table.uniqueConstraints() ); + } + } + if ( StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) + && StringHelper.isNotEmpty( defaults.getSchema() ) ) { + annotation.setValue( "schema", defaults.getSchema() ); + } + if ( StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) + && StringHelper.isNotEmpty( defaults.getCatalog() ) ) { + annotation.setValue( "catalog", defaults.getCatalog() ); + } + return AnnotationFactory.create( annotation ); + } + else if ( ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) { + return super.getAnnotation( Table.class ); + } + else { + return null; + } + } + else { + //ignore java annotation, an element is defined + AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class ); + copyAttribute( annotation, subelement, "name" ); + copyAttribute( annotation, subelement, "catalog" ); + if ( StringHelper.isNotEmpty( defaults.getCatalog() ) + && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) { + annotation.setValue( "catalog", defaults.getCatalog() ); + } + copyAttribute( annotation, subelement, "schema" ); + if ( StringHelper.isNotEmpty( defaults.getSchema() ) + && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) { + annotation.setValue( "schema", defaults.getSchema() ); + } + buildUniqueConstraints( annotation, subelement ); + return AnnotationFactory.create( annotation ); + } + } + + private SecondaryTables getSecondaryTables(Element tree, XMLContext.Default defaults) { + List<Element> elements = tree == null ? + new ArrayList<Element>() : + (List<Element>) tree.elements( "secondary-table" ); + List<SecondaryTable> secondaryTables = new ArrayList<SecondaryTable>( 3 ); + for ( Element element : elements ) { + AnnotationDescriptor annotation = new AnnotationDescriptor( SecondaryTable.class ); + copyAttribute( annotation, element, "name" ); + copyAttribute( annotation, element, "catalog" ); + if ( StringHelper.isNotEmpty( defaults.getCatalog() ) + && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) { + annotation.setValue( "catalog", defaults.getCatalog() ); + } + copyAttribute( annotation, element, "schema" ); + if ( StringHelper.isNotEmpty( defaults.getSchema() ) + && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) { + annotation.setValue( "schema", defaults.getSchema() ); + } + buildUniqueConstraints( annotation, element ); + buildPrimaryKeyJoinColumns( annotation, element ); + secondaryTables.add( (SecondaryTable) AnnotationFactory.create( annotation ) ); + } + /* + * You can't have both secondary table in XML and Java, + * since there would be no way to "remove" a secondary table + */ + if ( secondaryTables.size() == 0 && ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) { + SecondaryTable secTableAnn = super.getAnnotation( SecondaryTable.class ); + overridesDefaultInSecondaryTable( secTableAnn, defaults, secondaryTables ); + SecondaryTables secTablesAnn = super.getAnnotation( SecondaryTables.class ); + if (secTablesAnn != null) { + for ( SecondaryTable table : secTablesAnn.value() ) { + overridesDefaultInSecondaryTable( table, defaults, secondaryTables ); + } + } + } + if (secondaryTables.size() > 0) { + AnnotationDescriptor descriptor = new AnnotationDescriptor( SecondaryTables.class ); + descriptor.setValue( "value", secondaryTables.toArray( new SecondaryTable[secondaryTables.size()] ) ); + return AnnotationFactory.create( descriptor ); + } + else { + return null; + } + } + + private void overridesDefaultInSecondaryTable( + SecondaryTable secTableAnn, XMLContext.Default defaults, List<SecondaryTable> secondaryTables + ) { + if ( secTableAnn != null ) { + //handle default values + if ( StringHelper.isNotEmpty( defaults.getCatalog() ) + || StringHelper.isNotEmpty( defaults.getSchema() ) ) { + AnnotationDescriptor annotation = new AnnotationDescriptor( SecondaryTable.class ); + annotation.setValue( "name", secTableAnn.name() ); + annotation.setValue( "schema", secTableAnn.schema() ); + annotation.setValue( "catalog", secTableAnn.catalog() ); + annotation.setValue( "uniqueConstraints", secTableAnn.uniqueConstraints() ); + annotation.setValue( "pkJoinColumns", secTableAnn.pkJoinColumns() ); + if ( StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) + && StringHelper.isNotEmpty( defaults.getSchema() ) ) { + annotation.setValue( "schema", defaults.getSchema() ); + } + if ( StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) + && StringHelper.isNotEmpty( defaults.getCatalog() ) ) { + annotation.setValue( "catalog", defaults.getCatalog() ); + } + secondaryTables.add( (SecondaryTable) AnnotationFactory.create( annotation ) ); + } + else { + secondaryTables.add( secTableAnn ); + } + } + } + + private void buildUniqueConstraints(AnnotationDescriptor annotation, Element element) { + List uniqueConstraintElementList = element.elements( "unique-constraint" ); + UniqueConstraint[] uniqueConstraints = new UniqueConstraint[ uniqueConstraintElementList.size() ]; + int ucIndex = 0; + Iterator ucIt = uniqueConstraintElementList.listIterator(); + while ( ucIt.hasNext() ) { + Element subelement = (Element) ucIt.next(); + List<Element> columnNamesElements = subelement.elements( "column-name" ); + String[] columnNames = new String[columnNamesElements.size()]; + int columnNameIndex = 0; + Iterator it = columnNamesElements.listIterator(); + while ( it.hasNext() ) { + Element columnNameElt = (Element) it.next(); + columnNames[columnNameIndex++] = columnNameElt.getTextTrim(); + } + AnnotationDescriptor ucAnn = new AnnotationDescriptor( UniqueConstraint.class ); + ucAnn.setValue( "columnNames", columnNames ); + uniqueConstraints[ucIndex++] = AnnotationFactory.create( ucAnn ); + } + annotation.setValue( "uniqueConstraints", uniqueConstraints ); + } + + private void buildPrimaryKeyJoinColumns(AnnotationDescriptor annotation, Element element) { + List pkJoinColumnElementList = element.elements( "primary-key-join-column" ); + PrimaryKeyJoinColumn[] pkJoinColumns = new PrimaryKeyJoinColumn[ pkJoinColumnElementList.size() ]; + int index = 0; + Iterator pkIt = pkJoinColumnElementList.listIterator(); + while ( pkIt.hasNext() ) { + Element subelement = (Element) pkIt.next(); + AnnotationDescriptor pkAnn = new AnnotationDescriptor( PrimaryKeyJoinColumn.class ); + Attribute attribute = subelement.attribute( "name" ); + if ( attribute != null ) { + pkAnn.setValue( "name", attribute.getValue() ); + } + attribute = subelement.attribute( "referenced-column-name" ); + if ( attribute != null ) { + pkAnn.setValue( "referencedColumnName", attribute.getValue() ); + } + attribute = subelement.attribute( "column-definition" ); + if ( attribute != null ) { + pkAnn.setValue( "columnDefinition", attribute.getValue() ); + } + pkJoinColumns[index++] = AnnotationFactory.create( pkAnn ); + } + annotation.setValue( "pkJoinColumns", pkJoinColumns ); + } + + private void copyAttribute(AnnotationDescriptor annotation, Element element, String attributeName) { + annotation.setValue( attributeName, element.attributeValue( attributeName, "" ) ); + } +} Property changes on: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-04-13 12:14:07 UTC (rev 9747) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-04-15 16:31:35 UTC (rev 9748) @@ -23,7 +23,6 @@ public void addDocument(Document doc) { Element root = doc.getRootElement(); - //global defaults Element metadata = root.element( "persistence-unit-metadata" ); if (metadata != null) { @@ -35,15 +34,17 @@ null ); Element defaultElement = metadata.element( "persistence-unit-defaults" ); - Element unitElement = defaultElement.element( "schema" ); - globalDefaults.setSchema( unitElement != null ? unitElement.getTextTrim() : null ); - unitElement = defaultElement.element( "catalog" ); - globalDefaults.setCatalog( unitElement != null ? unitElement.getTextTrim() : null ); - unitElement = defaultElement.element( "access" ); - globalDefaults.setAccess( unitElement != null ? unitElement.getTextTrim() : null ); - unitElement = defaultElement.element( "cascade-persist" ); - globalDefaults.setCascadePersist( unitElement != null ? Boolean.TRUE : null ); - //TODO entity listeners + if ( defaultElement != null ) { + Element unitElement = defaultElement.element( "schema" ); + globalDefaults.setSchema( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = defaultElement.element( "catalog" ); + globalDefaults.setCatalog( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = defaultElement.element( "access" ); + globalDefaults.setAccess( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = defaultElement.element( "cascade-persist" ); + globalDefaults.setCascadePersist( unitElement != null ? Boolean.TRUE : null ); + //TODO entity listeners + } } else { log.warn("Found more than one <persistence-unit-metadata>, ignored"); Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Administration.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Administration.java 2006-04-13 12:14:07 UTC (rev 9747) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Administration.java 2006-04-15 16:31:35 UTC (rev 9748) @@ -0,0 +1,44 @@ +//$Id: $ +package org.hibernate.test.reflection.java.xml; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.SecondaryTable; + +/** + * @author Emmanuel Bernard + */ +@Entity(name="JavaAdministration") +@Table(name="JavaAdministration") +@SecondaryTable(name="Extend") +public class Administration { + @Id private Integer id; + private String firstname; + private String lastname; + private String address; + + public String getFirstname() { + return firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Competition.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Competition.java 2006-04-13 12:14:07 UTC (rev 9747) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Competition.java 2006-04-15 16:31:35 UTC (rev 9748) @@ -0,0 +1,11 @@ +//$Id: $ +package org.hibernate.test.reflection.java.xml; + +import javax.persistence.MappedSuperclass; + +/** + * @author Emmanuel Bernard + */ +@MappedSuperclass +public class Competition { +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-13 12:14:07 UTC (rev 9747) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-15 16:31:35 UTC (rev 9748) @@ -0,0 +1,108 @@ +//$Id: $ +package org.hibernate.test.reflection.java.xml; + +import java.io.InputStream; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; + +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.persistence.MappedSuperclass; +import javax.persistence.SecondaryTables; +import javax.persistence.SecondaryTable; + +import junit.framework.TestCase; +import org.hibernate.util.XMLHelper; +import org.hibernate.reflection.java.xml.XMLContext; +import org.hibernate.reflection.java.EJB3OverridenAnnotationReader; +import org.hibernate.cfg.EJB3DTDEntityResolver; +import org.dom4j.io.SAXReader; +import org.dom4j.DocumentException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + + +/** + * @author Emmanuel Bernard + */ +public class EJB3OverridenAnnotationReaderTest extends TestCase { + public void testEntityRelatedAnnotations() throws Exception { + XMLContext context = buildContext("org/hibernate/test/reflection/java/xml/orm.xml"); + EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader(Administration.class, context); + assertNotNull( reader.getAnnotation( Entity.class) ); + assertEquals( "Default value in xml entity should not override @Entity.name", "JavaAdministration", reader.getAnnotation( Entity.class).name() ); + assertNotNull( reader.getAnnotation( Table.class) ); + assertEquals( "@Table not overriden", "tbl_admin", reader.getAnnotation( Table.class ).name() ); + assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() ); + assertEquals( "Proper @Table.uniqueConstraints", 2, reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames().length ); + String columnName = reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames()[0]; + assertTrue( "Proper @Table.uniqueConstraints", "firstname".equals( columnName ) || "lastname".equals( columnName ) ); + assertNull( "Both Java and XML used", reader.getAnnotation( SecondaryTable.class) ); + assertNotNull( "XML does not work", reader.getAnnotation( SecondaryTables.class) ); + SecondaryTable[] tables = reader.getAnnotation( SecondaryTables.class).value(); + assertEquals( 1, tables.length ); + assertEquals( "admin2", tables[0].name() ); + assertEquals( "unique constraints ignored", 1, tables[0].uniqueConstraints().length ); + assertEquals( "pk join column ignored", 1, tables[0].pkJoinColumns().length ); + assertEquals( "pk join column ignored", "admin_id", tables[0].pkJoinColumns()[0].name() ); + reader = new EJB3OverridenAnnotationReader(Match.class, context); + assertNotNull( reader.getAnnotation( Table.class) ); + assertEquals( "Java annotation not taken into account", "matchtable", reader.getAnnotation( Table.class ).name() ); + assertEquals( "Java annotation not taken into account", "matchschema", reader.getAnnotation( Table.class ).schema() ); + assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() ); + assertNotNull( "SecondaryTable swallowed", reader.getAnnotation( SecondaryTables.class ) ); + assertEquals( "Default schema not taken into account", "myschema", + reader.getAnnotation( SecondaryTables.class ).value()[0].schema() + ); + reader = new EJB3OverridenAnnotationReader(Competition.class, context); + assertNotNull( reader.getAnnotation( MappedSuperclass.class) ); + } + + public void testEntityRelatedAnnotationsMetadataComplete() throws Exception { + XMLContext context = buildContext("org/hibernate/test/reflection/java/xml/metadata-complete.xml"); + EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader(Administration.class, context); + assertNotNull( reader.getAnnotation( Entity.class) ); + assertEquals( "Metadata complete should ignore java annotations", "", reader.getAnnotation( Entity.class).name() ); + assertNotNull( reader.getAnnotation( Table.class) ); + assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() ); + assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() ); + reader = new EJB3OverridenAnnotationReader(Match.class, context); + assertNotNull( reader.getAnnotation( Table.class) ); + assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() ); + assertEquals( "Overriding not taken into account", "myschema", reader.getAnnotation( Table.class ).schema() ); + assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() ); + reader = new EJB3OverridenAnnotationReader(Competition.class, context); + assertNull( reader.getAnnotation( MappedSuperclass.class) ); + } + + private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException { + XMLHelper xmlHelper = new XMLHelper(); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + InputStream is = cl.getResourceAsStream( ormfile ); + assertNotNull( "ORM.xml not found: " + ormfile, is ); + XMLContext context = new XMLContext(); + List errors = new ArrayList(); + SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, EJB3DTDEntityResolver.INSTANCE ); + //saxReader.setValidation( false ); + try { + saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true ); + } + catch (SAXNotSupportedException e) { + saxReader.setValidation( false ); + } + org.dom4j.Document doc; + try { + doc = saxReader + .read( new InputSource( new BufferedInputStream( is ) ) ); + } + finally { + is.close(); + } + assertEquals( 0, errors.size() ); + context.addDocument( doc ); + return context; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java 2006-04-13 12:14:07 UTC (rev 9747) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java 2006-04-15 16:31:35 UTC (rev 9748) @@ -0,0 +1,15 @@ +//$Id: $ +package org.hibernate.test.reflection.java.xml; + +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.persistence.SecondaryTable; + +/** + * @author Emmanuel Bernard + */ +@Entity +@Table(name="matchtable", schema = "matchschema") +@SecondaryTable(name="extendedMatch") +public class Match extends Competition { +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/XMLContextTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/XMLContextTest.java 2006-04-13 12:14:07 UTC (rev 9747) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/XMLContextTest.java 2006-04-15 16:31:35 UTC (rev 9748) @@ -0,0 +1,53 @@ +//$Id: $ +package org.hibernate.test.reflection.java.xml; + +import java.io.BufferedInputStream; +import java.io.InputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import junit.framework.TestCase; +import org.dom4j.io.SAXReader; +import org.hibernate.cfg.EJB3DTDEntityResolver; +import org.hibernate.reflection.java.xml.XMLContext; +import org.hibernate.util.XMLHelper; +import org.xml.sax.InputSource; +import org.xml.sax.SAXNotSupportedException; + +/** + * @author Emmanuel Bernard + */ +public class XMLContextTest extends TestCase { + public void testAll() throws Exception { + XMLHelper xmlHelper = new XMLHelper(); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + InputStream is = cl.getResourceAsStream( "org/hibernate/test/reflection/java/xml/orm.xml" ); + assertNotNull( "ORM.xml not found", is ); + XMLContext context = new XMLContext(); + List errors = new ArrayList(); + SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, EJB3DTDEntityResolver.INSTANCE ); + //saxReader.setValidation( false ); + try { + saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true ); + } + catch (SAXNotSupportedException e) { + saxReader.setValidation( false ); + } + org.dom4j.Document doc; + try { + doc = saxReader + .read( new InputSource( new BufferedInputStream( is ) ) ); + } + finally { + try { + is.close(); + } + catch (IOException ioe) { + //log.warn( "Could not close input stream", ioe ); + } + } + assertEquals( 0, errors.size() ); + context.addDocument( doc ); + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml 2006-04-13 12:14:07 UTC (rev 9747) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml 2006-04-15 16:31:35 UTC (rev 9748) @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd" + version="1.0" +> + <persistence-unit-metadata> + <xml-mapping-metadata-complete/> + <persistence-unit-defaults> + <schema>myschema</schema> + <catalog>mycatalog</catalog> + <cascade-persist/> + </persistence-unit-defaults> + </persistence-unit-metadata> + <package>org.hibernate.test.reflection.java.xml</package> + <entity class="Administration"> + </entity> + <entity class="Match"> + </entity> +</entity-mappings> \ No newline at end of file Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-13 12:14:07 UTC (rev 9747) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-15 16:31:35 UTC (rev 9748) @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd" + version="1.0" +> + <persistence-unit-metadata> + <persistence-unit-defaults> + <schema>myschema</schema> + <catalog>mycatalog</catalog> + <cascade-persist/> + </persistence-unit-defaults> + </persistence-unit-metadata> + <package>org.hibernate.test.reflection.java.xml</package> + <entity class="Administration"> + <table name="tbl_admin"> + <unique-constraint> + <column-name>firstname</column-name> + <column-name>lastname</column-name> + </unique-constraint> + </table> + <secondary-table name="admin2"> + <primary-key-join-column name="admin_id" referenced-column-name="id"/> + <unique-constraint> + <column-name>address</column-name> + </unique-constraint> + </secondary-table> + </entity> + <entity class="Match"> + </entity> +</entity-mappings> \ No newline at end of file |
From: <hib...@li...> - 2006-04-13 12:14:10
|
Author: ste...@jb... Date: 2006-04-13 08:14:07 -0400 (Thu, 13 Apr 2006) New Revision: 9747 Modified: branches/HQL_ANTLR_2/Hibernate3/etc/hibernate.properties Log: removed timesten not supported comment Modified: branches/HQL_ANTLR_2/Hibernate3/etc/hibernate.properties =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/etc/hibernate.properties 2006-04-13 12:13:37 UTC (rev 9746) +++ branches/HQL_ANTLR_2/Hibernate3/etc/hibernate.properties 2006-04-13 12:14:07 UTC (rev 9747) @@ -73,7 +73,7 @@ #hibernate.connection.username db2 #hibernate.connection.password db2 -## TimesTen (not supported yet) +## TimesTen #hibernate.dialect org.hibernate.dialect.TimesTenDialect #hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver |
From: <hib...@li...> - 2006-04-13 12:13:40
|
Author: ste...@jb... Date: 2006-04-13 08:13:37 -0400 (Thu, 13 Apr 2006) New Revision: 9746 Modified: branches/Branch_3_1/Hibernate3/etc/hibernate.properties Log: removed timesten not supported comment Modified: branches/Branch_3_1/Hibernate3/etc/hibernate.properties =================================================================== --- branches/Branch_3_1/Hibernate3/etc/hibernate.properties 2006-04-13 12:12:54 UTC (rev 9745) +++ branches/Branch_3_1/Hibernate3/etc/hibernate.properties 2006-04-13 12:13:37 UTC (rev 9746) @@ -73,7 +73,7 @@ #hibernate.connection.username db2 #hibernate.connection.password db2 -## TimesTen (not supported yet) +## TimesTen #hibernate.dialect org.hibernate.dialect.TimesTenDialect #hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver |
From: <hib...@li...> - 2006-04-13 12:13:00
|
Author: ste...@jb... Date: 2006-04-13 08:12:54 -0400 (Thu, 13 Apr 2006) New Revision: 9745 Modified: trunk/Hibernate3/etc/hibernate.properties Log: removed timesten not supported comment Modified: trunk/Hibernate3/etc/hibernate.properties =================================================================== --- trunk/Hibernate3/etc/hibernate.properties 2006-04-13 12:12:00 UTC (rev 9744) +++ trunk/Hibernate3/etc/hibernate.properties 2006-04-13 12:12:54 UTC (rev 9745) @@ -73,7 +73,7 @@ #hibernate.connection.username db2 #hibernate.connection.password db2 -## TimesTen (not supported yet) +## TimesTen #hibernate.dialect org.hibernate.dialect.TimesTenDialect #hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver @@ -96,7 +96,7 @@ #hibernate.connection.url jdbc:as400://systemname -## Derby +## Derby (not supported!) #hibernate.dialect org.hibernate.dialect.DerbyDialect #hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver |
From: <hib...@li...> - 2006-04-13 12:12:04
|
Author: ste...@jb... Date: 2006-04-13 08:12:00 -0400 (Thu, 13 Apr 2006) New Revision: 9744 Modified: trunk/Hibernate3/etc/hibernate.properties Log: removed timesten not supported comment Modified: trunk/Hibernate3/etc/hibernate.properties =================================================================== --- trunk/Hibernate3/etc/hibernate.properties 2006-04-12 20:22:04 UTC (rev 9743) +++ trunk/Hibernate3/etc/hibernate.properties 2006-04-13 12:12:00 UTC (rev 9744) @@ -96,7 +96,7 @@ #hibernate.connection.url jdbc:as400://systemname -## Derby (Not supported!) +## Derby #hibernate.dialect org.hibernate.dialect.DerbyDialect #hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver |
Author: pgmjsd Date: 2006-04-12 09:12:03 -0400 (Wed, 12 Apr 2006) New Revision: 9742 Added: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/HqlResolver.java branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/HqlResolverASTFactory.java branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/RangeNode.java branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/ResolverContext.java branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/ResolverContextImpl.java branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/StatementNode.java Removed: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java Modified: branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java Log: Moved the resolver stuff into it's own package. The unit test now resolves 'FROM Animal'. Modified: branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g 2006-04-12 13:12:03 UTC (rev 9742) @@ -40,34 +40,13 @@ { private static Log log = LogFactory.getLog( HqlBaseResolver.class ); - private int level = 0; - private List inputContext = new ArrayList(); - private List outputContext = new ArrayList(); + // Semantic action methods, overridden in subclasses for clarity. - protected void pushContext(AST outputAst,AST inputAst) { - level++; - inputContext.add(inputAst); - outputContext.add(outputAst); - if (log.isDebugEnabled()) { - log.debug("Pushed context: level = " + level + " input is " + inputAst.toStringTree()); - } - } + protected void pushContext(AST outputAst,AST inputAst) { } - protected void popContext() { - level--; - AST n = (AST)inputContext.remove(inputContext.size() - 1); - outputContext.remove(outputContext.size() - 1); - if (log.isDebugEnabled()) { - log.debug("Popped context: level = " + level + " input was " + n.toStringTree()); - } - } + protected void popContext() { } - protected AST getCurrentContext(boolean input) { - return (AST)((input) ? inputContext.get(inputContext.size() - 1) - : outputContext.get(outputContext.size() - 1)); - } - - protected int getLevel() { return level; } + protected void defineRange(AST range,String path,AST alias, AST fetch) { } } // The main statement rule. @@ -120,8 +99,15 @@ : #(f:FROM { pushContext(#fromClause,f); } ( range | join | filter ) * ) ; +// Antlr note: The '!' prevents the automatic creation of the output AST, so the semantic action can do it. range - : #(RANGE path (ALIAS)? (FETCH)? ) + { + String p = ""; + } + : #(RANGE p=pathAsString! (a:ALIAS!)? (f:FETCH!)? ) + { + defineRange(#range,p,a,f); // Set up the output tree. + } ; join @@ -178,6 +164,20 @@ | #(DOT path identifier) ; +// Matches a path and returns the normalized string for the path (usually +// fully qualified a class name). +pathAsString returns [String p] { + p = "???"; + String x = "?x?"; + } + : a:identifier { p = a.getText(); } + | #(DOT x=pathAsString y:identifier) { + StringBuffer buf = new StringBuffer(); + buf.append(x).append(".").append(y.getText()); + p = buf.toString(); + } + ; + identifier : (IDENT | WEIRD_IDENT) ; Deleted: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -1,16 +0,0 @@ -package org.hibernate.hql.ast; - -import org.hibernate.hql.antlr.HqlBaseResolver; - -/** - * Implements the methods for the HqlBaseResolver. - * <br>User: Joshua Davis - * Date: Apr 1, 2006 - * Time: 7:40:42 AM - */ -public class HqlResolver extends HqlBaseResolver { - public HqlResolver() { - super(); - setASTFactory(new HqlResolverASTFactory()); // Create nodes that track line and column number. - } -} Deleted: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -1,24 +0,0 @@ -package org.hibernate.hql.ast; - -import org.hibernate.hql.antlr.HqlRTokenTypes; -import org.hibernate.hql.ast.tree.StatementNode; - -/** - * AST factory for the resolver phase. - * <br>User: Joshua Davis - * Date: Apr 3, 2006 - * Time: 7:58:16 AM - */ -public class HqlResolverASTFactory extends HqlASTFactory implements HqlRTokenTypes { - public Class getASTNodeType(int tokenType) { - // Statement nodes: - switch (tokenType) { - case QUERY : - case UPDATE: - case DELETE: - case INSERT: - return StatementNode.class; - } - return super.getASTNodeType(tokenType); - } -} Copied: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/HqlResolver.java (from rev 9741, branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java) =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/HqlResolver.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -0,0 +1,68 @@ +package org.hibernate.hql.ast.resolve; + +import org.hibernate.hql.antlr.HqlBaseResolver; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import java.util.List; +import java.util.ArrayList; + +import antlr.collections.AST; + +/** + * Implements the methods for the HqlBaseResolver. + * <br>User: Joshua Davis + * Date: Apr 1, 2006 + * Time: 7:40:42 AM + */ +public class HqlResolver extends HqlBaseResolver { + private static Log log = LogFactory.getLog( HqlResolver.class ); + + private int level = 0; + private List inputContext = new ArrayList(); + private List outputContext = new ArrayList(); + private ResolverContext context; // Provides acces to the session factory via an interface. + + public HqlResolver() { + super(); + setASTFactory(new HqlResolverASTFactory()); // Create nodes that track line and column number. + } + + + protected void pushContext(AST outputAst,AST inputAst) { + level++; + inputContext.add(inputAst); + outputContext.add(outputAst); + if (log.isDebugEnabled()) { + log.debug("Pushed context: level = " + level + " input is " + inputAst.toStringTree()); + } + } + + protected void popContext() { + level--; + AST n = (AST)inputContext.remove(inputContext.size() - 1); + outputContext.remove(outputContext.size() - 1); + if (log.isDebugEnabled()) { + log.debug("Popped context: level = " + level + " input was " + n.toStringTree()); + } + } + + protected AST getCurrentContext(boolean input) { + return (AST)((input) ? inputContext.get(inputContext.size() - 1) + : outputContext.get(outputContext.size() - 1)); + } + + protected int getLevel() { return level; } + + protected void defineRange(AST range, String path, AST alias, AST fetch) { + RangeNode r = (RangeNode) range; + r.setPath(path); + r.setPersister(context.lookupPersister(path)); + r.setFetch(fetch != null); + r.setAlias(alias != null ? alias.getText() : null); + } + + public void initialize(ResolverContext resolverContext) { + context = resolverContext; + } +} Copied: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/HqlResolverASTFactory.java (from rev 9741, branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java) =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/HqlResolverASTFactory.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -0,0 +1,26 @@ +package org.hibernate.hql.ast.resolve; + +import org.hibernate.hql.antlr.HqlRTokenTypes; +import org.hibernate.hql.ast.HqlASTFactory; + +/** + * AST factory for the resolver phase. + * <br>User: Joshua Davis + * Date: Apr 3, 2006 + * Time: 7:58:16 AM + */ +public class HqlResolverASTFactory extends HqlASTFactory implements HqlRTokenTypes { + public Class getASTNodeType(int tokenType) { + // Statement nodes: + switch (tokenType) { + case QUERY : + case UPDATE: + case DELETE: + case INSERT: + return StatementNode.class; + case RANGE: + return RangeNode.class; + } + return super.getASTNodeType(tokenType); + } +} Added: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/RangeNode.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/RangeNode.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/RangeNode.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -0,0 +1,64 @@ +package org.hibernate.hql.ast.resolve; + +import org.hibernate.hql.ast.tree.Node; +import org.hibernate.hql.ast.tree.DisplayableNode; +import org.hibernate.persister.entity.EntityPersister; + +/** + * Represents an element of a FROM clause, e.g. "from Animal a" + * <br>User: Joshua Davis + * Date: Apr 12, 2006 + * Time: 7:31:17 AM + */ +public class RangeNode extends Node implements DisplayableNode { + private String path; + private String alias; + private EntityPersister persister; + private boolean fetch = false; + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public EntityPersister getPersister() { + return persister; + } + + public void setPersister(EntityPersister persister) { + this.persister = persister; + } + + public boolean isFetch() { + return fetch; + } + + public void setFetch(boolean fetch) { + this.fetch = fetch; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + + public String toString() { + return "RangeNode{" + + "path='" + path + '\'' + + ", alias='" + alias + '\'' + + ", persister=" + persister + + ", fetch=" + fetch + + '}'; + } + + public String getDisplayText() { + return toString(); + } +} Added: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/ResolverContext.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/ResolverContext.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/ResolverContext.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -0,0 +1,13 @@ +package org.hibernate.hql.ast.resolve; + +import org.hibernate.persister.entity.EntityPersister; + +/** + * Looks up persisters and other things by name. + * <br>User: Joshua Davis + * Date: Apr 12, 2006 + * Time: 7:34:11 AM + */ +public interface ResolverContext { + EntityPersister lookupPersister(String path); +} Added: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/ResolverContextImpl.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/ResolverContextImpl.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/ResolverContextImpl.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -0,0 +1,36 @@ +package org.hibernate.hql.ast.resolve; + +import org.hibernate.engine.SessionFactoryImplementor; +import org.hibernate.MappingException; +import org.hibernate.persister.entity.EntityPersister; + +/** + * Implements the resolver's context with a session factory. + * <br>User: Joshua Davis + * Date: Apr 12, 2006 + * Time: 7:35:31 AM + */ +public class ResolverContextImpl implements ResolverContext { + private SessionFactoryImplementor sfi; + + public ResolverContextImpl(SessionFactoryImplementor sfi) { + this.sfi = sfi; + } + + public EntityPersister lookupPersister(String name) { + // First, try to get the persister using the class name directly. + try { + return sfi.getEntityPersister( name ); + } + catch ( MappingException ignore ) { + // unable to locate it using this name + } + + // If that didn't work, try using the 'import' name. + String importedClassName = sfi.getImportedClassName( name ); + if ( importedClassName == null ) { + return null; + } + return sfi.getEntityPersister( importedClassName ); + } +} Copied: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/StatementNode.java (from rev 9741, branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java) =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/resolve/StatementNode.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -0,0 +1,12 @@ +package org.hibernate.hql.ast.resolve; + +import org.hibernate.hql.ast.tree.Node; + +/** + * Represents a statement (SELECT, UPDATE, INSERT, DELETE) in the resolved HQL tree. + * <br>User: Joshua Davis + * Date: Apr 3, 2006 + * Time: 8:00:55 AM + */ +public class StatementNode extends Node { +} Deleted: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -1,10 +0,0 @@ -package org.hibernate.hql.ast.tree; - -/** - * Represents a statement (SELECT, UPDATE, INSERT, DELETE) in the resolved HQL tree. - * <br>User: Joshua Davis - * Date: Apr 3, 2006 - * Time: 8:00:55 AM - */ -public class StatementNode extends Node { -} Modified: branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java 2006-04-11 11:57:40 UTC (rev 9741) +++ branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java 2006-04-12 13:12:03 UTC (rev 9742) @@ -4,12 +4,14 @@ import antlr.TokenStreamException; import antlr.collections.AST; import junit.framework.Test; -import junit.framework.TestCase; import junit.framework.TestSuite; import org.hibernate.hql.antlr.HqlRTokenTypes; -import org.hibernate.hql.ast.HqlResolver; -import org.hibernate.hql.ast.tree.StatementNode; +import org.hibernate.hql.ast.resolve.HqlResolver; +import org.hibernate.hql.ast.resolve.StatementNode; +import org.hibernate.hql.ast.resolve.ResolverContextImpl; import org.hibernate.hql.ast.util.ASTPrinter; +import org.hibernate.test.TestCase; +import org.hibernate.engine.SessionFactoryImplementor; /** * Tests the new HQL resolver phase. @@ -24,7 +26,6 @@ super(n); } - public void testSimpleHql() throws Exception { // First, get an AST by parsing some HQL text. AST ast = resolve("from Animal"); @@ -38,13 +39,67 @@ // Now, pass it though the resolver phase, which yeilds // a processed HQL AST. HqlResolver resolver = new HqlResolver(); + ResolverContextImpl context = new ResolverContextImpl(getSessionFactoryImplementor()); + resolver.initialize(context); // Give the resolver a fake context. resolver.statement(hqlAst); AST resolvedHql = resolver.getAST(); - System.out.println(hqlrPrinter.showAsString(resolvedHql,"Resolved AST : " + resolvedHql.toStringTree() + "" )); + System.out.println(hqlrPrinter.showAsString(resolvedHql, + "Resolved AST : " + resolvedHql.toStringTree() + "" )); return resolvedHql; } + protected SessionFactoryImplementor getSessionFactoryImplementor() { + SessionFactoryImplementor factory = ( SessionFactoryImplementor ) getSessions(); + if ( factory == null ) { + throw new NullPointerException( "Unable to create factory!" ); + } + return factory; + } + public static Test suite() { return new TestSuite(HqlResolverTest.class); } + + protected String[] getMappings() { + return new String[]{ + "hql/Animal.hbm.xml", + "hql/EntityWithCrazyCompositeKey.hbm.xml", + "batchfetch/ProductLine.hbm.xml", + "cid/Customer.hbm.xml", + "cid/Order.hbm.xml", + "cid/LineItem.hbm.xml", + "cid/Product.hbm.xml", + "legacy/Baz.hbm.xml", + "legacy/Category.hbm.xml", + "legacy/Commento.hbm.xml", + "legacy/Container.hbm.xml", + "legacy/Custom.hbm.xml", + "legacy/Eye.hbm.xml", + "legacy/Fee.hbm.xml", + "legacy/FooBar.hbm.xml", + "legacy/Fum.hbm.xml", + "legacy/Glarch.hbm.xml", + "legacy/Holder.hbm.xml", + "legacy/Many.hbm.xml", + "legacy/Marelo.hbm.xml", + "legacy/MasterDetail.hbm.xml", + "legacy/Middle.hbm.xml", + "legacy/Multi.hbm.xml", + "legacy/Nameable.hbm.xml", + "legacy/One.hbm.xml", + "legacy/Qux.hbm.xml", + "legacy/Simple.hbm.xml", + "legacy/SingleSeveral.hbm.xml", + "legacy/WZ.hbm.xml", + "legacy/UpDown.hbm.xml", + "compositeelement/Parent.hbm.xml", + "onetoone/joined/Person.hbm.xml", + "hql/CrazyIdFieldNames.hbm.xml" + }; + } + + protected boolean recreateSchema() { + // we do not need to create the schema for these parser tests + return false; + } } |
Author: pgmjsd Date: 2006-04-11 07:57:40 -0400 (Tue, 11 Apr 2006) New Revision: 9741 Added: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java Modified: branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java Log: Added a node factory to the new tree parser. Added simple context push and pop actions. Modified: branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g 2006-04-07 17:55:45 UTC (rev 9740) +++ branches/HQL_ANTLR_2/Hibernate3/grammar/hql-resolve.g 2006-04-11 11:57:40 UTC (rev 9741) @@ -3,6 +3,7 @@ // $Id:$ package org.hibernate.hql.antlr; +import java.util.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; } @@ -38,6 +39,35 @@ // -- Declarations -- { private static Log log = LogFactory.getLog( HqlBaseResolver.class ); + + private int level = 0; + private List inputContext = new ArrayList(); + private List outputContext = new ArrayList(); + + protected void pushContext(AST outputAst,AST inputAst) { + level++; + inputContext.add(inputAst); + outputContext.add(outputAst); + if (log.isDebugEnabled()) { + log.debug("Pushed context: level = " + level + " input is " + inputAst.toStringTree()); + } + } + + protected void popContext() { + level--; + AST n = (AST)inputContext.remove(inputContext.size() - 1); + outputContext.remove(outputContext.size() - 1); + if (log.isDebugEnabled()) { + log.debug("Popped context: level = " + level + " input was " + n.toStringTree()); + } + } + + protected AST getCurrentContext(boolean input) { + return (AST)((input) ? inputContext.get(inputContext.size() - 1) + : outputContext.get(outputContext.size() - 1)); + } + + protected int getLevel() { return level; } } // The main statement rule. @@ -52,15 +82,18 @@ ; updateStatement - : #(UPDATE (VERSIONED)? fromClause setClause (whereClause)? ) + : #(UPDATE (VERSIONED)? fromClause setClause (whereClause)? + { popContext(); } ) ; deleteStatement - : #(DELETE fromClause (whereClause)? ) + : #(DELETE fromClause (whereClause)? + { popContext(); } ) ; insertStatement - : #(INSERT intoClause query ) + : #(INSERT intoClause query + { popContext(); } ) ; query @@ -73,6 +106,7 @@ (whereClause)? (groupClause)? (orderClause)? + { popContext(); } ) ; @@ -83,11 +117,29 @@ // -- Language sub-elements -- fromClause - : #(FROM (subtree)* ) + : #(f:FROM { pushContext(#fromClause,f); } ( range | join | filter ) * ) ; +range + : #(RANGE path (ALIAS)? (FETCH)? ) + ; + +join + : #(JOIN (joinType )? (FETCH)? propertyRef (ALIAS)? (FETCH)? (WITH)? ) + ; + +joinType + : ( (LEFT | RIGHT) (OUTER)? ) + | FULL + | INNER + ; + +filter + : fe:FILTER_ENTITY a:ALIAS + ; + intoClause - : #(INTO (subtree)* ) + : #(i:INTO { pushContext(#intoClause,i); } (subtree)* ) ; whereClause @@ -106,6 +158,30 @@ : #(SET (subtree)* ) ; + +propertyRef + : #(DOT propertyRef propertyName ) + | identifier + ; + +propertyName + : identifier + | CLASS + | ELEMENTS + | INDICES + ; + +// Matches a path and returns the normalized string for the path (usually +// fully qualified a class name). +path + : identifier + | #(DOT path identifier) + ; + +identifier + : (IDENT | WEIRD_IDENT) + ; + // General subtree. Matches anything, copies the tree verbatim. subtree : #(. (subtree)*) Modified: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java 2006-04-07 17:55:45 UTC (rev 9740) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolver.java 2006-04-11 11:57:40 UTC (rev 9741) @@ -11,6 +11,6 @@ public class HqlResolver extends HqlBaseResolver { public HqlResolver() { super(); - setASTFactory(new HqlASTFactory()); // Create nodes that track line and column number. + setASTFactory(new HqlResolverASTFactory()); // Create nodes that track line and column number. } } Added: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java 2006-04-07 17:55:45 UTC (rev 9740) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/HqlResolverASTFactory.java 2006-04-11 11:57:40 UTC (rev 9741) @@ -0,0 +1,24 @@ +package org.hibernate.hql.ast; + +import org.hibernate.hql.antlr.HqlRTokenTypes; +import org.hibernate.hql.ast.tree.StatementNode; + +/** + * AST factory for the resolver phase. + * <br>User: Joshua Davis + * Date: Apr 3, 2006 + * Time: 7:58:16 AM + */ +public class HqlResolverASTFactory extends HqlASTFactory implements HqlRTokenTypes { + public Class getASTNodeType(int tokenType) { + // Statement nodes: + switch (tokenType) { + case QUERY : + case UPDATE: + case DELETE: + case INSERT: + return StatementNode.class; + } + return super.getASTNodeType(tokenType); + } +} Added: branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java 2006-04-07 17:55:45 UTC (rev 9740) +++ branches/HQL_ANTLR_2/Hibernate3/src/org/hibernate/hql/ast/tree/StatementNode.java 2006-04-11 11:57:40 UTC (rev 9741) @@ -0,0 +1,10 @@ +package org.hibernate.hql.ast.tree; + +/** + * Represents a statement (SELECT, UPDATE, INSERT, DELETE) in the resolved HQL tree. + * <br>User: Joshua Davis + * Date: Apr 3, 2006 + * Time: 8:00:55 AM + */ +public class StatementNode extends Node { +} Modified: branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java =================================================================== --- branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java 2006-04-07 17:55:45 UTC (rev 9740) +++ branches/HQL_ANTLR_2/Hibernate3/test/org/hibernate/test/hql/HqlResolverTest.java 2006-04-11 11:57:40 UTC (rev 9741) @@ -1,19 +1,16 @@ package org.hibernate.test.hql; +import antlr.RecognitionException; +import antlr.TokenStreamException; +import antlr.collections.AST; +import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; -import junit.framework.Test; -import antlr.collections.AST; -import antlr.RecognitionException; -import antlr.TokenStreamException; +import org.hibernate.hql.antlr.HqlRTokenTypes; +import org.hibernate.hql.ast.HqlResolver; +import org.hibernate.hql.ast.tree.StatementNode; import org.hibernate.hql.ast.util.ASTPrinter; -import org.hibernate.hql.ast.HqlParser; -import org.hibernate.hql.ast.HqlResolver; -import org.hibernate.hql.antlr.HqlRTokenTypes; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; - /** * Tests the new HQL resolver phase. * <br>User: Joshua Davis @@ -30,13 +27,21 @@ public void testSimpleHql() throws Exception { // First, get an AST by parsing some HQL text. - AST hqlAst = HqlParserTest.doParse("from Foo f, Bar b where f.x.id = b.id",false); + AST ast = resolve("from Animal"); + // Assert: + // * The root node should be a statement. + assertTrue(ast instanceof StatementNode); + } + + private AST resolve(String hql) throws RecognitionException, TokenStreamException { + AST hqlAst = HqlParserTest.doParse(hql,false); // Now, pass it though the resolver phase, which yeilds // a processed HQL AST. HqlResolver resolver = new HqlResolver(); resolver.statement(hqlAst); AST resolvedHql = resolver.getAST(); System.out.println(hqlrPrinter.showAsString(resolvedHql,"Resolved AST : " + resolvedHql.toStringTree() + "" )); + return resolvedHql; } public static Test suite() { |
From: <hib...@li...> - 2006-04-07 17:55:53
|
Author: max...@jb... Date: 2006-04-07 13:55:45 -0400 (Fri, 07 Apr 2006) New Revision: 9740 Added: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.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/ReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java Log: use settings object instead of naive map. Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-04-07 17:53:03 UTC (rev 9739) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-04-07 17:55:45 UTC (rev 9740) @@ -455,8 +455,8 @@ Iterator columnIterator = table.getColumnIterator(); while(columnIterator.hasNext()) { Column column = (Column) columnIterator.next(); - Boolean useIt = revengStrategy.useColumnForOptimisticLock(identifier, column.getName()); - if(Boolean.TRUE==useIt && !processed.contains(column)) { + boolean useIt = revengStrategy.useColumnForOptimisticLock(identifier, column.getName()); + if(useIt && !processed.contains(column)) { bindVersionProperty( table, identifier, column, rc, processed, mapping ); return; } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.java 2006-04-07 17:53:03 UTC (rev 9739) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.java 2006-04-07 17:55:45 UTC (rev 9740) @@ -73,7 +73,6 @@ private boolean ignoreconfigxmlmapppings = true; // set to true and fk's that are part of a primary key will just be mapped as the raw value and as a readonly property. if false, it will be <many-to-one-key-property private boolean preferBasicCompositeIds = true; - private boolean scanForVersioningColumns = true; /** * If true, compositeid's will not create key-many-to-one and @@ -87,15 +86,7 @@ public void setPreferBasicCompositeIds(boolean flag) { preferBasicCompositeIds = flag; } - - public boolean scanForVersioningColumns() { - return scanForVersioningColumns; - } - - public void setScanForVersioningColumns(boolean scanForVersioningColumns) { - this.scanForVersioningColumns = scanForVersioningColumns; - } - + protected void parseMappingElement(Element subelement, String name) { if(!ignoreconfigxmlmapppings ) { super.parseMappingElement(subelement, name); Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-04-07 17:53:03 UTC (rev 9739) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-04-07 17:55:45 UTC (rev 9740) @@ -16,11 +16,11 @@ public class DefaultReverseEngineeringStrategy implements ReverseEngineeringStrategy { - Log log = LogFactory.getLog(DefaultReverseEngineeringStrategy.class); + static final private Log log = LogFactory.getLog(DefaultReverseEngineeringStrategy.class); - String packageName = ""; - private static Set AUTO_OPTIMISTICLOCK_COLUMNS; + + private ReverseEngineeringSettings settings; static { AUTO_OPTIMISTICLOCK_COLUMNS = new HashSet(); AUTO_OPTIMISTICLOCK_COLUMNS.add("version"); @@ -89,19 +89,6 @@ return propertyName; } - - public void setPackageName(String pkg) { - if(pkg==null) this.packageName = ""; - this.packageName = pkg.trim(); - } - - /** - * @return Returns the default packagename which will be used for class names returned by this namingstrategy. - */ - public String getPackageName() { - return packageName; - } - public String columnToHibernateTypeName(TableIdentifier table, String columnName, int sqlType, int length, int precision, int scale, boolean nullable, boolean generatedIdentifier) { String preferredHibernateType = JDBCToHibernateTypeHelper.getPreferredHibernateType(sqlType, length, precision, scale, nullable, generatedIdentifier); if(preferredHibernateType==null) { @@ -122,7 +109,7 @@ public String tableToClassName(TableIdentifier tableIdentifier) { - String pkgName = (packageName == null ? "" : packageName ); + String pkgName = settings.getDefaultPackageName(); String className = toUpperCamelCase( tableIdentifier.getName() ); if(pkgName.length()>0) { @@ -167,8 +154,12 @@ return null; } - public Boolean useColumnForOptimisticLock(TableIdentifier identifier, String column) { - return AUTO_OPTIMISTICLOCK_COLUMNS.contains(column.toLowerCase())?Boolean.TRUE:Boolean.FALSE; + public boolean useColumnForOptimisticLock(TableIdentifier identifier, String column) { + if(settings.hasDefaultOptimisticLockDetection()) { + return AUTO_OPTIMISTICLOCK_COLUMNS.contains(column.toLowerCase())?true:false; + } else { + return false; + } } public List getSchemaSelections() { @@ -198,5 +189,9 @@ public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { return true; } + + public void setSettings(ReverseEngineeringSettings settings) { + this.settings = settings; + } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-04-07 17:53:03 UTC (rev 9739) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-04-07 17:55:45 UTC (rev 9740) @@ -74,8 +74,8 @@ return delegate==null?null:delegate.getOptimisticLockColumnName(identifier); } - public Boolean useColumnForOptimisticLock(TableIdentifier identifier, String column) { - return delegate==null?null:delegate.useColumnForOptimisticLock(identifier, column); + public boolean useColumnForOptimisticLock(TableIdentifier identifier, String column) { + return delegate==null?false:delegate.useColumnForOptimisticLock(identifier, column); } public List getSchemaSelections() { @@ -104,6 +104,10 @@ public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { return delegate==null?true:delegate.isForeignKeyCollectionLazy(name, foreignKeyTable, columns, foreignKeyReferencedTable, referencedColumns); + } + + public void setSettings(ReverseEngineeringSettings settings) { + if(delegate!=null) delegate.setSettings(settings); } } Added: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java 2006-04-07 17:53:03 UTC (rev 9739) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java 2006-04-07 17:55:45 UTC (rev 9740) @@ -0,0 +1,44 @@ +package org.hibernate.cfg.reveng; + +public class ReverseEngineeringSettings { + + + //final ReverseEngineeringStrategy rootStrategy; + + String defaultPackageName = ""; + private boolean defaultOptimisticLockDetection = true; + + //public ReverseEngineeringSettings(ReverseEngineeringStrategy rootStrategy) { + // this.rootStrategy = rootStrategy; + //} + + public ReverseEngineeringSettings setDefaultPackageName(String defaultPackageName) { + if(defaultPackageName==null) { + this.defaultPackageName = ""; + } else { + this.defaultPackageName= defaultPackageName.trim(); + } + return this; + } + + /** return the default packageName. Never null, at least the empty string */ + public String getDefaultPackageName() { + return defaultPackageName; + } + + public boolean hasDefaultOptimisticLockDetection() { + return defaultOptimisticLockDetection ; + } + + public void setDefaultOptimisticLockDetection( + boolean optimisticLockSupportEnabled) { + this.defaultOptimisticLockDetection = optimisticLockSupportEnabled; + } + + + /** return the top/root strategy. Allows a lower strategy to ask another question. Dangerous to do since recursive loops can easily occur! */ + /*public ReverseEngineeringStrategy getRootStrategy() { + return rootStrategy; + }*/ + +} Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-04-07 17:53:03 UTC (rev 9739) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-04-07 17:55:45 UTC (rev 9740) @@ -9,7 +9,30 @@ public interface ReverseEngineeringStrategy { /** + * Generic method used to initialize the reverse engineering strategy. * + * @param settings used for this + */ + public void setSettings(ReverseEngineeringSettings settings); + + /** + * Configure the reverse engineering strategy. Called before reverse engineering commences. + * + * This is mainly for exotic strategies to get access to a connection. + * + * @param provider a connectionprovider. It is the responsibility of the metadatadialect to open/close any used connections via this provider. + * @param sec sqlexceptionConverter, use to convert any possible SQLExceptions. + */ + public void configure(ConnectionProvider provider, SQLExceptionConverter sec); + + + /** + * Close any resources this strategy might have used. Called after reverse engineering has been completed. + */ + public void close(); + + /** + * * @return a fully-qualified class name (must be aligned with tableToPackageName and tableToSimpleClassName) */ public String tableToClassName(TableIdentifier tableIdentifier); @@ -95,26 +118,11 @@ */ public String classNameToCompositeIdName(String className); - /** - * Configure the reverse engineering strategy. - * - * This is mainly for exotic strategies to get access to a connection. - * - * @param provider a connectionprovider. It is the responsibility of the metadatadialect to open/close any used connections via this provider. - * @param sec sqlexceptionConverter, use to convert any possible SQLExceptions. - */ - public void configure(ConnectionProvider provider, SQLExceptionConverter sec); - - - /** - * Close any resources this strategy might have used. - */ - public void close(); - + /** Return explicit which column name should be used for optimistic lock */ public String getOptimisticLockColumnName(TableIdentifier identifier); - public Boolean useColumnForOptimisticLock(TableIdentifier identifier, String column); + public boolean useColumnForOptimisticLock(TableIdentifier identifier, String column); /** return list of SchemaSelctors * Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java 2006-04-07 17:53:03 UTC (rev 9739) +++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java 2006-04-07 17:55:45 UTC (rev 9740) @@ -15,6 +15,7 @@ import org.hibernate.cfg.Settings; import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; import org.hibernate.cfg.reveng.OverrideRepository; +import org.hibernate.cfg.reveng.ReverseEngineeringSettings; import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; import org.hibernate.util.ReflectHelper; @@ -48,26 +49,28 @@ jmdc.setPreferBasicCompositeIds(preferBasicCompositeIds); DefaultReverseEngineeringStrategy defaultStrategy = new DefaultReverseEngineeringStrategy(); + ReverseEngineeringSettings qqsettings = new ReverseEngineeringSettings().setDefaultPackageName(packageName); + if(packageName!=null) { - defaultStrategy.setPackageName(packageName); + defaultStrategy.setSettings(qqsettings); } ReverseEngineeringStrategy strategy = defaultStrategy; if(revengFiles!=null) { - Settings settings = configuration.buildSettings(); OverrideRepository or = new OverrideRepository(); String[] fileNames = revengFiles.list(); for (int i = 0; i < fileNames.length; i++) { or.addFile(new File(fileNames[i]) ); } - strategy = or.getReverseEngineeringStrategy(defaultStrategy); + strategy = or.getReverseEngineeringStrategy(defaultStrategy); } if(reverseEngineeringStrategyClass!=null) { - strategy = loadreverseEngineeringStrategy(reverseEngineeringStrategyClass, strategy); + strategy = loadreverseEngineeringStrategy(reverseEngineeringStrategyClass, strategy); } + strategy.setSettings(qqsettings); jmdc.setReverseEngineeringStrategy(strategy); jmdc.readFromJDBC(); |
From: <hib...@li...> - 2006-04-07 17:53:14
|
Author: max...@jb... Date: 2006-04-07 13:53:03 -0400 (Fri, 07 Apr 2006) New Revision: 9739 Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/DefaultReverseEngineeringStrategyTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/PersistentClassesTest.java trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java Log: use settings object instead of naive map. Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/DefaultReverseEngineeringStrategyTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/DefaultReverseEngineeringStrategyTest.java 2006-04-07 12:25:55 UTC (rev 9738) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/DefaultReverseEngineeringStrategyTest.java 2006-04-07 17:53:03 UTC (rev 9739) @@ -116,8 +116,7 @@ public void testReservedKeywordsHandling() { assertEquals("class_", rns.columnToPropertyName(new TableIdentifier("blah"), "class")); } - - + public static Test suite() { return new TestSuite(DefaultReverseEngineeringStrategyTest.class); Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/PersistentClassesTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/PersistentClassesTest.java 2006-04-07 12:25:55 UTC (rev 9738) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/PersistentClassesTest.java 2006-04-07 17:53:03 UTC (rev 9739) @@ -15,6 +15,7 @@ import org.hibernate.Transaction; import org.hibernate.cfg.JDBCMetaDataConfiguration; import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; +import org.hibernate.cfg.reveng.ReverseEngineeringSettings; import org.hibernate.classic.Session; import org.hibernate.mapping.Collection; import org.hibernate.mapping.KeyValue; @@ -44,10 +45,10 @@ }; } - protected void configure(JDBCMetaDataConfiguration cfg) { + protected void configure(JDBCMetaDataConfiguration cfgToConfigure) { DefaultReverseEngineeringStrategy c = new DefaultReverseEngineeringStrategy(); - c.setPackageName("persistentclasses"); - cfg.setReverseEngineeringStrategy(c); + c.setSettings(new ReverseEngineeringSettings().setDefaultPackageName("persistentclasses")); + cfgToConfigure.setReverseEngineeringStrategy(c); } protected String[] getDropSQL() { Modified: trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-04-07 12:25:55 UTC (rev 9738) +++ trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-04-07 17:53:03 UTC (rev 9739) @@ -1,6 +1,7 @@ import java.util.List; import java.util.Properties; +import org.hibernate.cfg.reveng.ReverseEngineeringSettings; import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; import org.hibernate.cfg.reveng.TableIdentifier; import org.hibernate.connection.ConnectionProvider; @@ -90,9 +91,9 @@ return null; } - public Boolean useColumnForOptimisticLock(TableIdentifier identifier, String column) { + public boolean useColumnForOptimisticLock(TableIdentifier identifier, String column) { // TODO Auto-generated method stub - return null; + return false; } public boolean excludeColumn(TableIdentifier identifier, String columnName) { @@ -134,4 +135,9 @@ // TODO Auto-generated method stub return false; } + + public void setSettings(ReverseEngineeringSettings settings) { + // TODO Auto-generated method stub + + } } |
From: <hib...@li...> - 2006-04-07 12:25:59
|
Author: max...@jb... Date: 2006-04-07 08:25:55 -0400 (Fri, 07 Apr 2006) New Revision: 9738 Added: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml Log: HBX-615 exclude for <set> and <many-to-one> Added: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java 2006-04-07 12:24:37 UTC (rev 9737) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java 2006-04-07 12:25:55 UTC (rev 9738) @@ -0,0 +1,141 @@ +/* + * Created on 2004-12-01 + * + */ +package org.hibernate.tool.test.jdbc2cfg; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.hibernate.MappingException; +import org.hibernate.cfg.Environment; +import org.hibernate.cfg.JDBCMetaDataConfiguration; +import org.hibernate.cfg.Settings; +import org.hibernate.cfg.SettingsFactory; +import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; +import org.hibernate.cfg.reveng.OverrideRepository; +import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.Property; +import org.hibernate.mapping.SimpleValue; +import org.hibernate.tool.JDBCMetaDataBinderTestCase; + +/** + * @author max + * + */ +public class RevEngForeignKeyTests extends JDBCMetaDataBinderTestCase { + + private static final String OVERRIDETEST_FOREIGNKEY_XML = "org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml"; + + public static Test suite() { + return new TestSuite(RevEngForeignKeyTests.class); + } + + private Settings settings; + + public void testDefaultBiDirectional() { + + PersistentClass project = cfg.getClassMapping("Project"); + + assertNotNull(project.getProperty("worksOns")); + assertNotNull(project.getProperty("employee")); + assertEquals(3, project.getPropertyClosureSpan()); + assertEquals("projectId", project.getIdentifierProperty().getName()); + + PersistentClass employee = cfg.getClassMapping("Employee"); + + assertNotNull(employee.getProperty("worksOns")); + assertNotNull(employee.getProperty("employees")); + assertNotNull(employee.getProperty("employee")); + assertNotNull(employee.getProperty("projects")); + assertEquals(5, employee.getPropertyClosureSpan()); + assertEquals("id", employee.getIdentifierProperty().getName()); + + PersistentClass worksOn = cfg.getClassMapping("WorksOn"); + + assertNotNull(worksOn.getProperty("project")); + assertNotNull(worksOn.getProperty("employee")); + assertEquals(4, worksOn.getPropertyClosureSpan()); + assertEquals("id", worksOn.getIdentifierProperty().getName()); + + } + + public void testSetAndManyToOne() { + + OverrideRepository or = buildOverrideRepository(); + + or.addResource(OVERRIDETEST_FOREIGNKEY_XML); + ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy()); + + JDBCMetaDataConfiguration localCfg = new JDBCMetaDataConfiguration(); + localCfg.setReverseEngineeringStrategy(repository); + localCfg.readFromJDBC(); + + PersistentClass project = localCfg.getClassMapping("Project"); + + assertNotNull(project.getProperty("worksOns")); + assertPropertyNotExists(project, "employee", "should be removed by reveng.xml"); + Property property = project.getProperty("teamLead"); + assertNotNull(property); + assertTrue(property.getValue() instanceof SimpleValue); + assertEquals(3, project.getPropertyClosureSpan()); + assertEquals("projectId", project.getIdentifierProperty().getName()); + + PersistentClass employee = localCfg.getClassMapping("Employee"); + + assertNotNull(employee.getProperty("worksOns")); + assertNotNull("property should be renamed by reveng.xml", employee.getProperty("manager")); + assertPropertyNotExists( employee, "employees", "set should be excluded by reveng.xml" ); + assertNotNull("should be renamed by reveng.xml", employee.getProperty("managedProjects")); + + assertEquals(4, employee.getPropertyClosureSpan()); + assertEquals("id", employee.getIdentifierProperty().getName()); + + PersistentClass worksOn = localCfg.getClassMapping("WorksOn"); + + assertNotNull(worksOn.getProperty("project")); + assertNotNull(worksOn.getProperty("employee")); + assertEquals(4, worksOn.getPropertyClosureSpan()); + assertEquals("id", worksOn.getIdentifierProperty().getName()); + + } + + private void assertPropertyNotExists(PersistentClass employee, String name, String msg) { + try { + employee.getProperty(name); + fail(msg); + } catch(MappingException me) { + // excpected + } + } + + private OverrideRepository buildOverrideRepository() { + if(settings==null) { + settings = new SettingsFactory() { + // trick to get hibernate.properties settings for defaultschema/catalog in here + }.buildSettings(Environment.getProperties()); + } + //return new OverrideRepository(settings.getDefaultCatalogName(),settings.getDefaultSchemaName()); + return new OverrideRepository(); + } + + protected String[] getCreateSQL() { + return new String[] { + "create table PROJECT ( project_id integer not null, name varchar(50), team_lead integer, primary key (project_id) )", + "create table EMPLOYEE ( id integer not null, name varchar(50), manager_id integer, primary key (id), constraint employee_manager foreign key (manager_id) references EMPLOYEE)", + "create table WORKS_ON ( project_id integer not null, employee_id integer not null, start_date date, end_date date, primary key (project_id, employee_id), foreign key (employee_id) references EMPLOYEE, foreign key (project_id) references PROJECT )", + "alter table PROJECT add constraint project_manager foreign key (team_lead) references EMPLOYEE" + }; + } + + protected String[] getDropSQL() { + return new String[] { + "alter table PROJECT drop constraint project_manager", + "drop table WORKS_ON", + "drop table EMPLOYEE", + "drop table PROJECT", + }; + } + +} Added: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml 2006-04-07 12:24:37 UTC (rev 9737) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml 2006-04-07 12:25:55 UTC (rev 9738) @@ -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> + +<!-- This one assumes set and many-to-one is exclude=false --> + <table name="EMPLOYEE"> + <foreign-key constraint-name="EMPLOYEE_MANAGER"> + <many-to-one property="manager"/> + <set exclude="true"/> + </foreign-key> + </table> + + <table name="PROJECT"> + <foreign-key constraint-name="PROJECT_MANAGER"> + <many-to-one exclude="true"/> + <set property="managedProjects"/> + </foreign-key> + </table> + +</hibernate-reverse-engineering> \ No newline at end of file |
From: <hib...@li...> - 2006-04-07 12:24:46
|
Author: max...@jb... Date: 2006-04-07 08:24:37 -0400 (Fri, 07 Apr 2006) New Revision: 9737 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/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/testsupport/NoopReverseEngineeringStrategy.java Log: HBX-615 exclude for <set> and <many-to-one> Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -172,10 +172,19 @@ private void bindIncomingForeignKeys(PersistentClass rc, Set processed, List foreignKeys, Mapping mapping) { if(foreignKeys!=null) { for (Iterator iter = foreignKeys.iterator(); iter.hasNext();) { - ForeignKey fk = (ForeignKey) iter.next(); + ForeignKey foreignKey = (ForeignKey) iter.next(); - Property property = bindOneToMany(rc, fk, processed, mapping); - rc.addProperty(property); + if(revengStrategy.excludeForeignKeyAsCollection( + foreignKey.getName(), + TableIdentifier.create(foreignKey.getTable() ), + foreignKey.getColumns(), + TableIdentifier.create(foreignKey.getReferencedTable() ), + foreignKey.getReferencedColumns())) { + log.debug("Rev.eng excluded one-to-many for foreignkey " + foreignKey.getName()); + } else { + Property property = bindOneToMany(rc, foreignKey, processed, mapping); + rc.addProperty(property); + } } } } @@ -198,8 +207,7 @@ value.addColumn(fkcolumn); processedColumns.add(fkcolumn); } - value.setFetchMode(FetchMode.SELECT); - + value.setFetchMode(FetchMode.SELECT); return makeProperty(propertyName, value, true, true, value.getFetchMode()!=FetchMode.JOIN, null, null); } @@ -219,10 +227,14 @@ boolean b = isUniqueReference(foreignKey); + TableIdentifier foreignKeyTable = TableIdentifier.create( foreignKey.getTable() ); + TableIdentifier foreignKeyReferencedTable = TableIdentifier.create( foreignKey.getReferencedTable() ); String collectionRole = revengStrategy.foreignKeyToCollectionName( foreignKey.getName(), - TableIdentifier.create( foreignKey.getTable() ), - foreignKey.getColumns(), TableIdentifier.create( foreignKey.getReferencedTable() ), foreignKey.getReferencedColumns(), + foreignKeyTable, + foreignKey.getColumns(), + foreignKeyReferencedTable, + foreignKey.getReferencedColumns(), b ); collectionRole = makeUnique(rc,collectionRole); @@ -232,12 +244,20 @@ log.debug(fullRolePath + " found twice!"); } collection.setRole(fullRolePath); // Master.setOfChildren+ - collection.setInverse(true); // TODO: allow overriding this - collection.setLazy(true); // TODO: configurable + collection.setInverse(revengStrategy.isForeignKeyCollectionInverse(foreignKey.getName(), + foreignKeyTable, + foreignKey.getColumns(), + foreignKeyReferencedTable, + foreignKey.getReferencedColumns())); // TODO: allow overriding this + collection.setLazy(revengStrategy.isForeignKeyCollectionLazy(foreignKey.getName(), + foreignKeyTable, + foreignKey.getColumns(), + foreignKeyReferencedTable, + foreignKey.getReferencedColumns())); collection.setFetchMode(FetchMode.SELECT); OneToMany oneToMany = new OneToMany( collection.getOwner() ); - oneToMany.setReferencedEntityName( revengStrategy.tableToClassName( TableIdentifier.create( foreignKey.getTable() ) ) ); // Child + oneToMany.setReferencedEntityName( revengStrategy.tableToClassName( foreignKeyTable ) ); // Child mappings.addSecondPass( new JDBCCollectionSecondPass(mappings, collection) ); collection.setElement(oneToMany); @@ -359,27 +379,35 @@ mutable = false; } - boolean isUnique = isUniqueReference(foreignKey); - String propertyName = revengStrategy.foreignKeyToEntityName( - foreignKey.getName(), - TableIdentifier.create(foreignKey.getTable() ), - foreignKey.getColumns(), - TableIdentifier.create(foreignKey.getReferencedTable() ), - foreignKey.getReferencedColumns(), - isUnique - ); - - Property property = bindManyToOne( - makeUnique(rc, propertyName), - table, - foreignKey, - processedColumns - ); - property.setUpdateable(mutable); - property.setInsertable(mutable); - - rc.addProperty(property); - + if(revengStrategy.excludeForeignKeyAsManytoOne(foreignKey.getName(), + TableIdentifier.create(foreignKey.getTable() ), + foreignKey.getColumns(), + TableIdentifier.create(foreignKey.getReferencedTable() ), + foreignKey.getReferencedColumns())) { + // TODO: if many-to-one is excluded should the column be marked as processed so it won't show up at all ? + log.debug("Rev.eng excluded many-to-one for foreignkey " + foreignKey.getName()); + } else { + boolean isUnique = isUniqueReference(foreignKey); + String propertyName = revengStrategy.foreignKeyToEntityName( + foreignKey.getName(), + TableIdentifier.create(foreignKey.getTable() ), + foreignKey.getColumns(), + TableIdentifier.create(foreignKey.getReferencedTable() ), + foreignKey.getReferencedColumns(), + isUnique + ); + + Property property = bindManyToOne( + makeUnique(rc, propertyName), + table, + foreignKey, + processedColumns + ); + property.setUpdateable(mutable); + property.setInsertable(mutable); + + rc.addProperty(property); + } } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -182,5 +182,21 @@ public String tableToCompositeIdName(TableIdentifier identifier) { return null; } + + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + return false; // TODO: default to true ? TODO: named include ? + } + + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + return false; + } + + public boolean isForeignKeyCollectionInverse(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + return true; + } + + public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + return true; + } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -88,5 +88,22 @@ public String tableToCompositeIdName(TableIdentifier identifier) { return delegate==null?null:delegate.tableToCompositeIdName(identifier); + } + + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + return delegate==null?false:delegate.excludeForeignKeyAsCollection(keyname, fromTable, fromColumns, referencedTable, referencedColumns); + } + + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + return delegate==null?false:delegate.excludeForeignKeyAsManytoOne(keyname, fromTable, fromColumns, referencedTable, referencedColumns); + } + + public boolean isForeignKeyCollectionInverse(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + return delegate==null?true:delegate.isForeignKeyCollectionInverse(name, foreignKeyTable, columns, foreignKeyReferencedTable, referencedColumns); + } + + public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + return delegate==null?true:delegate.isForeignKeyCollectionLazy(name, foreignKeyTable, columns, foreignKeyReferencedTable, referencedColumns); } + } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -151,23 +151,33 @@ if(StringHelper.isNotEmpty(constraintName)) { String manyToOneProperty = null; + Boolean excludeManyToOne = null; + Element manyToOne = element.element("many-to-one"); if(manyToOne!=null) { manyToOneProperty = manyToOne.attributeValue("property"); + excludeManyToOne = BooleanValue(manyToOne.attributeValue("exclude")); } String collectionProperty = null; + Boolean excludeCollection = null; Element collection = element.element("set"); if(collection!=null) { collectionProperty = collection.attributeValue("property"); + excludeCollection = BooleanValue(collection.attributeValue("exclude")); } - repository.addForeignKeyInfo(constraintName, manyToOneProperty, collectionProperty); + repository.addForeignKeyInfo(constraintName, manyToOneProperty, excludeManyToOne, collectionProperty, excludeCollection); } } } + private static Boolean BooleanValue(String string) { + if(string==null) return null; + return Boolean.valueOf(string); + } + private static String getValue(String first, String second) { if(first==null) { return second; @@ -198,7 +208,7 @@ repository.setTypeNameForColumn(tableIdentifier, column.getName(), element.attributeValue("type")); repository.setPropertyNameForColumn(tableIdentifier, column.getName(), element.attributeValue("property")); - boolean excluded = Boolean.valueOf(element.attributeValue("exclude")).booleanValue(); + boolean excluded = booleanValue( element.attributeValue("exclude") ); if(excluded) { repository.setExcludedColumn(tableIdentifier, column.getName()); } @@ -233,6 +243,10 @@ return columnNames; } + private static boolean booleanValue(String value) { + return Boolean.valueOf(value).booleanValue(); + } + private static void bindTableFilters(List filters, OverrideRepository respository) { Iterator iterator = filters.iterator(); Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -63,6 +63,10 @@ final private Map foreignKeyToEntityName; final private Map foreignKeyToCollectionName; + + final private Map foreignKeyCollectionExclude; + + final private Map foreignKeyManyToOneExclude; //private String defaultCatalog; //private String defaultSchema; @@ -88,6 +92,8 @@ compositeIdNameForTable = new HashMap(); foreignKeyToEntityName = new HashMap(); foreignKeyToCollectionName = new HashMap(); + foreignKeyCollectionExclude = new HashMap(); + foreignKeyManyToOneExclude = new HashMap(); } public OverrideRepository addFile(File xmlFile) { @@ -397,6 +403,26 @@ return property; } } + + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + Boolean bool = (Boolean) foreignKeyCollectionExclude.get(keyname); + if(bool!=null) { + return bool.booleanValue(); + } else { + return super.excludeForeignKeyAsCollection( keyname, fromTable, fromColumns, + referencedTable, referencedColumns ); + } + } + + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + Boolean bool = (Boolean) foreignKeyManyToOneExclude.get(keyname); + if(bool!=null) { + return bool.booleanValue(); + } else { + return super.excludeForeignKeyAsManytoOne( keyname, fromTable, fromColumns, + referencedTable, referencedColumns ); + } + } }; } @@ -483,13 +509,19 @@ schemaSelections.add(schemaSelection); } - public void addForeignKeyInfo(String constraintName, String manyToOneProperty, String collectionProperty) { + public void addForeignKeyInfo(String constraintName, String manyToOneProperty, Boolean excludeManyToOne, String collectionProperty, Boolean excludeCollection) { if(StringHelper.isNotEmpty(manyToOneProperty)) { foreignKeyToEntityName.put(constraintName, manyToOneProperty); } if(StringHelper.isNotEmpty(collectionProperty)) { foreignKeyToCollectionName.put(constraintName, collectionProperty); } + if(excludeCollection!=null) { + foreignKeyCollectionExclude.put(constraintName, excludeCollection); + } + if(excludeManyToOne!=null) { + foreignKeyManyToOneExclude.put(constraintName, excludeManyToOne); + } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -21,6 +21,18 @@ */ public String columnToPropertyName(TableIdentifier table, String column); + /** Should this foreignkey be used as a oneToMany */ + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns); + + /** Should this foreignkey be used as a many-to-one */ + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns); + + /** is the collection inverse or not ? */ + public boolean isForeignKeyCollectionInverse(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns); + + /** is the collection lazy or not ? */ + public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns); + /** * Return a collection role name for a Collection based on the foreignkey. * @param fromColumns list of Column instances on the fromTable. Only col.getName() should be assumed to be correct @@ -114,5 +126,9 @@ public String tableToCompositeIdName(TableIdentifier identifier); + + + + } 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-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2006-04-07 12:24:37 UTC (rev 9737) @@ -83,21 +83,25 @@ <!ELEMENT param (#PCDATA)> <!ATTLIST param name CDATA #REQUIRED> -<!ELEMENT foreign-key (column-ref+,many-to-one?,(set)?) > +<!-- A foreign-key has to have at least a constraint-name AND/OR foreign-table+column-ref's --> +<!ELEMENT foreign-key (column-ref*,many-to-one?,(set)?) > <!ATTLIST foreign-key constraint-name CDATA #IMPLIED > <!ATTLIST foreign-key foreign-catalog CDATA #IMPLIED > <!ATTLIST foreign-key foreign-schema CDATA #IMPLIED > -<!ATTLIST foreign-key foreign-table CDATA #REQUIRED > +<!ATTLIST foreign-key foreign-table CDATA #IMPLIED > <!ELEMENT column-ref EMPTY > <!ATTLIST column-ref local-column CDATA #REQUIRED > <!ATTLIST column-ref foreign-column CDATA #IMPLIED > <!ELEMENT many-to-one EMPTY > -<!ATTLIST many-to-one property CDATA #REQUIRED> +<!ATTLIST many-to-one property CDATA #IMPLIED> +<!ATTLIST many-to-one exclude (true|false) #IMPLIED> + <!ELEMENT set EMPTY > -<!ATTLIST set property CDATA #REQUIRED> +<!ATTLIST set property CDATA #IMPLIED> +<!ATTLIST set exclude (true|false) #IMPLIED> <!-- <!ELEMENT bag EMPTY > <!ATTLIST bag property CDATA #REQUIRED> --> Modified: trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -114,4 +114,24 @@ // TODO Auto-generated method stub return null; } + + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + // TODO Auto-generated method stub + return false; + } + + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + // TODO Auto-generated method stub + return false; + } + + public boolean isForeignKeyCollectionInverse(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + // TODO Auto-generated method stub + return false; + } + + public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + // TODO Auto-generated method stub + return false; + } } |
From: <hib...@li...> - 2006-04-07 08:13:51
|
Author: epbernard Date: 2006-04-07 04:13:46 -0400 (Fri, 07 Apr 2006) New Revision: 9736 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/transaction/Isolater.java Log: HHH-1648 missing throw keyword Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/transaction/Isolater.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/transaction/Isolater.java 2006-04-07 08:00:03 UTC (rev 9735) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/transaction/Isolater.java 2006-04-07 08:13:46 UTC (rev 9736) @@ -121,7 +121,7 @@ } catch( Throwable t ) { if ( !caughtException ) { - new HibernateException( "unable to resume previously suspended transaction", t ); + throw new HibernateException( "unable to resume previously suspended transaction", t ); } } } |
From: <hib...@li...> - 2006-04-07 08:00:31
|
Author: epbernard Date: 2006-04-07 04:00:03 -0400 (Fri, 07 Apr 2006) New Revision: 9735 Modified: trunk/Hibernate3/src/org/hibernate/engine/transaction/Isolater.java Log: HHH-1648 missing throw keyword Modified: trunk/Hibernate3/src/org/hibernate/engine/transaction/Isolater.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/transaction/Isolater.java 2006-04-05 00:33:20 UTC (rev 9734) +++ trunk/Hibernate3/src/org/hibernate/engine/transaction/Isolater.java 2006-04-07 08:00:03 UTC (rev 9735) @@ -1,16 +1,16 @@ package org.hibernate.engine.transaction; +import java.sql.Connection; +import java.sql.SQLException; +import javax.transaction.Transaction; +import javax.transaction.TransactionManager; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; +import org.hibernate.engine.SessionImplementor; import org.hibernate.exception.JDBCExceptionHelper; -import org.hibernate.engine.SessionImplementor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import javax.transaction.Transaction; -import javax.transaction.TransactionManager; -import java.sql.Connection; -import java.sql.SQLException; - /** * Class which provides the isolation semantics required by * an {@link IsolatedWork}. @@ -121,7 +121,7 @@ } catch( Throwable t ) { if ( !caughtException ) { - new HibernateException( "unable to resume previously suspended transaction", t ); + throw new HibernateException( "unable to resume previously suspended transaction", t ); } } } |