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