Skip to content

Commit 01d2329

Browse files
committed
Use reflection to extract JSON field names from Post class when populating map for post creation.
1 parent ffb0489 commit 01d2329

2 files changed

Lines changed: 80 additions & 25 deletions

File tree

src/main/java/com/afrozaar/wordpress/wpapi/v2/Client.java

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.afrozaar.wordpress.wpapi.v2;
22

33
import static com.afrozaar.wordpress.wpapi.v2.util.FieldExtractor.extractField;
4-
import static com.afrozaar.wordpress.wpapi.v2.util.FieldExtractor.renderableField;
54

65
import static java.lang.String.format;
76
import static java.net.URLDecoder.decode;
@@ -28,6 +27,7 @@
2827
import com.afrozaar.wordpress.wpapi.v2.model.Post;
2928
import com.afrozaar.wordpress.wpapi.v2.model.PostMeta;
3029
import com.afrozaar.wordpress.wpapi.v2.model.PostStatus;
30+
import com.afrozaar.wordpress.wpapi.v2.model.RenderableField;
3131
import com.afrozaar.wordpress.wpapi.v2.model.Taxonomy;
3232
import com.afrozaar.wordpress.wpapi.v2.model.Term;
3333
import com.afrozaar.wordpress.wpapi.v2.model.User;
@@ -59,17 +59,20 @@
5959
import org.springframework.http.converter.xml.SourceHttpMessageConverter;
6060
import org.springframework.util.LinkedMultiValueMap;
6161
import org.springframework.util.MultiValueMap;
62+
import org.springframework.util.ReflectionUtils;
6263
import org.springframework.web.client.HttpClientErrorException;
6364
import org.springframework.web.client.HttpServerErrorException;
6465
import org.springframework.web.client.RestTemplate;
6566
import org.springframework.web.util.UriComponents;
6667
import org.springframework.web.util.UriComponentsBuilder;
6768

69+
import com.fasterxml.jackson.annotation.JsonProperty;
6870
import com.fasterxml.jackson.databind.DeserializationFeature;
6971
import com.fasterxml.jackson.databind.JsonMappingException;
7072
import com.fasterxml.jackson.databind.ObjectMapper;
7173

7274
import org.apache.commons.beanutils.BeanUtils;
75+
import org.assertj.core.util.VisibleForTesting;
7376
import org.slf4j.Logger;
7477
import org.slf4j.LoggerFactory;
7578

@@ -852,31 +855,54 @@ private String fixQuery(String href) {
852855

853856
}
854857

858+
@VisibleForTesting
855859
@SuppressWarnings("unchecked")
856-
private Map<String, Object> fieldsFrom(Post post) {
860+
protected Map<String, Object> fieldsFrom(Post post) {
857861
ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
858862

859-
BiConsumer<String, Object> biConsumer = (key, value) -> {
860-
if (value != null) {
861-
builder.put(key, value);
862-
}
863-
};
864-
865-
biConsumer.accept("date", post.getDate());
866-
biConsumer.accept("modified_gmt", post.getModified());
867-
// biConsumer.accept("slug", post.getSlug());
868-
// biConsumer.accept("status",post.getStatus());
869-
biConsumer.accept("title", renderableField.apply(Post::getTitle, post).orElse(null));
870-
biConsumer.accept("content", renderableField.apply(Post::getContent, post).orElse(null));
871-
biConsumer.accept("author", post.getAuthor());
872-
biConsumer.accept("excerpt", renderableField.apply(Post::getExcerpt, post).orElse(null));
873-
biConsumer.accept("comment_status", post.getCommentStatus());
874-
biConsumer.accept("ping_status", post.getPingStatus());
875-
biConsumer.accept("format", post.getFormat());
876-
biConsumer.accept("sticky", post.getSticky());
877-
biConsumer.accept("featured_media", post.getFeaturedMedia());
878-
biConsumer.accept("categories", post.getCategoryIds());
879-
//biConsumer.accept("type", post.getType());
863+
BiConsumer<String, Object> biConsumer = (key, value) -> ofNullable(value).ifPresent(v -> builder.put(key, v));
864+
865+
List<String> processableFields = Arrays.asList(
866+
"author",
867+
"categories",
868+
"comment_status",
869+
"content",
870+
"date",
871+
"featured_media",
872+
"format",
873+
"excerpt",
874+
"modified_gmt",
875+
"ping_status",
876+
//"slug",
877+
//"status",
878+
"sticky",
879+
"title"
880+
//"type"
881+
);
882+
883+
// types ignored for now: slug, status, type
884+
885+
Arrays.stream(post.getClass().getDeclaredFields())
886+
.filter(field -> field.getAnnotationsByType(JsonProperty.class).length > 0)
887+
.map(field -> Tuple2.of(field, field.getAnnotationsByType(JsonProperty.class)[0]))
888+
.filter(fieldTuple -> processableFields.contains(fieldTuple.b.value()))
889+
.forEach(field -> {
890+
try {
891+
ReflectionUtils.makeAccessible(field.a);
892+
Object theField = field.a.get(post);
893+
if (nonNull(theField)) {
894+
final Object value;
895+
if (theField instanceof RenderableField) {
896+
value = ((RenderableField) theField).getRendered();
897+
} else {
898+
value = theField;
899+
}
900+
biConsumer.accept(field.b.value(), value);
901+
}
902+
} catch (IllegalAccessException e) {
903+
LOG.error("Error populating post fields builder.", e);
904+
}
905+
});
880906

881907
return builder.build();
882908
}
Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,49 @@
11
package com.afrozaar.wordpress.wpapi.v2;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
35
import com.afrozaar.wordpress.wpapi.v2.config.ClientConfig;
46
import com.afrozaar.wordpress.wpapi.v2.config.ClientFactory;
7+
import com.afrozaar.wordpress.wpapi.v2.model.Post;
8+
import com.afrozaar.wordpress.wpapi.v2.model.builder.PostBuilder;
9+
import com.afrozaar.wordpress.wpapi.v2.model.builder.TitleBuilder;
510

611
import org.junit.Test;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
14+
15+
import java.time.Instant;
16+
import java.util.Map;
717

818
/**
919
* @author johan
1020
*/
1121
public class WordpressClientTest {
1222

23+
private static final Logger LOG = LoggerFactory.getLogger(WordpressClientTest.class);
24+
Wordpress wordpress = ClientFactory.fromConfig(ClientConfig.of("http://localhost", "username", "password", false, true));
25+
1326
@Test
1427
public void TestCreateClient() {
15-
Wordpress wordpress = ClientFactory.fromConfig(ClientConfig.of("http://localhost", "username", "password", false, true));
16-
1728
System.out.println("media = " + wordpress.getMedia(10L));
1829
}
1930

31+
@Test
32+
public void PostFieldProcessingTest() {
33+
34+
Post post = PostBuilder.aPost()
35+
.withTitle(TitleBuilder.aTitle().withRendered("foobar").build())
36+
.withModifiedGmt(Instant.now().toString())
37+
.withContent(null)
38+
.withFormat("myformat")
39+
.build();
40+
41+
final Map<String, Object> fieldMap = ((Client) wordpress).fieldsFrom(post);
42+
43+
assertThat(fieldMap).containsOnlyKeys("title", "modified_gmt","format");
44+
45+
LOG.debug("map to post: {}", fieldMap);
46+
47+
}
48+
2049
}

0 commit comments

Comments
 (0)