/**
* Copyright (C) 2015 Bonitasoft S.A.
* Bonitasoft, 32 rue Gustave Eiffel - 38000 Grenoble
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2.0 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.bonitasoft.web.designer.controller;
import org.bonitasoft.web.designer.controller.asset.MalformedJsonException;
import org.bonitasoft.web.designer.controller.importer.ImportException;
import org.bonitasoft.web.designer.repository.exception.ConstraintValidationException;
import org.bonitasoft.web.designer.repository.exception.InUseException;
import org.bonitasoft.web.designer.repository.exception.NotAllowedException;
import org.bonitasoft.web.designer.repository.exception.NotFoundException;
import org.bonitasoft.web.designer.repository.exception.RepositoryException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import java.io.IOException;
/**
* Definition of the exception handlers
*/
@ControllerAdvice
public class ResourceControllerAdvice {
private static final Logger logger = LoggerFactory.getLogger(ResourceControllerAdvice.class);
/**
* Construct Header to specify content-type
*/
public static HttpHeaders getHttpHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);
return headers;
}
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public ResponseEntity<ErrorMessage> handleIllegalArgumentException(IllegalArgumentException exception) {
logger.error("Illegal Argument Exception", exception);
return new ResponseEntity<>(new ErrorMessage(exception), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(ConstraintValidationException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public ResponseEntity<ErrorMessage> handleConstraintValidationException(ConstraintValidationException exception) {
logger.error("Constraint Validation Exception", exception);
return new ResponseEntity<>(new ErrorMessage(exception), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(NotAllowedException.class)
public ResponseEntity<ErrorMessage> handleNotAllowedException(NotAllowedException exception) {
logger.error("Not Allowed Exception", exception);
return new ResponseEntity<>(new ErrorMessage(exception), HttpStatus.FORBIDDEN);
}
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<ErrorMessage> handleNotFoundException(NotFoundException exception) {
logger.error("Element Not Found Exception", exception);
return new ResponseEntity<>(new ErrorMessage(exception), HttpStatus.NOT_FOUND);
}
@ExceptionHandler(IOException.class)
public ResponseEntity<ErrorMessage> handleIOException(IOException exception) {
logger.error("Internal Server Error Exception", exception);
return new ResponseEntity<>(new ErrorMessage(exception), HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(RepositoryException.class)
public ResponseEntity<ErrorMessage> handleRepositoryException(RepositoryException exception) {
logger.error("Internal Exception", exception);
return new ResponseEntity<>(new ErrorMessage(exception), HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(InUseException.class)
public ResponseEntity<ErrorMessage> handleInUseException(InUseException exception) {
logger.error("Element In Use Exception", exception);
return new ResponseEntity<>(new ErrorMessage(exception), HttpStatus.CONFLICT);
}
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<ErrorMessage> handleRepositoryException(RuntimeException exception) {
logger.error("Internal Exception", exception);
return new ResponseEntity<>(new ErrorMessage(exception), HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(ImportException.class)
public ResponseEntity<ErrorMessage> handleImportException(ImportException exception) {
logger.error("Technical error when importing a component", exception);
// BS-14113: HttpStatus.ACCEPTED internet explorer don't recognize response if sent with http error code
ErrorMessage errorMessage = new ErrorMessage(exception.getType().toString(), exception.getMessage());
errorMessage.addInfos(exception.getInfos());
return new ResponseEntity<>(errorMessage, HttpStatus.ACCEPTED);
}
@ExceptionHandler(MalformedJsonException.class)
public ResponseEntity<ErrorMessage> handleJsonProcessingException(MalformedJsonException exception) {
logger.error("Error while uploading a json file " + exception.getMessage());
// BS-14113: HttpStatus.ACCEPTED internet explorer don't recognize response if sent with http error code
ErrorMessage message = new ErrorMessage(exception);
message.addInfo("location", exception.getLocationInfos());
return new ResponseEntity<>(message, HttpStatus.ACCEPTED);
}
}