|
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
|