001 package org.springframework.richclient.exceptionhandling;
002
003 import java.io.PrintWriter;
004 import java.io.StringWriter;
005 import java.util.Arrays;
006
007 import org.apache.commons.lang.StringUtils;
008 import org.jdesktop.jdic.desktop.Desktop;
009 import org.jdesktop.jdic.desktop.DesktopException;
010 import org.jdesktop.jdic.desktop.Message;
011 import org.jdesktop.swingx.error.ErrorInfo;
012 import org.jdesktop.swingx.error.ErrorReporter;
013 import org.springframework.beans.factory.BeanNameAware;
014 import org.springframework.beans.factory.InitializingBean;
015 import org.springframework.context.support.MessageSourceAccessor;
016 import org.springframework.richclient.application.ApplicationServicesLocator;
017
018 /**
019 * <p>
020 * This email reporter can be added as {@link ErrorReporter} to the
021 * {@link JXErrorDialogExceptionHandler}. The email reporter uses the JDIC (
022 * {@link https://jdic.dev.java.net/}) library to access your mail client. To
023 * use and deploy this correctly, you need to have the correct native libraries
024 * for your platform and have them added to your VM startup
025 * (-Djava.library.path).
026 * </p>
027 * <p>
028 * The following libs are needed:
029 * </p>
030 * <ul>
031 * <li><em>jdic-shared</em>: this one is always needed, shared across
032 * platforms.</li>
033 * <li><em>jdic-stub-{linux/windows}</em>: platform specific java classes.</li>
034 * <li><em>jdic-native-{linux/windows}</em>: platform specific native
035 * libraries.</li>
036 * </ul>
037 *
038 * <p>
039 * During development, maven can add the correct jars to your classpath by using
040 * a profile that is os specific (see pom.xml of spring-richclient-jdk5). Note
041 * that you still have to add the native libraries to your environment. You can
042 * do this by unpacking the jdic-native-* file and setting the
043 * -Djava.library.path to that directory.
044 * </p>
045 * <p>
046 * In production the same setup should be used. A webstart app should use os
047 * specific and native dependencies to have the correct jars downloaded and the
048 * native library unpacked and added to the environment.
049 * </p>
050 *
051 * @author Jan Hoskens
052 *
053 */
054 public class EmailNotifierErrorReporter implements ErrorReporter, BeanNameAware, InitializingBean {
055
056 private MessageSourceAccessor messageSourceAccessor;
057
058 private String id;
059
060 public void afterPropertiesSet() {
061 if (messageSourceAccessor == null) {
062 messageSourceAccessor = (MessageSourceAccessor) ApplicationServicesLocator.services().getService(
063 MessageSourceAccessor.class);
064 }
065 if (getId() == null) {
066 setId(StringUtils.uncapitalize(getClass().getSimpleName()));
067 }
068 }
069
070 public void reportError(ErrorInfo info) throws NullPointerException {
071 Message mail = new Message();
072
073 Object params[] = new Object[] { info.getBasicErrorMessage(), info.getDetailedErrorMessage() };
074 if (info.getErrorException() != null) {
075 params = new Object[] { info.getErrorException(), getStackTraceString(info.getErrorException()) };
076 }
077
078 String body = messageSourceAccessor.getMessage(getId() + ".body", params, "");
079 String title = messageSourceAccessor.getMessage(getId() + ".title", "");
080
081 String adresses = messageSourceAccessor.getMessage(getId() + ".mailTo", "");
082 if (!StringUtils.isEmpty(adresses)) {
083 mail.setToAddrs(Arrays.<String> asList(adresses.split(";")));
084 }
085
086 mail.setSubject(title);
087 mail.setBody(body);
088
089 try {
090 Desktop.mail(mail);
091 }
092 catch (DesktopException e) {
093 String mailExceptionMessage = messageSourceAccessor.getMessage(getId() + ".mailException", "");
094 throw new RuntimeException(mailExceptionMessage, e);
095 }
096
097 }
098
099 protected String getStackTraceString(Throwable t) {
100 StringWriter sw = new StringWriter();
101 PrintWriter pw = new PrintWriter(sw, true);
102 t.printStackTrace(pw);
103 pw.flush();
104 sw.flush();
105 return sw.toString();
106 }
107
108 public String getId() {
109 return id;
110 }
111
112 public void setId(String id) {
113 this.id = id;
114 }
115
116 public void setBeanName(String name) {
117 if (getId() == null) {
118 setId(name);
119 }
120 }
121 }