/mustacheTemplates/libraries/retrofit2/JSON.mustache
https://github.com/sk89q/commandhelper · Mustache · 446 lines · 386 code · 60 blank · 0 comment · 45 complexity · 9fe476cb92e952949740accb569f6f44 MD5 · raw file
- {{>licenseInfo}}
- package {{invokerPackage}};
- import com.google.gson.Gson;
- import com.google.gson.GsonBuilder;
- import com.google.gson.JsonParseException;
- import com.google.gson.TypeAdapter;
- import com.google.gson.internal.bind.util.ISO8601Utils;
- import com.google.gson.stream.JsonReader;
- import com.google.gson.stream.JsonWriter;
- import com.google.gson.JsonElement;
- import io.gsonfire.GsonFireBuilder;
- import io.gsonfire.TypeSelector;
- {{#joda}}
- import org.joda.time.DateTime;
- import org.joda.time.LocalDate;
- import org.joda.time.format.DateTimeFormatter;
- import org.joda.time.format.DateTimeFormatterBuilder;
- import org.joda.time.format.ISODateTimeFormat;
- {{/joda}}
- {{#threetenbp}}
- import org.threeten.bp.LocalDate;
- import org.threeten.bp.OffsetDateTime;
- import org.threeten.bp.format.DateTimeFormatter;
- {{/threetenbp}}
- {{#hasModel}}import {{modelPackage}}.*;{{/hasModel}}
- import java.io.IOException;
- import java.io.StringReader;
- import java.lang.reflect.Type;
- import java.text.DateFormat;
- import java.text.ParseException;
- import java.text.ParsePosition;
- {{#java8}}
- import java.time.LocalDate;
- import java.time.OffsetDateTime;
- import java.time.format.DateTimeFormatter;
- {{/java8}}
- import java.util.Date;
- import java.util.Map;
- import java.util.HashMap;
- public class JSON {
- private Gson gson;
- private DateTypeAdapter dateTypeAdapter = new DateTypeAdapter();
- private SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter();
- {{#joda}}
- private DateTimeTypeAdapter dateTimeTypeAdapter = new DateTimeTypeAdapter();
- private LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter();
- {{/joda}}
- {{#jsr310}}
- private OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter();
- private LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter();
- {{/jsr310}}
- public static GsonBuilder createGson() {
- GsonFireBuilder fireBuilder = new GsonFireBuilder()
- {{#parent}}
- .registerTypeSelector({{classname}}.class, new TypeSelector() {
- @Override
- public Class getClassForElement(JsonElement readElement) {
- Map classByDiscriminatorValue = new HashMap();
- {{#children}}
- classByDiscriminatorValue.put("{{name}}".toUpperCase(), {{classname}}.class);
- {{/children}}
- classByDiscriminatorValue.put("{{classname}}".toUpperCase(), {{classname}}.class);
- return getClassByDiscriminator(
- classByDiscriminatorValue,
- getDiscriminatorValue(readElement, "{{discriminator.propertyName}}"));
- }
- })
- {{/parent}}
- ;
- return fireBuilder.createGsonBuilder();
- }
- private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) {
- JsonElement element = readElement.getAsJsonObject().get(discriminatorField);
- if(null == element) {
- throw new IllegalArgumentException("missing discriminator field: <" + discriminatorField + ">");
- }
- return element.getAsString();
- }
- private static Class getClassByDiscriminator(Map classByDiscriminatorValue, String discriminatorValue) {
- Class clazz = (Class) classByDiscriminatorValue.get(discriminatorValue.toUpperCase());
- if(null == clazz) {
- throw new IllegalArgumentException("cannot determine model class of name: <" + discriminatorValue + ">");
- }
- return clazz;
- }
- public JSON() {
- gson = createGson()
- .registerTypeAdapter(Date.class, dateTypeAdapter)
- .registerTypeAdapter(java.sql.Date.class, sqlDateTypeAdapter)
- {{#joda}}
- .registerTypeAdapter(DateTime.class, dateTimeTypeAdapter)
- .registerTypeAdapter(LocalDate.class, localDateTypeAdapter)
- {{/joda}}
- {{#jsr310}}
- .registerTypeAdapter(OffsetDateTime.class, offsetDateTimeTypeAdapter)
- .registerTypeAdapter(LocalDate.class, localDateTypeAdapter)
- {{/jsr310}}
- .create();
- }
- /**
- * Get Gson.
- *
- * @return Gson
- */
- public Gson getGson() {
- return gson;
- }
- /**
- * Set Gson.
- *
- * @param gson Gson
- * @return JSON
- */
- public JSON setGson(Gson gson) {
- this.gson = gson;
- return this;
- }
- {{#joda}}
- /**
- * Gson TypeAdapter for Joda DateTime type
- */
- public static class DateTimeTypeAdapter extends TypeAdapter<DateTime> {
- private DateTimeFormatter formatter;
- public DateTimeTypeAdapter() {
- this(new DateTimeFormatterBuilder()
- .append(ISODateTimeFormat.dateTime().getPrinter(), ISODateTimeFormat.dateOptionalTimeParser().getParser())
- .toFormatter());
- }
- public DateTimeTypeAdapter(DateTimeFormatter formatter) {
- this.formatter = formatter;
- }
- public void setFormat(DateTimeFormatter dateFormat) {
- this.formatter = dateFormat;
- }
- @Override
- public void write(JsonWriter out, DateTime date) throws IOException {
- if (date == null) {
- out.nullValue();
- } else {
- out.value(formatter.print(date));
- }
- }
- @Override
- public DateTime read(JsonReader in) throws IOException {
- switch (in.peek()) {
- case NULL:
- in.nextNull();
- return null;
- default:
- String date = in.nextString();
- return formatter.parseDateTime(date);
- }
- }
- }
- /**
- * Gson TypeAdapter for Joda LocalDate type
- */
- public class LocalDateTypeAdapter extends TypeAdapter<LocalDate> {
- private DateTimeFormatter formatter;
- public LocalDateTypeAdapter() {
- this(ISODateTimeFormat.date());
- }
- public LocalDateTypeAdapter(DateTimeFormatter formatter) {
- this.formatter = formatter;
- }
- public void setFormat(DateTimeFormatter dateFormat) {
- this.formatter = dateFormat;
- }
- @Override
- public void write(JsonWriter out, LocalDate date) throws IOException {
- if (date == null) {
- out.nullValue();
- } else {
- out.value(formatter.print(date));
- }
- }
- @Override
- public LocalDate read(JsonReader in) throws IOException {
- switch (in.peek()) {
- case NULL:
- in.nextNull();
- return null;
- default:
- String date = in.nextString();
- return formatter.parseLocalDate(date);
- }
- }
- }
- public JSON setDateTimeFormat(DateTimeFormatter dateFormat) {
- dateTimeTypeAdapter.setFormat(dateFormat);
- return this;
- }
- public JSON setLocalDateFormat(DateTimeFormatter dateFormat) {
- localDateTypeAdapter.setFormat(dateFormat);
- return this;
- }
- {{/joda}}
- {{#jsr310}}
- /**
- * Gson TypeAdapter for JSR310 OffsetDateTime type
- */
- public static class OffsetDateTimeTypeAdapter extends TypeAdapter<OffsetDateTime> {
- private DateTimeFormatter formatter;
- public OffsetDateTimeTypeAdapter() {
- this(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
- }
- public OffsetDateTimeTypeAdapter(DateTimeFormatter formatter) {
- this.formatter = formatter;
- }
- public void setFormat(DateTimeFormatter dateFormat) {
- this.formatter = dateFormat;
- }
- @Override
- public void write(JsonWriter out, OffsetDateTime date) throws IOException {
- if (date == null) {
- out.nullValue();
- } else {
- out.value(formatter.format(date));
- }
- }
- @Override
- public OffsetDateTime read(JsonReader in) throws IOException {
- switch (in.peek()) {
- case NULL:
- in.nextNull();
- return null;
- default:
- String date = in.nextString();
- if (date.endsWith("+0000")) {
- date = date.substring(0, date.length()-5) + "Z";
- }
- return OffsetDateTime.parse(date, formatter);
- }
- }
- }
- /**
- * Gson TypeAdapter for JSR310 LocalDate type
- */
- public class LocalDateTypeAdapter extends TypeAdapter<LocalDate> {
- private DateTimeFormatter formatter;
- public LocalDateTypeAdapter() {
- this(DateTimeFormatter.ISO_LOCAL_DATE);
- }
- public LocalDateTypeAdapter(DateTimeFormatter formatter) {
- this.formatter = formatter;
- }
- public void setFormat(DateTimeFormatter dateFormat) {
- this.formatter = dateFormat;
- }
- @Override
- public void write(JsonWriter out, LocalDate date) throws IOException {
- if (date == null) {
- out.nullValue();
- } else {
- out.value(formatter.format(date));
- }
- }
- @Override
- public LocalDate read(JsonReader in) throws IOException {
- switch (in.peek()) {
- case NULL:
- in.nextNull();
- return null;
- default:
- String date = in.nextString();
- return LocalDate.parse(date, formatter);
- }
- }
- }
- public JSON setOffsetDateTimeFormat(DateTimeFormatter dateFormat) {
- offsetDateTimeTypeAdapter.setFormat(dateFormat);
- return this;
- }
- public JSON setLocalDateFormat(DateTimeFormatter dateFormat) {
- localDateTypeAdapter.setFormat(dateFormat);
- return this;
- }
- {{/jsr310}}
- /**
- * Gson TypeAdapter for java.sql.Date type
- * If the dateFormat is null, a simple "yyyy-MM-dd" format will be used
- * (more efficient than SimpleDateFormat).
- */
- public static class SqlDateTypeAdapter extends TypeAdapter<java.sql.Date> {
- private DateFormat dateFormat;
- public SqlDateTypeAdapter() {
- }
- public SqlDateTypeAdapter(DateFormat dateFormat) {
- this.dateFormat = dateFormat;
- }
- public void setFormat(DateFormat dateFormat) {
- this.dateFormat = dateFormat;
- }
- @Override
- public void write(JsonWriter out, java.sql.Date date) throws IOException {
- if (date == null) {
- out.nullValue();
- } else {
- String value;
- if (dateFormat != null) {
- value = dateFormat.format(date);
- } else {
- value = date.toString();
- }
- out.value(value);
- }
- }
- @Override
- public java.sql.Date read(JsonReader in) throws IOException {
- switch (in.peek()) {
- case NULL:
- in.nextNull();
- return null;
- default:
- String date = in.nextString();
- try {
- if (dateFormat != null) {
- return new java.sql.Date(dateFormat.parse(date).getTime());
- }
- return new java.sql.Date(ISO8601Utils.parse(date, new ParsePosition(0)).getTime());
- } catch (ParseException e) {
- throw new JsonParseException(e);
- }
- }
- }
- }
- /**
- * Gson TypeAdapter for java.util.Date type
- * If the dateFormat is null, ISO8601Utils will be used.
- */
- public static class DateTypeAdapter extends TypeAdapter<Date> {
- private DateFormat dateFormat;
- public DateTypeAdapter() {
- }
- public DateTypeAdapter(DateFormat dateFormat) {
- this.dateFormat = dateFormat;
- }
- public void setFormat(DateFormat dateFormat) {
- this.dateFormat = dateFormat;
- }
- @Override
- public void write(JsonWriter out, Date date) throws IOException {
- if (date == null) {
- out.nullValue();
- } else {
- String value;
- if (dateFormat != null) {
- value = dateFormat.format(date);
- } else {
- value = ISO8601Utils.format(date, true);
- }
- out.value(value);
- }
- }
- @Override
- public Date read(JsonReader in) throws IOException {
- try {
- switch (in.peek()) {
- case NULL:
- in.nextNull();
- return null;
- default:
- String date = in.nextString();
- try {
- if (dateFormat != null) {
- return dateFormat.parse(date);
- }
- return ISO8601Utils.parse(date, new ParsePosition(0));
- } catch (ParseException e) {
- throw new JsonParseException(e);
- }
- }
- } catch (IllegalArgumentException e) {
- throw new JsonParseException(e);
- }
- }
- }
- public JSON setDateFormat(DateFormat dateFormat) {
- dateTypeAdapter.setFormat(dateFormat);
- return this;
- }
- public JSON setSqlDateFormat(DateFormat dateFormat) {
- sqlDateTypeAdapter.setFormat(dateFormat);
- return this;
- }
- }