AppException.java

  1. /*
  2.  * Copyright (c) 2002-2022, City of Paris
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  *  1. Redistributions of source code must retain the above copyright notice
  10.  *     and the following disclaimer.
  11.  *
  12.  *  2. Redistributions in binary form must reproduce the above copyright notice
  13.  *     and the following disclaimer in the documentation and/or other materials
  14.  *     provided with the distribution.
  15.  *
  16.  *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
  17.  *     contributors may be used to endorse or promote products derived from
  18.  *     this software without specific prior written permission.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
  24.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30.  * POSSIBILITY OF SUCH DAMAGE.
  31.  *
  32.  * License 1.0
  33.  */
  34. package fr.paris.lutece.portal.service.util;

  35. import org.apache.commons.lang3.exception.ExceptionUtils;

  36. /**
  37.  * This kind of exception is thrown when the application encounters a critical problem. This class extends RuntimeException in order to avoid try/catch blocks
  38.  * This class forces to write to the logs immediatly to protect against swallowing exceptions.
  39.  */
  40. public class AppException extends RuntimeException
  41. {
  42.     /**
  43.      * Generated serialVersionUID
  44.      */
  45.     private static final long serialVersionUID = -742252097057629674L;

  46.     /**
  47.      * Constructor 1
  48.      *
  49.      * @param strMessage
  50.      *            The error message
  51.      */
  52.     public AppException( String strMessage )
  53.     {
  54.         super( strMessage );
  55.         writeToLogs( );
  56.     }

  57.     /**
  58.      * Constructor 2
  59.      *
  60.      * @param strMessage
  61.      *            The error message
  62.      * @param t
  63.      *            The initial throwable
  64.      */
  65.     public AppException( String strMessage, Throwable t )
  66.     {
  67.         super( strMessage, t );
  68.         writeToLogs( );
  69.     }

  70.     /**
  71.      * Constructor for backwards binary compatibility, same as AppException( String s, Throwable t )
  72.      *
  73.      * @param strMessage
  74.      *            The error message
  75.      * @param e
  76.      *            The initial exception
  77.      */
  78.     public AppException( String strMessage, Exception e )
  79.     {
  80.         this( strMessage, (Throwable) e );
  81.     }

  82.     /**
  83.      * Constructor 3
  84.      */
  85.     public AppException( )
  86.     {
  87.         writeToLogs( );
  88.     }

  89.     /**
  90.      * Constructor 4
  91.      *
  92.      * @param strMessage
  93.      *            The error message
  94.      * @param e
  95.      *            The initial exception
  96.      * @param enableSuppression
  97.      *            enableSuppresion
  98.      * @param writableStackTrace
  99.      *            writableStackTrace
  100.      */
  101.     public AppException( String strMessage, Throwable t, boolean enableSuppression, boolean writableStackTrace )
  102.     {
  103.         super( strMessage, t, enableSuppression, writableStackTrace );
  104.         writeToLogs( );
  105.     }

  106.     private void writeToLogs( )
  107.     {

  108.         AppLogService.error( "{}", ( ) -> buildLogs( ), ( ) -> this );
  109.     }

  110.     private String buildLogs( )
  111.     {

  112.         StringBuilder sb = new StringBuilder( "Critical AppException" );

  113.         Throwable strRootCause = ExceptionUtils.getRootCause( this );
  114.         if ( strRootCause != null )
  115.         {
  116.             sb.append( ", root cause: " );
  117.             String strShortName = strRootCause.getClass( ).getSimpleName( );
  118.             sb.append( strShortName );
  119.         }

  120.         Throwable throwableForMessage = strRootCause == null ? this : strRootCause;
  121.         String strMessage = throwableForMessage.getMessage( );
  122.         if ( strMessage != null )
  123.         {
  124.             sb.append( ": " );
  125.             sb.append( strMessage );
  126.         }

  127.         return sb.toString( );
  128.     }
  129. }