⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ejb3overridenannotationreader.java

📁 hibernate3.2.6源码和jar包
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
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 + -