Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions src/main/java/com/contentful/java/cda/TransformQuery.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,17 @@ public class TransformQuery<Transformed>
String value() default "";
}

/**
* This annotation marks the metadata field.
* <p>
* Metadata is returned in the {@link CDAEntry#metadata()} method.
* <p>
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentfulMetadata {
String value() default "metadata";
}
private final String contentTypeId;

private final Map<String, Object> instanceCache = new HashMap<>();
Expand Down Expand Up @@ -114,6 +125,11 @@ public class TransformQuery<Transformed>
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);
}
}
}
}
Expand Down Expand Up @@ -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.
*
Expand Down Expand Up @@ -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);
}
}
}
}
Expand All @@ -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);
}
}
}
}
Expand Down Expand Up @@ -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 + ".");
}
}
}