package svanimpe.reminders.json;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.json.Json;
import javax.json.JsonObjectBuilder;
import javax.json.JsonWriter;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import svanimpe.reminders.domain.Reminder;
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ReminderWriter implements MessageBodyWriter<Reminder>
{
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
{
return Reminder.class.isAssignableFrom(type);
}
@Override
public long getSize(Reminder reminder, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
{
return -1;
}
@Override
public void writeTo(Reminder reminder, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException
{
JsonObjectBuilder jsonReminder = Json.createObjectBuilder();
jsonReminder.add("id", reminder.getId());
jsonReminder.add("title", reminder.getTitle());
if (reminder.getDate() != null) {
jsonReminder.add("date", reminder.getDate().getTimeInMillis());
}
if (reminder.getLocation() != null) {
JsonObjectBuilder jsonLocation = Json.createObjectBuilder();
jsonLocation.add("latitude", reminder.getLocation().getLatitude());
jsonLocation.add("longitude", reminder.getLocation().getLongitude());
jsonReminder.add("location", jsonLocation);
}
jsonReminder.add("image", reminder.getImage() != null);
try (JsonWriter writer = Json.createWriter(entityStream)) {
writer.writeObject(jsonReminder.build());
}
}
}