package sk.stuba.fiit.perconik.data; import java.util.Map; import javax.annotation.Nullable; import com.fasterxml.jackson.databind.annotation.JsonNaming; import sk.stuba.fiit.perconik.data.bind.Mapper; import sk.stuba.fiit.perconik.data.bind.NamingStrategy.LowerUnderscore; import sk.stuba.fiit.perconik.data.bind.Writer; import sk.stuba.fiit.perconik.data.content.Content; import static com.google.common.collect.Maps.newTreeMap; @JsonNaming(LowerUnderscore.class) public class Data implements Content { public Data() {} public static final <T extends Data> T fromMap(final Class<T> type, final Map<String, Object> data) { try { return Mapper.getShared().convertValue(data, type); } catch (Exception e) { throw new DataException(e); } } public static final <T extends Data> T fromString(final Class<T> type, final String data) { try { return Mapper.getShared().readValue(data, type); } catch (Exception e) { throw new DataException(e); } } @Override public final boolean equals(@Nullable final Object o) { return o == this || o instanceof Data && ((Data) o).toMap().equals(this.toMap()); } @Override public final int hashCode() { return this.toMap().hashCode(); } public Map<String, Object> toMap() { try { return Mapper.getShared().convertValue(this, Mapper.getMapType()); } catch (Exception e) { throw new DataException(e); } } public Map<String, Object> toMap(final boolean pretty) { if (!pretty) { return this.toMap(); } Map<String, Object> map = newTreeMap(); map.putAll(this.toMap()); return map; } @Override public String toString() { try { return Mapper.getShared().writeValueAsString(this); } catch (Exception e) { throw new DataException(e); } } public String toString(final boolean pretty) { if (!pretty) { return this.toString(); } try { return Writer.getPretty().writeValueAsString(this.toMap()); } catch (Exception e) { throw new DataException(e); } } }