From cfe1b657b7b875887a6c4bff8b742d10caa48fbf Mon Sep 17 00:00:00 2001 From: Tyler Nickerson Date: Mon, 5 Feb 2018 00:55:05 -0500 Subject: [PATCH] Added Jackson parser to remove hand-made JSON errors and bugs --- build.gradle | 1 + src/main/java/org/odict/java/ODictionary.java | 3 +- .../java/org/odict/java/models/Entry.java | 18 +++ .../java/org/odict/java/models/Etymology.java | 27 ++++ .../java/org/odict/java/models/Group.java | 36 +++++ .../java/org/odict/java/models/Usage.java | 36 +++++ .../odict/java/util/EntryJSONConverter.java | 150 +++++++----------- 7 files changed, 180 insertions(+), 91 deletions(-) create mode 100644 src/main/java/org/odict/java/models/Entry.java create mode 100644 src/main/java/org/odict/java/models/Etymology.java create mode 100644 src/main/java/org/odict/java/models/Group.java create mode 100644 src/main/java/org/odict/java/models/Usage.java diff --git a/build.gradle b/build.gradle index 6aa751b..e0a4c08 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,7 @@ targetCompatibility = 1.8 dependencies { compile 'com.github.davidmoten:flatbuffers-java:1.7.0.1' compile 'org.xerial.snappy:snappy-java:1.1.4' + compile 'com.fasterxml.jackson.core:jackson-databind:2.9.4' } shadowJar { diff --git a/src/main/java/org/odict/java/ODictionary.java b/src/main/java/org/odict/java/ODictionary.java index 3bf294e..f7c1f59 100644 --- a/src/main/java/org/odict/java/ODictionary.java +++ b/src/main/java/org/odict/java/ODictionary.java @@ -1,5 +1,6 @@ package org.odict.java; +import com.fasterxml.jackson.core.JsonProcessingException; import org.odict.java.schema.Dictionary; import org.odict.java.util.EntryJSONConverter; @@ -18,7 +19,7 @@ public ODictionary(short version, Dictionary dictionary) { * @param word * @return String */ - public String getEntryAsJSON(String word) { + public String getEntryAsJSON(String word) throws JsonProcessingException { return new EntryJSONConverter().convert(this.dictionary.entriesByKey(word)); } diff --git a/src/main/java/org/odict/java/models/Entry.java b/src/main/java/org/odict/java/models/Entry.java new file mode 100644 index 0000000..45afbc5 --- /dev/null +++ b/src/main/java/org/odict/java/models/Entry.java @@ -0,0 +1,18 @@ +package org.odict.java.models; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.util.List; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Entry { + private List etymologies; + + public List getEtymologies() { + return etymologies; + } + + public void setEtymologies(List etymologies) { + this.etymologies = etymologies; + } +} diff --git a/src/main/java/org/odict/java/models/Etymology.java b/src/main/java/org/odict/java/models/Etymology.java new file mode 100644 index 0000000..aa2bec7 --- /dev/null +++ b/src/main/java/org/odict/java/models/Etymology.java @@ -0,0 +1,27 @@ +package org.odict.java.models; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.util.List; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Etymology { + private List usages; + private String description; + + public List getUsages() { + return usages; + } + + public void setUsages(List usages) { + this.usages = usages; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/org/odict/java/models/Group.java b/src/main/java/org/odict/java/models/Group.java new file mode 100644 index 0000000..2003dc6 --- /dev/null +++ b/src/main/java/org/odict/java/models/Group.java @@ -0,0 +1,36 @@ +package org.odict.java.models; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.util.List; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Group { + private String id; + private String description; + private List definitions; + + public String getID() { + return id; + } + + public void setID(String id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getDefinitions() { + return definitions; + } + + public void setDefinitions(List definitions) { + this.definitions = definitions; + } +} diff --git a/src/main/java/org/odict/java/models/Usage.java b/src/main/java/org/odict/java/models/Usage.java new file mode 100644 index 0000000..2444fe1 --- /dev/null +++ b/src/main/java/org/odict/java/models/Usage.java @@ -0,0 +1,36 @@ +package org.odict.java.models; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.util.List; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Usage { + private String pos; + private List groups; + private List definitions; + + public String getPOS() { + return pos; + } + + public void setPOS(String pos) { + this.pos = pos; + } + + public List getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } + + public List getDefinitions() { + return definitions; + } + + public void setDefinitions(List definitions) { + this.definitions = definitions; + } +} diff --git a/src/main/java/org/odict/java/util/EntryJSONConverter.java b/src/main/java/org/odict/java/util/EntryJSONConverter.java index c8c59d7..ce3cd0b 100644 --- a/src/main/java/org/odict/java/util/EntryJSONConverter.java +++ b/src/main/java/org/odict/java/util/EntryJSONConverter.java @@ -1,137 +1,107 @@ package org.odict.java.util; -import org.odict.java.schema.Entry; -import org.odict.java.schema.Etymology; -import org.odict.java.schema.Group; -import org.odict.java.schema.Usage; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.odict.java.models.Entry; +import org.odict.java.models.Group; +import org.odict.java.models.Usage; +import org.odict.java.models.Etymology; import java.util.ArrayList; import java.util.List; public class EntryJSONConverter { + private ObjectMapper mapper = new ObjectMapper(); - private String addDefinitions(DefinitionsObject obj) { - String output = "\"definitions\":["; - int length = obj.definitionsLength(); + private List getDefinitions(DefinitionsObject obj) { + List definitions = new ArrayList<>(); - for (int i = 0; i < length; i++) { - output += "\"" + obj.definitions(i) + "\""; - if (i != length - 1) output += ","; - } - - output += "]"; + for (int i = 0; i < obj.definitionsLength(); i++) + definitions.add(obj.definitions(i)); - return output; + return definitions; } - private String addGroups(Usage usage) { - String output = "\"groups\":["; - int length = usage.groupsLength(); - List properties = new ArrayList<>(); - - for (int i = 0; i < length; i++) { - Group group = usage.groups(i); - String id = group.id().trim(); - String description = group.description().trim(); - - output += "{"; + private List getGroups(org.odict.java.schema.Usage usage) { + List groups = new ArrayList<>(); - if (id.length() > 0) - properties.add(String.format("\"id\":\"%s\"", id)); + for (int i = 0; i < usage.groupsLength(); i++) { + org.odict.java.schema.Group g = usage.groups(i); - if (description.length() > 0) - properties.add(String.format("\"description\":\"%s\"", description)); + Group group = new Group(); + String id = g.id().trim(); + String description = g.description().trim(); - if (group.definitionsLength() > 0) - properties.add(this.addDefinitions(new DefinitionsObject(group))); + if (id.length() > 0) group.setID(id); + if (description.length() > 0) group.setDescription(description); + if (g.definitionsLength() > 0) group.setDefinitions( + this.getDefinitions(new DefinitionsObject(g)) + ); - output += String.join(",", properties); - output += "}"; - - properties.clear(); - - if (i != length - 1) output += ","; + groups.add(group); } - output += "]"; - - return output; + return groups; } - private String addUsages(Etymology etymology) { - String output = "\"usages\":["; - int length = etymology.usagesLength(); - List properties = new ArrayList<>(); - - for (int i = 0; i < length; i++) { - Usage usage = etymology.usages(i); - String pos = usage.pos().trim(); + private List getUsages(org.odict.java.schema.Etymology etymology) { + List usages = new ArrayList<>(); - output += "{"; + for (int i = 0; i < etymology.usagesLength(); i++) { + org.odict.java.schema.Usage u = etymology.usages(i); - if (pos.length() > 0) - properties.add(String.format("\"pos\":\"%s\"", pos)); + Usage usage = new Usage(); + String pos = u.pos().trim(); - if (usage.groupsLength() > 0) - properties.add(this.addGroups(usage)); + if (pos.length() > 0) usage.setPOS(pos); + if (u.groupsLength() > 0) usage.setGroups(this.getGroups(u)); + if (u.definitionsLength() > 0) usage.setDefinitions( + this.getDefinitions(new DefinitionsObject(u)) + ); - if (usage.definitionsLength() > 0) - properties.add(this.addDefinitions(new DefinitionsObject(usage))); - - output += String.join(",", properties); - output += "}"; - - properties.clear(); - - if (i != length - 1) output += ","; + usages.add(usage); } - output += "]"; - - return output; + return usages; } - private String addEtymologies(Entry entry) { - String output = "\"etymologies\":["; - int length = entry.etymologiesLength(); + private List getEtymologies(org.odict.java.schema.Entry entry) { + List etymologies = new ArrayList<>(); - for (int i = 0; i < length; i++) { - Etymology etymology = entry.etymologies(i); - String description = etymology.description().trim(); + for (int i = 0; i < entry.etymologiesLength(); i++) { + org.odict.java.schema.Etymology ety = entry.etymologies(i); - output += "{"; + Etymology etymology = new Etymology(); + String description = ety.description().trim(); - if (description.length() > 0) - output += String.format("\"description\":\"%s\",", description); + if (description.length() > 0) etymology.setDescription(description); + if (ety.usagesLength() > 0) etymology.setUsages(this.getUsages(ety)); - if (etymology.usagesLength() > 0) - output += this.addUsages(etymology); - - output += "}"; - - if (i != length - 1) output += ","; + etymologies.add(etymology); } - output += "]"; - - return output; + return etymologies; } - public String convert(Entry entry) { - if (entry == null) return "{}"; - else return "{" + this.addEtymologies(entry) + "}"; + public String convert(org.odict.java.schema.Entry e) throws JsonProcessingException { + Entry entry = new Entry(); + if (e == null) return "{}"; + else { + entry.setEtymologies(this.getEtymologies(e)); + return this.mapper.writeValueAsString(entry); + } } class DefinitionsObject { - private Group group; - private Usage usage; + private org.odict.java.schema.Group group; + private org.odict.java.schema.Usage usage; - DefinitionsObject(Group group) { + DefinitionsObject(org.odict.java.schema.Group group) { this.group = group; this.usage = null; } - DefinitionsObject(Usage usage) { + DefinitionsObject(org.odict.java.schema.Usage usage) { this.usage = usage; this.group = null; }