[hibernate-commits] Hibernate SVN: r18683 - in jpamodelgen/trunk/src: main/java/org/hibernate/jpamodelgen/xml and 4 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Feb 2 16:51:41 EST 2010


Author: hardy.ferentschik
Date: 2010-02-02 16:51:40 -0500 (Tue, 02 Feb 2010)
New Revision: 18683

Added:
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedModeMappingTest.java
Removed:
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/persistence.xml
Modified:
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.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/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/XmlMappingTest.java
   jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/orm.xml
Log:
METAGEN-9

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java	2010-02-02 21:32:53 UTC (rev 18682)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java	2010-02-02 21:51:40 UTC (rev 18683)
@@ -17,8 +17,11 @@
 */
 package org.hibernate.jpamodelgen;
 
+import java.util.ArrayList;
+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;
@@ -44,6 +47,7 @@
 	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>();
@@ -70,6 +74,20 @@
 			persistenceXmlLocation = DEFAULT_PERSISTENCE_XML_LOCATION;
 		}
 
+		if ( pe.getOptions().get( JPAMetaModelEntityProcessor.ORM_XML_OPTION ) != null ) {
+			String tmp = pe.getOptions().get( JPAMetaModelEntityProcessor.ORM_XML_OPTION );
+			ormXmlFiles = new ArrayList<String>();
+			for ( String ormFile : tmp.split( "," ) ) {
+				if ( !ormFile.startsWith( PATH_SEPARATOR ) ) {
+					ormFile = PATH_SEPARATOR + ormFile;
+				}
+				ormXmlFiles.add( ormFile );
+			}
+		}
+		else {
+			ormXmlFiles = Collections.emptyList();
+		}
+
 		logDebug = Boolean.parseBoolean( pe.getOptions().get( JPAMetaModelEntityProcessor.DEBUG_OPTION ) );
 
 	}
@@ -82,6 +100,10 @@
 		return persistenceXmlLocation;
 	}
 
+	public List<String> getOrmXmlFiles() {
+		return ormXmlFiles;
+	}
+
 	public Map<String, MetaEntity> getMetaEntities() {
 		return metaEntities;
 	}

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java	2010-02-02 21:32:53 UTC (rev 18682)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java	2010-02-02 21:51:40 UTC (rev 18683)
@@ -49,10 +49,15 @@
  */
 @SupportedAnnotationTypes("*")
 @SupportedSourceVersion(RELEASE_6)
- at SupportedOptions({ JPAMetaModelEntityProcessor.DEBUG_OPTION })
+ at SupportedOptions({
+		JPAMetaModelEntityProcessor.DEBUG_OPTION,
+		JPAMetaModelEntityProcessor.PERSISTENCE_XML_OPTION,
+		JPAMetaModelEntityProcessor.ORM_XML_OPTION
+})
 public class JPAMetaModelEntityProcessor extends AbstractProcessor {
 	public static final String DEBUG_OPTION = "debug";
 	public static final String PERSISTENCE_XML_OPTION = "persistenceXml";
+	public static final String ORM_XML_OPTION = "ormXmlList";
 	private static final Boolean ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS = Boolean.FALSE;
 
 	private boolean xmlProcessed = false;
@@ -88,10 +93,6 @@
 			return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS;
 		}
 
-		if ( context.isPersistenceUnitCompletelyXmlConfigured() ) {
-			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() );
@@ -137,22 +138,28 @@
 		List<? extends AnnotationMirror> annotationMirrors = element.getAnnotationMirrors();
 		for ( AnnotationMirror mirror : annotationMirrors ) {
 			if ( element.getKind() == ElementKind.CLASS ) {
-				if ( TypeUtils.isAnnotationMirrorOfType( mirror, Entity.class ) ) {
-					AnnotationMetaEntity metaEntity = new AnnotationMetaEntity( ( TypeElement ) element, context );
-					MetaEntity alreadyExistingMetaEntity = context.getMetaEntities()
-							.get( metaEntity.getQualifiedName() );
-					if ( alreadyExistingMetaEntity != null && alreadyExistingMetaEntity.isMetaComplete() ) {
-						continue;
-					}
-					context.getMetaEntities().put( metaEntity.getQualifiedName(), metaEntity );
+				String fqn = ( ( TypeElement ) element ).getQualifiedName().toString();
+				MetaEntity alreadyExistingMetaEntity = context.getMetaEntities().get( fqn );
+				if ( alreadyExistingMetaEntity != null && alreadyExistingMetaEntity.isMetaComplete() ) {
+					String msg = "Skipping processing of annotations for " + fqn + " since xml configuration is metadata complete.";
+					context.logMessage( Diagnostic.Kind.OTHER, msg );
+					continue;
 				}
-				else if ( TypeUtils.isAnnotationMirrorOfType( mirror, MappedSuperclass.class )
-						|| TypeUtils.isAnnotationMirrorOfType( mirror, Embeddable.class ) ) {
-					AnnotationMetaEntity metaEntity = new AnnotationMetaEntity( ( TypeElement ) element, context );
-					// TODO instead of just adding the entity we have to do some merging.
-					context.getMetaSuperclassAndEmbeddable().put( metaEntity.getQualifiedName(), metaEntity );
-				}
+
+				AnnotationMetaEntity metaEntity = new AnnotationMetaEntity( ( TypeElement ) element, context );
+				addMetaEntityToContext( mirror, metaEntity );
 			}
 		}
 	}
+
+	private void addMetaEntityToContext(AnnotationMirror mirror, AnnotationMetaEntity metaEntity) {
+		if ( TypeUtils.isAnnotationMirrorOfType( mirror, Entity.class ) ) {
+			context.getMetaEntities().put( metaEntity.getQualifiedName(), metaEntity );
+		}
+		else if ( TypeUtils.isAnnotationMirrorOfType( mirror, MappedSuperclass.class )
+				|| TypeUtils.isAnnotationMirrorOfType( mirror, Embeddable.class ) ) {
+
+			context.getMetaSuperclassAndEmbeddable().put( metaEntity.getQualifiedName(), metaEntity );
+		}
+	}
 }

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-02 21:32:53 UTC (rev 18682)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java	2010-02-02 21:51:40 UTC (rev 18683)
@@ -77,9 +77,8 @@
 		this.context = context;
 		this.importContext = new ImportContextImpl( getPackageName() );
 		this.element = element;
-		Attributes attributes = ormEntity.getAttributes();
-
-		parseAttributes( attributes );
+		initIsMetaComplete( ormEntity.isMetadataComplete() );
+		parseAttributes( ormEntity.getAttributes() );
 	}
 
 	public XmlMetaEntity(MappedSuperclass mappedSuperclass, String packageName, TypeElement element, Context context) {
@@ -88,8 +87,8 @@
 		this.context = context;
 		this.importContext = new ImportContextImpl( getPackageName() );
 		this.element = element;
-		Attributes attributes = mappedSuperclass.getAttributes();
-		parseAttributes( attributes );
+		initIsMetaComplete( mappedSuperclass.isMetadataComplete() );
+		parseAttributes( mappedSuperclass.getAttributes() );
 	}
 
 	public XmlMetaEntity(Embeddable embeddable, String packageName, TypeElement element, Context context) {
@@ -98,10 +97,14 @@
 		this.context = context;
 		this.importContext = new ImportContextImpl( getPackageName() );
 		this.element = element;
-		EmbeddableAttributes attributes = embeddable.getAttributes();
-		parseEmbeddableAttributes( attributes );
+		initIsMetaComplete( embeddable.isMetadataComplete() );
+		parseEmbeddableAttributes( embeddable.getAttributes() );
 	}
 
+	private void initIsMetaComplete(boolean metadataComplete) {
+		isMetaComplete = context.isPersistenceUnitCompletelyXmlConfigured() || metadataComplete;
+	}
+
 	public String getSimpleName() {
 		return clazzName;
 	}

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-02 21:32:53 UTC (rev 18682)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java	2010-02-02 21:51:40 UTC (rev 18683)
@@ -61,24 +61,27 @@
 	}
 
 	public void parsePersistenceXml() {
-		// /META-INF/orm.xml is implicit
-		parsingOrmXml( ORM_XML );
-
 		Persistence persistence = parseXml(
 				context.getPersistenceXmlLocation(), Persistence.class, PERSISTENCE_XML_XSD
 		);
-		if ( persistence == null ) {
-			return;
+		if ( persistence != null ) {
+			List<Persistence.PersistenceUnit> persistenceUnits = persistence.getPersistenceUnit();
+			for ( Persistence.PersistenceUnit unit : persistenceUnits ) {
+				List<String> mappingFiles = unit.getMappingFile();
+				for ( String mappingFile : mappingFiles ) {
+					parsingOrmXml( mappingFile );
+				}
+			}
 		}
 
-		List<Persistence.PersistenceUnit> persistenceUnits = persistence.getPersistenceUnit();
-		for ( Persistence.PersistenceUnit unit : persistenceUnits ) {
-			List<String> mappingFiles = unit.getMappingFile();
-			for ( String mappingFile : mappingFiles ) {
-				parsingOrmXml( mappingFile );
-			}
+		// /META-INF/orm.xml is implicit
+		parsingOrmXml( ORM_XML );
+
+		// not really part of the official spec, but the processor allows to specify mapping files directly as
+		// command line options
+		for ( String optionalOrmFiles : context.getOrmXmlFiles() ) {
+			parsingOrmXml( optionalOrmFiles );
 		}
-
 	}
 
 	private void parsingOrmXml(String resource) {

Copied: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedModeMappingTest.java (from rev 18677, jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/XmlMappingTest.java)
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedModeMappingTest.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedModeMappingTest.java	2010-02-02 21:51:40 UTC (rev 18683)
@@ -0,0 +1,56 @@
+// $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

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-02 21:32:53 UTC (rev 18682)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java	2010-02-02 21:51:40 UTC (rev 18683)
@@ -19,7 +19,6 @@
 
 import java.io.File;
 import java.io.FilenameFilter;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -33,6 +32,7 @@
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testng.annotations.BeforeClass;
 
 import static org.testng.FileAssert.fail;
 
@@ -63,17 +63,11 @@
 	}
 
 	public CompilationTest() {
-		try {
-			TestUtil.clearOutputFolder();
-			compile();
-		}
-		catch ( Exception e ) {
-			e.printStackTrace();
-			fail( "Unable to compile test sources. " + e.getMessage() );
-		}
 	}
 
-	private void compile() throws IOException {
+	@BeforeClass
+	protected void compile() throws Exception {
+		TestUtil.deleteGeneratedSourceFiles( new File( outBaseDir ) );
 		List<String> options = createJavaOptions();
 
 		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

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-02 21:32:53 UTC (rev 18682)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/TestUtil.java	2010-02-02 21:51:40 UTC (rev 18683)
@@ -18,11 +18,14 @@
 package org.hibernate.jpamodelgen.test.util;
 
 import java.io.File;
+import java.io.FileFilter;
 import java.lang.reflect.Field;
 import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 
 import static org.testng.Assert.assertEquals;
@@ -34,7 +37,7 @@
  * @author Hardy Ferentschik
  */
 public class TestUtil {
-
+	private static final Logger log = LoggerFactory.getLogger( TestUtil.class );
 	private static final String PATH_SEPARATOR = System.getProperty( "file.separator" );
 	private static final String PACKAGE_SEPARATOR = ".";
 	private static final String META_MODEL_CLASS_POSTFIX = "_";
@@ -51,11 +54,23 @@
 	private TestUtil() {
 	}
 
-	public static void clearOutputFolder() {
-		File outDir = new File( outBaseDir );
-		File[] files = outDir.listFiles();
-		for ( File file : files ) {
-			file.delete();
+	public static void deleteGeneratedSourceFiles(File path) {
+		if ( path.exists() ) {
+			File[] files = path.listFiles( new MetaModelFilenameFilter() );
+			for ( File file : files ) {
+				if ( file.isDirectory() ) {
+					deleteGeneratedSourceFiles( file );
+				}
+				else {
+					boolean success = file.delete();
+					if ( success ) {
+						log.debug( file.getAbsolutePath() + " deleted successfully" );
+					}
+					else {
+						log.debug( "Failed to delete generated source file" + file.getAbsolutePath() );
+					}
+				}
+			}
 		}
 	}
 
@@ -162,6 +177,19 @@
 	public static String fcnToPath(String fcn) {
 		return fcn.replace( PACKAGE_SEPARATOR, PATH_SEPARATOR );
 	}
+
+	private static class MetaModelFilenameFilter implements FileFilter {
+		@Override
+		public boolean accept(File pathname) {
+			if ( pathname.isDirectory() ) {
+				return true;
+			}
+			else {
+				return pathname.getAbsolutePath().endsWith( "_.java" )
+						|| pathname.getAbsolutePath().endsWith( "_.class" );
+			}
+		}
+	}
 }
 
 

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-02 21:32:53 UTC (rev 18682)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/XmlMappingTest.java	2010-02-02 21:51:40 UTC (rev 18683)
@@ -86,8 +86,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 );

Modified: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/orm.xml
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/orm.xml	2010-02-02 21:32:53 UTC (rev 18682)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/orm.xml	2010-02-02 21:51:40 UTC (rev 18683)
@@ -9,5 +9,10 @@
         <xml-mapping-metadata-complete/>
     </persistence-unit-metadata>
     <package>org.hibernate.jpamodelgen.test.mixedmode</package>
+    <entity class="Person" access="FIELD" metadata-complete="true">
+        <attributes>
+            <id name="id"/>
+        </attributes>
+    </entity>
 </entity-mappings>
 

Deleted: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/persistence.xml
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/persistence.xml	2010-02-02 21:32:53 UTC (rev 18682)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/persistence.xml	2010-02-02 21:51:40 UTC (rev 18683)
@@ -1,8 +0,0 @@
-<?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">
-        <mapping-file>/org/hibernate/jpamodelgen/test/mixedmode/orm.xml</mapping-file>
-    </persistence-unit>
-</persistence>



More information about the hibernate-commits mailing list