|
From: <hib...@li...> - 2006-04-25 02:10:56
|
Author: epbernard
Date: 2006-04-24 22:10:52 -0400 (Mon, 24 Apr 2006)
New Revision: 9787
Modified:
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/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:
XML overriding: support for <embedded> and <transient>
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-25 00:49:30 UTC (rev 9786)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-25 02:10:52 UTC (rev 9787)
@@ -57,6 +57,9 @@
import javax.persistence.Basic;
import javax.persistence.FetchType;
import javax.persistence.EnumType;
+import javax.persistence.Version;
+import javax.persistence.Transient;
+import javax.persistence.Embedded;
import org.dom4j.Attribute;
import org.dom4j.Element;
@@ -127,6 +130,10 @@
annotationToXml.put( Temporal.class, "temporal" );
annotationToXml.put( Lob.class, "lob" );
annotationToXml.put( Enumerated.class, "enumerated");
+ annotationToXml.put( Version.class, "version");
+ annotationToXml.put( Transient.class, "transient");
+ annotationToXml.put( Basic.class, "basic");
+ annotationToXml.put( Embedded.class, "embedded");
}
private XMLContext xmlContext;
@@ -289,9 +296,17 @@
}
}
preCalculateElementsForProperty(tree);
- getId( annotationList, defaults );
- getEmbeddedId( annotationList, defaults );
- getBasic( annotationList, defaults );
+ Transient transientAnn = getTransient();
+ if (transientAnn != null) {
+ annotationList.add( transientAnn );
+ }
+ else {
+ getId( annotationList, defaults );
+ getEmbeddedId( annotationList, defaults );
+ getEmbedded( annotationList, defaults );
+ getBasic( annotationList, defaults );
+ getVersion( annotationList, defaults );
+ }
this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] );
}
else {
@@ -300,6 +315,59 @@
}
}
+ private void getEmbedded(List<Annotation> annotationList, XMLContext.Default defaults) {
+ for (Element element : elementsForProperty) {
+ if ( "embedded".equals( element.getName() ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( Embedded.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+ }
+ if ( elementsForProperty.size() == 0 ) {
+ Embedded annotation = super.getAnnotation( Embedded.class );
+ if (annotation != null) annotationList.add( annotation );
+ }
+ }
+
+ private Transient getTransient() {
+ for (Element element : elementsForProperty) {
+ if ( "transient".equals( element.getName() ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( Transient.class );
+ return AnnotationFactory.create( ad );
+ }
+ }
+ if ( elementsForProperty.size() == 0 ) {
+ return super.getAnnotation( Transient.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private void getVersion(List<Annotation> annotationList, XMLContext.Default defaults) {
+ for (Element element : elementsForProperty) {
+ if ( "version".equals( element.getName() ) ) {
+ Annotation annotation = buildColumns( element );
+ if (annotation != null) annotationList.add(annotation);
+ getTemporal(annotationList, element);
+ AnnotationDescriptor basic = new AnnotationDescriptor( Version.class );
+ annotationList.add( AnnotationFactory.create( basic ) );
+ }
+ }
+ if ( elementsForProperty.size() == 0 ) {
+ //we have nothing, so Java annotations might occurs
+ if ( defaults.canUseJavaAnnotations() ) {
+ Annotation annotation = super.getAnnotation( Version.class );
+ if (annotation != null) annotationList.add(annotation);
+ annotation = super.getAnnotation( Column.class );
+ if (annotation != null) annotationList.add(annotation);
+ annotation = super.getAnnotation( Columns.class );
+ if (annotation != null) annotationList.add(annotation);
+ annotation = super.getAnnotation( Temporal.class );
+ if (annotation != null) annotationList.add(annotation);
+ }
+ }
+ }
+
private void getBasic(List<Annotation> annotationList, XMLContext.Default defaults) {
for (Element element : elementsForProperty) {
if ( "basic".equals( element.getName() ) ) {
@@ -401,9 +469,11 @@
private void preCalculateElementsForProperty(Element tree) {
elementsForProperty = new ArrayList<Element>();
Element element = tree != null ? tree.element( "attributes" ) : null;
- for ( Element subelement : (List<Element>) element.elements() ) {
- if ( propertyName.equals( subelement.attributeValue("name") ) ) {
- elementsForProperty.add( subelement );
+ if (element != null) {
+ for ( Element subelement : (List<Element>) element.elements() ) {
+ if ( propertyName.equals( subelement.attributeValue("name") ) ) {
+ elementsForProperty.add( subelement );
+ }
}
}
}
Modified: 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-25 00:49:30 UTC (rev 9786)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Administration.java 2006-04-25 02:10:52 UTC (rev 9787)
@@ -5,6 +5,7 @@
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.SecondaryTable;
+import javax.persistence.Basic;
/**
* @author Emmanuel Bernard
@@ -17,7 +18,25 @@
private String firstname;
private String lastname;
private String address;
+ private Integer version;
+ @Basic private String transientField;
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public Integer getVersion() {
+ return version;
+ }
+
+ public void setVersion(Integer version) {
+ this.version = version;
+ }
+
public String getFirstname() {
return firstname;
}
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-25 00:49:30 UTC (rev 9786)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-25 02:10:52 UTC (rev 9787)
@@ -4,16 +4,30 @@
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
+import javax.persistence.AssociationOverrides;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Basic;
+import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
+import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.ExcludeDefaultListeners;
+import javax.persistence.ExcludeSuperclassListeners;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
+import javax.persistence.Lob;
import javax.persistence.MappedSuperclass;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedQueries;
@@ -25,31 +39,20 @@
import javax.persistence.SqlResultSetMappings;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
-import javax.persistence.ExcludeSuperclassListeners;
-import javax.persistence.ExcludeDefaultListeners;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.AssociationOverrides;
-import javax.persistence.Id;
-import javax.persistence.Column;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Enumerated;
-import javax.persistence.EnumType;
-import javax.persistence.Lob;
-import javax.persistence.Basic;
-import javax.persistence.FetchType;
+import javax.persistence.Version;
+import javax.persistence.Transient;
+import javax.persistence.Embedded;
import junit.framework.TestCase;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
+import org.hibernate.annotations.Columns;
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.annotations.Columns;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotSupportedException;
@@ -233,6 +236,30 @@
assertNotNull( reader.isAnnotationPresent( Basic.class ) );
}
+ public void testVersionRelatedAnnotations() throws Exception {
+ XMLContext context = buildContext("org/hibernate/test/reflection/java/xml/orm.xml");
+ Method method = Administration.class.getDeclaredMethod( "getVersion" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
+ assertNotNull( reader.getAnnotation( Version.class ) );
+
+ Field field = Match.class.getDeclaredField( "version" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Version.class ) );
+ }
+
+ public void testTransientAndEmbeddedRelatedAnnotations() throws Exception {
+ XMLContext context = buildContext("org/hibernate/test/reflection/java/xml/orm.xml");
+
+ Field field = Administration.class.getDeclaredField( "transientField" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Transient.class ) );
+ assertNull( reader.getAnnotation( Basic.class ) );
+
+ field = Match.class.getDeclaredField( "playerASSN" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Embedded.class ) );
+ }
+
private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException {
XMLHelper xmlHelper = new XMLHelper();
ClassLoader cl = Thread.currentThread().getContextClassLoader();
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-25 00:49:30 UTC (rev 9786)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java 2006-04-25 02:10:52 UTC (rev 9787)
@@ -10,6 +10,7 @@
import javax.persistence.NamedQueries;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
+import javax.persistence.Version;
/**
* @author Emmanuel Bernard
@@ -28,4 +29,6 @@
})
public class Match extends Competition {
public String competitor1Point;
+ @Version public Integer version;
+ public SocialSecurityNumber playerASSN;
}
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-25 00:49:30 UTC (rev 9786)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-25 02:10:52 UTC (rev 9787)
@@ -35,6 +35,8 @@
<temporal>DATE</temporal>
<sequence-generator name="generator" sequence-name="seq"/>
</id>
+ <version name="version"/>
+ <transient name="transientField"/>
</attributes>
</entity>
<entity class="Match">
@@ -63,6 +65,9 @@
</sql-result-set-mapping>
<exclude-default-listeners/>
<exclude-superclass-listeners/>
+ <attributes>
+ <embedded name="playerASSN"/>
+ </attributes>
</entity>
<entity class="TennisMatch">
<primary-key-join-column name="id"/>
|