[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