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 |