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 |