From ca7f96b83ddd7e7c44a5b72fec62bb7557a20b2d Mon Sep 17 00:00:00 2001 From: Lukas Jungmann Date: Fri, 18 Sep 2015 23:46:55 +0200 Subject: [PATCH] Bug 466271: Abstract MappedSuperclass in separate JAR is not weaved statically Signed-off-by: Lukas Jungmann Reviewed-by: Petros, MartinG --- .../config/PersistenceUnitProperties.java | 18 ++++- .../eclipselink-jpa21-model/persistence.xml | 12 ++++ .../tests/jpa21/advanced/JPA21TestSuite.java | 1 + .../tests/jpa21/advanced/WeaverTestSuite.java | 44 +++++++++++++ .../tests/weaving/SimpleWeaverTestSuite.java | 33 +++++++--- .../internal/jpa/EntityManagerSetupImpl.java | 7 +- .../jpa/metadata/MetadataProcessor.java | 6 +- .../jpa/metadata/MetadataProject.java | 11 ++-- .../accessors/classes/ClassAccessor.java | 2 +- .../jpa/weaving/TransformerFactory.java | 65 ++++++++++++------- 10 files changed, 157 insertions(+), 42 deletions(-) create mode 100644 jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa21/advanced/WeaverTestSuite.java diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/config/PersistenceUnitProperties.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/config/PersistenceUnitProperties.java index b25f68b03a3..8c11c8239e9 100644 --- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/config/PersistenceUnitProperties.java +++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/config/PersistenceUnitProperties.java @@ -53,6 +53,7 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.FlushModeType; +import javax.persistence.MappedSuperclass; import javax.persistence.Persistence; import org.eclipse.persistence.annotations.Cache; @@ -1860,9 +1861,23 @@ public class PersistenceUnitProperties { */ public static final String WEAVING_FETCHGROUPS = "eclipselink.weaving.fetchgroups"; + /** + * The "eclipselink.weaving.mappedsuperclass" property configures + * whether {@link MappedSuperclass}es with no direct sub-classes will be woven. + *

+ * This property will only be considered if weaving is enabled. + *

+ * Allowed Values: + *

+ */ + public static final String WEAVING_MAPPEDSUPERCLASS = "eclipselink.weaving.mappedsuperclass"; + /** * The "eclipselink.weaving.rest" property configures - * whether classes will be weaved to support EclipseLink JPA_RS functionality + * whether classes will be woven to support EclipseLink JPA_RS functionality *

* This property will only be considered if weaving is enabled. *

@@ -2479,6 +2494,7 @@ public class PersistenceUnitProperties { * * @deprecated replaced by {@link #ID_VALIDATION} property with value "NULL". */ + @Deprecated public static final String ALLOW_ZERO_ID = "eclipselink.allow-zero-id"; /** diff --git a/jpa/eclipselink.jpa.test/resource/eclipselink-jpa21-model/persistence.xml b/jpa/eclipselink.jpa.test/resource/eclipselink-jpa21-model/persistence.xml index 1863b3d7e31..7057013398d 100644 --- a/jpa/eclipselink.jpa.test/resource/eclipselink-jpa21-model/persistence.xml +++ b/jpa/eclipselink.jpa.test/resource/eclipselink-jpa21-model/persistence.xml @@ -168,4 +168,16 @@ true + + + org.eclipse.persistence.jpa.PersistenceProvider + NONE + org.eclipse.persistence.testing.models.jpa21.advanced.Athlete + true + + + + + + diff --git a/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa21/advanced/JPA21TestSuite.java b/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa21/advanced/JPA21TestSuite.java index 93d7273f2f6..73875ef959d 100644 --- a/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa21/advanced/JPA21TestSuite.java +++ b/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa21/advanced/JPA21TestSuite.java @@ -49,6 +49,7 @@ public static Test suite() { fullSuite.addTest(XMLForeignKeyTestSuite.suite()); fullSuite.addTest(XMLIndexTestSuite.suite()); fullSuite.addTest(XMLEntityGraphTestSuite.suite()); + fullSuite.addTest(WeaverTestSuite.suite()); return fullSuite; } } diff --git a/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa21/advanced/WeaverTestSuite.java b/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa21/advanced/WeaverTestSuite.java new file mode 100644 index 00000000000..82c28fdc27a --- /dev/null +++ b/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa21/advanced/WeaverTestSuite.java @@ -0,0 +1,44 @@ +package org.eclipse.persistence.testing.tests.jpa21.advanced; + +import java.util.Arrays; + +import javax.persistence.EntityManagerFactory; +import javax.persistence.metamodel.ManagedType; + +import org.eclipse.persistence.internal.descriptors.PersistenceEntity; +import org.eclipse.persistence.testing.framework.junit.JUnitTestCase; +import org.eclipse.persistence.testing.models.jpa21.advanced.Athlete; +import org.junit.Assert; + +import junit.framework.Test; +import junit.framework.TestSuite; + +public class WeaverTestSuite extends JUnitTestCase { + + public WeaverTestSuite(String name) { + super(name); + } + + @Override + public String getPersistenceUnitName() { + return "pu-with-mappedsuperclass"; + } + + + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.setName("WeaverTestSuite"); + + suite.addTest(new WeaverTestSuite("testMappedSuperclassWeaving")); + + return suite; + } + + //bug #466271 - @MappedSuperclass with no implementations should be woven + public void testMappedSuperclassWeaving() { + EntityManagerFactory emf = getEntityManagerFactory(); + ManagedType managedType = emf.getMetamodel().managedType(Athlete.class); + Class javaClass = emf.getMetamodel().managedType(Athlete.class).getJavaType(); + Assert.assertTrue(Arrays.asList(javaClass.getInterfaces()).contains(PersistenceEntity.class)); + } +} diff --git a/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/weaving/SimpleWeaverTestSuite.java b/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/weaving/SimpleWeaverTestSuite.java index 73434b36766..aaa14116cd0 100644 --- a/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/weaving/SimpleWeaverTestSuite.java +++ b/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/weaving/SimpleWeaverTestSuite.java @@ -18,10 +18,6 @@ import java.util.ArrayList; import java.util.Collection; -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - import org.eclipse.persistence.internal.jpa.metadata.MetadataLogger; import org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory; import org.eclipse.persistence.internal.jpa.weaving.PersistenceWeaver; @@ -33,6 +29,10 @@ import org.eclipse.persistence.testing.models.weaving.SimpleObject; import org.eclipse.persistence.testing.models.weaving.SimpleProject; +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + public class SimpleWeaverTestSuite extends TestCase { // fixtures @@ -64,20 +64,26 @@ public static Test suite() { TestSuite suite = new TestSuite("Simple TopLinkWeaver Tests"); suite.addTest(new SimpleWeaverTestSuite( "test TopLinkWeaver with null Session") { + @Override public void setUp() { } + @Override public void tearDown() { } + @Override public void runTest() { nullSessionTest(); } }); suite.addTest(new SimpleWeaverTestSuite( "test TopLinkWeaver with null Project") { + @Override public void setUp() { } + @Override public void tearDown() { } + @Override public void runTest() { Session session = new ServerSession(); session.setLogLevel(SessionLog.OFF); @@ -86,10 +92,13 @@ public void runTest() { }); suite.addTest(new SimpleWeaverTestSuite( "test TopLinkWeaver with null list of entities") { + @Override public void setUp() { } + @Override public void tearDown() { } + @Override public void runTest() { Session session = new ServerSession(new SimpleProject()); session.setLogLevel(SessionLog.OFF); @@ -98,10 +107,13 @@ public void runTest() { }); suite.addTest(new SimpleWeaverTestSuite( "test TopLinkWeaver with empty list of entities") { + @Override public void setUp() { } + @Override public void tearDown() { } + @Override public void runTest() { Session session = new ServerSession(new SimpleProject()); session.setLogLevel(SessionLog.OFF); @@ -109,10 +121,13 @@ public void runTest() { } }); suite.addTest(new SimpleWeaverTestSuite("build TopLinkWeaver") { + @Override public void setUp() { } + @Override public void tearDown() { } + @Override public void runTest() { Session session = new ServerSession(new SimpleProject()); session.setLogLevel(SessionLog.OFF); @@ -125,7 +140,7 @@ public void runTest() { public void nullSessionTest() { boolean expectedFailure = false; try { - TransformerFactory.createTransformerAndModifyProject(null, null, Thread.currentThread().getContextClassLoader(), true, false, true, true, true); + TransformerFactory.createTransformerAndModifyProject(null, null, Thread.currentThread().getContextClassLoader(), true, false, true, true, true, false); } catch (IllegalArgumentException iae) { expectedFailure = true; @@ -138,7 +153,7 @@ public void nullSessionTest() { public void nullProjectTest(Session session) { boolean expectedFailure = false; try { - TransformerFactory.createTransformerAndModifyProject(session, null, Thread.currentThread().getContextClassLoader(), true, false, true, true, true); + TransformerFactory.createTransformerAndModifyProject(session, null, Thread.currentThread().getContextClassLoader(), true, false, true, true, true, false); } catch (IllegalArgumentException iae) { expectedFailure = true; @@ -150,7 +165,7 @@ public void nullProjectTest(Session session) { public void nullEntitiesTest(Session session) { try { - TransformerFactory.createTransformerAndModifyProject(session, null, Thread.currentThread().getContextClassLoader(), true, false, true, true, true); + TransformerFactory.createTransformerAndModifyProject(session, null, Thread.currentThread().getContextClassLoader(), true, false, true, true, true, false); } catch (Exception e) { fail(getName() + " failed: " + e.toString()); @@ -159,7 +174,7 @@ public void nullEntitiesTest(Session session) { public void emptyEntitiesTest(Session session) { try { - TransformerFactory.createTransformerAndModifyProject(session, new ArrayList(), Thread.currentThread().getContextClassLoader(), true, false, true, true, true); + TransformerFactory.createTransformerAndModifyProject(session, new ArrayList(), Thread.currentThread().getContextClassLoader(), true, false, true, true, true, false); } catch (Exception e) { fail(getName() + " failed: " + e.toString()); @@ -170,7 +185,7 @@ public PersistenceWeaver buildWeaver(Session session, Collection entities) { PersistenceWeaver tw = null; try { - tw = TransformerFactory.createTransformerAndModifyProject(session, entities, Thread.currentThread().getContextClassLoader(), true, false, true, true, true); + tw = TransformerFactory.createTransformerAndModifyProject(session, entities, Thread.currentThread().getContextClassLoader(), true, false, true, true, true, false); } catch (Exception e) { fail(getName() + " failed: " + e.toString()); diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java index ba2f299d21d..cfe9a12404a 100644 --- a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java +++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java @@ -429,6 +429,7 @@ public class EntityManagerSetupImpl implements MetadataRefreshListener { boolean weaveFetchGroups; boolean weaveInternal; boolean weaveRest; + boolean weaveMappedSuperClass; /** * Used to indicate that an EntityManagerFactoryImpl based on this @@ -1922,6 +1923,7 @@ public synchronized ClassTransformer predeploy(PersistenceUnitInfo info, Map ext weaveFetchGroups = false; weaveInternal = false; weaveRest = false; + weaveMappedSuperClass = false; if (enableWeaving) { weaveChangeTracking = "true".equalsIgnoreCase(EntityManagerFactoryProvider.getConfigPropertyAsStringLogDebug(PersistenceUnitProperties.WEAVING_CHANGE_TRACKING, predeployProperties, "true", session)); weaveLazy = "true".equalsIgnoreCase(EntityManagerFactoryProvider.getConfigPropertyAsStringLogDebug(PersistenceUnitProperties.WEAVING_LAZY, predeployProperties, "true", session)); @@ -1929,6 +1931,7 @@ public synchronized ClassTransformer predeploy(PersistenceUnitInfo info, Map ext weaveFetchGroups = "true".equalsIgnoreCase(EntityManagerFactoryProvider.getConfigPropertyAsStringLogDebug(PersistenceUnitProperties.WEAVING_FETCHGROUPS, predeployProperties, "true", session)); weaveInternal = "true".equalsIgnoreCase(EntityManagerFactoryProvider.getConfigPropertyAsStringLogDebug(PersistenceUnitProperties.WEAVING_INTERNAL, predeployProperties, "true", session)); weaveRest = "true".equalsIgnoreCase(EntityManagerFactoryProvider.getConfigPropertyAsStringLogDebug(PersistenceUnitProperties.WEAVING_REST, predeployProperties, "true", session)); + weaveMappedSuperClass = "true".equalsIgnoreCase(EntityManagerFactoryProvider.getConfigPropertyAsStringLogDebug(PersistenceUnitProperties.WEAVING_MAPPEDSUPERCLASS, predeployProperties, "true", session)); } } @@ -1987,7 +1990,7 @@ public synchronized ClassTransformer predeploy(PersistenceUnitInfo info, Map ext if (enableWeaving) { // build a list of entities the persistence unit represented by this EntityManagerSetupImpl will use Collection entities = PersistenceUnitProcessor.buildEntityList(processor, classLoaderToUse); - this.weaver = TransformerFactory.createTransformerAndModifyProject(session, entities, classLoaderToUse, weaveLazy, weaveChangeTracking, weaveFetchGroups, weaveInternal, weaveRest); + this.weaver = TransformerFactory.createTransformerAndModifyProject(session, entities, classLoaderToUse, weaveLazy, weaveChangeTracking, weaveFetchGroups, weaveInternal, weaveRest, weaveMappedSuperClass); session.getProject().setClassNamesForWeaving(new ArrayList(processor.getProject().getWeavableClassNames())); } @@ -2015,7 +2018,7 @@ public synchronized ClassTransformer predeploy(PersistenceUnitInfo info, Map ext persistenceClasses.add(factory.getMetadataClass(className)); } } - this.weaver = TransformerFactory.createTransformerAndModifyProject(session, persistenceClasses, classLoaderToUse, weaveLazy, weaveChangeTracking, weaveFetchGroups, weaveInternal, weaveRest); + this.weaver = TransformerFactory.createTransformerAndModifyProject(session, persistenceClasses, classLoaderToUse, weaveLazy, weaveChangeTracking, weaveFetchGroups, weaveInternal, weaveRest, weaveMappedSuperClass); } } diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java index 77667225059..cb660e8e2b9 100644 --- a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java +++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java @@ -63,6 +63,7 @@ import org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ConverterAccessor; import org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EmbeddableAccessor; import org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor; +import org.eclipse.persistence.internal.jpa.metadata.accessors.classes.MappedSuperclassAccessor; import org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory; import org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataClass; import org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataFactory; @@ -372,9 +373,10 @@ protected void initPersistenceUnitClasses() { m_project.addConverterAccessor(new ConverterAccessor(PersistenceUnitProcessor.getConverterAnnotation(candidateClass), candidateClass, m_project)); } else if (PersistenceUnitProcessor.isMappedSuperclass(candidateClass) && ! m_project.hasMappedSuperclass(candidateClass)) { // ensure mapped superclasses will be added to the metamodel even if they do not have entity subclasses - MetadataDescriptor metadataDescriptor = new MetadataDescriptor(candidateClass); // add the mapped superclass to keep track of it in case it is not processed later (has no subclasses). - m_session.getProject().addMappedSuperclass(candidateClass.getName(), metadataDescriptor.getClassDescriptor(), false); + m_project.addMappedSuperclass(new MappedSuperclassAccessor( + PersistenceUnitProcessor.getMappedSuperclassAnnotation(candidateClass), + candidateClass, m_project)); } } } diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java index 8eb35cb0140..7cbb75fa6a8 100644 --- a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java +++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java @@ -1323,10 +1323,13 @@ public List getStructConverters(){ /** * INTERNAL: * Returns all those classes in this project that are available for - * weaving. This list currently includes entity and embeddables classes. + * weaving. This list currently includes entity, embeddables + * and mappedsuperclass with no children classes. */ public Collection getWeavableClassNames() { - return Collections.unmodifiableCollection(m_allAccessors.keySet()); + Set weavableClassNames = new HashSet(m_allAccessors.keySet()); + weavableClassNames.addAll(m_mappedSuperclasseAccessors.keySet()); + return Collections.unmodifiableCollection(weavableClassNames); } /** @@ -1794,8 +1797,8 @@ public void processStage1() { * @see processStage3 */ public void processStage2() { - // 266912: process metamodel mappedSuperclasses separately from entity descriptors - for (MappedSuperclassAccessor msAccessor : m_metamodelMappedSuperclasses.values()) { + // process metamodel mappedSuperclasses separately from entity descriptors + for (MappedSuperclassAccessor msAccessor : getMappedSuperclasses()) { if (! msAccessor.isProcessed()) { msAccessor.processMetamodelDescriptor(); } diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/accessors/classes/ClassAccessor.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/accessors/classes/ClassAccessor.java index 7723337b897..8809ecac1f8 100644 --- a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/accessors/classes/ClassAccessor.java +++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/accessors/classes/ClassAccessor.java @@ -561,7 +561,7 @@ protected void addPotentialMappedSuperclass(MetadataClass metadataClass, boolean // project for later use by the Metamodel API Note: we must // again reload our accessor from XML or we will be sharing // instances of the descriptor - getProject().addMetamodelMappedSuperclass(reloadMappedSuperclass(accessor, new MetadataDescriptor(metadataClass)), getDescriptor()); + getProject().addMetamodelMappedSuperclass(reloadMappedSuperclass(accessor, new MetadataDescriptor(metadataClass, getDescriptor().getClassAccessor())), getDescriptor()); } else { m_mappedSuperclasses.add(accessor); } diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/weaving/TransformerFactory.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/weaving/TransformerFactory.java index 01764aa2097..7d44ceb406b 100644 --- a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/weaving/TransformerFactory.java +++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/weaving/TransformerFactory.java @@ -69,10 +69,12 @@ public class TransformerFactory { protected boolean weaveFetchGroups; protected boolean weaveInternal; protected boolean weaveRest; + protected boolean weaveMappedSuperClass; public static PersistenceWeaver createTransformerAndModifyProject( Session session, Collection entityClasses, ClassLoader classLoader, - boolean weaveLazy, boolean weaveChangeTracking, boolean weaveFetchGroups, boolean weaveInternal, boolean weaveRest) { + boolean weaveLazy, boolean weaveChangeTracking, boolean weaveFetchGroups, + boolean weaveInternal, boolean weaveRest, boolean weaveMappedSuperClass) { if (session == null) { throw new IllegalArgumentException("Weaver session cannot be null"); } @@ -80,12 +82,14 @@ public static PersistenceWeaver createTransformerAndModifyProject( ((AbstractSession)session).log(SessionLog.SEVERE, SessionLog.WEAVER, WEAVER_NULL_PROJECT, null); throw new IllegalArgumentException("Weaver session's project cannot be null"); } - TransformerFactory tf = new TransformerFactory(session, entityClasses, classLoader, weaveLazy, weaveChangeTracking, weaveFetchGroups, weaveInternal, weaveRest); + TransformerFactory tf = new TransformerFactory(session, entityClasses, classLoader, weaveLazy, weaveChangeTracking, weaveFetchGroups, weaveInternal, weaveRest, weaveMappedSuperClass); tf.buildClassDetailsAndModifyProject(); return tf.buildPersistenceWeaver(); } - public TransformerFactory(Session session, Collection entityClasses, ClassLoader classLoader, boolean weaveLazy, boolean weaveChangeTracking, boolean weaveFetchGroups, boolean weaveInternal, boolean weaveRest) { + public TransformerFactory(Session session, Collection entityClasses, ClassLoader classLoader, + boolean weaveLazy, boolean weaveChangeTracking, boolean weaveFetchGroups, + boolean weaveInternal, boolean weaveRest, boolean weaveMappedSuperClass) { this.session = session; this.entityClasses = entityClasses; this.classLoader = classLoader; @@ -95,6 +99,7 @@ public TransformerFactory(Session session, Collection entityClass this.weaveFetchGroups = weaveFetchGroups; this.weaveInternal = weaveInternal; this.weaveRest = weaveRest; + this.weaveMappedSuperClass = weaveMappedSuperClass; } /** @@ -151,34 +156,48 @@ public void buildClassDetailsAndModifyProject() { for (MetadataClass metaClass : entityClasses) { // check to ensure that class is present in project // this will be a relational descriptor because MetadataClass only describes relational descriptors + boolean isMappedSuperclass = false; ClassDescriptor descriptor = findDescriptor(session.getProject(), metaClass.getName()); if (descriptor == null) { - log(SessionLog.FINER, WEAVER_CLASS_NOT_IN_PROJECT, new Object[]{metaClass.getName()}); - } else { - log(SessionLog.FINER, WEAVER_PROCESSING_CLASS, new Object[]{metaClass.getName()}); + if (weaveMappedSuperClass) { + //Bug #466271 - find mapped superclasses which have no implementation + descriptor = session.getProject().getMappedSuperclass(metaClass.getName()); + if (descriptor == null) { + log(SessionLog.FINER, WEAVER_CLASS_NOT_IN_PROJECT, new Object[]{metaClass.getName()}); + continue; + } else { + isMappedSuperclass = true; + } + } else { + log(SessionLog.FINER, WEAVER_CLASS_NOT_IN_PROJECT, new Object[]{metaClass.getName()}); + continue; + } + } + log(SessionLog.FINER, WEAVER_PROCESSING_CLASS, new Object[]{metaClass.getName()}); - boolean weaveValueHoldersForClass = weaveLazy && canWeaveValueHolders(metaClass, descriptor.getMappings()); - boolean weaveChangeTrackingForClass = canChangeTrackingBeEnabled(descriptor, metaClass, weaveChangeTracking); + boolean weaveValueHoldersForClass = weaveLazy && canWeaveValueHolders(metaClass, descriptor.getMappings()); + boolean weaveChangeTrackingForClass = canChangeTrackingBeEnabled(descriptor, metaClass, weaveChangeTracking); - ClassDetails classDetails = createClassDetails(metaClass, weaveValueHoldersForClass, weaveChangeTrackingForClass, weaveFetchGroups, weaveInternal, weaveRest); - if (descriptor.isDescriptorTypeAggregate()) { - classDetails.setIsEmbedable(true); -// classDetails.setShouldWeaveFetchGroups(false); - } - if (!descriptor.usesPropertyAccessForWeaving()){ - classDetails.useAttributeAccess(); - } + ClassDetails classDetails = createClassDetails(metaClass, weaveValueHoldersForClass, weaveChangeTrackingForClass, weaveFetchGroups, weaveInternal, weaveRest); + classDetails.setIsMappedSuperClass(isMappedSuperclass); + if (descriptor.isDescriptorTypeAggregate()) { + classDetails.setIsEmbedable(true); +// classDetails.setShouldWeaveFetchGroups(false); + } + + if (!descriptor.usesPropertyAccessForWeaving()){ + classDetails.useAttributeAccess(); + } - classDetails.getVirtualAccessMethods().addAll(descriptor.getVirtualAttributeMethods()); + classDetails.getVirtualAccessMethods().addAll(descriptor.getVirtualAttributeMethods()); - List unMappedAttributes = storeAttributeMappings(metaClass, classDetails, descriptor.getMappings(), weaveValueHoldersForClass); - classDetailsMap.put(classDetails.getClassName() ,classDetails); + List unMappedAttributes = storeAttributeMappings(metaClass, classDetails, descriptor.getMappings(), weaveValueHoldersForClass); + classDetailsMap.put(classDetails.getClassName() ,classDetails); - classDetails.setShouldWeaveConstructorOptimization((classDetails.getDescribedClass().getFields().size() - (descriptor.getMappings().size() - unMappedAttributes.size()))<=0); + classDetails.setShouldWeaveConstructorOptimization((classDetails.getDescribedClass().getFields().size() - (descriptor.getMappings().size() - unMappedAttributes.size()))<=0); - if (classDetails.getSuperClassName() != null) { - addClassDetailsForMappedSuperClasses(metaClass, descriptor, classDetails, classDetailsMap, unMappedAttributes, weaveChangeTracking); - } + if (classDetails.getSuperClassName() != null) { + addClassDetailsForMappedSuperClasses(metaClass, descriptor, classDetails, classDetailsMap, unMappedAttributes, weaveChangeTracking); } }