Skip to content
This repository has been archived by the owner on Jan 14, 2021. It is now read-only.

Commit

Permalink
Added Jackson parser to remove hand-made JSON errors and bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
Nickersoft committed Feb 5, 2018
1 parent 9c53f87 commit cfe1b65
Show file tree
Hide file tree
Showing 7 changed files with 180 additions and 91 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/odict/java/ODictionary.java
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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));
}

Expand Down
18 changes: 18 additions & 0 deletions src/main/java/org/odict/java/models/Entry.java
Original file line number Diff line number Diff line change
@@ -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<Etymology> etymologies;

public List<Etymology> getEtymologies() {
return etymologies;
}

public void setEtymologies(List<Etymology> etymologies) {
this.etymologies = etymologies;
}
}
27 changes: 27 additions & 0 deletions src/main/java/org/odict/java/models/Etymology.java
Original file line number Diff line number Diff line change
@@ -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<Usage> usages;
private String description;

public List<Usage> getUsages() {
return usages;
}

public void setUsages(List<Usage> usages) {
this.usages = usages;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}
}
36 changes: 36 additions & 0 deletions src/main/java/org/odict/java/models/Group.java
Original file line number Diff line number Diff line change
@@ -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<String> 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<String> getDefinitions() {
return definitions;
}

public void setDefinitions(List<String> definitions) {
this.definitions = definitions;
}
}
36 changes: 36 additions & 0 deletions src/main/java/org/odict/java/models/Usage.java
Original file line number Diff line number Diff line change
@@ -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<Group> groups;
private List<String> definitions;

public String getPOS() {
return pos;
}

public void setPOS(String pos) {
this.pos = pos;
}

public List<Group> getGroups() {
return groups;
}

public void setGroups(List<Group> groups) {
this.groups = groups;
}

public List<String> getDefinitions() {
return definitions;
}

public void setDefinitions(List<String> definitions) {
this.definitions = definitions;
}
}
150 changes: 60 additions & 90 deletions src/main/java/org/odict/java/util/EntryJSONConverter.java
Original file line number Diff line number Diff line change
@@ -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<String> getDefinitions(DefinitionsObject obj) {
List<String> 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<String> 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<Group> getGroups(org.odict.java.schema.Usage usage) {
List<Group> 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<String> properties = new ArrayList<>();

for (int i = 0; i < length; i++) {
Usage usage = etymology.usages(i);
String pos = usage.pos().trim();
private List<Usage> getUsages(org.odict.java.schema.Etymology etymology) {
List<Usage> 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<Etymology> getEtymologies(org.odict.java.schema.Entry entry) {
List<Etymology> 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;
}
Expand Down

0 comments on commit cfe1b65

Please sign in to comment.