This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new ce46582575 Marshall module improvements
ce46582575 is described below
commit ce465825755feb95d8a46cc9ed71f0be2c83be58
Author: James Bognar <[email protected]>
AuthorDate: Mon Dec 8 18:06:10 2025 -0500
Marshall module improvements
---
.../src/main/java/org/apache/juneau/BeanMeta.java | 29 ++++++++++++++++++----
.../src/main/java/org/apache/juneau/ClassMeta.java | 18 +++-----------
2 files changed, 27 insertions(+), 20 deletions(-)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index ac85da45f0..b281bac58c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -80,6 +80,21 @@ public class BeanMeta<T> {
Optional<String> optNotABeanReason() { return
opt(notABeanReason()); }
}
+ /**
+ * Finds the bean filter for the specified class metadata.
+ *
+ * @param <T> The class type.
+ * @param cm The class metadata to find the filter for.
+ * @return The bean filter, or <jk>null</jk> if no filter is found.
+ */
+ static <T> BeanFilter findBeanFilter(ClassMeta<T> cm) {
+ var ap = cm.getBeanContext().getAnnotationProvider();
+ var l = ap.find(Bean.class, cm);
+ if (l.isEmpty())
+ return null;
+ return
BeanFilter.create(cm.inner()).applyAnnotations(reverse(l.stream().map(AnnotationInfo::inner).toList())).build();
+ }
+
/**
* Creates a {@link BeanMeta} instance for the specified class metadata.
*
@@ -133,7 +148,7 @@ public class BeanMeta<T> {
* @param implClassConstructor Optional constructor to use if one
cannot be found. Can be <jk>null</jk>.
* @return A {@link BeanMetaValue} containing the bean metadata (if
successful) or a reason why it's not a bean.
*/
- public static <T> BeanMetaValue<T> create(ClassMeta<T> cm, BeanFilter
bf, String[] pNames, ConstructorInfo implClassConstructor) {
+ public static <T> BeanMetaValue<T> create(ClassMeta<T> cm, String[]
pNames, ConstructorInfo implClassConstructor) {
try {
var bc = cm.getBeanContext();
var ap = bc.getAnnotationProvider();
@@ -142,7 +157,7 @@ public class BeanMeta<T> {
if (bc.isNotABean(cm))
return notABean("Class matches exclude-class
list");
- if (bf == null && bc.isBeansRequireSerializable() && !
cm.isChildOf(Serializable.class))
+ if (bc.isBeansRequireSerializable() && !
cm.isChildOf(Serializable.class) && ! ap.has(Bean.class, cm))
return notABean("Class is not serializable");
if (ap.has(BeanIgnore.class, cm))
@@ -151,7 +166,7 @@ public class BeanMeta<T> {
if ((!
bc.getBeanClassVisibility().isVisible(cm.getModifiers()) ||
cm.isAnonymousClass()) && ! ap.has(Bean.class, cm))
return notABean("Class is not public");
- var bm = new BeanMeta<>(cm, bf, pNames,
implClassConstructor);
+ var bm = new BeanMeta<>(cm, findBeanFilter(cm), pNames,
implClassConstructor);
var nabr = bm.notABeanReason;
return new BeanMetaValue<>(nabr == null ? bm : null,
nabr);
} catch (RuntimeException e) {
@@ -843,6 +858,10 @@ public class BeanMeta<T> {
/** Optional bean filter associated with the target class. */
protected final BeanFilter beanFilter;
+ public BeanFilter getBeanFilter() {
+ return beanFilter;
+ }
+
/** The constructor for this bean. */
protected final ConstructorInfo constructor;
@@ -924,11 +943,11 @@ public class BeanMeta<T> {
* @param implClassConstructor The constructor to use if one cannot be
found. Can be <jk>null</jk>.
*/
protected BeanMeta(ClassMeta<T> classMeta, BeanFilter beanFilter,
String[] pNames, ConstructorInfo implClassConstructor) {
-
- Builder<T> b = new Builder<>(classMeta,
classMeta.getBeanContext(), beanFilter, pNames, implClassConstructor);
this.classMeta = classMeta;
this.ctx = classMeta.getBeanContext();
this.c = classMeta.inner();
+
+ Builder<T> b = new Builder<>(classMeta,
classMeta.getBeanContext(), beanFilter, pNames, implClassConstructor);
notABeanReason = b.init(this);
this.beanFilter = beanFilter;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index efc4c74479..d9133c07b3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -139,7 +139,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
private final List<ClassMeta<?>> args;
// Arg types if this is an array of args.
private final BeanContext beanContext;
// The bean context that created this object.
- private final OptionalSupplier<BeanFilter> beanFilter;
private final Supplier<BuilderSwap<T,?>> builderSwap;
// The builder swap associated with this bean (if it has one).
private final Categories cat;
// The class category.
private final Cache<Class<?>,ObjectSwap<?,?>> childSwapMap;
// Maps normal subclasses to ObjectSwaps.
@@ -238,7 +237,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
cat.set(INPUTSTREAM);
}
- beanFilter = memoize(()->findBeanFilter());
beanMeta = memoize(()->findBeanMeta());
builderSwap = memoize(()->findBuilderSwap());
childSwapMap =
Cache.<Class<?>,ObjectSwap<?,?>>create().supplier(x -> findSwap(x)).build();
@@ -298,7 +296,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
this.exampleField = memoize(()->findExampleField());
this.noArgConstructor = memoize(()->findNoArgConstructor());
this.stringConstructor = memoize(()->findStringConstructor());
- this.beanFilter = memoize(()->findBeanFilter());
this.marshalledFilter = memoize(()->findMarshalledFilter());
this.builderSwap = memoize(()->findBuilderSwap());
this.example = memoize(()->findExample());
@@ -333,7 +330,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
this.exampleField = mainType.exampleField;
this.noArgConstructor = mainType.noArgConstructor;
this.stringConstructor = mainType.stringConstructor;
- this.beanFilter = mainType.beanFilter;
this.marshalledFilter = mainType.marshalledFilter;
this.builderSwap = mainType.builderSwap;
this.example = mainType.example;
@@ -1319,18 +1315,10 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
.orElse(null);
}
- private BeanFilter findBeanFilter() {
- var ap = beanContext.getAnnotationProvider();
- var l = ap.find(Bean.class, this);
- if (l.isEmpty())
- return null;
- return
BeanFilter.create(inner()).applyAnnotations(reverse(l.stream().map(AnnotationInfo::inner).toList())).build();
- }
-
private BeanMeta.BeanMetaValue<T> findBeanMeta() {
if (! cat.isUnknown())
return new BeanMeta.BeanMetaValue<>(null, "Known
non-bean type");
- return BeanMeta.create(this, beanFilter.get(), null,
implClass.map(x -> x.getPublicConstructor(x2 ->
x2.hasNumParameters(0)).orElse(null)).orElse(null));
+ return BeanMeta.create(this, null, implClass.map(x ->
x.getPublicConstructor(x2 ->
x2.hasNumParameters(0)).orElse(null)).orElse(null));
}
private KeyValueTypes findKeyValueTypes() {
@@ -1431,7 +1419,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
@SuppressWarnings("unchecked")
private String findExample() {
- var example = beanFilter.map(x -> x.getExample()).orElse(null);
+ var example = beanMeta.get().optBeanMeta().map(x ->
x.getBeanFilter()).map(x -> x.getExample()).orElse(null);
if (example == null)
example = marshalledFilter.map(x ->
x.getExample()).orElse(null);
@@ -1512,7 +1500,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
if (is(Object.class))
return null;
- var v = beanFilter.map(x ->
x.getImplClass()).map(ReflectionUtils::info).orElse(null);
+ var v = beanContext.getAnnotationProvider().find(Bean.class,
this).stream().map(x -> x.inner()).filter(x -> ne(x.implClass(),
void.class)).map(x -> ClassInfo.of(x)).findFirst().orElse(null);
if (v == null)
v = marshalledFilter.map(x ->
x.getImplClass()).map(ReflectionUtils::info).orElse(null);