sqt/assignment-w13/comments-api/src/main/java/comments/resources/CommentResource.java

200 lines
7.8 KiB
Java

package comments.resources;
import comments.model.Comment;
import comments.repository.CriticsRepository;
import comments.repository.MapCriticsRepository;
//import org.jboss.resteasy.spi.BadRequestException;
//import org.jboss.resteasy.spi.NotFoundException;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.ws.rs.core.Response.ResponseBuilder;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@Path("/comments")
public class CommentResource {
public static CommentResource _instance = null;
CriticsRepository repository;
private CommentResource() {
repository = MapCriticsRepository.getInstance();
}
public static CommentResource getInstance() {
if (_instance == null) {
_instance = new CommentResource();
}
return _instance;
}
public void order(List<Comment> list) {
// Comparator<Comment> c = Comparator.comparing(x -> x.getDate());
Collections.sort(list, new ComparatorDateComment());
}
public List<Comment> length(List<Comment> list, Integer index) {
List<Comment> sublist = list.subList(0, index);
return sublist;
}
@GET
@Produces("application/json")
public Response getAll(@QueryParam("contains") String word, @QueryParam("type") String type, @QueryParam("order") String order,
@QueryParam("offset") String offset, @QueryParam("limit") String limit) {
if(type != null && !type.equals("Review") && !type.equals("Request") && !type.equals("Complain") && !type.equals("All"))
return Response.status(400).type(MediaType.TEXT_PLAIN).entity("type must be one of Review, Request, Complain or All").build();
// return Response.status(400).build();
if(order != null && !order.equals("date") && !order.equals("-date") && !order.equals("+date"))
return Response.status(400).type(MediaType.TEXT_PLAIN).entity("order must be one of date, -date or +date").build();
// return Response.status(400).build();
List<Comment> comments = new ArrayList<Comment>();
Comment c = null;
Iterator<Comment> iterator = repository.getAllComments().iterator();
while (iterator.hasNext()) {
c = iterator.next();
if (wordFilter(c, word) && typeFilter(c, type)) {
comments.add(c);
}
}
if (order != null && (order.equals("date") || order.equals("+date"))) {
Collections.sort(comments, new ComparatorDateComment());
}
if (order != null && order.equals("-date")) {
Collections.sort(comments, new ComparatorDateCommentReversed());
}
Integer off = 0;
Integer lim = comments.size();
if (offset != null) {
try {
off = new Integer(offset);
if (off < 0 || off > comments.size()) {
off = 0;
}
} catch(NumberFormatException e) {
return Response.status(400).type(MediaType.TEXT_PLAIN).entity("The offset must be a number").build();
}
}
if (limit != null) {
try {
lim = new Integer(limit);
if (lim < 0 || lim + off > comments.size()) {
lim = comments.size();
} else {
lim--;
}
} catch(NumberFormatException e) {
return Response.status(400).type(MediaType.TEXT_PLAIN).entity("The limit must be a number").build();
}
}
comments = comments.subList(off, lim + off > comments.size() ? lim : lim + off);
return Response.ok(comments).build();
}
@GET
@Path("{id}")
@Produces("application/json")
public Response getComment(@PathParam("id") String commentId) {
Comment comment = repository.getComment(commentId);
if (comment == null) {
return Response.status(404).type(MediaType.TEXT_PLAIN).entity("The comment with id" + commentId + " was not found").type(MediaType.TEXT_PLAIN).build();
// return Response.status(404).build();
}
return Response.ok(comment).build();
}
@DELETE
@Path("{id}")
@Produces("application/json")
public Response deleteComment(@PathParam("id") String commentId) {
Comment comment = repository.getComment(commentId);
if (comment == null) {
return Response.status(404).type(MediaType.TEXT_PLAIN).entity("The comment with id" + commentId + " was not found").build();
// return Response.status(404).build();
}
return Response.noContent().build();
}
@POST
@Consumes("application/json")
@Produces("application/json")
public Response addComment(@Context UriInfo uriInfo, Comment c) {
if (!validateBodyPost(c)) {
return Response.status(400).type(MediaType.TEXT_PLAIN).entity("You must complete the username and text fields").build();
// return Response.status(400).build();
}
if (c.getType() != null && !(c.getType().equals("Review") || c.getType().equals("Request") || c.getType().equals("Complain"))) {
return Response.status(400).type(MediaType.TEXT_PLAIN).entity("Invalid value for type parameter").build();
// return Response.status(400).build();
}
repository.addComment(c);
UriBuilder ub = uriInfo.getAbsolutePathBuilder().path(this.getClass(), "getComment");
URI uri = ub.build(c.getId());
ResponseBuilder resp = Response.created(uri);
resp.entity(c);
return resp.build();
}
@PUT
@Consumes("application/json")
@Produces("application/json")
public Response updateComment(Comment c) {
if(!validateBodyPut(c))
return Response.status(400).type(MediaType.TEXT_PLAIN).entity("You must complete all fields").build();
// return Response.status(400).build();
Comment oldComment = repository.getComment(c.getId());
if (oldComment == null) {
return Response.status(404).type(MediaType.TEXT_PLAIN).entity("The comment with id " + c.getId() + " was not found").build();
// return Response.status(404).build();
}
repository.updateComment(c);
return Response.ok(repository.getComment(c.getId())).build();
}
private boolean validateBodyPost(Comment c) {
return c != null && c.getUserName() != null && !c.getUserName().equals("") && c.getText() != null
&& !c.getText().equals("") && !(c.getType() != null && !c.getType().equals("Review")
&& !c.getType().equals("Request") && !c.getType().equals("Complain"));
}
private boolean validateBodyPut(Comment c) {
return c != null && c.getId() != null && !c.getId().equals("") && c.getUserName() != null
&& !c.getUserName().equals("") && c.getText() != null && !c.getText().equals("")
&& c.getId() != null && !c.getId().equals("") && c.getDate() != null && !c.getDate().equals("")
&& c.getType() != null && (c.getType().equals("Review") || c.getType().equals("Request")
|| c.getType().equals("Complain"));
}
// Returns true if the comment include word, or if the word is null or empty.
private boolean wordFilter(Comment c, String word) {
return (word == null || word.equals("") || c.getText().contains(word));
}
// Returns true if the comment matches the input type.
private boolean typeFilter(Comment c, String type) {
// return (type == null || type.equals("") || type.equals("All") || c.getType().equals(type));
return type == null || type.equals("") || type.equals("All") || (c.getType() != null && c.getType().equals(type));
}
}