Revision 42d326df
Added by Andreas Kohlbecker about 6 years ago
src/main/java/eu/etaxonomy/cdm/vaadin/event/error/DelegatingErrorHandler.java | ||
---|---|---|
1 |
// $Id$ |
|
2 | 1 |
/** |
3 | 2 |
* Copyright (C) 2018 EDIT |
4 | 3 |
* European Distributed Institute of Taxonomy |
... | ... | |
9 | 8 |
*/ |
10 | 9 |
package eu.etaxonomy.cdm.vaadin.event.error; |
11 | 10 |
|
12 |
import java.util.HashMap;
|
|
13 |
import java.util.Map;
|
|
11 |
import java.util.HashSet;
|
|
12 |
import java.util.Set;
|
|
14 | 13 |
|
15 | 14 |
import org.apache.log4j.Logger; |
16 | 15 |
|
... | ... | |
26 | 25 |
* see https://dev.e-taxonomy.eu/redmine/issues/7241 |
27 | 26 |
* |
28 | 27 |
* @author freimeier |
29 |
* @date 26.02.2018 |
|
30 | 28 |
* |
31 | 29 |
*/ |
32 | 30 |
public class DelegatingErrorHandler implements ErrorHandler{ |
33 | 31 |
|
34 | 32 |
private static final long serialVersionUID = 3378605204517477112L; |
35 | 33 |
|
36 |
Map<Class<? extends Exception>, ErrorTypeHandler<? extends Exception>> handlerMap = new HashMap<>(); |
|
34 |
Set<ErrorTypeHandler<? extends Throwable>> handlers = new HashSet<>(); |
|
35 |
|
|
36 |
public <E extends Throwable> void registerHandler(ErrorTypeHandler<E> handler) { |
|
37 |
assert findHandler(handler.supports()) == null; |
|
38 |
handlers.add(handler); |
|
39 |
} |
|
40 |
|
|
41 |
@SuppressWarnings("unchecked") |
|
42 |
public <E extends Throwable> ErrorTypeHandler<E> findHandler(Class<E> errorClass){ |
|
43 |
for(ErrorTypeHandler<?> h : handlers){ |
|
44 |
if(h.supports().equals(errorClass)){ |
|
45 |
return (ErrorTypeHandler<E>) h; |
|
46 |
} |
|
47 |
} |
|
48 |
return null; |
|
37 | 49 |
|
38 |
public <E extends Exception> void registerHandler(Class<E> type, ErrorTypeHandler<E> handler) { |
|
39 |
handlerMap.put(type, handler); |
|
40 | 50 |
} |
41 | 51 |
|
42 | 52 |
/* (non-Javadoc) |
... | ... | |
45 | 55 |
@Override |
46 | 56 |
public void error(ErrorEvent event) { |
47 | 57 |
|
48 |
Class<? extends Throwable> errorClass = event.getThrowable().getCause().getClass(); |
|
49 |
Logger.getLogger(this.getClass()).debug(errorClass); |
|
50 |
if(handlerMap.get(errorClass) != null){ |
|
51 |
handlerMap.get(errorClass).error(event); |
|
52 |
} else { |
|
58 |
boolean handlerFound = true; |
|
59 |
Throwable throwable = event.getThrowable(); |
|
60 |
while(throwable != null){ |
|
61 |
if(delegate(event, throwable)){ |
|
62 |
break; |
|
63 |
} |
|
64 |
throwable = throwable.getCause(); |
|
65 |
} |
|
66 |
if(!handlerFound){ |
|
53 | 67 |
Notification.show(event.getThrowable().getMessage()); |
54 | 68 |
} |
55 | 69 |
} |
70 |
|
|
71 |
private <E extends Throwable> boolean delegate(ErrorEvent event, E throwable){ |
|
72 |
Class<E> errorClass = (Class<E>) throwable.getClass(); |
|
73 |
Logger.getLogger(this.getClass()).debug(errorClass); |
|
74 |
ErrorTypeHandler<E> handler = findHandler(errorClass); |
|
75 |
if(handler != null){ |
|
76 |
handler.handleError(event, throwable); |
|
77 |
return true; |
|
78 |
} |
|
79 |
return false; |
|
80 |
} |
|
56 | 81 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/event/error/ErrorTypeHandler.java | ||
---|---|---|
1 |
// $Id$ |
|
2 | 1 |
/** |
3 | 2 |
* Copyright (C) 2018 EDIT |
4 | 3 |
* European Distributed Institute of Taxonomy |
... | ... | |
16 | 15 |
* see {@link DelegatingErrorHandler} |
17 | 16 |
* |
18 | 17 |
* @author freimeier |
19 |
* @date 26.02.2018 |
|
20 | 18 |
* |
21 | 19 |
*/ |
22 |
public abstract class ErrorTypeHandler<E extends Exception> implements ErrorHandler {
|
|
20 |
public abstract class ErrorTypeHandler<E extends Throwable> implements ErrorHandler {
|
|
23 | 21 |
|
24 |
private static final long serialVersionUID = 1782060185842059311L; |
|
22 |
private static final long serialVersionUID = 1782060185842059311L;
|
|
25 | 23 |
|
26 |
/* (non-Javadoc) |
|
27 |
* @see com.vaadin.server.ErrorHandler#error(com.vaadin.server.ErrorEvent) |
|
28 |
*/ |
|
29 |
@Override |
|
30 |
public final void error(ErrorEvent event) { |
|
31 |
handleError((E) event.getThrowable().getCause()); |
|
24 |
public abstract Class<E> supports(); |
|
32 | 25 |
|
26 |
public final void handleError(ErrorEvent event, E throwable){ |
|
27 |
error(event); |
|
28 |
exception(throwable); |
|
33 | 29 |
} |
34 | 30 |
|
35 |
public abstract void handleError(E exception); |
|
31 |
/** |
|
32 |
* @param exception |
|
33 |
*/ |
|
34 |
public abstract void exception(E throwable); |
|
36 | 35 |
} |
37 | 36 |
|
38 | 37 |
|
src/main/java/eu/etaxonomy/cdm/vaadin/event/error/ExternalServiceExceptionHandler.java | ||
---|---|---|
1 |
/** |
|
2 |
* Copyright (C) 2018 EDIT |
|
3 |
* European Distributed Institute of Taxonomy |
|
4 |
* http://www.e-taxonomy.eu |
|
5 |
* |
|
6 |
* The contents of this file are subject to the Mozilla Public License Version 1.1 |
|
7 |
* See LICENSE.TXT at the top of this package for the full license terms. |
|
8 |
*/ |
|
9 |
package eu.etaxonomy.cdm.vaadin.event.error; |
|
10 |
|
|
11 |
import com.vaadin.server.ErrorEvent; |
|
12 |
import com.vaadin.server.Page; |
|
13 |
import com.vaadin.ui.Notification; |
|
14 |
import com.vaadin.ui.Notification.Type; |
|
15 |
|
|
16 |
import eu.etaxonomy.cdm.ext.common.ExternalServiceException; |
|
17 |
import eu.etaxonomy.cdm.vaadin.ui.RegistrationUIDefaults; |
|
18 |
|
|
19 |
|
|
20 |
public class ExternalServiceExceptionHandler extends ErrorTypeHandler<ExternalServiceException>{ |
|
21 |
|
|
22 |
private static final long serialVersionUID = -5703485298578474572L; |
|
23 |
private String mainMessage; |
|
24 |
|
|
25 |
public ExternalServiceExceptionHandler(String mainMessage){ |
|
26 |
this.mainMessage = mainMessage; |
|
27 |
} |
|
28 |
|
|
29 |
|
|
30 |
/** |
|
31 |
* {@inheritDoc} |
|
32 |
*/ |
|
33 |
@Override |
|
34 |
public Class<ExternalServiceException> supports() { |
|
35 |
return ExternalServiceException.class; |
|
36 |
} |
|
37 |
|
|
38 |
|
|
39 |
/** |
|
40 |
* {@inheritDoc} |
|
41 |
*/ |
|
42 |
@Override |
|
43 |
public void error(ErrorEvent event) { |
|
44 |
// only exception() needed in this class |
|
45 |
|
|
46 |
} |
|
47 |
|
|
48 |
@Override |
|
49 |
public void exception(ExternalServiceException exception) { |
|
50 |
Notification notification = new Notification(mainMessage, |
|
51 |
"<div><strong>Service:</strong> "+ exception.getExternalService() + "</div>" + |
|
52 |
"<div><strong>Problem:</strong> "+ exception.getProblem() + "</div>" + |
|
53 |
"<p>" + RegistrationUIDefaults.ERROR_CONTACT_MESSAGE_LINE + "</p>" |
|
54 |
, Type.ERROR_MESSAGE); |
|
55 |
notification.setHtmlContentAllowed(true); |
|
56 |
notification.show(Page.getCurrent()); |
|
57 |
} |
|
58 |
|
|
59 |
|
|
60 |
|
|
61 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/event/error/HibernateSystemErrorHandler.java | ||
---|---|---|
11 | 11 |
|
12 | 12 |
import org.springframework.orm.hibernate5.HibernateSystemException; |
13 | 13 |
|
14 |
import com.vaadin.server.ErrorEvent; |
|
14 | 15 |
import com.vaadin.ui.Notification; |
15 | 16 |
|
16 | 17 |
import eu.etaxonomy.cdm.database.PermissionDeniedException; |
... | ... | |
18 | 19 |
|
19 | 20 |
/** |
20 | 21 |
* @author freimeier |
21 |
* @date 26.02.2018 |
|
22 | 22 |
* |
23 | 23 |
*/ |
24 | 24 |
public class HibernateSystemErrorHandler extends ErrorTypeHandler<HibernateSystemException>{ |
25 | 25 |
|
26 | 26 |
private static final long serialVersionUID = -5703485298578474572L; |
27 | 27 |
|
28 |
/* (non-Javadoc)
|
|
29 |
* @see eu.etaxonomy.cdm.vaadin.util.errorhandler.ErrorTypeHandler#handleError(com.vaadin.server.ErrorEvent)
|
|
28 |
/**
|
|
29 |
* {@inheritDoc}
|
|
30 | 30 |
*/ |
31 | 31 |
@Override |
32 |
public void handleError(HibernateSystemException exception) { |
|
32 |
public Class<HibernateSystemException> supports() { |
|
33 |
return HibernateSystemException.class; |
|
34 |
} |
|
35 |
|
|
36 |
/** |
|
37 |
* {@inheritDoc} |
|
38 |
*/ |
|
39 |
@Override |
|
40 |
public void error(ErrorEvent event) { |
|
41 |
// not needed in this class so far |
|
42 |
} |
|
43 |
|
|
44 |
@Override |
|
45 |
public void exception(HibernateSystemException exception) { |
|
46 |
|
|
33 | 47 |
if(exception != null) { |
34 | 48 |
if(exception.getCause().getClass().equals(PermissionDeniedException.class)) { |
35 | 49 |
Notification.show(Messages.getLocalizedString(Messages.PermissionDeniedErrorHandler_ERROR_MSG)); |
... | ... | |
39 | 53 |
} |
40 | 54 |
} |
41 | 55 |
|
56 |
|
|
57 |
|
|
42 | 58 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/view/distributionStatus/DistributionTableViewBean.java | ||
---|---|---|
16 | 16 |
import java.util.UUID; |
17 | 17 |
|
18 | 18 |
import org.springframework.beans.factory.annotation.Autowired; |
19 |
import org.springframework.orm.hibernate5.HibernateSystemException; |
|
20 | 19 |
import org.springframework.security.core.GrantedAuthority; |
21 | 20 |
import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer; |
22 | 21 |
|
... | ... | |
175 | 174 |
//popup window |
176 | 175 |
final Window popup = new Window(Messages.getLocalizedString(Messages.DistributionTableViewBean_CHOOSE_DISTRIBUTION_STATUS)); |
177 | 176 |
DelegatingErrorHandler errorHandler = new DelegatingErrorHandler(); |
178 |
errorHandler.registerHandler(HibernateSystemException.class, new HibernateSystemErrorHandler());
|
|
177 |
errorHandler.registerHandler(new HibernateSystemErrorHandler()); |
|
179 | 178 |
popup.setErrorHandler(errorHandler); |
180 | 179 |
final ListSelect termSelect = new ListSelect(); |
181 | 180 |
termSelect.setSizeFull(); |
Also available in: Unified diff
ref #7241 DelegatingErrorHandler more generically