001 package org.springframework.richclient.exceptionhandling; 002 003 import org.apache.commons.logging.LogFactory; 004 import org.springframework.context.MessageSourceResolvable; 005 import org.springframework.context.support.MessageSourceAccessor; 006 import org.springframework.richclient.application.ApplicationServicesLocator; 007 import org.springframework.richclient.application.ApplicationWindow; 008 import org.springframework.richclient.application.Application; 009 import org.springframework.richclient.application.config.ApplicationLifecycleAdvisor; 010 import org.springframework.richclient.core.DefaultMessage; 011 import org.springframework.richclient.core.Message; 012 import org.springframework.richclient.core.Severity; 013 import org.springframework.util.StringUtils; 014 015 import javax.swing.JFrame; 016 import javax.swing.JOptionPane; 017 018 /** 019 * @TODO extends AbstractRegisterableExceptionHandler as soon as spring-richclient is minimum 1.5 020 * @author Geoffrey De Smet 021 */ 022 public class DefaultRegisterableExceptionHandler implements RegisterableExceptionHandler { 023 024 /** 025 * Currently on registers for the event thread, not for other threads. 026 * @TODO remove as soon as this class extends AbstractRegisterableExceptionHandler 027 */ 028 public void registerExceptionHandler() { 029 AwtExceptionHandlerAdapterHack.registerExceptionHandler(this); 030 } 031 032 public void uncaughtException(Thread thread, Throwable throwable) { 033 LogFactory.getLog(ApplicationLifecycleAdvisor.class).error(throwable.getMessage(), throwable); 034 String exceptionMessage; 035 if (throwable instanceof MessageSourceResolvable) { 036 exceptionMessage = ((MessageSourceAccessor) ApplicationServicesLocator.services() 037 .getService(MessageSourceAccessor.class)) 038 .getMessage((MessageSourceResolvable) throwable); 039 } else { 040 exceptionMessage = throwable.getLocalizedMessage(); 041 } 042 if (!StringUtils.hasText(exceptionMessage)) { 043 String defaultMessage = "An application exception occurred.\nPlease contact your administrator."; 044 exceptionMessage = ((MessageSourceAccessor) ApplicationServicesLocator.services() 045 .getService(MessageSourceAccessor.class)) 046 .getMessage("applicationDialog.defaultException", defaultMessage); 047 } 048 049 Message message = new DefaultMessage(exceptionMessage, Severity.ERROR); 050 ApplicationWindow activeWindow = Application.instance().getActiveWindow(); 051 JFrame parentFrame = (activeWindow == null) ? null : activeWindow.getControl(); 052 JOptionPane.showMessageDialog(parentFrame, message.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); 053 } 054 055 }