/*
 * Copyright 2014 Open mHealth
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.openmhealth.dsu.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;


/**
 * A set of exception handlers that are applied to all controllers, primarily to prevent information disclosure.
 *
 * @author Emerson Farrugia
 */
@ControllerAdvice
public class GenericExceptionHandlingControllerAdvice {

    private static final Logger log = LoggerFactory.getLogger(GenericExceptionHandlingControllerAdvice.class);


    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public void handleException(Exception e) {

        log.error("The following API exception is being swallowed to prevent it from being passed to the browser.", e);
    }
}
@@ -732,16 +732,111 @@
 Status;%0A
+import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;%0A
 import o
@@ -1021,16 +1021,63 @@
 tatus;%0A%0A
+import javax.servlet.http.HttpServletRequest;%0A%0A
 %0A/**%0A * 
@@ -1408,17 +1408,16 @@
 lass);%0A%0A
-%0A
     @Exc
@@ -1430,16 +1430,49 @@
 Handler(
+AuthenticationCredentialsNotFound
 Exceptio
@@ -1515,29 +1515,20 @@
 tus.
-INTERNAL_SERVER_ERROR
+UNAUTHORIZED
 )%0A  
@@ -1551,148 +1551,478 @@
 ndle
-Exception(Exception e) %7B%0A%0A        log.error(%22The following API exception is being swallowed to prevent it from being passed to the browser.%22
+AuthenticationCredentialsNotFoundException(Exception e, HttpServletRequest request) %7B%0A%0A        log.debug(%22A %7B%7D request for '%7B%7D' failed authentication.%22, request.getMethod(), request.getPathInfo(), e);%0A    %7D%0A%0A    @ExceptionHandler(Exception.class)%0A    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)%0A    public void handleException(Exception e, HttpServletRequest request) %7B%0A%0A        log.debug(%22A %7B%7D request for '%7B%7D' failed.%22, request.getMethod(), request.getPathInfo()
 , e)

Add authentication-specific exception handling.