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.JsonArray; import javax.json.JsonException; import javax.json.JsonObject; 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.Role; import svanimpe.reminders.domain.User; @Provider @Consumes(MediaType.APPLICATION_JSON) public class UserReader implements MessageBodyReader<User> { @Override public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return User.class.isAssignableFrom(type); } @Override public User readFrom(Class<User> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { User user = new User(); try { JsonObject jsonUser = Json.createReader(entityStream).readObject(); if (jsonUser.containsKey("username")) { user.setUsername(jsonUser.getString("username")); } if (jsonUser.containsKey("fullName")) { user.setFullName(jsonUser.getString("fullName")); } if (jsonUser.containsKey("password")) { user.setPassword(jsonUser.getString("password")); } JsonArray roles = jsonUser.getJsonArray("roles"); if (roles != null) { for (int i = 0; i < roles.size(); i++) { try { Role role = Role.valueOf(roles.getString(i).toUpperCase()); user.getRoles().add(role); } catch (IllegalArgumentException ex) { // Invalid role name. throw new BadRequestException("USER_ROLES"); } } } } catch (JsonException | ClassCastException ex) { // Invalid JSON or type mismatch. throw new BadRequestException("JSON"); } return user; } }