diff --git a/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java index a393dc2483fac635661f05abb036c610b4fd1edf..58e3f907e967d2f1eadc31592c4a87be04891237 100644 --- a/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java +++ b/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java @@ -1,15 +1,23 @@ package de.thm.arsnova.controller; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.event.Level; import org.springframework.beans.factory.annotation.Value; import java.util.HashMap; import java.util.Map; public class AbstractControllerExceptionHandler { + private static final Logger logger = LoggerFactory.getLogger(AbstractControllerExceptionHandler.class); + /* Since exception messages might contain sensitive data, they are not exposed by default. */ @Value("${api.expose-error-messages:false}") private boolean exposeMessages; - protected Map<String, Object> handleException(Throwable e) { + protected Map<String, Object> handleException(@NonNull Throwable e, @NonNull Level level) { + final String message = e.getMessage() != null ? e.getMessage() : ""; + log(level, message, e); final Map<String, Object> result = new HashMap<>(); result.put("errorType", e.getClass().getSimpleName()); if (exposeMessages) { @@ -18,4 +26,24 @@ public class AbstractControllerExceptionHandler { return result; } + + private void log(Level level, String message, Throwable e) { + switch (level) { + case ERROR: + logger.error(message, e); + break; + case WARN: + logger.warn(message, e); + break; + case INFO: + logger.info(message, e); + break; + case DEBUG: + logger.debug(message, e); + break; + case TRACE: + logger.trace(message, e); + break; + } + } } diff --git a/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java index 433f259aadef3df37d60a0276e6da733d99d272d..9e91b10a19e4efa4be548001422831f4a09e58f9 100644 --- a/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java +++ b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java @@ -25,6 +25,7 @@ import de.thm.arsnova.exceptions.NotImplementedException; import de.thm.arsnova.exceptions.PayloadTooLargeException; import de.thm.arsnova.exceptions.PreconditionFailedException; import de.thm.arsnova.exceptions.UnauthorizedException; +import org.slf4j.event.Level; import org.springframework.http.HttpStatus; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.security.access.AccessDeniedException; @@ -46,25 +47,32 @@ import java.util.Map; */ @ControllerAdvice public class ControllerExceptionHandler extends AbstractControllerExceptionHandler { + @ExceptionHandler(NoContentException.class) + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + public Map<String, Object> handleNoContentException(final Exception e, final HttpServletRequest request) { + return handleException(e, Level.TRACE); + } + @ExceptionHandler(NotFoundException.class) @ResponseBody @ResponseStatus(HttpStatus.NOT_FOUND) public Map<String, Object> handleNotFoundException(final Exception e, final HttpServletRequest request) { - return handleException(e); + return handleException(e, Level.TRACE); } @ExceptionHandler(UnauthorizedException.class) @ResponseBody @ResponseStatus(HttpStatus.UNAUTHORIZED) public Map<String, Object> handleUnauthorizedException(final Exception e, final HttpServletRequest request) { - return handleException(e); + return handleException(e, Level.TRACE); } @ExceptionHandler(AuthenticationCredentialsNotFoundException.class) @ResponseStatus(HttpStatus.UNAUTHORIZED) @ResponseBody public Map<String, Object> handleAuthenticationCredentialsNotFoundException(final Exception e, final HttpServletRequest request) { - return handleException(e); + return handleException(e, Level.DEBUG); } @ExceptionHandler(AccessDeniedException.class) @@ -83,55 +91,48 @@ public class ControllerExceptionHandler extends AbstractControllerExceptionHandl response.setStatus(HttpStatus.FORBIDDEN.value()); } - return handleException(e); + return handleException(e, Level.DEBUG); } @ExceptionHandler(ForbiddenException.class) @ResponseBody @ResponseStatus(HttpStatus.FORBIDDEN) public Map<String, Object> handleForbiddenException(final Exception e, final HttpServletRequest request) { - return handleException(e); - } - - @ExceptionHandler(NoContentException.class) - @ResponseBody - @ResponseStatus(HttpStatus.NO_CONTENT) - public Map<String, Object> handleNoContentException(final Exception e, final HttpServletRequest request) { - return handleException(e); + return handleException(e, Level.DEBUG); } @ExceptionHandler(BadRequestException.class) @ResponseBody @ResponseStatus(HttpStatus.BAD_REQUEST) public Map<String, Object> handleBadRequestException(final Exception e, final HttpServletRequest request) { - return handleException(e); + return handleException(e, Level.DEBUG); } @ExceptionHandler(PreconditionFailedException.class) @ResponseBody @ResponseStatus(HttpStatus.PRECONDITION_FAILED) public Map<String, Object> handlePreconditionFailedException(final Exception e, final HttpServletRequest request) { - return handleException(e); + return handleException(e, Level.DEBUG); } @ExceptionHandler(NotImplementedException.class) @ResponseBody @ResponseStatus(HttpStatus.NOT_IMPLEMENTED) public Map<String, Object> handleNotImplementedException(final Exception e, final HttpServletRequest request) { - return handleException(e); + return handleException(e, Level.DEBUG); } @ExceptionHandler(PayloadTooLargeException.class) @ResponseBody @ResponseStatus(HttpStatus.PAYLOAD_TOO_LARGE) public Map<String, Object> handlePayloadTooLargeException(final Exception e, final HttpServletRequest request) { - return handleException(e); + return handleException(e, Level.DEBUG); } @ExceptionHandler(HttpMessageNotReadableException.class) @ResponseBody @ResponseStatus(HttpStatus.BAD_REQUEST) public Map<String, Object> handleHttpMessageNotReadableException(final Exception e, final HttpServletRequest request) { - return handleException(e); + return handleException(e, Level.DEBUG); } } diff --git a/src/main/java/de/thm/arsnova/controller/CourseController.java b/src/main/java/de/thm/arsnova/controller/CourseController.java index 48e4ece77443ef4d12ec17c9f9eb5083f18d8b47..e8919bc4328b9b8f96daba68863b5770b5eac614 100644 --- a/src/main/java/de/thm/arsnova/controller/CourseController.java +++ b/src/main/java/de/thm/arsnova/controller/CourseController.java @@ -25,8 +25,6 @@ import de.thm.arsnova.exceptions.NotImplementedException; import de.thm.arsnova.exceptions.UnauthorizedException; import de.thm.arsnova.services.IUserService; import io.swagger.annotations.ApiParam; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -44,9 +42,6 @@ import java.util.List; */ @RestController public class CourseController extends AbstractController { - - private static final Logger logger = LoggerFactory.getLogger(CourseController.class); - @Autowired(required = false) private ConnectorClient connectorClient; diff --git a/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java index fe8546c826bfe65e6c36cfc1a2b80d3f8d1eb25e..3d124928001158db3c07765f8f4ad014bf677ef6 100644 --- a/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java +++ b/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java @@ -1,5 +1,6 @@ package de.thm.arsnova.controller; +import org.slf4j.event.Level; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -26,6 +27,6 @@ public class DefaultControllerExceptionHandler extends AbstractControllerExcepti throw e; } - return handleException(e); + return handleException(e, Level.ERROR); } } diff --git a/src/main/java/de/thm/arsnova/controller/FeedbackController.java b/src/main/java/de/thm/arsnova/controller/FeedbackController.java index d0e77fdda10508be1d3fe1ff951296a3392396b4..2f3e3b16c7b509ee4336f6dda7805ef240245436 100644 --- a/src/main/java/de/thm/arsnova/controller/FeedbackController.java +++ b/src/main/java/de/thm/arsnova/controller/FeedbackController.java @@ -23,8 +23,6 @@ import de.thm.arsnova.exceptions.NotFoundException; import de.thm.arsnova.services.IFeedbackService; import de.thm.arsnova.services.IUserService; import de.thm.arsnova.web.DeprecatedApi; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.PathVariable; @@ -42,9 +40,6 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController public class FeedbackController extends AbstractController { - - private static final Logger logger = LoggerFactory.getLogger(FeedbackController.class); - @Autowired private IFeedbackService feedbackService; @@ -99,14 +94,9 @@ public class FeedbackController extends AbstractController { @RequestBody final int value ) { User user = userService.getCurrentUser(); - if (feedbackService.saveFeedback(sessionkey, value, user)) { - Feedback feedback = feedbackService.getFeedback(sessionkey); - if (feedback != null) { - return feedback; - } - throw new RuntimeException(); - } + feedbackService.saveFeedback(sessionkey, value, user); + Feedback feedback = feedbackService.getFeedback(sessionkey); - throw new NotFoundException(); + return feedback; } } diff --git a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java index 40674a0e88e135e8e2650e3f67c25f85b972035e..85ee7c9c57380a1bd5dd757c4d97c5c440c527fd 100644 --- a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java +++ b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java @@ -31,8 +31,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.PathVariable; @@ -55,9 +53,6 @@ import java.util.List; @RequestMapping("/lecturerquestion") @Api(value = "/lecturerquestion", description = "Operations for Lecture Questions") public class LecturerQuestionController extends PaginationController { - - private static final Logger logger = LoggerFactory.getLogger(LecturerQuestionController.class); - @Autowired private IQuestionService questionService; diff --git a/src/main/java/de/thm/arsnova/controller/LoginController.java b/src/main/java/de/thm/arsnova/controller/LoginController.java index 0420a72400fa12dc7954ba8a93c052b927755a90..090ac606741cb563d060e8d92f60b6f4da1bb490 100644 --- a/src/main/java/de/thm/arsnova/controller/LoginController.java +++ b/src/main/java/de/thm/arsnova/controller/LoginController.java @@ -174,7 +174,7 @@ public class LoginController extends AbstractController { return; } } catch (AuthenticationException e) { - logger.info("Authentication failed: {}", e.getMessage()); + logger.info("Database authentication failed.", e); } userService.increaseFailedLoginCount(addr); @@ -197,9 +197,9 @@ public class LoginController extends AbstractController { return; } - logger.info("LDAPLOGIN: {}", auth.isAuthenticated()); + logger.info("LDAP authentication failed."); } catch (AuthenticationException e) { - logger.info("No LDAP login: {}", e); + logger.info("LDAP authentication failed.", e); } userService.increaseFailedLoginCount(addr); diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java index fb5ad95f66c81cb3d7ba9104da0fe541974957ff..1c1c6599bd3873f1a4519561d905a69faac235f3 100644 --- a/src/main/java/de/thm/arsnova/controller/SessionController.java +++ b/src/main/java/de/thm/arsnova/controller/SessionController.java @@ -37,8 +37,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; @@ -62,9 +60,6 @@ import java.util.List; @RequestMapping("/session") @Api(value = "/session", description = "the Session Controller API") public class SessionController extends PaginationController { - - private static final Logger logger = LoggerFactory.getLogger(SessionController.class); - @Autowired private ISessionService sessionService; diff --git a/src/main/java/de/thm/arsnova/controller/SocketController.java b/src/main/java/de/thm/arsnova/controller/SocketController.java index 63c9fb35a683f991710b8d57b3af9b811fcafb86..685d1ff7dccd6432aff1348e63c924ee76ef5576 100644 --- a/src/main/java/de/thm/arsnova/controller/SocketController.java +++ b/src/main/java/de/thm/arsnova/controller/SocketController.java @@ -70,13 +70,13 @@ public class SocketController extends AbstractController { public void authorize(@ApiParam(value = "sessionMap", required = true) @RequestBody final Map <String, String> sessionMap, @ApiParam(value = "response", required = true) final HttpServletResponse response) { String socketid = sessionMap.get("session"); if (null == socketid) { - logger.debug("Expected property 'session' missing"); + logger.debug("Expected property 'session' missing."); response.setStatus(HttpStatus.BAD_REQUEST.value()); return; } User u = userService.getCurrentUser(); if (null == u) { - logger.debug("Client {} requested to assign Websocket session but has not authenticated", socketid); + logger.debug("Client {} requested to assign Websocket session but has not authenticated.", socketid); response.setStatus(HttpStatus.FORBIDDEN.value()); return; } diff --git a/src/main/java/de/thm/arsnova/controller/UserController.java b/src/main/java/de/thm/arsnova/controller/UserController.java index 6f955b5a8e10c17c637ac95cc90ae95301fe643b..df9237599b782733210c06f11fb39edb4c9ec10c 100644 --- a/src/main/java/de/thm/arsnova/controller/UserController.java +++ b/src/main/java/de/thm/arsnova/controller/UserController.java @@ -20,8 +20,6 @@ package de.thm.arsnova.controller; import de.thm.arsnova.entities.DbUser; import de.thm.arsnova.services.IUserService; import de.thm.arsnova.services.UserSessionService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.stereotype.Controller; @@ -48,9 +46,6 @@ public class UserController extends AbstractController { @Autowired private UserSessionService userSessionService; - private static final Logger logger = LoggerFactory - .getLogger(UserController.class); - @RequestMapping(value = "/register", method = RequestMethod.POST) public void register(@RequestParam final String username, @RequestParam final String password, diff --git a/src/main/java/de/thm/arsnova/controller/WelcomeController.java b/src/main/java/de/thm/arsnova/controller/WelcomeController.java index 9313f5ef9d652c934da711ed3ded1328463a0af2..c036abda8e3be9e8068340da46af383a9baf5969 100644 --- a/src/main/java/de/thm/arsnova/controller/WelcomeController.java +++ b/src/main/java/de/thm/arsnova/controller/WelcomeController.java @@ -86,13 +86,13 @@ public class WelcomeController extends AbstractController { ) { /* Block requests from the server itself to prevent DoS attacks caused by request loops */ if ("127.0.0.1".equals(request.getRemoteAddr())) { - throw new BadRequestException(); + throw new BadRequestException("Access to localhost not allowed."); } /* Block requests to servers in private networks */ try { final InetAddress addr = InetAddress.getByName(new URL(url).getHost()); if (addr.isSiteLocalAddress()) { - throw new BadRequestException(); + throw new BadRequestException("Access to site-local addresses not allowed."); } } catch (UnknownHostException | MalformedURLException e) { throw new BadRequestException(); diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 6c6982aa64ecac222ff8dcfb42534b71e02fa0f7..ba8775802711219853d001b7c427892e7414d892 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -145,7 +145,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware try { database.saveDocument(d); } catch (final IOException e) { - logger.error("Logging of '{}' event to database failed.", event); + logger.error("Logging of '{}' event to database failed.", event, e); } } @@ -546,7 +546,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware if (document.has("keyword")) { return (String) document.get("keyword"); } - logger.error("No session found for internal id: {}", internalSessionId); + logger.error("No session found for internal id {}.", internalSessionId); return null; } @@ -559,11 +559,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware ); database = session.getDatabase(databaseName); } catch (final Exception e) { - logger.error( - "Cannot connect to CouchDB database '" + databaseName - + "' on host '" + databaseHost - + "' using port " + databasePort - ); + logger.error("Cannot connect to CouchDB database '{}' on host '{}' using port {}.", + databaseName, databaseHost, databasePort, e); } } @@ -584,7 +581,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware question.set_rev(q.getRev()); return question; } catch (final IOException e) { - logger.error("Could not save question {}", question); + logger.error("Could not save question {}.", question, e); } return null; } @@ -715,7 +712,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return question; } catch (final IOException e) { - logger.error("Could not update question {}", question); + logger.error("Could not update question {}.", question, e); } return null; @@ -742,7 +739,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return question; } catch (final IOException e) { - logger.error("Could not save interposed question {}", question); + logger.error("Could not save interposed question {}.", question, e); } return null; @@ -766,7 +763,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware question.setSessionKeyword(getSessionKeyword(question.getSessionId())); return question; } catch (final IOException e) { - logger.error("Could not get question with id {}", id); + logger.error("Could not get question {}.", id, e); } return null; } @@ -840,7 +837,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware getDatabase().saveDocument(new Document(json)); return session; } catch (final IOException e) { - logger.error("Failed to update lastOwnerActivity for Session {}", session); + logger.error("Failed to update lastOwnerActivity for session {}.", session, e); return session; } } @@ -867,7 +864,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return count; } catch (final IOException e) { - logger.error("IOException: Could not delete question {}", question.get_id()); + logger.error("Could not delete question {}.", question.get_id(), e); } return 0; @@ -931,14 +928,14 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware if (database.bulkSaveDocuments(answersToDelete.toArray(new Document[answersToDelete.size()]))) { count += partition.size(); } else { - logger.error("Could not bulk delete answers"); + logger.error("Could not bulk delete answers."); } } log("delete", "type", "answer", "answerCount", count); return count; } catch (final IOException e) { - logger.error("IOException: Could not delete answers for question {}", question.get_id()); + logger.error("Could not delete answers for question {}.", question.get_id(), e); } return 0; @@ -1363,7 +1360,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware } return stats; } catch (final Exception e) { - logger.error("Error while retrieving session count", e); + logger.error("Could not retrieve session count.", e); } return stats; } @@ -1377,7 +1374,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware question.setSessionId(getSessionKeyword(question.getSessionId())); return question; } catch (final IOException e) { - logger.error("Could not load interposed question {}", questionId); + logger.error("Could not load interposed question {}.", questionId, e); } return null; } @@ -1390,7 +1387,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware document.put("read", question.isRead()); getDatabase().saveDocument(document); } catch (final IOException e) { - logger.error("Could not mark interposed question as read {}", question.get_id()); + logger.error("Could not mark interposed question as read {}.", question.get_id(), e); } } @@ -1455,7 +1452,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware final Document doc = new Document(json); getDatabase().saveDocument(doc); } catch (IOException e) { - logger.error("Could not clean up logged_in document of {}", user.getUsername()); + logger.error("Could not clean up logged_in document of {}.", user.getUsername(), e); } return result; } @@ -1521,7 +1518,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware final Document doc = new Document(json); getDatabase().saveDocument(doc); } catch (IOException e) { - logger.error("Could not clean up logged_in document of {}", username); + logger.error("Could not clean up logged_in document of {}.", username, e); } return result; } @@ -1588,7 +1585,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware this.publisher.publishEvent(new NewAnswerEvent(this, e.getSession(), e.getAnswer(), e.getUser(), e.getQuestion())); } } catch (IOException e) { - logger.error("Could not bulk save answers from queue"); + logger.error("Could not bulk save answers from queue.", e); } } @@ -1612,7 +1609,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware answer.set_rev(a.getRev()); return answer; } catch (final IOException e) { - logger.error("Could not save answer {}", answer); + logger.error("Could not update answer {}.", answer, e); } return null; } @@ -1625,7 +1622,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware database.deleteDocument(database.getDocument(answerId)); log("delete", "type", "answer"); } catch (final IOException e) { - logger.error("Could not delete answer {} because of {}", answerId, e.getMessage()); + logger.error("Could not delete answer {}.", answerId, e); } } @@ -1635,7 +1632,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware deleteDocument(question.get_id()); log("delete", "type", "comment"); } catch (final IOException e) { - logger.error("Could not delete interposed question {} because of {}", question.get_id(), e.getMessage()); + logger.error("Could not delete interposed question {}.", question.get_id(), e); } } @@ -1709,7 +1706,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return session; } catch (final IOException e) { - logger.error("Could not lock session {}", session); + logger.error("Could not update session {}.", session, e); } return null; @@ -1724,7 +1721,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware database.saveDocument(s); session.set_rev(s.getRev()); } catch (final IOException e) { - logger.error("Could not lock session {}", session); + logger.error("Could not update creator for session {}.", session, e); } return session; @@ -1740,7 +1737,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware logger.debug("Deleted session document {} and related data.", session.get_id()); log("delete", "type", "session", "id", session.get_id()); } catch (final IOException e) { - logger.error("Could not delete session {}", session); + logger.error("Could not delete session {}.", session, e); } return count; @@ -1797,7 +1794,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware if (getDatabase().bulkSaveDocuments(newDocs.toArray(new Document[newDocs.size()]))) { count += newDocs.size(); } else { - logger.error("Could not bulk delete visited session lists"); + logger.error("Could not bulk delete visited session lists."); } } } @@ -1809,7 +1806,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return count; } catch (IOException e) { - logger.error("Could not delete visited session lists of inactive users."); + logger.error("Could not delete visited session lists of inactive users.", e); } return 0; @@ -2101,7 +2098,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware try { deleteDocument(document.getId()); } catch (final IOException e) { - logger.error("Could not delete all interposed questions {}", session); + logger.error("Could not delete all interposed questions {}.", session, e); } } @@ -2142,7 +2139,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware try { database.bulkSaveDocuments(documents.toArray(new Document[documents.size()])); } catch (final IOException e) { - logger.error("Could not bulk publish all questions: {}", e.getMessage()); + logger.error("Could not bulk publish all questions.", e); } } @@ -2180,7 +2177,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware try { database.bulkSaveDocuments(documents.toArray(new Document[documents.size()])); } catch (final IOException e) { - logger.error("Could not bulk set voting admission for all questions: {}", e.getMessage()); + logger.error("Could not bulk set voting admission for all questions.", e); } } @@ -2243,7 +2240,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware try { database.bulkSaveDocuments(documents.toArray(new Document[documents.size()])); } catch (final IOException e) { - logger.error("Could not bulk reset all questions round state: {}", e.getMessage()); + logger.error("Could not bulk reset all questions round state.", e); } } @@ -2267,7 +2264,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return allAnswers.size(); } catch (IOException e) { - logger.error("Could not bulk delete answers: {}", e.getMessage()); + logger.error("Could not bulk delete answers.", e); } return 0; @@ -2303,7 +2300,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return new int[] {deleteList.size(), result.size()}; } catch (IOException e) { - logger.error("Could not bulk delete questions and answers: {}", e.getMessage()); + logger.error("Could not bulk delete questions and answers.", e); } return new int[] {0, 0}; @@ -2376,7 +2373,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return user; } catch (IOException e) { - logger.error("Could not save user {}", user); + logger.error("Could not save user {}.", user, e); } return null; @@ -2406,7 +2403,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return true; } catch (IOException e) { - logger.error("Could not delete user {}", dbUser.getId()); + logger.error("Could not delete user {}.", dbUser.getId(), e); } return false; @@ -2446,7 +2443,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return count; } catch (IOException e) { - logger.error("Could not delete inactive users."); + logger.error("Could not delete inactive users.", e); } return 0; @@ -2531,7 +2528,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware database.bulkSaveDocuments(motds.toArray(new Document[motds.size()])); database.bulkSaveDocuments(documents.toArray(new Document[documents.size()])); } catch (IOException e) { - logger.error("Could not import this session: {}", e.getMessage()); + logger.error("Could not import session.", e); // Something went wrong, delete this session since we do not want a partial import this.deleteSession(session); return null; @@ -2824,7 +2821,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return motd; } catch (IOException e) { - logger.error("Could not save motd {}", motd); + logger.error("Could not save MotD {}.", motd, e); } return null; @@ -2836,7 +2833,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware try { this.deleteDocument(motd.get_id()); } catch (IOException e) { - logger.error("Could not delete Motd {}", motd.get_id()); + logger.error("Could not delete MotD {}.", motd.get_id(), e); } } @@ -2879,7 +2876,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return motdlist; } catch (IOException e) { - logger.error("Could not save motdlist {}", motdlist); + logger.error("Could not save MotD list {}.", motdlist, e); } return null; diff --git a/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java b/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java index c9b728742518288d38a567ed398dab1677c6de6a..b7e80b833cb0f6053e9d0c1f77fe63813272cdd9 100644 --- a/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java +++ b/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java @@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions; */ public class BadRequestException extends RuntimeException { private static final long serialVersionUID = 1L; + + public BadRequestException() { + super(); + } + + public BadRequestException(String message) { + super(message); + } + + public BadRequestException(Throwable e) { + super(e); + } + + public BadRequestException(String message, Throwable e) { + super(message, e); + } } diff --git a/src/main/java/de/thm/arsnova/exceptions/ForbiddenException.java b/src/main/java/de/thm/arsnova/exceptions/ForbiddenException.java index 05ed5bf3bb633258cdecade7a5ec1621bfe76752..05b21dab60ba76f181a0343c4420d7129814e966 100644 --- a/src/main/java/de/thm/arsnova/exceptions/ForbiddenException.java +++ b/src/main/java/de/thm/arsnova/exceptions/ForbiddenException.java @@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions; */ public class ForbiddenException extends RuntimeException { private static final long serialVersionUID = 1L; + + public ForbiddenException() { + super(); + } + + public ForbiddenException(String message) { + super(message); + } + + public ForbiddenException(Throwable e) { + super(e); + } + + public ForbiddenException(String message, Throwable e) { + super(message, e); + } } diff --git a/src/main/java/de/thm/arsnova/exceptions/NoContentException.java b/src/main/java/de/thm/arsnova/exceptions/NoContentException.java index f0de3c46c0f629be82b65e8b425d44c410c6e1c6..f3f7e81649b77d04bf4431b45aeebd857b71eff8 100644 --- a/src/main/java/de/thm/arsnova/exceptions/NoContentException.java +++ b/src/main/java/de/thm/arsnova/exceptions/NoContentException.java @@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions; */ public class NoContentException extends RuntimeException { private static final long serialVersionUID = 1L; + + public NoContentException() { + super(); + } + + public NoContentException(String message) { + super(message); + } + + public NoContentException(Throwable e) { + super(e); + } + + public NoContentException(String message, Throwable e) { + super(message, e); + } } diff --git a/src/main/java/de/thm/arsnova/exceptions/NotFoundException.java b/src/main/java/de/thm/arsnova/exceptions/NotFoundException.java index 0937ebde41a488665a864a5aac53cbc295fd3af5..a0a12b25add162e74557c33502cea8dcc3697b90 100644 --- a/src/main/java/de/thm/arsnova/exceptions/NotFoundException.java +++ b/src/main/java/de/thm/arsnova/exceptions/NotFoundException.java @@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions; */ public class NotFoundException extends RuntimeException { private static final long serialVersionUID = 1L; + + public NotFoundException() { + super(); + } + + public NotFoundException(String message) { + super(message); + } + + public NotFoundException(Throwable e) { + super(e); + } + + public NotFoundException(String message, Throwable e) { + super(message, e); + } } diff --git a/src/main/java/de/thm/arsnova/exceptions/NotImplementedException.java b/src/main/java/de/thm/arsnova/exceptions/NotImplementedException.java index ed5e30f6516458b30faa96adc3010389e6baf57e..93f7ed795537fbd2a263059c7add9bc3c3b1f3b7 100644 --- a/src/main/java/de/thm/arsnova/exceptions/NotImplementedException.java +++ b/src/main/java/de/thm/arsnova/exceptions/NotImplementedException.java @@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions; */ public class NotImplementedException extends RuntimeException { private static final long serialVersionUID = 1L; + + public NotImplementedException() { + super(); + } + + public NotImplementedException(String message) { + super(message); + } + + public NotImplementedException(Throwable e) { + super(e); + } + + public NotImplementedException(String message, Throwable e) { + super(message, e); + } } diff --git a/src/main/java/de/thm/arsnova/exceptions/PayloadTooLargeException.java b/src/main/java/de/thm/arsnova/exceptions/PayloadTooLargeException.java index 6562a149b6ddf8e5dc7521ae70ec54165b1be75a..9233b58f25fd465979943a782c9a9d4fced27e25 100644 --- a/src/main/java/de/thm/arsnova/exceptions/PayloadTooLargeException.java +++ b/src/main/java/de/thm/arsnova/exceptions/PayloadTooLargeException.java @@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions; */ public class PayloadTooLargeException extends RuntimeException { private static final long serialVersionUID = 1L; + + public PayloadTooLargeException() { + super(); + } + + public PayloadTooLargeException(String message) { + super(message); + } + + public PayloadTooLargeException(Throwable e) { + super(e); + } + + public PayloadTooLargeException(String message, Throwable e) { + super(message, e); + } } diff --git a/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java b/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java index 423b3a4f88440f23c6413f02520d17a11b4f5d5b..e14d30c7edd66c8bc7dbd669144eda48a4a64d32 100644 --- a/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java +++ b/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java @@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions; */ public class PreconditionFailedException extends RuntimeException { private static final long serialVersionUID = 1L; + + public PreconditionFailedException() { + super(); + } + + public PreconditionFailedException(String message) { + super(message); + } + + public PreconditionFailedException(Throwable e) { + super(e); + } + + public PreconditionFailedException(String message, Throwable e) { + super(message, e); + } } diff --git a/src/main/java/de/thm/arsnova/exceptions/UnauthorizedException.java b/src/main/java/de/thm/arsnova/exceptions/UnauthorizedException.java index 7a4c3dc8a2ef623705b780e29c7d03c167f8fdd9..f6a91249b2681fea1bd816b0b9dadde1ab86748a 100644 --- a/src/main/java/de/thm/arsnova/exceptions/UnauthorizedException.java +++ b/src/main/java/de/thm/arsnova/exceptions/UnauthorizedException.java @@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions; */ public class UnauthorizedException extends RuntimeException { private static final long serialVersionUID = 1L; + + public UnauthorizedException() { + super(); + } + + public UnauthorizedException(String message) { + super(message); + } + + public UnauthorizedException(Throwable e) { + super(e); + } + + public UnauthorizedException(String message, Throwable e) { + super(message, e); + } } diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java index 275adfedb352fec8660d4101285c27f0abfad2f8..aa1e999c4db651d3d0345bb4aaad80e61c5e208d 100644 --- a/src/main/java/de/thm/arsnova/services/QuestionService.java +++ b/src/main/java/de/thm/arsnova/services/QuestionService.java @@ -112,7 +112,7 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis // base64 adds offset to filesize, formula taken from: http://en.wikipedia.org/wiki/Base64#MIME final int fileSize = (int) ((question.getImage().length() - 814) / 1.37); if (fileSize > uploadFileSizeByte) { - logger.error("Could not save file. File is too large with " + fileSize + " Byte."); + logger.error("Could not save file. File is too large with {} Byte.", fileSize); throw new BadRequestException(); } } diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index 7ea54a72eabbf8781455a06639e139927835c10a..77a22e5b3999fb7d0d945a06e1b53c07fc0097a3 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -174,7 +174,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe if (connectorClient != null && session.isCourseSession()) { final String courseid = session.getCourseId(); if (!connectorClient.getMembership(user.getUsername(), courseid).isMember()) { - throw new ForbiddenException(); + throw new ForbiddenException("User is no course member."); } } @@ -205,15 +205,15 @@ public class SessionService implements ISessionService, ApplicationEventPublishe } if (!session.isActive()) { if (user.hasRole(UserSessionService.Role.STUDENT)) { - throw new ForbiddenException(); + throw new ForbiddenException("User is not session creator."); } else if (user.hasRole(UserSessionService.Role.SPEAKER) && !session.isCreator(user)) { - throw new ForbiddenException(); + throw new ForbiddenException("User is not session creator."); } } if (connectorClient != null && session.isCourseSession()) { final String courseid = session.getCourseId(); if (!connectorClient.getMembership(user.getUsername(), courseid).isMember()) { - throw new ForbiddenException(); + throw new ForbiddenException("User is no course member."); } } return session; @@ -336,7 +336,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe final Session session = databaseDao.getSessionFromKeyword(sessionkey); final User user = userService.getCurrentUser(); if (!session.isCreator(user)) { - throw new ForbiddenException(); + throw new ForbiddenException("User is not session creator."); } session.setActive(lock); this.publisher.publishEvent(new StatusSessionEvent(this, session)); @@ -374,7 +374,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe public Session changeSessionCreator(String sessionkey, String newCreator) { final Session existingSession = databaseDao.getSessionFromKeyword(sessionkey); if (existingSession == null) { - throw new RuntimeException("Error while trying to get the session with sessionkey: " + sessionkey); + throw new NullPointerException("Could not load session " + sessionkey + "."); } return databaseDao.changeSessionCreator(existingSession, newCreator); } @@ -424,7 +424,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe final User user = userService.getCurrentUser(); final SessionInfo info = databaseDao.importSession(user, importSession); if (info == null) { - throw new RuntimeException("Error while importing the session."); + throw new NullPointerException("Could not import session."); } return info; } @@ -460,7 +460,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe final Session session = databaseDao.getSessionFromKeyword(sessionkey); final User user = userService.getCurrentUser(); if (!session.isCreator(user)) { - throw new UnauthorizedException(); + throw new UnauthorizedException("User is not session creator."); } session.setFeatures(features); this.publisher.publishEvent(new FeatureChangeEvent(this, session)); @@ -472,7 +472,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe final Session session = databaseDao.getSessionFromKeyword(sessionkey); final User user = userService.getCurrentUser(); if (!session.isCreator(user)) { - throw new UnauthorizedException(); + throw new UnauthorizedException("User is not session creator."); } if (!lock) { feedbackService.cleanFeedbackVotesInSession(sessionkey, 0); @@ -488,7 +488,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe final Session session = databaseDao.getSessionFromKeyword(sessionkey); final User user = userService.getCurrentUser(); if (!session.isCreator(user)) { - throw new UnauthorizedException(); + throw new UnauthorizedException("User is not session creator."); } session.setFlipFlashcards(flip); this.publisher.publishEvent(new FlipFlashcardsEvent(this, session)); @@ -500,7 +500,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe if (session.getPpLogo().startsWith("http")) { final String base64ImageString = imageUtils.encodeImageToString(session.getPpLogo()); if (base64ImageString == null) { - throw new BadRequestException(); + throw new BadRequestException("Could not encode image."); } session.setPpLogo(base64ImageString); } @@ -508,8 +508,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe // base64 adds offset to filesize, formula taken from: http://en.wikipedia.org/wiki/Base64#MIME final int fileSize = (int) ((session.getPpLogo().length() - 814) / 1.37); if (fileSize > uploadFileSizeByte) { - logger.error("Could not save file. File is too large with " + fileSize + " Byte."); - throw new PayloadTooLargeException(); + throw new PayloadTooLargeException("Could not save file. File is too large with " + fileSize + " Byte."); } } } diff --git a/src/main/java/de/thm/arsnova/services/UserService.java b/src/main/java/de/thm/arsnova/services/UserService.java index 9df1adffdeec7400e11a17dd9f10133f005a53f1..804ab96cc878e40b0200bf13b78e9587f060b623 100644 --- a/src/main/java/de/thm/arsnova/services/UserService.java +++ b/src/main/java/de/thm/arsnova/services/UserService.java @@ -241,7 +241,7 @@ public class UserService implements IUserService { if (tries < loginTryLimit) { loginTries.put(addr, ++tries); if (loginTryLimit == tries) { - logger.info("Temporarily banned {} from login.", new Object[] {addr}); + logger.info("Temporarily banned {} from login.", addr); loginBans.add(addr); } } @@ -301,7 +301,7 @@ public class UserService implements IUserService { public void removeUserFromSessionBySocketId(final UUID socketId) { final User user = socketid2user.get(socketId); if (null == user) { - logger.warn("null == user for socket {}", socketId); + logger.warn("No user exists for socket {}.", socketId); return; } @@ -401,8 +401,8 @@ public class UserService implements IUserService { UriUtils.encodeQueryParam(dbUser.getUsername(), "UTF-8"), dbUser.getActivationKey() ); - } catch (UnsupportedEncodingException e1) { - logger.error(e1.getMessage()); + } catch (UnsupportedEncodingException e) { + logger.error("Sending of activation mail failed.", e); return; } @@ -429,7 +429,7 @@ public class UserService implements IUserService { } mailPattern = Pattern.compile("[a-z0-9._-]+?@(" + StringUtils.join(patterns, "|") + ")", Pattern.CASE_INSENSITIVE); - logger.info("Allowed e-mail addresses (pattern) for registration: " + mailPattern.pattern()); + logger.info("Allowed e-mail addresses (pattern) for registration: '{}'.", mailPattern.pattern()); } } @@ -492,8 +492,8 @@ public class UserService implements IUserService { UriUtils.encodeQueryParam(dbUser.getUsername(), "UTF-8"), dbUser.getPasswordResetKey() ); - } catch (UnsupportedEncodingException e1) { - logger.error(e1.getMessage()); + } catch (UnsupportedEncodingException e) { + logger.error("Sending of password reset mail failed.", e); return; } @@ -539,7 +539,7 @@ public class UserService implements IUserService { logger.info("Sending mail \"{}\" from \"{}\" to \"{}\"", subject, msg.getFrom(), dbUser.getUsername()); mailSender.send(msg); } catch (MailException | MessagingException e) { - logger.warn("Mail \"{}\" could not be sent: {}", subject, e); + logger.warn("Mail \"{}\" could not be sent.", subject, e); } } } diff --git a/src/main/resources/log4j-dev.properties b/src/main/resources/log4j-dev.properties index bae1f9dffd40cb8899c04e8280615aaf9ddf4a71..021ba3029e4bd21f3445b50f1e8f1752d0d29dd6 100644 --- a/src/main/resources/log4j-dev.properties +++ b/src/main/resources/log4j-dev.properties @@ -1,8 +1,8 @@ log4j.rootCategory=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n +log4j.appender.stdout.layout=org.apache.log4j.EnhancedPatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n%throwable log4j.category.de.thm.arsnova=DEBUG log4j.category.com.corundumstudio.socketio=INFO diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index fb38b279b85636f344f4d0d6ba88c7a48665e6d0..b0ce03ef63b955e000ce00d8b17bf33c639a66dd 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -1,8 +1,8 @@ log4j.rootCategory=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n +log4j.appender.stdout.layout=org.apache.log4j.EnhancedPatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n%throwable{2} log4j.category.de.thm.arsnova=INFO log4j.category.com.corundumstudio.socketio=INFO