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)
-@SupportedOptions({ JPAMetaModelEntityProcessor.DEBUG_OPTION })
+@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>