package org.carlspring.strongbox.controllers;
import org.carlspring.logging.exceptions.AppenderNotFoundException;
import org.carlspring.logging.exceptions.LoggerNotFoundException;
import org.carlspring.logging.exceptions.LoggingConfigurationException;
import org.carlspring.logging.services.LoggingManagementService;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import static org.springframework.http.HttpStatus.*;
import static org.springframework.http.MediaType.APPLICATION_XML_VALUE;
import static org.springframework.http.MediaType.TEXT_PLAIN_VALUE;
/**
* This controllers provides a simple wrapper over REST API for the LoggingManagementService.
*
* @author Martin Todorov
*/
@Controller
@Api(value = "/logging")
@RequestMapping("/logging")
public class LoggingManagementController
extends BaseController
{
@Inject
LoggingManagementService loggingManagementService;
@ApiOperation(value = "Used to add new logger.",
position = 0)
@ApiResponses(value = { @ApiResponse(code = 200,
message = "The logger was added successfully."),
@ApiResponse(code = 400,
message = "An error occurred.") })
@RequestMapping(value = "/logger",
method = RequestMethod.PUT,
produces = TEXT_PLAIN_VALUE)
public ResponseEntity addLogger(@ApiParam(value = "The logger name",
required = true)
@RequestParam("logger") String loggerPackage,
@ApiParam(value = "The logger level",
required = true)
@RequestParam("level") String level,
@ApiParam(value = "The logger appender name",
required = true)
@RequestParam("appenderName") String appenderName)
{
try
{
loggingManagementService.addLogger(loggerPackage, level, appenderName);
return ResponseEntity.ok("The logger was added successfully.");
}
catch (LoggingConfigurationException | AppenderNotFoundException e)
{
logger.trace(e.getMessage(), e);
return ResponseEntity.status(BAD_REQUEST)
.body("Failed to add logger!");
}
}
@ApiOperation(value = "Used to update existing logger.",
position = 0)
@ApiResponses(value = { @ApiResponse(code = 200,
message = "The logger was updated successfully."),
@ApiResponse(code = 400,
message = "An error occurred."),
@ApiResponse(code = 404,
message = "Logger was not found.") })
@RequestMapping(value = "/logger",
method = RequestMethod.POST,
produces = TEXT_PLAIN_VALUE)
public ResponseEntity updateLogger(@ApiParam(value = "The logger name",
required = true)
@RequestParam("logger") String loggerPackage,
@ApiParam(value = "The logger level",
required = true)
@RequestParam("level") String level)
{
try
{
loggingManagementService.updateLogger(loggerPackage, level);
return ResponseEntity.ok("The logger was updated successfully.");
}
catch (LoggingConfigurationException e)
{
logger.trace(e.getMessage(), e);
return ResponseEntity.status(BAD_REQUEST)
.body("Failed to update logger!");
}
catch (LoggerNotFoundException e)
{
logger.trace(e.getMessage(), e);
return ResponseEntity.status(NOT_FOUND)
.body("Logger '" + loggerPackage + "' not found!");
}
}
@ApiOperation(value = "Used to delete existing logger.",
position = 0)
@ApiResponses(value = { @ApiResponse(code = 200,
message = "The logger was deleted successfully."),
@ApiResponse(code = 400,
message = "An error occurred."),
@ApiResponse(code = 404,
message = "Logger was not found.") })
@RequestMapping(value = "/logger",
method = RequestMethod.DELETE,
produces = TEXT_PLAIN_VALUE)
public ResponseEntity deleteLogger(@ApiParam(value = "The logger name",
required = true)
@RequestParam("logger") String loggerPackage)
throws IOException
{
try
{
loggingManagementService.deleteLogger(loggerPackage);
return ResponseEntity.ok("The logger was deleted successfully.");
}
catch (LoggingConfigurationException e)
{
logger.trace(e.getMessage(), e);
return ResponseEntity.status(BAD_REQUEST)
.body("Failed to delete the logger!");
}
catch (LoggerNotFoundException e)
{
logger.trace(e.getMessage(), e);
return ResponseEntity.status(NOT_FOUND)
.body("Logger '" + loggerPackage + "' not found!");
}
}
@ApiOperation(value = "Used to download log data.",
position = 0)
@ApiResponses(value = { @ApiResponse(code = 200,
message = "The logger was retrieved successfully."),
@ApiResponse(code = 400,
message = "An error occurred.") })
@RequestMapping(value = "/log/{path:.+}",
method = RequestMethod.GET,
produces = TEXT_PLAIN_VALUE)
public void downloadLog(@PathVariable String path,
HttpServletRequest request,
HttpServletResponse response)
throws Exception
{
try
{
logger.debug("Received a request to retrieve log file " + path + ".");
InputStream is = loggingManagementService.downloadLog(path);
copyToResponse(is, response);
logger.debug("Received a request to retrieve log file " + path + ".");
response.setStatus(OK.value());
}
catch (LoggingConfigurationException e)
{
logger.trace(e.getMessage(), e);
response.setStatus(BAD_REQUEST.value());
}
}
@ApiOperation(value = "Used to download logback configuration.",
position = 0)
@ApiResponses(value = { @ApiResponse(code = 200,
message = "The logger configuration was retrieved successfully."),
@ApiResponse(code = 400,
message = "An error occurred.") })
@RequestMapping(value = "/logback",
method = RequestMethod.GET,
produces = APPLICATION_XML_VALUE)
public void downloadLogbackConfiguration(HttpServletResponse response)
throws Exception
{
try
{
InputStream is = loggingManagementService.downloadLogbackConfiguration();
copyToResponse(is, response);
response.setStatus(OK.value());
}
catch (LoggingConfigurationException e)
{
logger.trace(e.getMessage(), e);
response.setStatus(BAD_REQUEST.value());
}
}
@ApiOperation(value = "Used to upload logback configuration.",
position = 0)
@ApiResponses(value = { @ApiResponse(code = 200,
message = "The logger configuration was uploaded successfully."),
@ApiResponse(code = 400,
message = "An error occurred.") })
@RequestMapping(value = "/logback",
method = RequestMethod.POST,
consumes = APPLICATION_XML_VALUE,
produces = TEXT_PLAIN_VALUE)
public ResponseEntity uploadLogbackConfiguration(HttpServletRequest request)
{
try
{
loggingManagementService.uploadLogbackConfiguration(request.getInputStream());
return ResponseEntity.ok("Logback configuration uploaded successfully.");
}
catch (IOException | LoggingConfigurationException e)
{
logger.trace(e.getMessage(), e);
return ResponseEntity.status(BAD_REQUEST)
.body("Failed to resolve the logging configuration!");
}
}
}