📄 ejb3overridenannotationreader.java
字号:
package org.hibernate.cfg.annotations.reflection;import java.beans.Introspector;import java.lang.annotation.Annotation;import java.lang.reflect.AccessibleObject;import java.lang.reflect.AnnotatedElement;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import javax.persistence.AssociationOverride;import javax.persistence.AssociationOverrides;import javax.persistence.AttributeOverride;import javax.persistence.AttributeOverrides;import javax.persistence.Basic;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.ColumnResult;import javax.persistence.DiscriminatorColumn;import javax.persistence.DiscriminatorType;import javax.persistence.DiscriminatorValue;import javax.persistence.Embeddable;import javax.persistence.Embedded;import javax.persistence.EmbeddedId;import javax.persistence.Entity;import javax.persistence.EntityListeners;import javax.persistence.EntityResult;import javax.persistence.EnumType;import javax.persistence.Enumerated;import javax.persistence.ExcludeDefaultListeners;import javax.persistence.ExcludeSuperclassListeners;import javax.persistence.FetchType;import javax.persistence.FieldResult;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.JoinColumn;import javax.persistence.JoinColumns;import javax.persistence.JoinTable;import javax.persistence.Lob;import javax.persistence.ManyToMany;import javax.persistence.ManyToOne;import javax.persistence.MapKey;import javax.persistence.MappedSuperclass;import javax.persistence.NamedNativeQueries;import javax.persistence.NamedNativeQuery;import javax.persistence.NamedQueries;import javax.persistence.NamedQuery;import javax.persistence.OneToMany;import javax.persistence.OneToOne;import javax.persistence.OrderBy;import javax.persistence.PostLoad;import javax.persistence.PostPersist;import javax.persistence.PostRemove;import javax.persistence.PostUpdate;import javax.persistence.PrePersist;import javax.persistence.PreRemove;import javax.persistence.PreUpdate;import javax.persistence.PrimaryKeyJoinColumn;import javax.persistence.PrimaryKeyJoinColumns;import javax.persistence.QueryHint;import javax.persistence.SecondaryTable;import javax.persistence.SecondaryTables;import javax.persistence.SequenceGenerator;import javax.persistence.SqlResultSetMapping;import javax.persistence.SqlResultSetMappings;import javax.persistence.Table;import javax.persistence.TableGenerator;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.persistence.Transient;import javax.persistence.UniqueConstraint;import javax.persistence.Version;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.dom4j.Attribute;import org.dom4j.Element;import org.hibernate.AnnotationException;import org.hibernate.annotations.AccessType;import org.hibernate.annotations.CollectionOfElements;import org.hibernate.annotations.Columns;import org.hibernate.annotations.common.annotationfactory.AnnotationDescriptor;import org.hibernate.annotations.common.annotationfactory.AnnotationFactory;import org.hibernate.annotations.common.reflection.AnnotationReader;import org.hibernate.annotations.common.reflection.Filter;import org.hibernate.annotations.common.reflection.ReflectionUtil;import org.hibernate.util.ReflectHelper;import org.hibernate.util.StringHelper;/** * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor. * * @author Paolo Perrotta * @author Davide Marchignoli * @author Emmanuel Bernard */public class EJB3OverridenAnnotationReader implements AnnotationReader { private static Log log = LogFactory.getLog( EJB3OverridenAnnotationReader.class ); private static final Map<Class, String> annotationToXml; private static final String SCHEMA_VALIDATION = "Activate schema validation for more informations"; private static final Filter FILTER = new Filter() { public boolean returnStatic() { return false; } public boolean returnTransient() { return false; } }; static { annotationToXml = new HashMap<Class, String>(); annotationToXml.put( Entity.class, "entity" ); annotationToXml.put( MappedSuperclass.class, "mapped-superclass" ); annotationToXml.put( Embeddable.class, "embeddable" ); annotationToXml.put( Table.class, "table" ); annotationToXml.put( SecondaryTable.class, "secondary-table" ); 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" ); annotationToXml.put( DiscriminatorValue.class, "discriminator-value" ); annotationToXml.put( DiscriminatorColumn.class, "discriminator-column" ); annotationToXml.put( SequenceGenerator.class, "sequence-generator" ); annotationToXml.put( TableGenerator.class, "table-generator" ); annotationToXml.put( NamedQuery.class, "named-query" ); annotationToXml.put( NamedQueries.class, "named-query" ); annotationToXml.put( NamedNativeQuery.class, "named-native-query" ); annotationToXml.put( NamedNativeQueries.class, "named-native-query" ); annotationToXml.put( SqlResultSetMapping.class, "sql-result-set-mapping" ); annotationToXml.put( SqlResultSetMappings.class, "sql-result-set-mapping" ); annotationToXml.put( ExcludeDefaultListeners.class, "exclude-default-listeners" ); annotationToXml.put( ExcludeSuperclassListeners.class, "exclude-superclass-listeners" ); annotationToXml.put( AccessType.class, "access" ); annotationToXml.put( AttributeOverride.class, "attribute-override" ); annotationToXml.put( AttributeOverrides.class, "attribute-override" ); annotationToXml.put( AttributeOverride.class, "association-override" ); annotationToXml.put( AttributeOverrides.class, "association-override" ); annotationToXml.put( Id.class, "id" ); annotationToXml.put( EmbeddedId.class, "embedded-id" ); annotationToXml.put( GeneratedValue.class, "generated-value" ); annotationToXml.put( Column.class, "column" ); annotationToXml.put( Columns.class, "column" ); 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" ); annotationToXml.put( ManyToOne.class, "many-to-one" ); annotationToXml.put( OneToOne.class, "one-to-one" ); annotationToXml.put( OneToMany.class, "one-to-many" ); annotationToXml.put( ManyToMany.class, "many-to-many" ); annotationToXml.put( JoinTable.class, "join-table" ); annotationToXml.put( JoinColumn.class, "join-column" ); annotationToXml.put( JoinColumns.class, "join-column" ); annotationToXml.put( MapKey.class, "map-key" ); annotationToXml.put( OrderBy.class, "order-by" ); annotationToXml.put( EntityListeners.class, "entity-listeners" ); annotationToXml.put( PrePersist.class, "pre-persist" ); annotationToXml.put( PreRemove.class, "pre-remove" ); annotationToXml.put( PreUpdate.class, "pre-update" ); annotationToXml.put( PostPersist.class, "post-persist" ); annotationToXml.put( PostRemove.class, "post-remove" ); annotationToXml.put( PostUpdate.class, "post-update" ); annotationToXml.put( PostLoad.class, "post-load" ); } private XMLContext xmlContext; private String className; private String propertyName; private PropertyType propertyType; private transient Annotation[] annotations; private transient Map<Class, Annotation> annotationsMap; private static final String WORD_SEPARATOR = "-"; private transient List<Element> elementsForProperty; private AccessibleObject mirroredAttribute; private final AnnotatedElement element; private enum PropertyType { PROPERTY, FIELD, METHOD } public EJB3OverridenAnnotationReader(AnnotatedElement el, XMLContext xmlContext) { this.element = el; this.xmlContext = xmlContext; if ( el instanceof Class ) { Class clazz = (Class) el; className = clazz.getName(); } else if ( el instanceof Field ) { Field field = (Field) el; className = field.getDeclaringClass().getName(); propertyName = field.getName(); propertyType = PropertyType.FIELD; String expectedGetter = "get" + Character.toUpperCase( propertyName.charAt( 0 ) ) + propertyName.substring( 1 ); try { mirroredAttribute = field.getDeclaringClass().getDeclaredMethod( expectedGetter ); } catch (NoSuchMethodException e) { //no method } } else if ( el instanceof Method ) { Method method = (Method) el; className = method.getDeclaringClass().getName(); propertyName = method.getName(); if ( ReflectionUtil.isProperty( method, null, //this is yukky!! we'd rather get the TypeEnvironment() FILTER ) ) { if ( propertyName.startsWith( "get" ) ) { propertyName = Introspector.decapitalize( propertyName.substring( "get".length() ) ); } else if ( propertyName.startsWith( "is" ) ) { propertyName = Introspector.decapitalize( propertyName.substring( "is".length() ) ); } else { throw new RuntimeException( "Method " + propertyName + " is not a property getter" ); } propertyType = PropertyType.PROPERTY; try { mirroredAttribute = method.getDeclaringClass().getDeclaredField( propertyName ); } catch (NoSuchFieldException e) { //no method } } else { propertyType = PropertyType.METHOD; } } else { className = null; propertyName = null; } } public <T extends Annotation> T getAnnotation(Class<T> annotationType) { initAnnotations(); return (T) annotationsMap.get( annotationType ); } public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) { initAnnotations(); return (T) annotationsMap.get( annotationType ) != null; } public Annotation[] getAnnotations() { initAnnotations(); return annotations; } private void initAnnotations() { if ( annotations == null ) { XMLContext.Default defaults = xmlContext.getDefault( className ); if ( className != null && propertyName == null ) { //is a class Element tree = xmlContext.getXMLTree( className, null ); Annotation[] annotations = getJavaAnnotations(); List<Annotation> annotationList = new ArrayList<Annotation>( annotations.length + 5 ); annotationsMap = new HashMap<Class, Annotation>( annotations.length + 5 ); for (Annotation annotation : annotations) { if ( !annotationToXml.containsKey( annotation.annotationType() ) ) { //unknown annotations are left over annotationList.add( annotation ); } } addIfNotNull( annotationList, getEntity( tree, defaults ) ); addIfNotNull( annotationList, getMappedSuperclass( tree, defaults ) ); addIfNotNull( annotationList, getEmbeddable( tree, defaults ) ); addIfNotNull( annotationList, getTable( tree, defaults ) ); addIfNotNull( annotationList, getSecondaryTables( tree, defaults ) ); addIfNotNull( annotationList, getPrimaryKeyJoinColumns( tree, defaults ) ); addIfNotNull( annotationList, getIdClass( tree, defaults ) ); addIfNotNull( annotationList, getInheritance( tree, defaults ) ); addIfNotNull( annotationList, getDiscriminatorValue( tree, defaults ) ); addIfNotNull( annotationList, getDiscriminatorColumn( tree, defaults ) ); addIfNotNull( annotationList, getSequenceGenerator( tree, defaults ) ); addIfNotNull( annotationList, getTableGenerator( tree, defaults ) ); addIfNotNull( annotationList, getNamedQueries( tree, defaults ) ); addIfNotNull( annotationList, getNamedNativeQueries( tree, defaults ) ); addIfNotNull( annotationList, getSqlResultSetMappings( tree, defaults ) ); addIfNotNull( annotationList, getExcludeDefaultListeners( tree, defaults ) ); addIfNotNull( annotationList, getExcludeSuperclassListeners( tree, defaults ) ); addIfNotNull( annotationList, getAccessType( tree, defaults ) ); addIfNotNull( annotationList, getAttributeOverrides( tree, defaults ) ); addIfNotNull( annotationList, getAssociationOverrides( tree, defaults ) ); addIfNotNull( annotationList, getEntityListeners( tree, defaults ) ); //FIXME use annotationsMap rather than annotationList this will be faster since the annotation type is usually known at put() time this.annotations = annotationList.toArray( new Annotation[annotationList.size()] );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -