2020
2121package com .flowingcode .vaadin .addons .errorwindow ;
2222
23+ import java .util .Map ;
24+ import java .util .Optional ;
25+ import java .util .concurrent .ConcurrentHashMap ;
26+
2327public final class ErrorManager {
2428
25- private static ErrorWindowFactory errorWindowFactory = new DefaultErrorWindowFactory ();
29+ private static final Map <Class <?>, ErrorWindowFactory > factories = new ConcurrentHashMap <>();
30+
31+ static {
32+ factories .put (Object .class , new DefaultErrorWindowFactory ());
33+ }
2634
2735 private ErrorManager () {
2836 throw new IllegalStateException ("Utility class not meant to be instantiated" );
@@ -34,14 +42,25 @@ public static void showError(Throwable throwable) {
3442
3543 public static void showError (Throwable throwable , String cause ) {
3644 ErrorDetails details = new ErrorDetails (throwable , cause );
37- errorWindowFactory .showError (details );
45+ getErrorWindowFactory (throwable .getClass ()).showError (details );
46+ }
47+
48+ public static void setErrorWindowFactory (Class <? extends Throwable > clazz ,
49+ ErrorWindowFactory errorWindowFactory ) {
50+ factories .put (clazz .asSubclass (Throwable .class ), errorWindowFactory );
51+ }
52+
53+ public static ErrorWindowFactory getErrorWindowFactory (Class <?> clazz ) {
54+ return Optional .ofNullable (factories .get (clazz ))
55+ .orElseGet (() -> getErrorWindowFactory (clazz .getSuperclass ()));
3856 }
3957
4058 public static void setErrorWindowFactory (ErrorWindowFactory errorWindowFactory ) {
41- ErrorManager . errorWindowFactory = errorWindowFactory ;
59+ factories . put ( Throwable . class , errorWindowFactory ) ;
4260 }
4361
4462 public static ErrorWindowFactory getErrorWindowFactory () {
45- return errorWindowFactory ;
63+ return getErrorWindowFactory ( Throwable . class ) ;
4664 }
65+
4766}
0 commit comments