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:
+ *
+ * - "
true
" (DEFAULT)
+ * - "
false
"
+ *
+ */
+ 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);
}
}