View Javadoc
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  
36  import org.apache.commons.lang3.exception.ExceptionUtils;
37  
38  /**
39   * This kind of exception is thrown when the application encounters a critical problem. This class extends RuntimeException in order to avoid try/catch blocks
40   * This class forces to write to the logs immediatly to protect against swallowing exceptions.
41   */
42  public class AppException extends RuntimeException
43  {
44      /**
45       * Generated serialVersionUID
46       */
47      private static final long serialVersionUID = -742252097057629674L;
48  
49      /**
50       * Constructor 1
51       *
52       * @param strMessage
53       *            The error message
54       */
55      public AppException( String strMessage )
56      {
57          super( strMessage );
58          writeToLogs( );
59      }
60  
61      /**
62       * Constructor 2
63       *
64       * @param strMessage
65       *            The error message
66       * @param t
67       *            The initial throwable
68       */
69      public AppException( String strMessage, Throwable t )
70      {
71          super( strMessage, t );
72          writeToLogs( );
73      }
74  
75      /**
76       * Constructor for backwards binary compatibility, same as AppException( String s, Throwable t )
77       *
78       * @param strMessage
79       *            The error message
80       * @param e
81       *            The initial exception
82       */
83      public AppException( String strMessage, Exception e )
84      {
85          this( strMessage, (Throwable) e );
86      }
87  
88      /**
89       * Constructor 3
90       */
91      public AppException( )
92      {
93          writeToLogs( );
94      }
95  
96      /**
97       * Constructor 4
98       *
99       * @param strMessage
100      *            The error message
101      * @param e
102      *            The initial exception
103      * @param enableSuppression
104      *            enableSuppresion
105      * @param writableStackTrace
106      *            writableStackTrace
107      */
108     public AppException( String strMessage, Throwable t, boolean enableSuppression, boolean writableStackTrace )
109     {
110         super( strMessage, t, enableSuppression, writableStackTrace );
111         writeToLogs( );
112     }
113 
114     private void writeToLogs( )
115     {
116 
117         AppLogService.error( "{}", ( ) -> buildLogs( ), ( ) -> this );
118     }
119 
120     private String buildLogs( )
121     {
122 
123         StringBuilder sb = new StringBuilder( "Critical AppException" );
124 
125         Throwable strRootCause = ExceptionUtils.getRootCause( this );
126         if ( strRootCause != null )
127         {
128             sb.append( ", root cause: " );
129             String strShortName = strRootCause.getClass( ).getSimpleName( );
130             sb.append( strShortName );
131         }
132 
133         Throwable throwableForMessage = strRootCause == null ? this : strRootCause;
134         String strMessage = throwableForMessage.getMessage( );
135         if ( strMessage != null )
136         {
137             sb.append( ": " );
138             sb.append( strMessage );
139         }
140 
141         return sb.toString( );
142     }
143 }