From 28033ad75f550a7f7388fe13d8e48dd8f3140cfc Mon Sep 17 00:00:00 2001 From: davdonin Date: Wed, 30 Aug 2023 15:23:23 +0300 Subject: [PATCH] ContentfulMetadataUnwrapping: adding ContentfulMetadata annotaion that will allow to unwrap the metadata - for all usecases when access to metadata is required. --- .../contentful/java/cda/TransformQuery.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/main/java/com/contentful/java/cda/TransformQuery.java b/src/main/java/com/contentful/java/cda/TransformQuery.java index 55b59426..fc3ed805 100644 --- a/src/main/java/com/contentful/java/cda/TransformQuery.java +++ b/src/main/java/com/contentful/java/cda/TransformQuery.java @@ -77,6 +77,17 @@ public class TransformQuery String value() default ""; } + /** + * This annotation marks the metadata field. + *

+ * Metadata is returned in the {@link CDAEntry#metadata()} method. + *

+ */ + @Target(ElementType.FIELD) + @Retention(RetentionPolicy.RUNTIME) + public @interface ContentfulMetadata { + String value() default "metadata"; + } private final String contentTypeId; private final Map instanceCache = new HashMap<>(); @@ -114,6 +125,11 @@ public class TransformQuery final ContentfulSystemField systemField = field.getAnnotation(ContentfulSystemField.class); if (systemField != null) { parseSystemFieldAnnotation(field, systemField); + } else { + final ContentfulMetadata metadata = field.getAnnotation(ContentfulMetadata.class); + if (metadata != null) { + parseMetadataAnnotation(metadata); + } } } } @@ -221,6 +237,10 @@ private void parseSystemFieldAnnotation(Field field, ContentfulSystemField annot select("sys." + name); } + private void parseMetadataAnnotation(ContentfulMetadata annotation) { + select(annotation.value()); + } + /** * Retrieve the transformed entry from Contentful. * @@ -376,6 +396,12 @@ private Object transform(CDAEntry entry) { field.getAnnotation(ContentfulSystemField.class); if (systemField != null) { transformSystemFieldAnnotation(entry, result, field, systemField); + } else { + final ContentfulMetadata metadata = + field.getAnnotation(ContentfulMetadata.class); + if (metadata != null) { + transformMetadataAnnotation(entry, result, field, metadata); + } } } } @@ -389,6 +415,12 @@ private Object transform(CDAEntry entry) { field.getAnnotation(ContentfulSystemField.class); if (systemField != null) { transformSystemFieldAnnotation(entry, result, field, systemField); + } else { + final ContentfulMetadata metadata = + field.getAnnotation(ContentfulMetadata.class); + if (metadata != null) { + transformMetadataAnnotation(entry, result, field, metadata); + } } } } @@ -475,4 +507,19 @@ private void transformSystemFieldAnnotation(CDAEntry entry, Object result, Field throw new IllegalStateException("Cannot set custom system field " + key + "."); } } + + private void transformMetadataAnnotation(CDAEntry entry, Object result, Field field, + ContentfulMetadata annotation) { + if (!field.isAccessible()) { + field.setAccessible(true); + } + + final String key = annotation.value(); + + try { + field.set(result, entry.metadata()); + } catch (IllegalAccessException e) { + throw new IllegalStateException("Cannot set " + key + "."); + } + } }