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 );
}
}
}
|