3434
3535import jakarta .servlet .http .HttpServletResponse ;
3636
37+ import org .apache .catalina .LifecycleState ;
3738import org .apache .tomcat .util .json .JSONFilter ;
3839import org .apache .tomcat .util .security .Escape ;
3940
@@ -795,6 +796,8 @@ protected static void writeContext(PrintWriter writer, ObjectName objectName, MB
795796 contextName = "" ;
796797 }
797798
799+ Object stateName = mBeanServer .getAttribute (objectName , "stateName" );
800+
798801 if (mode == 0 ) {
799802
800803 writer .print ("<h1>" );
@@ -803,12 +806,19 @@ protected static void writeContext(PrintWriter writer, ObjectName objectName, MB
803806 writer .print ("</a>" );
804807
805808 writer .print ("<p>" );
806- Object startTime = mBeanServer .getAttribute (objectName , "startTime" );
807- writer .print (" Start time: " + new Date (((Long ) startTime ).longValue ()));
808- writer .print (" Startup time: " );
809- writer .print (formatTime (mBeanServer .getAttribute (objectName , "startupTime" ), false ));
810- writer .print (" TLD scan time: " );
811- writer .print (formatTime (mBeanServer .getAttribute (objectName , "tldScanTime" ), false ));
809+ writer .print ("State: " + stateName );
810+ if (!LifecycleState .FAILED .name ().equals (stateName )) {
811+ /*
812+ * If in the FAILED state, the context will be an instance of FailedContext so the attributes normally
813+ * requested for a running context won't be available.
814+ */
815+ Object startTime = mBeanServer .getAttribute (objectName , "startTime" );
816+ writer .print (" Start time: " + new Date (((Long ) startTime ).longValue ()));
817+ writer .print (" Startup time: " );
818+ writer .print (formatTime (mBeanServer .getAttribute (objectName , "startupTime" ), false ));
819+ writer .print (" TLD scan time: " );
820+ writer .print (formatTime (mBeanServer .getAttribute (objectName , "tldScanTime" ), false ));
821+ }
812822 if (managerON != null ) {
813823 writeManager (writer , managerON , mBeanServer , mode );
814824 }
@@ -829,11 +839,19 @@ protected static void writeContext(PrintWriter writer, ObjectName objectName, MB
829839 } else if (mode == 2 ) {
830840 indent (writer , 2 ).append ('{' ).println ();
831841 appendJSonValue (indent (writer , 3 ), "name" , JSONFilter .escape (JSONFilter .escape (name ))).append (',' );
832- appendJSonValue (writer , "startTime" ,
833- new Date (((Long ) mBeanServer .getAttribute (objectName , "startTime" )).longValue ()).toString ())
834- .append (',' );
835- appendJSonValue (writer , "startupTime" , mBeanServer .getAttribute (objectName , "startupTime" )).append (',' );
836- appendJSonValue (writer , "tldScanTime" , mBeanServer .getAttribute (objectName , "tldScanTime" ));
842+ appendJSonValue (writer , "stateName" , stateName );
843+ if (!LifecycleState .FAILED .name ().equals (stateName )) {
844+ /*
845+ * If in the FAILED state, the context will be an instance of FailedContext so the attributes normally
846+ * requested for a running context won't be available.
847+ */
848+ writer .append (',' );
849+ appendJSonValue (writer , "startTime" ,
850+ new Date (((Long ) mBeanServer .getAttribute (objectName , "startTime" )).longValue ()).toString ())
851+ .append (',' );
852+ appendJSonValue (writer , "startupTime" , mBeanServer .getAttribute (objectName , "startupTime" )).append (',' );
853+ appendJSonValue (writer , "tldScanTime" , mBeanServer .getAttribute (objectName , "tldScanTime" ));
854+ }
837855 if (managerON != null ) {
838856 writeManager (writer , managerON , mBeanServer , mode );
839857 }
0 commit comments