[hibernate-commits] Hibernate SVN: r18734 - in jpamodelgen/trunk/src: main/java/org/hibernate/jpamodelgen/annotation and 16 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Feb 8 15:58:22 EST 2010


Author: hardy.ferentschik
Date: 2010-02-08 15:58:20 -0500 (Mon, 08 Feb 2010)
New Revision: 18734

Added:
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/AccessTypeInformation.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/StringUtil.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Car.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Truck.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Vehicle.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/XmlMetaCompleteTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/IgnoreInvalidXmlTest.java
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/accesstype/
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/accesstype/orm.xml
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/car.xml
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/truck.xml
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/jpa1-orm.xml
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/malformed-mapping.xml
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/non-existend-class.xml
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/persistence.xml
Removed:
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedModeMappingTest.java
   jpamodelgen/trunk/src/test/resources/META-INF/dummy.xml
   jpamodelgen/trunk/src/test/resources/META-INF/jpa1-orm.xml
   jpamodelgen/trunk/src/test/resources/META-INF/malformed-mapping-xml.xml
   jpamodelgen/trunk/src/test/resources/META-INF/orm.xml
Modified:
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ImportContextImpl.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaAttribute.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/TypeUtils.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaAttribute.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/accesstype/AccessTypeTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/accesstype/Order.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/ArrayTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/TemperatureSamples.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/elementcollection/ElementCollectionTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/GenericsTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/inheritance/InheritanceTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/RawTypesTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/TestUtil.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/LivingBeing.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/XmlMappingTest.java
   jpamodelgen/trunk/src/test/resources/META-INF/persistence.xml
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/mammal.xml
Log:
METAGEN-9

Added: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/AccessTypeInformation.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/AccessTypeInformation.java	                        (rev 0)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/AccessTypeInformation.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,90 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen;
+
+import javax.persistence.AccessType;
+
+/**
+ * Encapsulates the access type information for a single class.
+ *
+ * @author Hardy Ferentschik
+ */
+public class AccessTypeInformation {
+	private final String fqcn;
+
+	/**
+	 * Access type explicitly specified in xml or on an entity.
+	 */
+	private AccessType explicitAccessType;
+
+	/**
+	 * The default type for en entity. This type might change during the parsing/discovering process. The reason
+	 * for that is the ability to mix and match xml and annotation configuration.
+	 */
+	private AccessType defaultAccessType;
+
+	private static final AccessType DEFAULT_ACCESS_TYPE = AccessType.PROPERTY;
+
+	public AccessTypeInformation(String fqcn, AccessType explicitAccessType, AccessType defaultAccessType) {
+		this.fqcn = fqcn;
+		this.explicitAccessType = explicitAccessType;
+		this.defaultAccessType = defaultAccessType;
+	}
+
+	public boolean isAccessTypeResolved() {
+		return explicitAccessType != null || defaultAccessType != null;
+	}
+
+	public AccessType getAccessType() {
+		if ( explicitAccessType != null ) {
+			return explicitAccessType;
+		}
+		else if ( defaultAccessType != null ) {
+			return defaultAccessType;
+
+		}
+		else {
+			return DEFAULT_ACCESS_TYPE;
+		}
+	}
+
+	public void setDefaultAccessType(AccessType defaultAccessType) {
+		this.defaultAccessType = defaultAccessType;
+	}
+
+	public void setExplicitAccessType(AccessType explicitAccessType) {
+		this.explicitAccessType = explicitAccessType;
+	}
+
+	public AccessType getDefaultAccessType() {
+		return defaultAccessType;
+	}
+
+	@Override
+	public String toString() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append( "AccessTypeInformation" );
+		sb.append( "{fqcn='" ).append( fqcn ).append( '\'' );
+		sb.append( ", explicitAccessType=" ).append( explicitAccessType );
+		sb.append( ", defaultAccessType=" ).append( defaultAccessType );
+		sb.append( '}' );
+		return sb.toString();
+	}
+}
+
+

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -21,18 +21,15 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.TypeElement;
+import javax.lang.model.util.Elements;
 import javax.persistence.AccessType;
 import javax.tools.Diagnostic;
 
-import org.hibernate.jpamodelgen.annotation.AnnotationMetaEntity;
 import org.hibernate.jpamodelgen.model.MetaEntity;
-import org.hibernate.jpamodelgen.util.TypeUtils;
 
 /**
  * @author Max Andersen
@@ -44,24 +41,16 @@
 	private static final String DEFAULT_PERSISTENCE_XML_LOCATION = "/META-INF/persistence.xml";
 	private final Map<String, MetaEntity> metaEntities = new HashMap<String, MetaEntity>();
 	private final Map<String, MetaEntity> metaSuperclassAndEmbeddable = new HashMap<String, MetaEntity>();
+	private final Map<String, AccessTypeInformation> accessTypeInformation = new HashMap<String, AccessTypeInformation>();
 
 	private final ProcessingEnvironment pe;
 	private final boolean logDebug;
 	private final String persistenceXmlLocation;
 
 	private final List<String> ormXmlFiles;
-
-	//used to cache access types
-	private Map<TypeElement, AccessTypeHolder> accessTypes = new HashMap<TypeElement, AccessTypeHolder>();
-	private Set<String> elementsAlreadyProcessed = new HashSet<String>();
-
 	private boolean isPersistenceUnitCompletelyXmlConfigured;
+	private AccessType persistenceUnitDefaultAccessType;
 
-	private static class AccessTypeHolder {
-		public AccessType elementAccessType;
-		public AccessType hierarchyAccessType;
-	}
-
 	public Context(ProcessingEnvironment pe) {
 		this.pe = pe;
 
@@ -134,59 +123,23 @@
 		metaSuperclassAndEmbeddable.put( fcqn, metaEntity );
 	}
 
-	public void removeMetaSuperclassOrEmbeddable(String fcqn) {
-		metaSuperclassAndEmbeddable.remove( fcqn );
-	}
-
 	public Collection<MetaEntity> getMetaSuperclassOrEmbeddable() {
 		return metaSuperclassAndEmbeddable.values();
 	}
 
-	public void addAccessType(TypeElement element, AccessType accessType) {
-		AccessTypeHolder typeHolder = accessTypes.get( element );
-		if ( typeHolder == null ) {
-			typeHolder = new AccessTypeHolder();
-			accessTypes.put( element, typeHolder );
-		}
-		typeHolder.elementAccessType = accessType;
+	public void addAccessTypeInformation(String fqcn, AccessTypeInformation info) {
+		accessTypeInformation.put( fqcn, info );
 	}
 
-	public void addAccessTypeForHierarchy(TypeElement element, AccessType accessType) {
-		AccessTypeHolder typeHolder = accessTypes.get( element );
-		if ( typeHolder == null ) {
-			typeHolder = new AccessTypeHolder();
-			accessTypes.put( element, typeHolder );
-		}
-		typeHolder.hierarchyAccessType = accessType;
+	public AccessTypeInformation getAccessTypeInfo(String fqcn) {
+		return accessTypeInformation.get( fqcn );
 	}
 
-	public AccessType getAccessType(TypeElement element) {
-		final AccessTypeHolder typeHolder = accessTypes.get( element );
-		return typeHolder != null ? typeHolder.elementAccessType : null;
+	public TypeElement getTypeElementForFullyQualifiedName(String fqcn) {
+		Elements elementUtils = pe.getElementUtils();
+		return elementUtils.getTypeElement( fqcn );
 	}
 
-	public AccessType getDefaultAccessTypeForHierarchy(TypeElement element) {
-		final AccessTypeHolder typeHolder = accessTypes.get( element );
-		return typeHolder != null ? typeHolder.hierarchyAccessType : null;
-	}
-
-	public Set<String> getElementsAlreadyProcessed() {
-		return elementsAlreadyProcessed;
-	}
-
-	//only process Embeddable or Superclass
-	//does not work for Entity (risk of circularity)
-
-	public void processElement(TypeElement element, AccessType defaultAccessTypeForHierarchy) {
-		if ( elementsAlreadyProcessed.contains( element.getQualifiedName().toString() ) ) {
-			logMessage( Diagnostic.Kind.OTHER, "Element already processed (ignoring): " + element );
-			return;
-		}
-		ClassWriter.writeFile( new AnnotationMetaEntity( element, this, defaultAccessTypeForHierarchy ), this );
-		TypeUtils.extractClosestRealTypeAsString( element.asType(), this );
-		elementsAlreadyProcessed.add( element.getQualifiedName().toString() );
-	}
-
 	public void logMessage(Diagnostic.Kind type, String message) {
 		if ( !logDebug && type.equals( Diagnostic.Kind.OTHER ) ) {
 			return;
@@ -201,4 +154,25 @@
 	public void setPersistenceUnitCompletelyXmlConfigured(boolean persistenceUnitCompletelyXmlConfigured) {
 		isPersistenceUnitCompletelyXmlConfigured = persistenceUnitCompletelyXmlConfigured;
 	}
+
+	public AccessType getPersistenceUnitDefaultAccessType() {
+		return persistenceUnitDefaultAccessType;
+	}
+
+	public void setPersistenceUnitDefaultAccessType(AccessType persistenceUnitDefaultAccessType) {
+		this.persistenceUnitDefaultAccessType = persistenceUnitDefaultAccessType;
+	}
+
+	@Override
+	public String toString() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append( "Context" );
+		sb.append( "{accessTypeInformation=" ).append( accessTypeInformation );
+		sb.append( ", logDebug=" ).append( logDebug );
+		sb.append( ", isPersistenceUnitCompletelyXmlConfigured=" ).append( isPersistenceUnitCompletelyXmlConfigured );
+		sb.append( ", ormXmlFiles=" ).append( ormXmlFiles );
+		sb.append( ", persistenceXmlLocation='" ).append( persistenceXmlLocation ).append( '\'' );
+		sb.append( '}' );
+		return sb.toString();
+	}
 }

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ImportContextImpl.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ImportContextImpl.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ImportContextImpl.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -110,7 +110,7 @@
 
 
 		if ( inSamePackage( fqcn ) || ( imports.contains( pureFqcn ) && canBeSimple ) ) {
-			result = unqualify( result ); // dequalify
+			result = unqualify( result ); // de-qualify
 		}
 		else if ( inJavaLang( fqcn ) ) {
 			result = result.substring( "java.lang.".length() );

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -94,6 +94,14 @@
 			return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS;
 		}
 
+		if ( context.isPersistenceUnitCompletelyXmlConfigured() ) {
+			context.logMessage(
+					Diagnostic.Kind.OTHER,
+					"Skipping the processing of annotations since persistence unit is purely xml configured."
+			);
+			return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS;
+		}
+
 		Set<? extends Element> elements = roundEnvironment.getRootElements();
 		for ( Element element : elements ) {
 			context.logMessage( Diagnostic.Kind.OTHER, "Processing " + element.toString() );
@@ -104,16 +112,11 @@
 	}
 
 	private void createMetaModelClasses() {
-		for ( MetaEntity entity : context.getMetaEntities()) {
+		for ( MetaEntity entity : context.getMetaEntities() ) {
 			context.logMessage( Diagnostic.Kind.OTHER, "Writing meta model for " + entity );
 			ClassWriter.writeFile( entity, context );
 		}
 
-		//process left over, in most cases is empty
-		for ( String className : context.getElementsAlreadyProcessed() ) {
-			context.removeMetaSuperclassOrEmbeddable( className );
-		}
-
 		for ( MetaEntity entity : context.getMetaSuperclassOrEmbeddable() ) {
 			context.logMessage( Diagnostic.Kind.OTHER, "Writing meta model for " + entity );
 			ClassWriter.writeFile( entity, context );
@@ -159,7 +162,6 @@
 		}
 		else if ( TypeUtils.isAnnotationMirrorOfType( mirror, MappedSuperclass.class )
 				|| TypeUtils.isAnnotationMirrorOfType( mirror, Embeddable.class ) ) {
-
 			context.addMetaSuperclassOrEmbeddable( metaEntity.getQualifiedName(), metaEntity );
 		}
 	}

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaAttribute.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaAttribute.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaAttribute.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -71,4 +71,14 @@
 	public String getTypeDeclaration() {
 		return type;
 	}
+
+	@Override
+	public String toString() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append( "AnnotationMetaAttribute" );
+		sb.append( "{element=" ).append( element );
+		sb.append( ", type='" ).append( type ).append( '\'' );
+		sb.append( '}' );
+		return sb.toString();
+	}
 }

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -37,29 +37,24 @@
 import javax.lang.model.util.ElementFilter;
 import javax.lang.model.util.Elements;
 import javax.lang.model.util.SimpleTypeVisitor6;
-import javax.persistence.Access;
 import javax.persistence.AccessType;
 import javax.persistence.ElementCollection;
-import javax.persistence.Embeddable;
-import javax.persistence.Embedded;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.Id;
 import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.MapKeyClass;
-import javax.persistence.MappedSuperclass;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 import javax.persistence.Transient;
 import javax.tools.Diagnostic;
 
+import org.hibernate.jpamodelgen.AccessTypeInformation;
 import org.hibernate.jpamodelgen.Context;
-import org.hibernate.jpamodelgen.model.ImportContext;
 import org.hibernate.jpamodelgen.ImportContextImpl;
+import org.hibernate.jpamodelgen.MetaModelGenerationException;
+import org.hibernate.jpamodelgen.model.ImportContext;
 import org.hibernate.jpamodelgen.model.MetaAttribute;
 import org.hibernate.jpamodelgen.model.MetaEntity;
-import org.hibernate.jpamodelgen.MetaModelGenerationException;
+import org.hibernate.jpamodelgen.util.StringUtil;
 import org.hibernate.jpamodelgen.util.TypeUtils;
 
 /**
@@ -69,7 +64,6 @@
  */
 public class AnnotationMetaEntity implements MetaEntity {
 
-	private static final String DEFAULT_ANNOTATION_PARAMETER_NAME = "value";
 	static Map<String, String> COLLECTIONS = new HashMap<String, String>();
 
 	static {
@@ -82,21 +76,16 @@
 	private final TypeElement element;
 	private final ImportContext importContext;
 	private Context context;
-	//used to propagate the access type of the root entity over to subclasses, superclasses and embeddable
-	private AccessType defaultAccessTypeForHierarchy;
-	private AccessType defaultAccessTypeForElement;
+	private List<MetaAttribute> members;
+	private AccessTypeInformation entityAccessTypeInfo;
 
 	public AnnotationMetaEntity(TypeElement element, Context context) {
 		this.element = element;
 		this.context = context;
 		importContext = new ImportContextImpl( getPackageName() );
+		init();
 	}
 
-	public AnnotationMetaEntity(TypeElement element, Context context, AccessType accessType) {
-		this( element, context );
-		this.defaultAccessTypeForHierarchy = accessType;
-	}
-
 	public Context getContext() {
 		return context;
 	}
@@ -115,28 +104,7 @@
 	}
 
 	public List<MetaAttribute> getMembers() {
-		List<MetaAttribute> membersFound = new ArrayList<MetaAttribute>();
-		final AccessType elementAccessType = getAccessTypeForElement();
-
-		List<? extends Element> fieldsOfClass = ElementFilter.fieldsIn( element.getEnclosedElements() );
-		addPersistentMembers( membersFound, elementAccessType, fieldsOfClass, AccessType.FIELD );
-
-		List<? extends Element> methodsOfClass = ElementFilter.methodsIn( element.getEnclosedElements() );
-		addPersistentMembers( membersFound, elementAccessType, methodsOfClass, AccessType.PROPERTY );
-
-		//process superclasses
-		for ( TypeElement superclass = TypeUtils.getSuperclassTypeElement( element );
-			  superclass != null;
-			  superclass = TypeUtils.getSuperclassTypeElement( superclass ) ) {
-			if ( TypeUtils.containsAnnotation( superclass, Entity.class ) ) {
-				break; //will be handled or has been handled already
-			}
-			else if ( TypeUtils.containsAnnotation( superclass, MappedSuperclass.class ) ) {
-				//FIXME use the class default access type
-				context.processElement( superclass, defaultAccessTypeForHierarchy );
-			}
-		}
-		return membersFound;
+		return members;
 	}
 
 	@Override
@@ -144,191 +112,74 @@
 		return false;
 	}
 
-	private void addPersistentMembers(
-			List<MetaAttribute> membersFound,
-			AccessType elementAccessType,
-			List<? extends Element> membersOfClass,
-			AccessType membersKind) {
-		AccessType explicitAccessType;
-		if ( elementAccessType == membersKind ) {
-			//all membersKind considered
-			explicitAccessType = null;
-		}
-		else {
-			//use membersKind only if marked with @Access(membersKind)
-			explicitAccessType = membersKind;
-		}
+	private void addPersistentMembers(List<? extends Element> membersOfClass, AccessType membersKind) {
 		for ( Element memberOfClass : membersOfClass ) {
+			AccessType forcedAccessType = TypeUtils.determineAnnotationSpecifiedAccessType( memberOfClass );
+			if ( entityAccessTypeInfo.getAccessType() != membersKind && forcedAccessType == null ) {
+				continue;
+			}
 
-			TypeVisitor visitor = new TypeVisitor( this, explicitAccessType );
+			if ( TypeUtils.containsAnnotation( memberOfClass, Transient.class )
+					|| memberOfClass.getModifiers().contains( Modifier.TRANSIENT )
+					|| memberOfClass.getModifiers().contains( Modifier.STATIC ) ) {
+				continue;
+			}
+
+			TypeVisitor visitor = new TypeVisitor( this );
 			AnnotationMetaAttribute result = memberOfClass.asType().accept( visitor, memberOfClass );
 			if ( result != null ) {
-				membersFound.add( result );
+				members.add( result );
 			}
 		}
 	}
 
-	private AccessType getAccessTypeForElement() {
-
-		//get local strategy
-		AccessType accessType = getAccessTypeForClass( element );
-		if ( accessType == null ) {
-			accessType = this.defaultAccessTypeForHierarchy;
-		}
-		if ( accessType == null ) {
-			//we don't know if an entity go up
-			//
-			//superclasses are always treated after their entities
-			//and their access type are discovered
-			//FIXME is it really true if only the superclass is changed
-			TypeElement superClass = element;
-			do {
-				superClass = TypeUtils.getSuperclassTypeElement( superClass );
-				if ( superClass != null ) {
-					if ( TypeUtils.containsAnnotation( superClass, Entity.class, MappedSuperclass.class ) ) {
-						//FIXME make it work for XML
-						AccessType superClassAccessType = getAccessTypeForClass( superClass );
-						//we've reach the root entity and resolved Ids
-						if ( superClassAccessType != null && defaultAccessTypeForHierarchy != null ) {
-							break; //we've found it
-						}
-					}
-					else {
-						break; //neither @Entity nor @MappedSuperclass
-					}
-				}
-			}
-			while ( superClass != null );
-		}
-
-		if ( accessType == null ) {
-			accessType = AccessType.PROPERTY; //default to property
-			this.defaultAccessTypeForElement = accessType;
-		}
-		//this is a subclass so caching is OK
-		//this.defaultAccessTypeForHierarchy = accessType;
-		context.addAccessType( this.element, accessType );
-		this.defaultAccessTypeForElement = accessType;
-		return accessType;
+	@Override
+	public String toString() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append( "AnnotationMetaEntity" );
+		sb.append( "{element=" ).append( element );
+		sb.append( ", members=" ).append( members );
+		sb.append( '}' );
+		return sb.toString();
 	}
 
-	private AccessType getAccessTypeForClass(TypeElement searchedElement) {
-		context.logMessage( Diagnostic.Kind.OTHER, "check class " + searchedElement );
-		AccessType accessType = context.getAccessType( searchedElement );
+	private void init() {
+		members = new ArrayList<MetaAttribute>();
+		TypeUtils.determineAccessTypeForHierarchy( element, context );
+		entityAccessTypeInfo = context.getAccessTypeInfo( getQualifiedName() );
 
-		if ( defaultAccessTypeForHierarchy == null ) {
-			this.defaultAccessTypeForHierarchy = context.getDefaultAccessTypeForHierarchy( searchedElement );
-		}
-		if ( accessType != null ) {
-			context.logMessage( Diagnostic.Kind.OTHER, "Found in cache" + searchedElement + ":" + accessType );
-			return accessType;
-		}
+		List<? extends Element> fieldsOfClass = ElementFilter.fieldsIn( element.getEnclosedElements() );
+		addPersistentMembers( fieldsOfClass, AccessType.FIELD );
 
-		/**
-		 * when forcing access type, we can only override the defaultAccessTypeForHierarchy
-		 * if we are the entity root (identified by having @Id or @EmbeddedId
-		 */
-		AccessType forcedAccessType = determineAnnotationSpecifiedAccessType( searchedElement );
-		if ( forcedAccessType != null ) {
-			context.logMessage( Diagnostic.Kind.OTHER, "access type " + searchedElement + ":" + forcedAccessType );
-			context.addAccessType( searchedElement, forcedAccessType );
-		}
+		List<? extends Element> methodsOfClass = ElementFilter.methodsIn( element.getEnclosedElements() );
+		addPersistentMembers( methodsOfClass, AccessType.PROPERTY );
+	}
 
-		//continue nevertheless to check if we are root and if defaultAccessTypeForHierarchy
-		//should be overridden
-		if ( forcedAccessType == null || defaultAccessTypeForHierarchy == null ) {
-			List<? extends Element> myMembers = searchedElement.getEnclosedElements();
-			for ( Element subElement : myMembers ) {
-				List<? extends AnnotationMirror> entityAnnotations =
-						context.getProcessingEnvironment().getElementUtils().getAllAnnotationMirrors( subElement );
+	public String generateImports() {
+		return importContext.generateImports();
+	}
 
-				for ( Object entityAnnotation : entityAnnotations ) {
-					AnnotationMirror annotationMirror = ( AnnotationMirror ) entityAnnotation;
+	public String importType(String fqcn) {
+		return importContext.importType( fqcn );
+	}
 
-					//FIXME consider XML
-					if ( TypeUtils.isAnnotationMirrorOfType( annotationMirror, Id.class )
-							|| TypeUtils.isAnnotationMirrorOfType( annotationMirror, EmbeddedId.class ) ) {
-						context.logMessage( Diagnostic.Kind.OTHER, "Found id on" + searchedElement );
-						final ElementKind kind = subElement.getKind();
-						if ( kind == ElementKind.FIELD || kind == ElementKind.METHOD ) {
-							accessType = kind == ElementKind.FIELD ? AccessType.FIELD : AccessType.PROPERTY;
-							//FIXME enlever in niveau
-							if ( defaultAccessTypeForHierarchy == null ) {
-								this.defaultAccessTypeForHierarchy = context.getDefaultAccessTypeForHierarchy(
-										searchedElement
-								);
-								//we've discovered the class hierarchy, let's cache it
-								if ( defaultAccessTypeForHierarchy == null ) {
-									this.defaultAccessTypeForHierarchy = accessType;
-									context.addAccessTypeForHierarchy( searchedElement, defaultAccessTypeForHierarchy );
-									//FIXME should we add
-									//context.addAccessTypeForHierarchy( element, defaultAccessTypeForHierarchy );
-								}
-							}
-							if ( forcedAccessType == null ) {
-								context.addAccessType( searchedElement, accessType );
-								context.logMessage(
-										Diagnostic.Kind.OTHER, "access type " + searchedElement + ":" + accessType
-								);
-								return accessType;
-							}
-							else {
-								return forcedAccessType;
-							}
-						}
-					}
-				}
-			}
-		}
-		return forcedAccessType;
+	public String staticImport(String fqcn, String member) {
+		return importContext.staticImport( fqcn, member );
 	}
 
-	private AccessType determineAnnotationSpecifiedAccessType(Element element) {
-		final AnnotationMirror accessAnnotationMirror = TypeUtils.getAnnotationMirror( element, Access.class );
-		AccessType forcedAccessType = null;
-		if ( accessAnnotationMirror != null ) {
-			Element accessElement = ( Element ) TypeUtils.getAnnotationValue(
-					accessAnnotationMirror,
-					DEFAULT_ANNOTATION_PARAMETER_NAME
-			);
-			if ( accessElement.getKind().equals( ElementKind.ENUM_CONSTANT ) ) {
-				if ( accessElement.getSimpleName().toString().equals( AccessType.PROPERTY.toString() ) ) {
-					forcedAccessType = AccessType.PROPERTY;
-				}
-				else if ( accessElement.getSimpleName().toString().equals( AccessType.FIELD.toString() ) ) {
-					forcedAccessType = AccessType.FIELD;
-
-				}
-				else {
-					context.logMessage( Diagnostic.Kind.ERROR, "Unexpected type for access type" );
-				}
-			}
-		}
-		return forcedAccessType;
+	public String importType(Name qualifiedName) {
+		return importType( qualifiedName.toString() );
 	}
 
-	@Override
-	public String toString() {
-		final StringBuilder sb = new StringBuilder();
-		sb.append( "MetaEntity" );
-		sb.append( "{element=" ).append( element );
-		sb.append( '}' );
-		return sb.toString();
+	public TypeElement getTypeElement() {
+		return element;
 	}
 
 	class TypeVisitor extends SimpleTypeVisitor6<AnnotationMetaAttribute, Element> {
-
 		AnnotationMetaEntity parent;
 
-		/*
-		 * If {@code explicitAccessType == null}, process all members as implicit. If  {@code explicitAccessType != null}
-		 * only process members marked as {@code @Access(explicitAccessType)}.
-		 */
-		private AccessType explicitAccessType;
-
-		TypeVisitor(AnnotationMetaEntity parent, AccessType explicitAccessType) {
+		TypeVisitor(AnnotationMetaEntity parent) {
 			this.parent = parent;
-			this.explicitAccessType = explicitAccessType;
 		}
 
 		@Override
@@ -338,92 +189,82 @@
 
 		@Override
 		public AnnotationMetaAttribute visitPrimitive(PrimitiveType t, Element element) {
-			if ( isPersistent( element ) ) {
-				return new AnnotationMetaSingleAttribute( parent, element, TypeUtils.toTypeString( t ) );
-			}
-			else {
-				return null;
-			}
+			return new AnnotationMetaSingleAttribute( parent, element, TypeUtils.toTypeString( t ) );
 		}
 
 		@Override
 		public AnnotationMetaAttribute visitArray(ArrayType t, Element element) {
-			if ( isPersistent( element ) ) {
-				return new AnnotationMetaSingleAttribute( parent, element, TypeUtils.toTypeString( t ) );
-			}
-			else {
-				return null;
-			}
+			return new AnnotationMetaSingleAttribute( parent, element, TypeUtils.toTypeString( t ) );
 		}
 
-		private boolean isPersistent(Element element) {
-			//FIXME consider XML
-			boolean correctAccessType = false;
-			if ( this.explicitAccessType == null ) {
-				correctAccessType = true;
-			}
-			else {
-				AccessType annotationAccessType = determineAnnotationSpecifiedAccessType( element );
-				if ( explicitAccessType.equals( annotationAccessType ) ) {
-					correctAccessType = true;
-				}
-			}
-			return correctAccessType
-					&& !TypeUtils.containsAnnotation( element, Transient.class )
-					&& !element.getModifiers().contains( Modifier.TRANSIENT )
-					&& !element.getModifiers().contains( Modifier.STATIC );
-
-		}
-
 		@Override
 		public AnnotationMetaAttribute visitDeclared(DeclaredType declaredType, Element element) {
-			if ( isPersistent( element ) ) {
-				TypeElement returnedElement = ( TypeElement ) context.getProcessingEnvironment()
-						.getTypeUtils()
-						.asElement( declaredType );
-				// WARNING: .toString() is necessary here since Name equals does not compare to String
-				String fqNameOfReturnType = returnedElement.getQualifiedName().toString();
-				String collection = COLLECTIONS.get( fqNameOfReturnType );
-				String targetEntity = getTargetEntity( element.getAnnotationMirrors() );
-				if ( collection != null ) {
-					if ( TypeUtils.containsAnnotation( element, ElementCollection.class ) ) {
-						String explicitTargetEntity = getTargetEntity( element.getAnnotationMirrors() );
-						TypeMirror collectionElementType = getCollectionElementType(
-								declaredType, fqNameOfReturnType, explicitTargetEntity
+			TypeElement returnedElement = ( TypeElement ) context.getProcessingEnvironment()
+					.getTypeUtils()
+					.asElement( declaredType );
+			// WARNING: .toString() is necessary here since Name equals does not compare to String
+			String fqNameOfReturnType = returnedElement.getQualifiedName().toString();
+			String collection = COLLECTIONS.get( fqNameOfReturnType );
+			String targetEntity = getTargetEntity( element.getAnnotationMirrors() );
+			if ( collection != null ) {
+				if ( TypeUtils.containsAnnotation( element, ElementCollection.class ) ) {
+					String explicitTargetEntity = getTargetEntity( element.getAnnotationMirrors() );
+					TypeMirror collectionElementType = getCollectionElementType(
+							declaredType, fqNameOfReturnType, explicitTargetEntity
+					);
+					final TypeElement collectionElement = ( TypeElement ) context.getProcessingEnvironment()
+							.getTypeUtils()
+							.asElement( collectionElementType );
+					AccessTypeInformation accessTypeInfo = context.getAccessTypeInfo( collectionElement.getQualifiedName().toString() );
+					if ( accessTypeInfo == null ) {
+						AccessType explicitAccessType = TypeUtils.determineAnnotationSpecifiedAccessType(
+								collectionElement
 						);
-						final TypeElement collectionElement = ( TypeElement ) context.getProcessingEnvironment()
-								.getTypeUtils()
-								.asElement( collectionElementType );
-						this.parent.context.processElement(
-								collectionElement,
-								this.parent.defaultAccessTypeForElement
+						accessTypeInfo = new AccessTypeInformation(
+								collectionElement.getQualifiedName().toString(),
+								explicitAccessType,
+								entityAccessTypeInfo.getAccessType()
 						);
+						context.addAccessTypeInformation(
+								collectionElement.getQualifiedName().toString(), accessTypeInfo
+						);
 					}
-					if ( collection.equals( "javax.persistence.metamodel.MapAttribute" ) ) {
-						return createAnnotationMetaAttributeForMap( declaredType, element, collection, targetEntity );
-					}
 					else {
-						return new AnnotationMetaCollection(
-								parent, element, collection, getElementType( declaredType, targetEntity )
-						);
+						accessTypeInfo.setDefaultAccessType( entityAccessTypeInfo.getAccessType() );
 					}
+					AnnotationMetaEntity metaEntity = new AnnotationMetaEntity( collectionElement, context );
+					context.addMetaSuperclassOrEmbeddable( metaEntity.getQualifiedName(), metaEntity );
 				}
+				if ( collection.equals( "javax.persistence.metamodel.MapAttribute" ) ) {
+					return createAnnotationMetaAttributeForMap( declaredType, element, collection, targetEntity );
+				}
 				else {
-					//FIXME Consider XML
-					if ( TypeUtils.containsAnnotation( returnedElement, Embedded.class, Embeddable.class ) ) {
-						this.parent.context.processElement(
-								returnedElement,
-								this.parent.defaultAccessTypeForElement
-						);
-					}
-					return new AnnotationMetaSingleAttribute(
-							parent, element, returnedElement.getQualifiedName().toString()
+					return new AnnotationMetaCollection(
+							parent, element, collection, getElementType( declaredType, targetEntity )
 					);
 				}
 			}
 			else {
+				return new AnnotationMetaSingleAttribute(
+						parent, element, returnedElement.getQualifiedName().toString()
+				);
+			}
+		}
+
+		@Override
+		public AnnotationMetaAttribute visitExecutable(ExecutableType t, Element p) {
+			if ( !p.getKind().equals( ElementKind.METHOD ) ) {
 				return null;
 			}
+
+			String string = p.getSimpleName().toString();
+			if ( StringUtil.isPropertyName( string ) ) {
+				TypeMirror returnType = t.getReturnType();
+				return returnType.accept( this, p );
+			}
+			else {
+				return null;
+			}
 		}
 
 		private AnnotationMetaAttribute createAnnotationMetaAttributeForMap(DeclaredType declaredType, Element element, String collection, String targetEntity) {
@@ -432,7 +273,7 @@
 				TypeMirror typeMirror = ( TypeMirror ) TypeUtils.getAnnotationValue(
 						TypeUtils.getAnnotationMirror(
 								element, MapKeyClass.class
-						), DEFAULT_ANNOTATION_PARAMETER_NAME
+						), TypeUtils.DEFAULT_ANNOTATION_PARAMETER_NAME
 				);
 				keyType = typeMirror.toString();
 			}
@@ -470,103 +311,69 @@
 			return collectionElementType;
 		}
 
-		@Override
-		public AnnotationMetaAttribute visitExecutable(ExecutableType t, Element p) {
-			if ( !p.getKind().equals( ElementKind.METHOD ) ) {
-				return null;
+		private String getElementType(DeclaredType declaredType, String targetEntity) {
+			if ( targetEntity != null ) {
+				return targetEntity;
 			}
-
-			String string = p.getSimpleName().toString();
-			if ( string.startsWith( "get" ) || string.startsWith( "is" ) || string.startsWith( "has" ) ) {
-				TypeMirror returnType = t.getReturnType();
-				return returnType.accept( this, p );
+			final List<? extends TypeMirror> mirrors = declaredType.getTypeArguments();
+			if ( mirrors.size() == 1 ) {
+				final TypeMirror type = mirrors.get( 0 );
+				return TypeUtils.extractClosestRealTypeAsString( type, context );
 			}
+			else if ( mirrors.size() == 2 ) {
+				return TypeUtils.extractClosestRealTypeAsString( mirrors.get( 1 ), context );
+			}
 			else {
-				return null;
+				//for 0 or many
+				//0 is expected, many is not
+				if ( mirrors.size() > 2 ) {
+					context.logMessage(
+							Diagnostic.Kind.WARNING, "Unable to find the closest solid type" + declaredType
+					);
+				}
+				return "?";
 			}
 		}
-	}
 
-	/**
-	 * @param annotations list of annotation mirrors.
-	 *
-	 * @return target entity class name as string or {@code null} if no targetEntity is here or if equals to void
-	 */
-	private String getTargetEntity(List<? extends AnnotationMirror> annotations) {
-
-		String fullyQualifiedTargetEntityName = null;
-		for ( AnnotationMirror mirror : annotations ) {
-			if ( TypeUtils.isAnnotationMirrorOfType( mirror, ElementCollection.class ) ) {
-				fullyQualifiedTargetEntityName = getFullyQualifiedClassNameOfTargetEntity( mirror, "targetClass" );
-			}
-			else if ( TypeUtils.isAnnotationMirrorOfType( mirror, OneToMany.class )
-					|| TypeUtils.isAnnotationMirrorOfType( mirror, ManyToMany.class )
-					|| TypeUtils.isAnnotationMirrorOfType( mirror, ManyToOne.class )
-					|| TypeUtils.isAnnotationMirrorOfType( mirror, OneToOne.class ) ) {
-				fullyQualifiedTargetEntityName = getFullyQualifiedClassNameOfTargetEntity( mirror, "targetEntity" );
-			}
+		private String getKeyType(DeclaredType t) {
+			return TypeUtils.extractClosestRealTypeAsString( t.getTypeArguments().get( 0 ), context );
 		}
-		return fullyQualifiedTargetEntityName;
-	}
 
-	private String getFullyQualifiedClassNameOfTargetEntity(AnnotationMirror mirror, String parameterName) {
-		assert mirror != null;
-		assert parameterName != null;
+		/**
+		 * @param annotations list of annotation mirrors.
+		 *
+		 * @return target entity class name as string or {@code null} if no targetEntity is here or if equals to void
+		 */
+		private String getTargetEntity(List<? extends AnnotationMirror> annotations) {
 
-		String targetEntityName = null;
-		Object parameterValue = TypeUtils.getAnnotationValue( mirror, parameterName );
-		if ( parameterValue != null ) {
-			TypeMirror parameterType = ( TypeMirror ) parameterValue;
-			if ( !parameterType.getKind().equals( TypeKind.VOID ) ) {
-				targetEntityName = parameterType.toString();
+			String fullyQualifiedTargetEntityName = null;
+			for ( AnnotationMirror mirror : annotations ) {
+				if ( TypeUtils.isAnnotationMirrorOfType( mirror, ElementCollection.class ) ) {
+					fullyQualifiedTargetEntityName = getFullyQualifiedClassNameOfTargetEntity( mirror, "targetClass" );
+				}
+				else if ( TypeUtils.isAnnotationMirrorOfType( mirror, OneToMany.class )
+						|| TypeUtils.isAnnotationMirrorOfType( mirror, ManyToMany.class )
+						|| TypeUtils.isAnnotationMirrorOfType( mirror, ManyToOne.class )
+						|| TypeUtils.isAnnotationMirrorOfType( mirror, OneToOne.class ) ) {
+					fullyQualifiedTargetEntityName = getFullyQualifiedClassNameOfTargetEntity( mirror, "targetEntity" );
+				}
 			}
+			return fullyQualifiedTargetEntityName;
 		}
-		return targetEntityName;
-	}
 
-	public String generateImports() {
-		return importContext.generateImports();
-	}
+		private String getFullyQualifiedClassNameOfTargetEntity(AnnotationMirror mirror, String parameterName) {
+			assert mirror != null;
+			assert parameterName != null;
 
-	public String importType(String fqcn) {
-		return importContext.importType( fqcn );
-	}
-
-	public String staticImport(String fqcn, String member) {
-		return importContext.staticImport( fqcn, member );
-	}
-
-	public String importType(Name qualifiedName) {
-		return importType( qualifiedName.toString() );
-	}
-
-	public TypeElement getTypeElement() {
-		return element;
-	}
-
-	private String getKeyType(DeclaredType t) {
-		return TypeUtils.extractClosestRealTypeAsString( t.getTypeArguments().get( 0 ), context );
-	}
-
-	private String getElementType(DeclaredType declaredType, String targetEntity) {
-		if ( targetEntity != null ) {
-			return targetEntity;
-		}
-		final List<? extends TypeMirror> mirrors = declaredType.getTypeArguments();
-		if ( mirrors.size() == 1 ) {
-			final TypeMirror type = mirrors.get( 0 );
-			return TypeUtils.extractClosestRealTypeAsString( type, context );
-		}
-		else if ( mirrors.size() == 2 ) {
-			return TypeUtils.extractClosestRealTypeAsString( mirrors.get( 1 ), context );
-		}
-		else {
-			//for 0 or many
-			//0 is expected, many is not
-			if ( mirrors.size() > 2 ) {
-				context.logMessage( Diagnostic.Kind.WARNING, "Unable to find the closest solid type" + declaredType );
+			String targetEntityName = null;
+			Object parameterValue = TypeUtils.getAnnotationValue( mirror, parameterName );
+			if ( parameterValue != null ) {
+				TypeMirror parameterType = ( TypeMirror ) parameterValue;
+				if ( !parameterType.getKind().equals( TypeKind.VOID ) ) {
+					targetEntityName = parameterType.toString();
+				}
 			}
-			return "?";
+			return targetEntityName;
 		}
 	}
 }

Added: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/StringUtil.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/StringUtil.java	                        (rev 0)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/StringUtil.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,77 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.util;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class StringUtil {
+	private static final String NAME_SEPARATOR = ".";
+	private static final String PROPERTY_PREFIX_GET = "get";
+	private static final String PROPERTY_PREFIX_IS = "is";
+	private static final String PROPERTY_PREFIX_HAS = "has";
+
+	private StringUtil() {
+	}
+
+	public static String determineFullyQualifiedClassName(String packageName, String name) {
+		if ( isFullyQualified( name ) ) {
+			return name;
+		}
+		else {
+			return packageName + NAME_SEPARATOR + name;
+		}
+	}
+
+	public static boolean isFullyQualified(String name) {
+		return name.contains( NAME_SEPARATOR );
+	}
+
+	public static String packageNameFromFqcn(String fqcn) {
+		return fqcn.substring( 0, fqcn.lastIndexOf( NAME_SEPARATOR ) );
+	}
+
+	public static String classNameFromFqcn(String fqcn) {
+		return fqcn.substring( fqcn.lastIndexOf( NAME_SEPARATOR ) + 1 );
+	}
+
+	public static boolean isPropertyName(String name) {
+		return name.startsWith( PROPERTY_PREFIX_GET ) || name.startsWith( PROPERTY_PREFIX_IS ) || name.startsWith(
+				PROPERTY_PREFIX_HAS
+		);
+	}
+
+	public static String getPropertyName(String name) {
+		if ( !isPropertyName( name ) ) {
+			return null;
+		}
+
+		if ( name.startsWith( PROPERTY_PREFIX_GET ) ) {
+			name = name.replaceFirst( PROPERTY_PREFIX_GET, "" );
+		}
+		else if ( name.startsWith( PROPERTY_PREFIX_IS ) ) {
+			name = name.replaceFirst( PROPERTY_PREFIX_IS, "" );
+		}
+		else if ( name.startsWith( PROPERTY_PREFIX_HAS ) ) {
+			name = name.replaceFirst( PROPERTY_PREFIX_HAS, "" );
+		}
+		return name.substring(0,1).toLowerCase() + name.substring(1);
+	}
+}
+
+

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/TypeUtils.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/TypeUtils.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/TypeUtils.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -25,6 +25,7 @@
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.AnnotationValue;
 import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.type.DeclaredType;
@@ -32,7 +33,15 @@
 import javax.lang.model.type.TypeMirror;
 import javax.lang.model.type.TypeVariable;
 import javax.lang.model.util.Types;
+import javax.persistence.Access;
+import javax.persistence.AccessType;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+import javax.tools.Diagnostic;
 
+import org.hibernate.jpamodelgen.AccessTypeInformation;
 import org.hibernate.jpamodelgen.Context;
 
 /**
@@ -44,6 +53,7 @@
  */
 public class TypeUtils {
 
+	public static final String DEFAULT_ANNOTATION_PARAMETER_NAME = "value";
 	private static final Map<String, String> PRIMITIVES = new HashMap<String, String>();
 
 	static {
@@ -181,4 +191,135 @@
 		}
 		return returnValue;
 	}
+
+	public static void determineAccessTypeForHierarchy(TypeElement searchedElement, Context context) {
+		String fqcn = searchedElement.getQualifiedName().toString();
+		context.logMessage( Diagnostic.Kind.OTHER, "check class " + fqcn );
+		AccessTypeInformation accessTypeInfo = context.getAccessTypeInfo( fqcn );
+
+		if ( accessTypeInfo != null && accessTypeInfo.isAccessTypeResolved() ) {
+			context.logMessage(
+					Diagnostic.Kind.OTHER,
+					"AccessType for " + searchedElement.toString() + "found in cache: " + accessTypeInfo
+			);
+			return;
+		}
+
+		// check for explicit access type
+		AccessType forcedAccessType = determineAnnotationSpecifiedAccessType( searchedElement );
+		if ( forcedAccessType != null ) {
+			context.logMessage(
+					Diagnostic.Kind.OTHER, "Explicit access type on " + searchedElement + ":" + forcedAccessType
+			);
+			accessTypeInfo = new AccessTypeInformation( fqcn, forcedAccessType, null );
+			context.addAccessTypeInformation( fqcn, accessTypeInfo );
+			return;
+		}
+
+		// need to find the default access type for this class
+		// let's check first if this entity is the root of the class hierarchy and defines an id. If so the
+		// placement of the id annotation determines the access type
+		AccessType defaultAccessType = getAccessTypeInCaseElementIsRoot( searchedElement, context );
+		if ( defaultAccessType != null ) {
+			accessTypeInfo = new AccessTypeInformation( fqcn, null, defaultAccessType );
+			context.addAccessTypeInformation( fqcn, accessTypeInfo );
+			return;
+		}
+
+		// if we end up here we need to recursively look for superclasses
+		defaultAccessType = getDefaultAccessForHierarchy( searchedElement, context );
+		if ( defaultAccessType == null ) {
+			defaultAccessType = AccessType.PROPERTY;
+		}
+		accessTypeInfo = new AccessTypeInformation( fqcn, null, defaultAccessType );
+		context.addAccessTypeInformation( fqcn, accessTypeInfo );
+	}
+
+	private static AccessType getDefaultAccessForHierarchy(TypeElement element, Context context) {
+		AccessType defaultAccessType = null;
+		TypeElement superClass = element;
+		do {
+			superClass = TypeUtils.getSuperclassTypeElement( superClass );
+			if ( superClass != null ) {
+				String fqcn = superClass.getQualifiedName().toString();
+				AccessTypeInformation accessTypeInfo = context.getAccessTypeInfo( fqcn );
+				if ( accessTypeInfo != null && accessTypeInfo.getDefaultAccessType() != null ) {
+					return accessTypeInfo.getDefaultAccessType();
+				}
+				if ( TypeUtils.containsAnnotation( superClass, Entity.class, MappedSuperclass.class ) ) {
+					defaultAccessType = getAccessTypeInCaseElementIsRoot( superClass, context );
+					if ( defaultAccessType != null ) {
+						accessTypeInfo = new AccessTypeInformation( fqcn, null, defaultAccessType );
+						context.addAccessTypeInformation( fqcn, accessTypeInfo );
+						defaultAccessType = accessTypeInfo.getAccessType();
+					}
+					else {
+						defaultAccessType = getDefaultAccessForHierarchy( superClass, context );
+					}
+				}
+			}
+		}
+		while ( superClass != null );
+		return defaultAccessType;
+	}
+
+	private static AccessType getAccessTypeInCaseElementIsRoot(TypeElement searchedElement, Context context) {
+		AccessType defaultAccessType = null;
+		List<? extends Element> myMembers = searchedElement.getEnclosedElements();
+		for ( Element subElement : myMembers ) {
+			List<? extends AnnotationMirror> entityAnnotations =
+					context.getProcessingEnvironment().getElementUtils().getAllAnnotationMirrors( subElement );
+			for ( Object entityAnnotation : entityAnnotations ) {
+				AnnotationMirror annotationMirror = ( AnnotationMirror ) entityAnnotation;
+				if ( isIdAnnotation( annotationMirror ) ) {
+					defaultAccessType = getAccessTypeOfIdAnnotation( subElement );
+					break;
+				}
+			}
+		}
+		return defaultAccessType;
+	}
+
+	private static AccessType getAccessTypeOfIdAnnotation(Element element) {
+		AccessType accessType = null;
+		final ElementKind kind = element.getKind();
+		if ( kind == ElementKind.FIELD || kind == ElementKind.METHOD ) {
+			accessType = kind == ElementKind.FIELD ? AccessType.FIELD : AccessType.PROPERTY;
+		}
+		return accessType;
+	}
+
+	private static boolean isIdAnnotation(AnnotationMirror annotationMirror) {
+		return TypeUtils.isAnnotationMirrorOfType( annotationMirror, Id.class )
+				|| TypeUtils.isAnnotationMirrorOfType( annotationMirror, EmbeddedId.class );
+	}
+
+	public static AccessType determineAnnotationSpecifiedAccessType(Element element) {
+		final AnnotationMirror accessAnnotationMirror = TypeUtils.getAnnotationMirror( element, Access.class );
+		AccessType forcedAccessType = null;
+		if ( accessAnnotationMirror != null ) {
+			Element accessElement = ( Element ) TypeUtils.getAnnotationValue(
+					accessAnnotationMirror,
+					DEFAULT_ANNOTATION_PARAMETER_NAME
+			);
+			if ( accessElement.getKind().equals( ElementKind.ENUM_CONSTANT ) ) {
+				if ( accessElement.getSimpleName().toString().equals( AccessType.PROPERTY.toString() ) ) {
+					forcedAccessType = AccessType.PROPERTY;
+				}
+				else if ( accessElement.getSimpleName().toString().equals( AccessType.FIELD.toString() ) ) {
+					forcedAccessType = AccessType.FIELD;
+				}
+			}
+		}
+		return forcedAccessType;
+	}
+
+	public static ElementKind getElementKindForAccessType(AccessType accessType) {
+		if ( AccessType.FIELD.equals( accessType ) ) {
+			return ElementKind.FIELD;
+		}
+		else {
+			return ElementKind.METHOD;
+		}
+	}
 }

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaAttribute.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaAttribute.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaAttribute.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -37,7 +37,6 @@
         this.type = type;
     }
 
-
 	@Override
     public String getDeclarationString() {
         return "public static volatile " + parentEntity.importType(getMetaType()) + "<" + parentEntity.importType(parentEntity.getQualifiedName()) + ", " + parentEntity.importType(getTypeDeclaration()) + "> " + getPropertyName() + ";";
@@ -53,4 +52,14 @@
 
     @Override
     abstract public String getMetaType();
+
+	@Override
+	public String toString() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append( "XmlMetaAttribute" );
+		sb.append( "{propertyName='" ).append( propertyName ).append( '\'' );
+		sb.append( ", type='" ).append( type ).append( '\'' );
+		sb.append( '}' );
+		return sb.toString();
+	}
 }

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -22,18 +22,22 @@
 import java.util.List;
 import java.util.Map;
 import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.Name;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.type.DeclaredType;
 import javax.lang.model.type.TypeMirror;
 import javax.tools.Diagnostic;
 
+import org.hibernate.jpamodelgen.AccessTypeInformation;
 import org.hibernate.jpamodelgen.Context;
+import org.hibernate.jpamodelgen.ImportContextImpl;
+import org.hibernate.jpamodelgen.MetaModelGenerationException;
 import org.hibernate.jpamodelgen.model.ImportContext;
-import org.hibernate.jpamodelgen.ImportContextImpl;
 import org.hibernate.jpamodelgen.model.MetaAttribute;
 import org.hibernate.jpamodelgen.model.MetaEntity;
-import org.hibernate.jpamodelgen.MetaModelGenerationException;
+import org.hibernate.jpamodelgen.util.StringUtil;
 import org.hibernate.jpamodelgen.util.TypeUtils;
 import org.hibernate.jpamodelgen.xml.jaxb.Attributes;
 import org.hibernate.jpamodelgen.xml.jaxb.Basic;
@@ -68,15 +72,23 @@
 	private final List<MetaAttribute> members = new ArrayList<MetaAttribute>();
 	private final TypeElement element;
 	private final Context context;
+	private final AccessTypeInformation accessTypeInfo;
 
 	private boolean isMetaComplete;
 
 	public XmlMetaEntity(Entity ormEntity, String packageName, TypeElement element, Context context) {
-		this.clazzName = ormEntity.getClazz();
+		String className = ormEntity.getClazz();
+		if ( StringUtil.isFullyQualified( className ) ) {
+			// we have to extract the package name from the fqcn. default package name gets ignored
+			packageName = StringUtil.packageNameFromFqcn( className );
+			className = StringUtil.classNameFromFqcn( className );
+		}
+		this.clazzName = className;
 		this.packageName = packageName;
 		this.context = context;
 		this.importContext = new ImportContextImpl( getPackageName() );
 		this.element = element;
+		this.accessTypeInfo = context.getAccessTypeInfo( getQualifiedName() );
 		initIsMetaComplete( ormEntity.isMetadataComplete() );
 		parseAttributes( ormEntity.getAttributes() );
 	}
@@ -87,6 +99,7 @@
 		this.context = context;
 		this.importContext = new ImportContextImpl( getPackageName() );
 		this.element = element;
+		this.accessTypeInfo = context.getAccessTypeInfo( getQualifiedName() );
 		initIsMetaComplete( mappedSuperclass.isMetadataComplete() );
 		parseAttributes( mappedSuperclass.getAttributes() );
 	}
@@ -97,12 +110,21 @@
 		this.context = context;
 		this.importContext = new ImportContextImpl( getPackageName() );
 		this.element = element;
+		this.accessTypeInfo = context.getAccessTypeInfo( getQualifiedName() );
 		initIsMetaComplete( embeddable.isMetadataComplete() );
 		parseEmbeddableAttributes( embeddable.getAttributes() );
 	}
 
-	private void initIsMetaComplete(boolean metadataComplete) {
-		isMetaComplete = context.isPersistenceUnitCompletelyXmlConfigured() || metadataComplete;
+	private void initIsMetaComplete(Boolean metadataComplete) {
+		if ( context.isPersistenceUnitCompletelyXmlConfigured() ) {
+			isMetaComplete = true;
+			return;
+		}
+		if ( Boolean.TRUE.equals( metadataComplete ) ) {
+			isMetaComplete = true;
+			return;
+		}
+		isMetaComplete = false;
 	}
 
 	public String getSimpleName() {
@@ -146,205 +168,300 @@
 		return isMetaComplete;
 	}
 
-	private String[] getCollectionType(String propertyName, String explicitTargetEntity) {
+	private String[] getCollectionType(String propertyName, String explicitTargetEntity, ElementKind expectedElementKind) {
 		String types[] = new String[2];
 		for ( Element elem : element.getEnclosedElements() ) {
-			if ( elem.getSimpleName().toString().equals( propertyName ) ) {
-				DeclaredType type = ( ( DeclaredType ) elem.asType() );
-				List<? extends TypeMirror> typeArguments = type.getTypeArguments();
+			if ( expectedElementKind.equals( elem.getKind() ) ) {
+				continue;
+			}
 
-				if ( typeArguments.size() == 0 && explicitTargetEntity == null ) {
-					throw new MetaModelGenerationException( "Unable to determine target entity type for " + clazzName + "." + propertyName + "." );
-				}
+			if ( !elem.getSimpleName().toString().equals( propertyName ) ) {
+				continue;
+			}
 
-				if ( explicitTargetEntity == null ) {
-					types[0] = TypeUtils.extractClosestRealTypeAsString( typeArguments.get( 0 ), context );
-				}
-				else {
-					types[0] = explicitTargetEntity;
-				}
-				types[1] = COLLECTIONS.get( type.asElement().toString() );
+			DeclaredType type = ( ( DeclaredType ) elem.asType() );
+			List<? extends TypeMirror> typeArguments = type.getTypeArguments();
+
+			if ( typeArguments.size() == 0 && explicitTargetEntity == null ) {
+				throw new MetaModelGenerationException( "Unable to determine target entity type for " + clazzName + "." + propertyName + "." );
 			}
+
+			if ( explicitTargetEntity == null ) {
+				types[0] = TypeUtils.extractClosestRealTypeAsString( typeArguments.get( 0 ), context );
+			}
+			else {
+				types[0] = explicitTargetEntity;
+			}
+			types[1] = COLLECTIONS.get( type.asElement().toString() );
+			return types;
+
 		}
-		return types;
+		return null;
 	}
 
 	/**
-	 * Returns the entity type for relation.
+	 * Returns the entity type for a property.
 	 *
-	 * @param propertyName The property name of the association
-	 * @param explicitTargetEntity The explicitly specified target entity type
+	 * @param propertyName The property name
+	 * @param explicitTargetEntity The explicitly specified target entity type or {@code null}.
+	 * @param expectedElementKind Determines property vs field access type
 	 *
-	 * @return The entity type for relation/association.
+	 * @return The entity type for this property  or {@code null} if the property with the name and the matching access
+	 *         type does not exist.
 	 */
-	private String getType(String propertyName, String explicitTargetEntity) {
-		if ( explicitTargetEntity != null ) {
-			// TODO should there be a check of the target entity class and if it is loadable?
-			return explicitTargetEntity;
-		}
+	private String getType(String propertyName, String explicitTargetEntity, ElementKind expectedElementKind) {
+		for ( Element elem : element.getEnclosedElements() ) {
+			if ( !expectedElementKind.equals( elem.getKind() ) ) {
+				continue;
+			}
 
-		String typeName = null;
-		for ( Element elem : element.getEnclosedElements() ) {
-			if ( elem.getSimpleName().toString().equals( propertyName ) ) {
-				switch ( elem.asType().getKind() ) {
-					case INT: {
-						typeName = "java.lang.Integer";
-						break;
-					}
-					case LONG: {
-						typeName = "java.lang.Long";
-						break;
-					}
-					case BOOLEAN: {
-						typeName = "java.lang.Boolean";
-						break;
-					}
-					case DECLARED: {
-						typeName = elem.asType().toString();
-						break;
-					}
-					case TYPEVAR: {
-						typeName = elem.asType().toString();
-						break;
-					}
+			TypeMirror mirror;
+			String name = elem.getSimpleName().toString();
+			if ( ElementKind.METHOD.equals( elem.getKind() ) ) {
+				name = StringUtil.getPropertyName( name );
+				mirror = ( ( ExecutableElement ) elem ).getReturnType();
+			} else {
+				mirror = elem.asType();
+			}
+
+			if ( name == null || !name.equals( propertyName ) ) {
+				continue;
+			}
+
+			if ( explicitTargetEntity != null ) {
+				// TODO should there be a check of the target entity class and if it is loadable?
+				return explicitTargetEntity;
+			}
+
+			switch ( mirror.getKind() ) {
+				case INT: {
+					return "java.lang.Integer";
 				}
-				break;
+				case LONG: {
+					return "java.lang.Long";
+				}
+				case BOOLEAN: {
+					return "java.lang.Boolean";
+				}
+				case DECLARED: {
+					return mirror.toString();
+				}
+				case TYPEVAR: {
+					return mirror.toString();
+				}
 			}
 		}
-		return typeName;
+
+		context.logMessage(
+				Diagnostic.Kind.WARNING,
+				"Unable to determine type for property " + propertyName + " of class " + getQualifiedName()
+						+ " using assess type " + accessTypeInfo.getDefaultAccessType()
+		);
+		return null;
 	}
 
 	@Override
 	public String toString() {
 		final StringBuilder sb = new StringBuilder();
 		sb.append( "XmlMetaEntity" );
-		sb.append( "{type=" ).append( element );
+		sb.append( "{accessTypeInfo=" ).append( accessTypeInfo );
+		sb.append( ", clazzName='" ).append( clazzName ).append( '\'' );
+		sb.append( ", members=" ).append( members );
+		sb.append( ", isMetaComplete=" ).append( isMetaComplete );
 		sb.append( '}' );
 		return sb.toString();
 	}
 
 	private void parseAttributes(Attributes attributes) {
 		XmlMetaSingleAttribute attribute;
-
 		if ( !attributes.getId().isEmpty() ) {
 			// TODO what do we do if there are more than one id nodes?
 			Id id = attributes.getId().get( 0 );
-			attribute = new XmlMetaSingleAttribute(
-					this, id.getName(), getType( id.getName(), null )
-			);
-			members.add( attribute );
+			ElementKind elementKind = getElementKind( id.getAccess() );
+			String type = getType( id.getName(), null, elementKind );
+			if ( type != null ) {
+				attribute = new XmlMetaSingleAttribute( this, id.getName(), type );
+				members.add( attribute );
+			}
 		}
 
 		for ( Basic basic : attributes.getBasic() ) {
-			attribute = new XmlMetaSingleAttribute( this, basic.getName(), getType( basic.getName(), null ) );
-			members.add( attribute );
+			ElementKind elementKind = getElementKind( basic.getAccess() );
+			String type = getType( basic.getName(), null, elementKind );
+			if ( type != null ) {
+				attribute = new XmlMetaSingleAttribute( this, basic.getName(), type );
+				members.add( attribute );
+			}
 		}
 
 		for ( ManyToOne manyToOne : attributes.getManyToOne() ) {
-			attribute = new XmlMetaSingleAttribute(
-					this, manyToOne.getName(), getType( manyToOne.getName(), manyToOne.getTargetEntity() )
-			);
-			members.add( attribute );
+			ElementKind elementKind = getElementKind( manyToOne.getAccess() );
+			String type = getType( manyToOne.getName(), manyToOne.getTargetEntity(), elementKind );
+			if ( type != null ) {
+				attribute = new XmlMetaSingleAttribute( this, manyToOne.getName(), type );
+				members.add( attribute );
+			}
 		}
 
 		for ( OneToOne oneToOne : attributes.getOneToOne() ) {
-			attribute = new XmlMetaSingleAttribute(
-					this, oneToOne.getName(), getType( oneToOne.getName(), oneToOne.getTargetEntity() )
-			);
-			members.add( attribute );
+			ElementKind elementKind = getElementKind( oneToOne.getAccess() );
+			String type = getType( oneToOne.getName(), oneToOne.getTargetEntity(), elementKind );
+			if ( type != null ) {
+				attribute = new XmlMetaSingleAttribute( this, oneToOne.getName(), type );
+				members.add( attribute );
+			}
 		}
 
 		XmlMetaCollection metaCollection;
 		String[] types;
 		for ( ManyToMany manyToMany : attributes.getManyToMany() ) {
+			ElementKind elementKind = getElementKind( manyToMany.getAccess() );
 			try {
-				types = getCollectionType( manyToMany.getName(), manyToMany.getTargetEntity() );
+				types = getCollectionType( manyToMany.getName(), manyToMany.getTargetEntity(), elementKind );
 			}
 			catch ( MetaModelGenerationException e ) {
 				logMetaModelException( manyToMany.getName(), e );
 				break;
 			}
-			metaCollection = new XmlMetaCollection( this, manyToMany.getName(), types[0], types[1] );
-			members.add( metaCollection );
+			if ( types != null ) {
+				metaCollection = new XmlMetaCollection( this, manyToMany.getName(), types[0], types[1] );
+				members.add( metaCollection );
+			}
 		}
 
 		for ( OneToMany oneToMany : attributes.getOneToMany() ) {
+			ElementKind elementKind = getElementKind( oneToMany.getAccess() );
 			try {
-				types = getCollectionType( oneToMany.getName(), oneToMany.getTargetEntity() );
+				types = getCollectionType( oneToMany.getName(), oneToMany.getTargetEntity(), elementKind );
 			}
 			catch ( MetaModelGenerationException e ) {
 				logMetaModelException( oneToMany.getName(), e );
 				break;
 			}
-			metaCollection = new XmlMetaCollection( this, oneToMany.getName(), types[0], types[1] );
-			members.add( metaCollection );
+			if ( types != null ) {
+				metaCollection = new XmlMetaCollection( this, oneToMany.getName(), types[0], types[1] );
+				members.add( metaCollection );
+			}
 		}
 
 		for ( ElementCollection collection : attributes.getElementCollection() ) {
+			ElementKind elementKind = getElementKind( collection.getAccess() );
 			try {
-				types = getCollectionType( collection.getName(), collection.getTargetClass() );
+				types = getCollectionType( collection.getName(), collection.getTargetClass(), elementKind );
 			}
 			catch ( MetaModelGenerationException e ) {
 				logMetaModelException( collection.getName(), e );
 				break;
 			}
-			metaCollection = new XmlMetaCollection( this, collection.getName(), types[0], types[1] );
-			members.add( metaCollection );
+			if ( types != null ) {
+				metaCollection = new XmlMetaCollection( this, collection.getName(), types[0], types[1] );
+				members.add( metaCollection );
+			}
 		}
 	}
 
-	private void logMetaModelException(String name, MetaModelGenerationException e) {
-		StringBuilder builder = new StringBuilder();
-		builder.append( "Error processing xml for " );
-		builder.append( clazzName );
-		builder.append( "." );
-		builder.append( name );
-		builder.append( ". Error message: " );
-		builder.append( e.getMessage() );
-		context.logMessage(
-				Diagnostic.Kind.WARNING,
-				builder.toString()
-		);
-	}
-
 	private void parseEmbeddableAttributes(EmbeddableAttributes attributes) {
 		XmlMetaSingleAttribute attribute;
 		for ( Basic basic : attributes.getBasic() ) {
-			attribute = new XmlMetaSingleAttribute( this, basic.getName(), getType( basic.getName(), null ) );
-			members.add( attribute );
+			ElementKind elementKind = getElementKind( basic.getAccess() );
+			String type = getType( basic.getName(), null, elementKind );
+			if ( type != null ) {
+				attribute = new XmlMetaSingleAttribute( this, basic.getName(), type );
+				members.add( attribute );
+			}
 		}
 
 		for ( ManyToOne manyToOne : attributes.getManyToOne() ) {
-			attribute = new XmlMetaSingleAttribute(
-					this, manyToOne.getName(), getType( manyToOne.getName(), manyToOne.getTargetEntity() )
-			);
-			members.add( attribute );
+			ElementKind elementKind = getElementKind( manyToOne.getAccess() );
+			String type = getType( manyToOne.getName(), manyToOne.getTargetEntity(), elementKind );
+			if ( type != null ) {
+				attribute = new XmlMetaSingleAttribute( this, manyToOne.getName(), type );
+				members.add( attribute );
+			}
 		}
 
 		for ( OneToOne oneToOne : attributes.getOneToOne() ) {
-			attribute = new XmlMetaSingleAttribute(
-					this, oneToOne.getName(), getType( oneToOne.getName(), oneToOne.getTargetEntity() )
-			);
-			members.add( attribute );
+			ElementKind elementKind = getElementKind( oneToOne.getAccess() );
+			String type = getType( oneToOne.getName(), oneToOne.getTargetEntity(), elementKind );
+			if ( type != null ) {
+				attribute = new XmlMetaSingleAttribute( this, oneToOne.getName(), type );
+				members.add( attribute );
+			}
 		}
 
 		XmlMetaCollection metaCollection;
+		String[] types;
 		for ( ManyToMany manyToMany : attributes.getManyToMany() ) {
-			String[] types = getCollectionType( manyToMany.getName(), manyToMany.getTargetEntity() );
-			metaCollection = new XmlMetaCollection( this, manyToMany.getName(), types[0], types[1] );
-			members.add( metaCollection );
+			ElementKind elementKind = getElementKind( manyToMany.getAccess() );
+			try {
+				types = getCollectionType( manyToMany.getName(), manyToMany.getTargetEntity(), elementKind );
+			}
+			catch ( MetaModelGenerationException e ) {
+				logMetaModelException( manyToMany.getName(), e );
+				break;
+			}
+			if ( types != null ) {
+				metaCollection = new XmlMetaCollection( this, manyToMany.getName(), types[0], types[1] );
+				members.add( metaCollection );
+			}
 		}
 
 		for ( OneToMany oneToMany : attributes.getOneToMany() ) {
-			String[] types = getCollectionType( oneToMany.getName(), oneToMany.getTargetEntity() );
-			metaCollection = new XmlMetaCollection( this, oneToMany.getName(), types[0], types[1] );
-			members.add( metaCollection );
+			ElementKind elementKind = getElementKind( oneToMany.getAccess() );
+			try {
+				types = getCollectionType( oneToMany.getName(), oneToMany.getTargetEntity(), elementKind );
+			}
+			catch ( MetaModelGenerationException e ) {
+				logMetaModelException( oneToMany.getName(), e );
+				break;
+			}
+			if ( types != null ) {
+				metaCollection = new XmlMetaCollection( this, oneToMany.getName(), types[0], types[1] );
+				members.add( metaCollection );
+			}
 		}
 
 		for ( ElementCollection collection : attributes.getElementCollection() ) {
-			String[] types = getCollectionType( collection.getName(), collection.getTargetClass() );
-			metaCollection = new XmlMetaCollection( this, collection.getName(), types[0], types[1] );
-			members.add( metaCollection );
+			ElementKind elementKind = getElementKind( collection.getAccess() );
+			try {
+				types = getCollectionType( collection.getName(), collection.getTargetClass(), elementKind );
+			}
+			catch ( MetaModelGenerationException e ) {
+				logMetaModelException( collection.getName(), e );
+				break;
+			}
+			if ( types != null ) {
+				metaCollection = new XmlMetaCollection( this, collection.getName(), types[0], types[1] );
+				members.add( metaCollection );
+			}
 		}
 	}
+
+	private void logMetaModelException(String name, MetaModelGenerationException e) {
+		StringBuilder builder = new StringBuilder();
+		builder.append( "Error processing xml for " );
+		builder.append( clazzName );
+		builder.append( "." );
+		builder.append( name );
+		builder.append( ". Error message: " );
+		builder.append( e.getMessage() );
+		context.logMessage(
+				Diagnostic.Kind.WARNING,
+				builder.toString()
+		);
+	}
+
+	private ElementKind getElementKind(org.hibernate.jpamodelgen.xml.jaxb.AccessType accessType) {
+		// if no explicit access type was specified in xml we use the entity access type
+		if ( accessType == null ) {
+			return TypeUtils.getElementKindForAccessType( accessTypeInfo.getDefaultAccessType() );
+		}
+
+		if ( org.hibernate.jpamodelgen.xml.jaxb.AccessType.FIELD.equals( accessType ) ) {
+			return ElementKind.FIELD;
+		}
+		else {
+			return ElementKind.METHOD;
+		}
+	}
 }

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -37,7 +37,10 @@
 
 import org.xml.sax.SAXException;
 
+import org.hibernate.jpamodelgen.AccessTypeInformation;
 import org.hibernate.jpamodelgen.Context;
+import org.hibernate.jpamodelgen.util.StringUtil;
+import org.hibernate.jpamodelgen.util.TypeUtils;
 import org.hibernate.jpamodelgen.xml.jaxb.Entity;
 import org.hibernate.jpamodelgen.xml.jaxb.EntityMappings;
 import org.hibernate.jpamodelgen.xml.jaxb.ObjectFactory;
@@ -53,11 +56,9 @@
 	private static final String PERSISTENCE_XML_XSD = "persistence_2_0.xsd";
 	private static final String ORM_XSD = "orm_2_0.xsd";
 	private static final String PATH_SEPARATOR = "/";
-	private static final AccessType DEFAULT_XML_ACCESS_TYPE = AccessType.PROPERTY;
 
 	private Context context;
 	private List<EntityMappings> entityMappings;
-	private AccessType defaultAccessType = DEFAULT_XML_ACCESS_TYPE;
 
 	public XmlParser(Context context) {
 		this.context = context;
@@ -67,13 +68,18 @@
 	public void parsePersistenceXml() {
 		collectAllEntityMappings();
 		determineDefaultAccessTypeAndMetaCompleteness();
+		determineXmlAccessTypes();
+		if ( !context.isPersistenceUnitCompletelyXmlConfigured() ) {
+			// need to take annotations into consideration, since they can override xml settings
+			// we have to at least determine whether any of the xml configured entities is influenced by annotations
+			determineAnnotationAccessTypes();
+		}
 
 		for ( EntityMappings mappings : entityMappings ) {
-			String packageName = mappings.getPackage();
-			AccessType entityAccessType = determineEntityAccessType( mappings );
-			parseEntities( mappings.getEntity(), packageName, entityAccessType );
-			parseEmbeddable( mappings.getEmbeddable(), packageName, entityAccessType );
-			parseMappedSuperClass( mappings.getMappedSuperclass(), packageName, entityAccessType );
+			String defaultPackageName = mappings.getPackage();
+			parseEntities( mappings.getEntity(), defaultPackageName );
+			parseEmbeddable( mappings.getEmbeddable(), defaultPackageName );
+			parseMappedSuperClass( mappings.getMappedSuperclass(), defaultPackageName );
 		}
 	}
 
@@ -108,85 +114,88 @@
 		}
 	}
 
-	private void parseEntities(Collection<Entity> entities, String packageName, AccessType accessType) {
+	private void parseEntities(Collection<Entity> entities, String defaultPackageName) {
 		for ( Entity entity : entities ) {
-			String fullyQualifiedClassName = packageName + "." + entity.getClazz();
+			String fqcn = StringUtil.determineFullyQualifiedClassName( defaultPackageName, entity.getClazz() );
 
-			if ( !xmlMappedTypeExists( fullyQualifiedClassName ) ) {
+			if ( !xmlMappedTypeExists( fqcn ) ) {
 				context.logMessage(
 						Diagnostic.Kind.WARNING,
-						fullyQualifiedClassName + " is mapped in xml, but class does not exists. Skipping meta model generation."
+						fqcn + " is mapped in xml, but class does not exists. Skipping meta model generation."
 				);
 				continue;
 			}
 
 			XmlMetaEntity metaEntity = new XmlMetaEntity(
-					entity, packageName, getXmlMappedType( fullyQualifiedClassName ),
-					context
+					entity, defaultPackageName, getXmlMappedType( fqcn ), context
 			);
-
-			if ( context.containsMetaEntity( fullyQualifiedClassName ) ) {
+			if ( context.containsMetaEntity( fqcn ) ) {
 				context.logMessage(
 						Diagnostic.Kind.WARNING,
-						fullyQualifiedClassName + " was already processed once. Skipping second occurance."
+						fqcn + " was already processed once. Skipping second occurance."
 				);
 			}
-			context.addMetaEntity( fullyQualifiedClassName, metaEntity );
+			context.addMetaEntity( fqcn, metaEntity );
 		}
 	}
 
-	private void parseEmbeddable(Collection<org.hibernate.jpamodelgen.xml.jaxb.Embeddable> embeddables, String packageName, AccessType accessType) {
+	private void parseEmbeddable(Collection<org.hibernate.jpamodelgen.xml.jaxb.Embeddable> embeddables, String defaultPackageName) {
 		for ( org.hibernate.jpamodelgen.xml.jaxb.Embeddable embeddable : embeddables ) {
-			String fullyQualifiedClassName = packageName + "." + embeddable.getClazz();
+			String fqcn = StringUtil.determineFullyQualifiedClassName( defaultPackageName, embeddable.getClazz() );
+			// we have to extract the package name from the fqcn. Maybe the entity was setting a fqcn directly
+			String pkg = StringUtil.packageNameFromFqcn( fqcn );
 
-			if ( !xmlMappedTypeExists( fullyQualifiedClassName ) ) {
+			if ( !xmlMappedTypeExists( fqcn ) ) {
 				context.logMessage(
 						Diagnostic.Kind.WARNING,
-						fullyQualifiedClassName + " is mapped in xml, but class does not exists. Skipping meta model generation."
+						fqcn + " is mapped in xml, but class does not exists. Skipping meta model generation."
 				);
 				continue;
 			}
 
 			XmlMetaEntity metaEntity = new XmlMetaEntity(
-					embeddable, packageName, getXmlMappedType( fullyQualifiedClassName ),
+					embeddable, pkg, getXmlMappedType( fqcn ),
 					context
 			);
 
-			if ( context.containsMetaSuperclassOrEmbeddable( fullyQualifiedClassName ) ) {
+			if ( context.containsMetaSuperclassOrEmbeddable( fqcn ) ) {
 				context.logMessage(
 						Diagnostic.Kind.WARNING,
-						fullyQualifiedClassName + " was already processed once. Skipping second occurance."
+						fqcn + " was already processed once. Skipping second occurance."
 				);
 			}
-			context.addMetaSuperclassOrEmbeddable( fullyQualifiedClassName, metaEntity );
+			context.addMetaSuperclassOrEmbeddable( fqcn, metaEntity );
 		}
 	}
 
-
-	private void parseMappedSuperClass(Collection<org.hibernate.jpamodelgen.xml.jaxb.MappedSuperclass> mappedSuperClasses, String packageName, AccessType accessType) {
+	private void parseMappedSuperClass(Collection<org.hibernate.jpamodelgen.xml.jaxb.MappedSuperclass> mappedSuperClasses, String defaultPackageName) {
 		for ( org.hibernate.jpamodelgen.xml.jaxb.MappedSuperclass mappedSuperClass : mappedSuperClasses ) {
-			String fullyQualifiedClassName = packageName + "." + mappedSuperClass.getClazz();
+			String fqcn = StringUtil.determineFullyQualifiedClassName(
+					defaultPackageName, mappedSuperClass.getClazz()
+			);
+			// we have to extract the package name from the fqcn. Maybe the entity was setting a fqcn directly
+			String pkg = StringUtil.packageNameFromFqcn( fqcn );
 
-			if ( !xmlMappedTypeExists( fullyQualifiedClassName ) ) {
+			if ( !xmlMappedTypeExists( fqcn ) ) {
 				context.logMessage(
 						Diagnostic.Kind.WARNING,
-						fullyQualifiedClassName + " is mapped in xml, but class does not exists. Skipping meta model generation."
+						fqcn + " is mapped in xml, but class does not exists. Skipping meta model generation."
 				);
 				continue;
 			}
 
 			XmlMetaEntity metaEntity = new XmlMetaEntity(
-					mappedSuperClass, packageName, getXmlMappedType( fullyQualifiedClassName ),
+					mappedSuperClass, pkg, getXmlMappedType( fqcn ),
 					context
 			);
 
-			if ( context.containsMetaSuperclassOrEmbeddable( fullyQualifiedClassName ) ) {
+			if ( context.containsMetaSuperclassOrEmbeddable( fqcn ) ) {
 				context.logMessage(
 						Diagnostic.Kind.WARNING,
-						fullyQualifiedClassName + " was already processed once. Skipping second occurance."
+						fqcn + " was already processed once. Skipping second occurance."
 				);
 			}
-			context.addMetaSuperclassOrEmbeddable( fullyQualifiedClassName, metaEntity );
+			context.addMetaSuperclassOrEmbeddable( fqcn, metaEntity );
 		}
 	}
 
@@ -298,13 +307,89 @@
 	}
 
 	private AccessType determineEntityAccessType(EntityMappings mappings) {
-		AccessType accessType = defaultAccessType;
+		AccessType accessType = context.getPersistenceUnitDefaultAccessType();
 		if ( mappings.getAccess() != null ) {
 			accessType = mapXmlAccessTypeToJpaAccessType( mappings.getAccess() );
 		}
 		return accessType;
 	}
 
+	private void determineXmlAccessTypes() {
+		for ( EntityMappings mappings : entityMappings ) {
+			String fqcn;
+			String packageName = mappings.getPackage();
+			AccessType defaultAccessType = determineEntityAccessType( mappings );
+
+			for ( Entity entity : mappings.getEntity() ) {
+				String name = entity.getClazz();
+				fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name );
+				AccessType explicitAccessType = null;
+				org.hibernate.jpamodelgen.xml.jaxb.AccessType type = entity.getAccess();
+				if ( type != null ) {
+					explicitAccessType = mapXmlAccessTypeToJpaAccessType( type );
+				}
+				AccessTypeInformation accessInfo = new AccessTypeInformation(
+						fqcn, explicitAccessType, defaultAccessType
+				);
+				context.addAccessTypeInformation( fqcn, accessInfo );
+			}
+
+			for ( org.hibernate.jpamodelgen.xml.jaxb.Embeddable embeddable : mappings.getEmbeddable() ) {
+				String name = embeddable.getClazz();
+				fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name );
+				AccessType explicitAccessType = null;
+				org.hibernate.jpamodelgen.xml.jaxb.AccessType type = embeddable.getAccess();
+				if ( type != null ) {
+					explicitAccessType = mapXmlAccessTypeToJpaAccessType( type );
+				}
+				AccessTypeInformation accessInfo = new AccessTypeInformation(
+						fqcn, explicitAccessType, defaultAccessType
+				);
+				context.addAccessTypeInformation( fqcn, accessInfo );
+
+			}
+
+			for ( org.hibernate.jpamodelgen.xml.jaxb.MappedSuperclass mappedSuperClass : mappings.getMappedSuperclass() ) {
+				String name = mappedSuperClass.getClazz();
+				fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name );
+				AccessType explicitAccessType = null;
+				org.hibernate.jpamodelgen.xml.jaxb.AccessType type = mappedSuperClass.getAccess();
+				if ( type != null ) {
+					explicitAccessType = mapXmlAccessTypeToJpaAccessType( type );
+				}
+				AccessTypeInformation accessInfo = new AccessTypeInformation(
+						fqcn, explicitAccessType, defaultAccessType
+				);
+				context.addAccessTypeInformation( fqcn, accessInfo );
+			}
+		}
+	}
+
+	private void determineAnnotationAccessTypes() {
+		for ( EntityMappings mappings : entityMappings ) {
+			String fqcn;
+			String packageName = mappings.getPackage();
+
+			for ( Entity entity : mappings.getEntity() ) {
+				String name = entity.getClazz();
+				fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name );
+				TypeElement element = context.getTypeElementForFullyQualifiedName( fqcn );
+				if ( element != null ) {
+					TypeUtils.determineAccessTypeForHierarchy( element, context );
+				}
+			}
+
+			for ( org.hibernate.jpamodelgen.xml.jaxb.MappedSuperclass mappedSuperClass : mappings.getMappedSuperclass() ) {
+				String name = mappedSuperClass.getClazz();
+				fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name );
+				TypeElement element = context.getTypeElementForFullyQualifiedName( fqcn );
+				if ( element != null ) {
+					TypeUtils.determineAccessTypeForHierarchy( element, context );
+				}
+			}
+		}
+	}
+
 	/**
 	 * Determines the default access type as specified in the <i>persistence-unit-defaults</i> as well as whether the
 	 * xml configuration is complete and annotations should be ignored.
@@ -332,7 +417,7 @@
 				if ( persistenceUnitDefaults != null ) {
 					org.hibernate.jpamodelgen.xml.jaxb.AccessType xmlAccessType = persistenceUnitDefaults.getAccess();
 					if ( xmlAccessType != null ) {
-						defaultAccessType = mapXmlAccessTypeToJpaAccessType( xmlAccessType );
+						context.setPersistenceUnitDefaultAccessType( mapXmlAccessTypeToJpaAccessType( xmlAccessType ) );
 					}
 				}
 				// for simplicity we stop looking for PersistenceUnitMetadata instances. We assume that all files

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/accesstype/AccessTypeTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/accesstype/AccessTypeTest.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/accesstype/AccessTypeTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -17,8 +17,9 @@
 */
 package org.hibernate.jpamodelgen.test.accesstype;
 
-import java.util.Collections;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 import org.testng.annotations.Test;
 
@@ -36,6 +37,11 @@
 public class AccessTypeTest extends CompilationTest {
 
 	@Test
+	public void testXmlConfiguredEntityGenerated() {
+		TestUtil.assertMetamodelClassGeneratedFor( Order.class );
+	}
+
+	@Test
 	public void testExcludeTransientFieldAndStatic() {
 		TestUtil.assertAbsenceOfFieldInMetamodelFor( Product.class, "nonPersistent" );
 		TestUtil.assertAbsenceOfFieldInMetamodelFor( Product.class, "nonPersistent2" );
@@ -91,12 +97,14 @@
 	}
 
 	@Override
-	protected String getTestPackage() {
-		return Product.class.getPackage().getName();
+	protected String getPackageNameOfTestSources() {
+		return AccessTypeTest.class.getPackage().getName();
 	}
 
 	@Override
-	protected Map<String, String> getProcessorOptions() {
-		return Collections.emptyMap();
+	protected Collection<String> getOrmFiles() {
+		List<String> ormFiles = new ArrayList<String>();
+		ormFiles.add( TestUtil.fcnToPath( AccessTypeTest.class.getPackage().getName() ) + "/orm.xml" );
+		return ormFiles;
 	}
 }

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/accesstype/Order.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/accesstype/Order.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/accesstype/Order.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -22,7 +22,6 @@
 import java.util.Set;
 
 /**
- *
  * @author Max Andersen
  * @author Hardy Ferentschik
  * @author Emmanuel Bernard

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/ArrayTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/ArrayTest.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/ArrayTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -17,9 +17,6 @@
 */
 package org.hibernate.jpamodelgen.test.arraytype;
 
-import java.util.Collections;
-import java.util.Map;
-
 import org.testng.annotations.Test;
 
 import org.hibernate.jpamodelgen.test.util.CompilationTest;
@@ -50,12 +47,7 @@
 	}
 
 	@Override
-	protected String getTestPackage() {
+	protected String getPackageNameOfTestSources() {
 		return Image.class.getPackage().getName();
 	}
-
-	@Override
-	protected Map<String, String> getProcessorOptions() {
-		return Collections.emptyMap();
-	}
 }
\ No newline at end of file

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/TemperatureSamples.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/TemperatureSamples.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/TemperatureSamples.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -20,7 +20,7 @@
 import javax.persistence.Entity;
 
 /**
- * @author Hardy Feretnschik
+ * @author Hardy Ferentschik
  */
 @Entity
 public class TemperatureSamples {

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/elementcollection/ElementCollectionTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/elementcollection/ElementCollectionTest.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/elementcollection/ElementCollectionTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -17,9 +17,6 @@
 */
 package org.hibernate.jpamodelgen.test.elementcollection;
 
-import java.util.Collections;
-import java.util.Map;
-
 import org.testng.annotations.Test;
 
 import org.hibernate.jpamodelgen.test.util.CompilationTest;
@@ -59,12 +56,7 @@
 	}
 
 	@Override
-	protected String getTestPackage() {
+	protected String getPackageNameOfTestSources() {
 		return ElementCollectionTest.class.getPackage().getName();
 	}
-
-	@Override
-	protected Map<String, String> getProcessorOptions() {
-		return Collections.emptyMap();
-	}	
 }
\ No newline at end of file

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/GenericsTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/GenericsTest.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/GenericsTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -17,9 +17,6 @@
 */
 package org.hibernate.jpamodelgen.test.generics;
 
-import java.util.Collections;
-import java.util.Map;
-
 import org.testng.annotations.Test;
 
 import org.hibernate.jpamodelgen.test.util.CompilationTest;
@@ -38,12 +35,7 @@
 	}
 
 	@Override
-	protected String getTestPackage() {
+	protected String getPackageNameOfTestSources() {
 		return GenericsTest.class.getPackage().getName();
 	}
-
-	@Override
-	protected Map<String, String> getProcessorOptions() {
-		return Collections.emptyMap();
-	}
 }
\ No newline at end of file

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/inheritance/InheritanceTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/inheritance/InheritanceTest.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/inheritance/InheritanceTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -17,9 +17,6 @@
 */
 package org.hibernate.jpamodelgen.test.inheritance;
 
-import java.util.Collections;
-import java.util.Map;
-
 import org.testng.annotations.Test;
 
 import org.hibernate.jpamodelgen.test.util.CompilationTest;
@@ -43,12 +40,7 @@
 	}
 
 	@Override
-	protected String getTestPackage() {
+	protected String getPackageNameOfTestSources() {
 		return InheritanceTest.class.getPackage().getName();
 	}
-
-	@Override
-	protected Map<String, String> getProcessorOptions() {
-		return Collections.emptyMap();
-	}	
 }

Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Car.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Car.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Car.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,42 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.mixedmode;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class Car extends Vehicle {
+	private String make;
+
+	public int getHorsePower() {
+		return 0;
+	}
+
+	public void setHorsePower(int horsePower) {
+	}
+
+	public String getMake() {
+		return make;
+	}
+
+	public void setMake(String make) {
+		this.make = make;
+	}
+}
+
+

Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,65 @@
+// $Id: MixedModeMappingTest.java 18683 2010-02-02 21:51:40Z hardy.ferentschik $
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.mixedmode;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import org.hibernate.jpamodelgen.test.util.CompilationTest;
+import org.hibernate.jpamodelgen.test.util.TestUtil;
+
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertAbsenceOfFieldInMetamodelFor;
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertMetamodelClassGeneratedFor;
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertPresenceOfFieldInMetamodelFor;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class MixedConfigurationTest extends CompilationTest {
+	@Test
+	public void testDefaultAccessTypeApplied() {
+		assertMetamodelClassGeneratedFor( Vehicle.class );
+		assertMetamodelClassGeneratedFor( Car.class );
+		assertAbsenceOfFieldInMetamodelFor( Car.class, "horsePower" );
+	}
+
+	@Test
+	public void testExplicitXmlConfiguredAccessTypeApplied() {
+		assertMetamodelClassGeneratedFor( Vehicle.class );
+		assertMetamodelClassGeneratedFor( Truck.class );
+		assertPresenceOfFieldInMetamodelFor(
+				Truck.class, "horsePower", "Property horsePower has explicit access type and should be in metamodel"
+		);
+	}
+
+	@Override
+	protected String getPackageNameOfTestSources() {
+		return MixedConfigurationTest.class.getPackage().getName();
+	}
+
+	@Override
+	protected Collection<String> getOrmFiles() {
+		List<String> ormFiles = new ArrayList<String>();
+		ormFiles.add( TestUtil.fcnToPath( MixedConfigurationTest.class.getPackage().getName() ) + "/car.xml" );
+		ormFiles.add( TestUtil.fcnToPath( MixedConfigurationTest.class.getPackage().getName() ) + "/truck.xml" );
+		return ormFiles;
+	}
+}
\ No newline at end of file

Deleted: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedModeMappingTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedModeMappingTest.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedModeMappingTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -1,56 +0,0 @@
-// $Id$
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2008, Red Hat Middleware LLC, and individual contributors
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-* http://www.apache.org/licenses/LICENSE-2.0
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.hibernate.jpamodelgen.test.mixedmode;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.testng.annotations.Test;
-
-import org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor;
-import org.hibernate.jpamodelgen.test.util.CompilationTest;
-import org.hibernate.jpamodelgen.test.util.TestUtil;
-
-import static org.hibernate.jpamodelgen.test.util.TestUtil.assertAbsenceOfFieldInMetamodelFor;
-import static org.hibernate.jpamodelgen.test.util.TestUtil.assertMetamodelClassGeneratedFor;
-
-/**
- * @author Hardy Ferentschik
- */
-public class MixedModeMappingTest extends CompilationTest {
-	@Test
-	public void testXmlConfiguredEmbeddedClassGenerated() {
-		assertMetamodelClassGeneratedFor( Person.class );
-		assertAbsenceOfFieldInMetamodelFor( Person.class, "name" );
-	}
-
-	@Override
-	protected String getTestPackage() {
-		return MixedModeMappingTest.class.getPackage().getName();
-	}
-
-	@Override
-	protected Map<String, String> getProcessorOptions() {
-		Map<String, String> properties = new HashMap<String, String>();
-		properties.put(
-				JPAMetaModelEntityProcessor.ORM_XML_OPTION,
-				TestUtil.fcnToPath( MixedModeMappingTest.class.getPackage().getName() ) + "/orm.xml"
-		);
-		return properties;
-	}
-}
\ No newline at end of file

Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Truck.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Truck.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Truck.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,41 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.mixedmode;
+
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class Truck extends Vehicle {
+	private String make;
+
+	public int getHorsePower() {
+		return 0;
+	}
+
+	public void setHorsePower(int horsePower) {
+	}
+
+	public String getMake() {
+		return make;
+	}
+
+	public void setMake(String make) {
+		this.make = make;
+	}
+}
\ No newline at end of file

Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Vehicle.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Vehicle.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Vehicle.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,43 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.mixedmode;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Hardy Ferentschik
+ */
+ at Entity
+public class Vehicle {
+	// default access type for classes in this hierarchy is FIELD
+	@Id
+	@GeneratedValue
+	private long id;
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+}
+
+

Copied: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/XmlMetaCompleteTest.java (from rev 18683, jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedModeMappingTest.java)
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/XmlMetaCompleteTest.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/XmlMetaCompleteTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,53 @@
+// $Id$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.mixedmode;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import org.hibernate.jpamodelgen.test.util.CompilationTest;
+import org.hibernate.jpamodelgen.test.util.TestUtil;
+
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertAbsenceOfFieldInMetamodelFor;
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertMetamodelClassGeneratedFor;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class XmlMetaCompleteTest extends CompilationTest {
+	@Test
+	public void testXmlConfiguredEmbeddedClassGenerated() {
+		assertMetamodelClassGeneratedFor( Person.class );
+		assertAbsenceOfFieldInMetamodelFor( Person.class, "name" );
+	}
+
+	@Override
+	protected String getPackageNameOfTestSources() {
+		return XmlMetaCompleteTest.class.getPackage().getName();
+	}
+
+	@Override
+	protected Collection<String> getOrmFiles() {
+		List<String> ormFiles = new ArrayList<String>();
+		ormFiles.add( TestUtil.fcnToPath( XmlMetaCompleteTest.class.getPackage().getName() ) + "/orm.xml" );
+		return ormFiles;
+	}
+}
\ No newline at end of file


Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/XmlMetaCompleteTest.java
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/RawTypesTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/RawTypesTest.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/RawTypesTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -17,9 +17,6 @@
 */
 package org.hibernate.jpamodelgen.test.rawtypes;
 
-import java.util.Collections;
-import java.util.Map;
-
 import org.testng.annotations.Test;
 
 import org.hibernate.jpamodelgen.test.util.CompilationTest;
@@ -38,12 +35,7 @@
 	}
 
 	@Override
-	protected String getTestPackage() {
+	protected String getPackageNameOfTestSources() {
 		return DeskWithRawType.class.getPackage().getName();
 	}
-
-	@Override
-	protected Map<String, String> getProcessorOptions() {
-		return Collections.emptyMap();
-	}
 }
\ No newline at end of file

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -21,6 +21,8 @@
 import java.io.FilenameFilter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import javax.tools.Diagnostic;
@@ -34,6 +36,8 @@
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.BeforeClass;
 
+import org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor;
+
 import static org.testng.FileAssert.fail;
 
 /**
@@ -85,6 +89,7 @@
 		compilationUnits = fileManager.getJavaFileObjectsFromFiles(
 				getCompilationUnits( outBaseDir )
 		);
+		options.add( "-proc:none" ); // for the second compile skip the processor
 		compileSources( options, compiler, diagnostics, fileManager, compilationUnits );
 		fileManager.close();
 	}
@@ -104,6 +109,20 @@
 		options.add( "-d" );
 		options.add( outBaseDir );
 
+		// pass orm files if specified
+		if ( !getOrmFiles().isEmpty() ) {
+			StringBuilder builder = new StringBuilder();
+			builder.append( ANNOTATION_PROCESSOR_OPTION_PREFIX );
+			builder.append( JPAMetaModelEntityProcessor.ORM_XML_OPTION );
+			builder.append( "=" );
+			for ( String ormFile : getOrmFiles() ) {
+				builder.append( ormFile );
+				builder.append( "," );
+			}
+			builder.deleteCharAt( builder.length() - 1 );
+			options.add( builder.toString() );
+		}
+
 		// add any additional options specified by the test
 		for ( Map.Entry<String, String> entry : getProcessorOptions().entrySet() ) {
 			StringBuilder builder = new StringBuilder();
@@ -113,12 +132,13 @@
 			builder.append( entry.getValue() );
 			options.add( builder.toString() );
 		}
+		options.add( "-Adebug=true" );
 		return options;
 	}
 
 	private List<File> getCompilationUnits(String baseDir) {
 		List<File> javaFiles = new ArrayList<File>();
-		String packageDirName = baseDir + PATH_SEPARATOR + getTestPackage().replace( ".", PATH_SEPARATOR );
+		String packageDirName = baseDir + PATH_SEPARATOR + getPackageNameOfTestSources().replace( ".", PATH_SEPARATOR );
 		File packageDir = new File( packageDirName );
 		FilenameFilter javaFileFilter = new FilenameFilter() {
 			@Override
@@ -134,9 +154,15 @@
 		return javaFiles;
 	}
 
-	abstract protected String getTestPackage();
+	abstract protected String getPackageNameOfTestSources();
 
-	abstract protected Map<String, String> getProcessorOptions();
+	protected Map<String, String> getProcessorOptions() {
+		return Collections.emptyMap();
+	}
+
+	protected Collection<String> getOrmFiles() {
+		return Collections.emptyList();
+	}
 }
 
 

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/TestUtil.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/TestUtil.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/TestUtil.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -114,7 +114,7 @@
 
 	public static void assertAttributeTypeInMetaModelFor(Class<?> clazz, String fieldName, Class<?> expectedType, String errorString) {
 		Field field = getFieldFromMetamodelFor( clazz, fieldName );
-		assertNotNull( field );
+		assertNotNull( field, "Field " + fieldName + " should exist." );
 		ParameterizedType type = ( ParameterizedType ) field.getGenericType();
 		Type actualType = type.getActualTypeArguments()[1];
 		if ( expectedType.isArray() ) {

Copied: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/IgnoreInvalidXmlTest.java (from rev 18683, jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/XmlMappingTest.java)
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/IgnoreInvalidXmlTest.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/IgnoreInvalidXmlTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,57 @@
+// $Id$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.xmlmapped;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import org.hibernate.jpamodelgen.test.util.CompilationTest;
+import org.hibernate.jpamodelgen.test.util.TestUtil;
+
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertMetamodelClassGeneratedFor;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class IgnoreInvalidXmlTest extends CompilationTest {
+	@Test
+	public void testInvalidXmlFilesGetIgnored() {
+		// this is only a indirect test, but if the invalid xml files would cause the processor to abort the
+		// meta class would not have been generated
+		assertMetamodelClassGeneratedFor( Superhero.class );
+	}
+
+	@Override
+	protected String getPackageNameOfTestSources() {
+		return IgnoreInvalidXmlTest.class.getPackage().getName();
+	}
+
+	@Override
+	protected Collection<String> getOrmFiles() {
+		List<String> ormFiles = new ArrayList<String>();
+		String packageName = TestUtil.fcnToPath( IgnoreInvalidXmlTest.class.getPackage().getName() );
+		ormFiles.add( packageName + "/orm.xml" );
+		ormFiles.add( packageName + "/jpa1-orm.xml" );
+		ormFiles.add( packageName + "/malformed-mapping.xml" );
+		ormFiles.add( packageName + "/non-existend-class.xml" );
+		return ormFiles;
+	}
+}
\ No newline at end of file

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/LivingBeing.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/LivingBeing.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/LivingBeing.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -21,14 +21,14 @@
  * @author Hardy Ferentschik
  */
 public class LivingBeing {
-	boolean isReallyAlive;
+	boolean reallyAlive;
 
 	public boolean isReallyAlive() {
-		return isReallyAlive;
+		return reallyAlive;
 	}
 
 	public void setReallyAlive(boolean reallyAlive) {
-		isReallyAlive = reallyAlive;
+		this.reallyAlive = reallyAlive;
 	}
 
 	public int nonPersistent() {

Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/XmlMappingTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/XmlMappingTest.java	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/XmlMappingTest.java	2010-02-08 20:58:20 UTC (rev 18734)
@@ -17,12 +17,14 @@
 */
 package org.hibernate.jpamodelgen.test.xmlmapped;
 
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 
 import org.testng.annotations.Test;
 
+import org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor;
 import org.hibernate.jpamodelgen.test.util.CompilationTest;
+import org.hibernate.jpamodelgen.test.util.TestUtil;
 
 import static org.hibernate.jpamodelgen.test.util.TestUtil.assertAttributeTypeInMetaModelFor;
 import static org.hibernate.jpamodelgen.test.util.TestUtil.assertMetamodelClassGeneratedFor;
@@ -86,7 +88,7 @@
 		assertPresenceOfFieldInMetamodelFor( Boy.class, "nickNames", "nickNames field should exist" );
 		assertAttributeTypeInMetaModelFor( Boy.class, "nickNames", String.class, "target class overridden in xml" );
 	}
-	
+
 	@Test
 	public void testClassHierarchy() {
 		assertMetamodelClassGeneratedFor( Mammal.class );
@@ -100,12 +102,17 @@
 	}
 
 	@Override
-	protected String getTestPackage() {
+	protected String getPackageNameOfTestSources() {
 		return XmlMappingTest.class.getPackage().getName();
 	}
 
 	@Override
 	protected Map<String, String> getProcessorOptions() {
-		return Collections.emptyMap();
+		Map<String, String> properties = new HashMap<String, String>();
+		properties.put(
+				JPAMetaModelEntityProcessor.PERSISTENCE_XML_OPTION,
+				TestUtil.fcnToPath( XmlMappingTest.class.getPackage().getName() ) + "/persistence.xml"
+		);
+		return properties;
 	}
 }
\ No newline at end of file

Deleted: jpamodelgen/trunk/src/test/resources/META-INF/dummy.xml
===================================================================
--- jpamodelgen/trunk/src/test/resources/META-INF/dummy.xml	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/resources/META-INF/dummy.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
-                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
-                 version="2.0"
-        >
-    <package>org.hibernate.jpamodelgen.test.model</package>
-    <entity class="Dummy" access="FIELD" metadata-complete="true"> <!-- Class does not exist -->
-        <attributes>
-            <id name="id"/>
-        </attributes>
-    </entity>
-</entity-mappings>

Deleted: jpamodelgen/trunk/src/test/resources/META-INF/jpa1-orm.xml
===================================================================
--- jpamodelgen/trunk/src/test/resources/META-INF/jpa1-orm.xml	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/resources/META-INF/jpa1-orm.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
-                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
-                 version="1.0"
-        >
-    <package>org.hibernate.jpamodelgen.test.model</package>
-    <entity class="Airplane" metadata-complete="true" access="PROPERTY">
-        <attributes>
-            <id name="serialNumber"/>
-        </attributes>
-    </entity>
-</entity-mappings>
\ No newline at end of file

Deleted: jpamodelgen/trunk/src/test/resources/META-INF/malformed-mapping-xml.xml
===================================================================
--- jpamodelgen/trunk/src/test/resources/META-INF/malformed-mapping-xml.xml	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/resources/META-INF/malformed-mapping-xml.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
-                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
-                 version="2.0"
-        >
-    <package>org.hibernate.jpamodelgen.test.model</package>
-    <entity class="Dummy" access="FIELD" metadata-complete="true"> <!-- Class does not exist -->
-        <attributes>
-            <id name="id"/>
-    </entity>
-</entity-mappings>

Deleted: jpamodelgen/trunk/src/test/resources/META-INF/orm.xml
===================================================================
--- jpamodelgen/trunk/src/test/resources/META-INF/orm.xml	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/resources/META-INF/orm.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
-                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
-                 version="2.0"
-        >
-    <package>org.hibernate.jpamodelgen.test.accesstype</package>
-    <!-- default package -->
-    <entity class="Order" access="FIELD" metadata-complete="true"> <!--means ignore annotations-->
-        <attributes>
-            <id name="id">
-                <column name="fld_id"/>
-            </id>
-            <basic name="filled"/>
-            <basic name="date"/>
-            <many-to-one name="shop"/>
-            <one-to-many name="items"
-                         target-entity="org.hibernate.jpamodelgen.test.accesstype.Item"
-                         fetch="EAGER"> <!-- target-entity optional guess the type from the geenric-->
-                <cascade>
-                    <cascade-persist/>
-                </cascade>
-            </one-to-many>
-            <element-collection name="notes"/>
-            <!-- new in JPA 2 -->
-        </attributes>
-    </entity>
-</entity-mappings>

Modified: jpamodelgen/trunk/src/test/resources/META-INF/persistence.xml
===================================================================
--- jpamodelgen/trunk/src/test/resources/META-INF/persistence.xml	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/resources/META-INF/persistence.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -1,15 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <persistence xmlns="http://java.sun.com/xml/ns/persistence"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence.xsd" version="2.0">
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence.xsd" version="2.0">
     <persistence-unit name="annotation-processor" transaction-type="JTA">
         <description>Test persistence unit</description>
-        <mapping-file>/META-INF/dummy.xml</mapping-file>
-        <mapping-file>/META-INF/malformed-mapping-xml.xml</mapping-file>
-        <mapping-file>/META-INF/jpa1-orm.xml</mapping-file>
-        <mapping-file>/org/hibernate/jpamodelgen/test/xmlmapped/address.xml</mapping-file>
-        <mapping-file>/org/hibernate/jpamodelgen/test/xmlmapped/building.xml</mapping-file>
-        <mapping-file>/org/hibernate/jpamodelgen/test/xmlmapped/mammal.xml</mapping-file>
-        <mapping-file>/org/hibernate/jpamodelgen/test/xmlmapped/boy.xml</mapping-file>
     </persistence-unit>
 </persistence>

Copied: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/accesstype/orm.xml (from rev 18677, jpamodelgen/trunk/src/test/resources/META-INF/orm.xml)
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/accesstype/orm.xml	                        (rev 0)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/accesstype/orm.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
+                 version="2.0"
+        >
+    <package>org.hibernate.jpamodelgen.test.accesstype</package>
+    <entity class="Order" access="FIELD" metadata-complete="true"> <!--means ignore annotations-->
+        <attributes>
+            <id name="id">
+                <column name="fld_id"/>
+            </id>
+            <basic name="filled"/>
+            <basic name="date"/>
+            <many-to-one name="shop"/>
+            <one-to-many name="items"
+                         target-entity="org.hibernate.jpamodelgen.test.accesstype.Item"
+                         fetch="EAGER"> <!-- target-entity optional guess the type from the geenric-->
+                <cascade>
+                    <cascade-persist/>
+                </cascade>
+            </one-to-many>
+            <element-collection name="notes"/>
+        </attributes>
+    </entity>
+</entity-mappings>


Property changes on: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/accesstype/orm.xml
___________________________________________________________________
Name: svn:keywords
   + Id

Copied: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/car.xml (from rev 18683, jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/orm.xml)
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/car.xml	                        (rev 0)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/car.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
+                 version="2.0"
+        >
+    <!-- foo.bar should get ignored since class is fully qualified -->
+    <package>foo.bar</package>
+    <entity class="org.hibernate.jpamodelgen.test.mixedmode.Car">
+        <attributes>
+            <basic name="horsePower"/>
+            <basic name="make"/>
+        </attributes>
+    </entity>
+</entity-mappings>
+

Added: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/truck.xml
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/truck.xml	                        (rev 0)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/truck.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
+                 version="2.0"
+        >
+    <!-- foo.bar should get ignored since class is fully qualified -->
+    <package>foo.bar</package>
+    <entity class="org.hibernate.jpamodelgen.test.mixedmode.Truck">
+        <attributes>
+            <basic name="horsePower" access="PROPERTY"/>
+            <basic name="make"/>
+        </attributes>
+    </entity>
+</entity-mappings>
+

Copied: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/jpa1-orm.xml (from rev 18677, jpamodelgen/trunk/src/test/resources/META-INF/jpa1-orm.xml)
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/jpa1-orm.xml	                        (rev 0)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/jpa1-orm.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+                 version="1.0"
+        >
+    <package>org.hibernate.jpamodelgen.test.model</package>
+    <entity class="Airplane" metadata-complete="true" access="PROPERTY">
+        <attributes>
+            <id name="serialNumber"/>
+        </attributes>
+    </entity>
+</entity-mappings>
\ No newline at end of file


Property changes on: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/jpa1-orm.xml
___________________________________________________________________
Name: svn:keywords
   + Id

Copied: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/malformed-mapping.xml (from rev 18677, jpamodelgen/trunk/src/test/resources/META-INF/malformed-mapping-xml.xml)
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/malformed-mapping.xml	                        (rev 0)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/malformed-mapping.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
+                 version="2.0"
+        >
+    <package>org.hibernate.jpamodelgen.test.model</package>
+    <entity class="Dummy" access="FIELD" metadata-complete="true"> <!-- Class does not exist -->
+        <attributes>
+            <id name="id"/>
+    </entity>
+</entity-mappings>


Property changes on: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/malformed-mapping.xml
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/mammal.xml
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/mammal.xml	2010-02-08 19:27:00 UTC (rev 18733)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/mammal.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -8,7 +8,7 @@
     <package>org.hibernate.jpamodelgen.test.xmlmapped</package>
     <entity class="LivingBeing" access="FIELD" metadata-complete="true">
         <attributes>
-            <basic name="isReallyAlive"/>
+            <basic name="reallyAlive"/>
         </attributes>
     </entity>
     <entity class="Mammal" access="FIELD" metadata-complete="true">

Copied: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/non-existend-class.xml (from rev 18677, jpamodelgen/trunk/src/test/resources/META-INF/dummy.xml)
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/non-existend-class.xml	                        (rev 0)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/non-existend-class.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
+                 version="2.0"
+        >
+    <package>org.hibernate.jpamodelgen.test.model</package>
+    <entity class="Dummy" access="FIELD" metadata-complete="true"> <!-- Class does not exist -->
+        <attributes>
+            <id name="id"/>
+        </attributes>
+    </entity>
+</entity-mappings>


Property changes on: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/non-existend-class.xml
___________________________________________________________________
Name: svn:keywords
   + Id

Copied: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/persistence.xml (from rev 18677, jpamodelgen/trunk/src/test/resources/META-INF/persistence.xml)
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/persistence.xml	                        (rev 0)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/xmlmapped/persistence.xml	2010-02-08 20:58:20 UTC (rev 18734)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence.xsd" version="2.0">
+    <persistence-unit name="annotation-processor" transaction-type="JTA">
+        <mapping-file>/org/hibernate/jpamodelgen/test/xmlmapped/address.xml</mapping-file>
+        <mapping-file>/org/hibernate/jpamodelgen/test/xmlmapped/building.xml</mapping-file>
+        <mapping-file>/org/hibernate/jpamodelgen/test/xmlmapped/mammal.xml</mapping-file>
+        <mapping-file>/org/hibernate/jpamodelgen/test/xmlmapped/boy.xml</mapping-file>
+    </persistence-unit>
+</persistence>



More information about the hibernate-commits mailing list