package svanimpe.reminders.json;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.json.Json;
import javax.json.JsonException;
import javax.json.JsonObject;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import svanimpe.reminders.domain.List;
import svanimpe.reminders.domain.User;
@Provider
@Consumes(MediaType.APPLICATION_JSON)
public class ListReader implements MessageBodyReader<List>
{
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
{
return List.class.isAssignableFrom(type);
}
@Override
public List readFrom(Class<List> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException
{
List list = new List();
try {
JsonObject jsonList = Json.createReader(entityStream).readObject();
if (jsonList.containsKey("title")) {
list.setTitle(jsonList.getString("title"));
}
if (jsonList.containsKey("owner")) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("RemindersPU");
EntityManager em = emf.createEntityManager();
list.setOwner(em.find(User.class, jsonList.getString("owner")));
em.close();
emf.close();
}
} catch (JsonException | ClassCastException ex) {
// Invalid JSON or type mismatch.
throw new BadRequestException("JSON");
}
return list;
}
}