From 841685d86f02a950f3b522f1ec686313c5fbe846 Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer <paul-christian.volkmer@mni.thm.de>
Date: Tue, 12 Feb 2013 16:30:06 +0100
Subject: [PATCH] Use Exceptions mapped to HttpStatus instead of manually set
 Http status

This allows expecting those exceptions in test classes.
---
 .../controller/AbstractController.java        | 12 ++++++++++
 .../controller/FeedbackController.java        | 14 +++++------
 .../controller/FoodVoteController.java        |  3 ---
 .../QuestionByAudienceController.java         | 12 +++++-----
 .../QuestionByLecturerController.java         | 24 +++++++++----------
 .../arsnova/controller/SessionController.java | 19 +++++++--------
 .../exceptions/BadRequestException.java       |  5 ++++
 .../PreconditionFailedException.java          |  5 ++++
 8 files changed, 54 insertions(+), 40 deletions(-)
 create mode 100644 src/main/java/de/thm/arsnova/exceptions/BadRequestException.java
 create mode 100644 src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java

diff --git a/src/main/java/de/thm/arsnova/controller/AbstractController.java b/src/main/java/de/thm/arsnova/controller/AbstractController.java
index 3c379b337..3c86d4a0c 100644
--- a/src/main/java/de/thm/arsnova/controller/AbstractController.java
+++ b/src/main/java/de/thm/arsnova/controller/AbstractController.java
@@ -6,9 +6,11 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseStatus;
 
+import de.thm.arsnova.exceptions.BadRequestException;
 import de.thm.arsnova.exceptions.ForbiddenException;
 import de.thm.arsnova.exceptions.NoContentException;
 import de.thm.arsnova.exceptions.NotFoundException;
+import de.thm.arsnova.exceptions.PreconditionFailedException;
 import de.thm.arsnova.exceptions.UnauthorizedException;
 
 public class AbstractController {
@@ -31,4 +33,14 @@ public class AbstractController {
 	@ExceptionHandler(NoContentException.class)
 	public void handleNoContentException(final Exception e, final HttpServletRequest request) {
 	}
+	
+	@ResponseStatus(HttpStatus.BAD_REQUEST)
+	@ExceptionHandler(BadRequestException.class)
+	public void handleBadRequestException(final Exception e, final HttpServletRequest request) {
+	}
+	
+	@ResponseStatus(HttpStatus.PRECONDITION_FAILED)
+	@ExceptionHandler(PreconditionFailedException.class)
+	public void handlePreconditionFailedException(final Exception e, final HttpServletRequest request) {
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/controller/FeedbackController.java b/src/main/java/de/thm/arsnova/controller/FeedbackController.java
index 627c8fd47..c1a4be8fa 100644
--- a/src/main/java/de/thm/arsnova/controller/FeedbackController.java
+++ b/src/main/java/de/thm/arsnova/controller/FeedbackController.java
@@ -30,9 +30,11 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
 
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.User;
+import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.services.IFeedbackService;
 import de.thm.arsnova.services.IUserService;
 
@@ -61,8 +63,7 @@ public class FeedbackController extends AbstractController {
 		if (value != null && value >= Feedback.MIN_FEEDBACK_TYPE && value <= Feedback.MAX_FEEDBACK_TYPE) {
 			return value;
 		}
-		response.setStatus(HttpStatus.NOT_FOUND.value());
-		return null;
+		throw new NotFoundException();
 	}
 
 	@RequestMapping(value = "/session/{sessionkey}/feedbackcount", method = RequestMethod.GET)
@@ -85,6 +86,7 @@ public class FeedbackController extends AbstractController {
 
 	@RequestMapping(value = "/session/{sessionkey}/feedback", method = RequestMethod.POST)
 	@ResponseBody
+	@ResponseStatus(HttpStatus.CREATED)
 	public final Feedback postFeedback(
 			@PathVariable final String sessionkey,
 			@RequestBody final int value,
@@ -94,15 +96,11 @@ public class FeedbackController extends AbstractController {
 		if (feedbackService.saveFeedback(sessionkey, value, user)) {
 			Feedback feedback = feedbackService.getFeedback(sessionkey);
 			if (feedback != null) {
-				response.setStatus(HttpStatus.CREATED.value());
 				return feedback;
 			}
-
-			response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
-			return null;
+			throw new RuntimeException();
 		}
 
-		response.setStatus(HttpStatus.BAD_REQUEST.value());
-		return null;
+		throw new NotFoundException();
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/controller/FoodVoteController.java b/src/main/java/de/thm/arsnova/controller/FoodVoteController.java
index 61269ef5a..f784b03ab 100644
--- a/src/main/java/de/thm/arsnova/controller/FoodVoteController.java
+++ b/src/main/java/de/thm/arsnova/controller/FoodVoteController.java
@@ -66,7 +66,4 @@ public class FoodVoteController extends AbstractController {
 	public final String getFoodVoteCount() {
 		return Integer.toString(foodService.getFoodVoteCount());
 	}
-	
-	
-
 }
diff --git a/src/main/java/de/thm/arsnova/controller/QuestionByAudienceController.java b/src/main/java/de/thm/arsnova/controller/QuestionByAudienceController.java
index 8001f67dc..01a5ef239 100644
--- a/src/main/java/de/thm/arsnova/controller/QuestionByAudienceController.java
+++ b/src/main/java/de/thm/arsnova/controller/QuestionByAudienceController.java
@@ -32,9 +32,12 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
 
 import de.thm.arsnova.entities.InterposedQuestion;
 import de.thm.arsnova.entities.InterposedReadingCount;
+import de.thm.arsnova.exceptions.BadRequestException;
+import de.thm.arsnova.exceptions.PreconditionFailedException;
 import de.thm.arsnova.services.IQuestionService;
 
 @Controller
@@ -84,23 +87,21 @@ public class QuestionByAudienceController extends AbstractController {
 
 	@RequestMapping(value = "/session/{sessionkey}/interposed", method = RequestMethod.POST)
 	@ResponseBody
+	@ResponseStatus(HttpStatus.CREATED)
 	public final void postInterposedQuestion(
 			@PathVariable final String sessionkey,
 			@RequestBody final InterposedQuestion question,
 			final HttpServletResponse response
 	) {
 		if (!sessionkey.equals(question.getSessionId())) {
-			response.setStatus(HttpStatus.PRECONDITION_FAILED.value());
-			return;
+			throw new PreconditionFailedException();
 		}
 
 		if (questionService.saveQuestion(question)) {
-			response.setStatus(HttpStatus.CREATED.value());
 			return;
 		}
 
-		response.setStatus(HttpStatus.BAD_REQUEST.value());
-		return;
+		throw new BadRequestException();
 	}
 	
 	@RequestMapping(value = "/session/{sessionkey}/interposed/{questionId}", method = RequestMethod.DELETE)
@@ -112,5 +113,4 @@ public class QuestionByAudienceController extends AbstractController {
 	) {
 		questionService.deleteQuestion(questionId);
 	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java b/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java
index 007ff95af..1dfea5429 100644
--- a/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java
+++ b/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java
@@ -33,9 +33,13 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
 
 import de.thm.arsnova.entities.Answer;
 import de.thm.arsnova.entities.Question;
+import de.thm.arsnova.exceptions.BadRequestException;
+import de.thm.arsnova.exceptions.ForbiddenException;
+import de.thm.arsnova.exceptions.NoContentException;
 import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.services.IQuestionService;
 
@@ -59,8 +63,7 @@ public class QuestionByLecturerController extends AbstractController {
 			return question;
 		}
 
-		response.setStatus(HttpStatus.NOT_FOUND.value());
-		return null;
+		throw new NotFoundException();
 	}
 
 	@RequestMapping(
@@ -68,19 +71,17 @@ public class QuestionByLecturerController extends AbstractController {
 			method = RequestMethod.POST
 			)
 	@ResponseBody
+	@ResponseStatus(HttpStatus.CREATED)
 	public final Question postQuestion(
 			@RequestBody final Question question,
 			final HttpServletResponse response
 	) {
 
 		if (questionService.saveQuestion(question) != null) {
-			response.setStatus(HttpStatus.CREATED.value());
 			return question;
 		}
 
-		response.setStatus(HttpStatus.BAD_REQUEST.value());
-		
-		return null;
+		throw new BadRequestException();
 	}
 
 	@RequestMapping(
@@ -94,7 +95,7 @@ public class QuestionByLecturerController extends AbstractController {
 			@RequestBody final Question question,
 			final HttpServletResponse response
 	) {
-		response.setStatus(HttpStatus.NO_CONTENT.value());
+		throw new NoContentException();
 		
 		/* TODO: Not yet implemented! The following code has been copy-and-pasted from postQuestion */
 		/*
@@ -127,8 +128,7 @@ public class QuestionByLecturerController extends AbstractController {
 			@RequestBody final Question question,
 			final HttpServletResponse response
 	) {
-		/* TODO: Not yet implemented! */
-		response.setStatus(HttpStatus.NO_CONTENT.value());
+		throw new NoContentException();
 	}
 	
 
@@ -143,8 +143,7 @@ public class QuestionByLecturerController extends AbstractController {
 	) {
 		List<Question> questions = questionService.getSkillQuestions(sessionkey);
 		if (questions == null || questions.isEmpty()) {
-			response.setStatus(HttpStatus.NOT_FOUND.value());
-			return null;
+			throw new NotFoundException();
 		}
 		LOGGER.info(questions.toString());
 		return questions;
@@ -188,8 +187,7 @@ public class QuestionByLecturerController extends AbstractController {
 	) {
 		List<String> answers = questionService.getUnAnsweredQuestions(sessionkey);
 		if (answers == null || answers.isEmpty()) {
-			response.setStatus(HttpStatus.NO_CONTENT.value());
-			return null;
+			throw new NoContentException();
 		}
 		return answers;
 	}
diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index 885e076cb..641d6c21d 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -32,10 +32,13 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
 
 import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
+import de.thm.arsnova.exceptions.NoContentException;
+import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.services.ISessionService;
 import de.thm.arsnova.services.IUserService;
 
@@ -58,6 +61,7 @@ public class SessionController extends AbstractController {
 
 	@RequestMapping(value = "/session/{sessionkey}/online", method = RequestMethod.POST)
 	@ResponseBody
+	@ResponseStatus(HttpStatus.CREATED)
 	public final LoggedIn registerAsOnlineUser(
 			@PathVariable final String sessionkey,
 			final HttpServletResponse response
@@ -65,12 +69,10 @@ public class SessionController extends AbstractController {
 		User user = userService.getCurrentUser();
 		LoggedIn loggedIn = sessionService.registerAsOnlineUser(user, sessionkey);
 		if (loggedIn != null) {
-			response.setStatus(HttpStatus.CREATED.value());
 			return loggedIn;
 		}
 
-		response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
-		return null;
+		throw new RuntimeException();
 	}
 
 	@RequestMapping(value = "/session/{sessionkey}/activeusercount", method = RequestMethod.GET)
@@ -84,10 +86,10 @@ public class SessionController extends AbstractController {
 
 	@RequestMapping(value = "/session", method = RequestMethod.POST)
 	@ResponseBody
+	@ResponseStatus(HttpStatus.CREATED)
 	public final Session postNewSession(@RequestBody final Session session, final HttpServletResponse response) {
 		Session newSession = sessionService.saveSession(session);
 		if (session != null) {
-			response.setStatus(HttpStatus.CREATED.value());
 			return newSession;
 		}
 
@@ -100,13 +102,11 @@ public class SessionController extends AbstractController {
 	public final List<Session> getMySession(final HttpServletResponse response) {
 		String username = userService.getCurrentUser().getUsername();
 		if (username == null) {
-			response.setStatus(HttpStatus.NOT_FOUND.value());
-			return null;
+			throw new NotFoundException();
 		}
 		List<Session> sessions = sessionService.getMySessions(username);
 		if (sessions == null || sessions.isEmpty()) {
-			response.setStatus(HttpStatus.NOT_FOUND.value());
-			return null;
+			throw new NotFoundException();
 		}
 		return sessions;
 	}
@@ -116,8 +116,7 @@ public class SessionController extends AbstractController {
 	public final List<Session> getMyVisitedSession(final HttpServletResponse response) {
 		List<Session> sessions = sessionService.getMyVisitedSessions(userService.getCurrentUser());
 		if (sessions == null || sessions.isEmpty()) {
-			response.setStatus(HttpStatus.NO_CONTENT.value());
-			return null;
+			throw new NoContentException();
 		}
 		return sessions;
 	}
diff --git a/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java b/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java
new file mode 100644
index 000000000..f2289bf51
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java
@@ -0,0 +1,5 @@
+package de.thm.arsnova.exceptions;
+
+public class BadRequestException extends RuntimeException {
+	private static final long serialVersionUID = 1L;
+}
diff --git a/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java b/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java
new file mode 100644
index 000000000..827f0c5bf
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java
@@ -0,0 +1,5 @@
+package de.thm.arsnova.exceptions;
+
+public class PreconditionFailedException extends RuntimeException {
+	private static final long serialVersionUID = 1L;
+}
-- 
GitLab