From ab4cc1f49fe5cdb12f68f865967441b023a4e38e Mon Sep 17 00:00:00 2001 From: Jasper Vandemalle Date: Mon, 23 Feb 2026 09:13:03 +0100 Subject: [PATCH] Propagate vendor extensions to collection/map container metadata in annotation reader --- .../api/jdo/metadata/JDOAnnotationReader.java | 6 ++ ...notationReaderCollectionExtensionTest.java | 61 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/test/java/org/datanucleus/api/jdo/metadata/JDOAnnotationReaderCollectionExtensionTest.java diff --git a/src/main/java/org/datanucleus/api/jdo/metadata/JDOAnnotationReader.java b/src/main/java/org/datanucleus/api/jdo/metadata/JDOAnnotationReader.java index 1360e6f..e32c5a3 100644 --- a/src/main/java/org/datanucleus/api/jdo/metadata/JDOAnnotationReader.java +++ b/src/main/java/org/datanucleus/api/jdo/metadata/JDOAnnotationReader.java @@ -2112,6 +2112,12 @@ else if (contmd instanceof MapMetaData) ordermd.setParent(mmd); mmd.setOrderMetaData(ordermd); } + + // Propagate vendor extensions to container metadata (for cache, etc.) + if (extensions != null) + { + contmd.addExtensions(extensions); + } } if (joinmd != null) { diff --git a/src/test/java/org/datanucleus/api/jdo/metadata/JDOAnnotationReaderCollectionExtensionTest.java b/src/test/java/org/datanucleus/api/jdo/metadata/JDOAnnotationReaderCollectionExtensionTest.java new file mode 100644 index 0000000..3e8ab35 --- /dev/null +++ b/src/test/java/org/datanucleus/api/jdo/metadata/JDOAnnotationReaderCollectionExtensionTest.java @@ -0,0 +1,61 @@ +package org.datanucleus.api.jdo.metadata; + +import java.util.List; + +import javax.jdo.annotations.Extension; +import javax.jdo.annotations.PersistenceCapable; +import javax.jdo.annotations.Persistent; + +import junit.framework.TestCase; + +import org.datanucleus.ClassLoaderResolver; +import org.datanucleus.PersistenceNucleusContextImpl; +import org.datanucleus.metadata.AbstractClassMetaData; +import org.datanucleus.metadata.AbstractMemberMetaData; +import org.datanucleus.metadata.MetaDataManager; + +/** + * Tests that vendor extensions on collection/map fields are propagated to + * the container (CollectionMetaData / MapMetaData) by the annotation reader. + */ +public class JDOAnnotationReaderCollectionExtensionTest extends TestCase +{ + public JDOAnnotationReaderCollectionExtensionTest(String name) + { + super(name); + } + + /** + * Model class with a collection field annotated with a vendor extension. + */ + @PersistenceCapable + public static class ExtensionCollectionModel + { + @Persistent + @Extension(vendorName = "datanucleus", key = "cache", value = "false") + List tags; + } + + /** + * Verify that @Extension(key="cache", value="false") on a collection field + * reaches the CollectionMetaData. + */ + public void testExtensionPropagatedToCollectionMetaData() + { + PersistenceNucleusContextImpl ctx = new PersistenceNucleusContextImpl("JDO", null); + MetaDataManager mgr = new JDOMetaDataManager(ctx); + ClassLoaderResolver clr = ctx.getClassLoaderResolver(getClass().getClassLoader()); + + mgr.loadClasses(new String[] { ExtensionCollectionModel.class.getName() }, getClass().getClassLoader()); + + AbstractClassMetaData cmd = mgr.getMetaDataForClass(ExtensionCollectionModel.class, clr); + AbstractMemberMetaData mmd = cmd.getMetaDataForMember("tags"); + + assertNotNull("Member metadata for 'tags' should not be null", mmd); + assertNotNull("Collection metadata should not be null", mmd.getCollection()); + assertTrue("Collection metadata should have 'cache' extension", + mmd.getCollection().hasExtension("cache")); + assertEquals("Collection 'cache' extension should be 'false'", + "false", mmd.getCollection().getValueForExtension("cache")); + } +}