From 9ad2490e3c4363a1a8b9d75ddd7b3da8f06714fd Mon Sep 17 00:00:00 2001 From: mguessan Date: Mon, 27 Apr 2009 23:03:58 +0000 Subject: [PATCH] I18N : externalize and translate exception messages git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@544 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- src/java/davmail/BundleMessage.java | 17 ++++ src/java/davmail/caldav/CaldavConnection.java | 27 +++--- .../DavMailAuthenticationException.java | 12 +++ .../davmail/exception/DavMailException.java | 34 +++++++ .../davmail/exchange/ExchangeSession.java | 90 +++++++++---------- .../exchange/ExchangeSessionFactory.java | 23 +++-- .../exchange/NetworkDownException.java | 8 +- src/java/davmail/imap/ImapConnection.java | 27 +++--- src/java/davmail/ldap/LdapConnection.java | 3 +- src/java/davmail/smtp/SmtpConnection.java | 5 +- src/java/davmail/ui/tray/DavGatewayTray.java | 5 +- src/java/davmailmessages.properties | 42 +++++++++ src/java/davmailmessages_fr.properties | 42 +++++++++ 13 files changed, 239 insertions(+), 96 deletions(-) create mode 100644 src/java/davmail/exception/DavMailAuthenticationException.java create mode 100644 src/java/davmail/exception/DavMailException.java diff --git a/src/java/davmail/BundleMessage.java b/src/java/davmail/BundleMessage.java index 9f2ee4cd..1e58fab0 100644 --- a/src/java/davmail/BundleMessage.java +++ b/src/java/davmail/BundleMessage.java @@ -1,5 +1,7 @@ package davmail; +import davmail.exception.DavMailException; + import java.text.MessageFormat; import java.util.ArrayList; import java.util.Locale; @@ -43,6 +45,13 @@ public class BundleMessage { buffer.append(bundleMessage.format(locale)); } formattedArguments[i] = buffer.toString(); + } else if (arguments[i] instanceof DavMailException) { + formattedArguments[i] = ((DavMailException)arguments[i]).getMessage(locale); + } else if (arguments[i] instanceof Throwable) { + formattedArguments[i] = ((Throwable)arguments[i]).getMessage(); + if (formattedArguments[i] == null) { + formattedArguments[i] = arguments[i].toString(); + } } else { formattedArguments[i] = arguments[i]; } @@ -55,5 +64,13 @@ public class BundleMessage { return MessageFormat.format(ResourceBundle.getBundle(MESSAGE_BUNDLE_NAME).getString(key), arguments); } + public static String format(Locale locale, String key, Object... arguments) { + return MessageFormat.format(ResourceBundle.getBundle(MESSAGE_BUNDLE_NAME, locale).getString(key), arguments); + } + + public static String formatLog(String key, Object... arguments) { + return MessageFormat.format(ResourceBundle.getBundle(MESSAGE_BUNDLE_NAME, Locale.ROOT).getString(key), arguments); + } + public static class BundleMessageList extends ArrayList{} } diff --git a/src/java/davmail/caldav/CaldavConnection.java b/src/java/davmail/caldav/CaldavConnection.java index 61e25032..bfd5b080 100644 --- a/src/java/davmail/caldav/CaldavConnection.java +++ b/src/java/davmail/caldav/CaldavConnection.java @@ -1,15 +1,14 @@ package davmail.caldav; -import davmail.AbstractConnection; -import davmail.Settings; -import davmail.BundleMessage; +import davmail.*; +import davmail.exception.DavMailException; +import davmail.exception.DavMailAuthenticationException; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.ICSBufferedReader; import davmail.ui.tray.DavGatewayTray; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; -import org.apache.commons.httpclient.auth.AuthenticationException; import org.apache.commons.httpclient.util.URIUtil; import org.apache.log4j.Logger; @@ -48,7 +47,7 @@ public class CaldavConnection extends AbstractConnection { while ((line = readClient()) != null && line.length() > 0) { int index = line.indexOf(':'); if (index <= 0) { - throw new IOException("Invalid header: " + line); + throw new DavMailException("EXCEPTION_INVALID_HEADER", line); } headers.put(line.substring(0, index).toLowerCase(), line.substring(index + 1).trim()); } @@ -63,14 +62,14 @@ public class CaldavConnection extends AbstractConnection { try { size = Integer.parseInt(contentLength); } catch (NumberFormatException e) { - throw new IOException("Invalid content length: " + contentLength); + throw new DavMailException("EXCEPTION_INVALID_CONTENT_LENGTH", contentLength); } char[] buffer = new char[size]; StringBuilder builder = new StringBuilder(); int actualSize = in.read(buffer); builder.append(buffer, 0, actualSize); if (actualSize < 0) { - throw new IOException("End of stream reached reading content"); + throw new DavMailException("EXCEPTION_END_OF_STREAM"); } // dirty hack to ensure full content read // TODO : replace with a dedicated reader @@ -89,7 +88,7 @@ public class CaldavConnection extends AbstractConnection { try { keepAlive = Integer.parseInt(keepAliveValue); } catch (NumberFormatException e) { - throw new IOException("Invalid Keep-Alive: " + keepAliveValue); + throw new DavMailException("EXCEPTION_INVALID_KEEPALIVE", keepAliveValue); } if (keepAlive > MAX_KEEP_ALIVE_TIME) { keepAlive = MAX_KEEP_ALIVE_TIME; @@ -130,7 +129,7 @@ public class CaldavConnection extends AbstractConnection { ExchangeSessionFactory.checkConfig(); try { session = ExchangeSessionFactory.getInstance(userName, password); - } catch (AuthenticationException e) { + } catch (DavMailAuthenticationException e) { sendUnauthorized(); } } @@ -576,7 +575,7 @@ public class CaldavConnection extends AbstractConnection { while ((line = reader.readLine()) != null) { int index = line.indexOf(':'); if (index <= 0) { - throw new IOException("Invalid request: " + body); + throw new DavMailException("EXCEPTION_INVALID_REQUEST", body); } String fullkey = line.substring(0, index); String value = line.substring(index + 1); @@ -727,7 +726,7 @@ public class CaldavConnection extends AbstractConnection { if (index > 0) { String mode = authorization.substring(0, index).toLowerCase(); if (!"basic".equals(mode)) { - throw new IOException("Unsupported authorization mode: " + mode); + throw new DavMailException("EXCEPTION_UNSUPPORTED_AUTHORIZATION_MODE", mode); } String encodedCredentials = authorization.substring(index + 1); String decodedCredentials = base64Decode(encodedCredentials); @@ -736,10 +735,10 @@ public class CaldavConnection extends AbstractConnection { userName = decodedCredentials.substring(0, index); password = decodedCredentials.substring(index + 1); } else { - throw new IOException("Invalid credentials"); + throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } } else { - throw new IOException("Invalid credentials"); + throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } } @@ -961,7 +960,7 @@ public class CaldavConnection extends AbstractConnection { } } } catch (XMLStreamException e) { - throw new IOException(e.getMessage()); + throw new DavMailException("EXCEPTION_INVALID_CALDAV_REQUEST", e.getMessage()); } finally { try { if (streamReader != null) { diff --git a/src/java/davmail/exception/DavMailAuthenticationException.java b/src/java/davmail/exception/DavMailAuthenticationException.java new file mode 100644 index 00000000..7980105e --- /dev/null +++ b/src/java/davmail/exception/DavMailAuthenticationException.java @@ -0,0 +1,12 @@ +package davmail.exception; + +import davmail.exception.DavMailException; + +/** + * I18 AuthenticationException subclass. + */ +public class DavMailAuthenticationException extends DavMailException { + public DavMailAuthenticationException(String key) { + super(key); + } +} diff --git a/src/java/davmail/exception/DavMailException.java b/src/java/davmail/exception/DavMailException.java new file mode 100644 index 00000000..e416976d --- /dev/null +++ b/src/java/davmail/exception/DavMailException.java @@ -0,0 +1,34 @@ +package davmail.exception; + +import davmail.BundleMessage; + +import java.io.IOException; +import java.util.Locale; + +/** + * I18 IOException subclass. + */ +public class DavMailException extends IOException { + private final BundleMessage message; + + public DavMailException(String key, Object... arguments) { + this.message = new BundleMessage(key, arguments); + } + + @Override + public String getMessage() { + return message.format(); + } + + public String getMessage(Locale locale) { + return message.format(locale); + } + + public String getLogMessage() { + return message.format(Locale.ROOT); + } + + public BundleMessage getBundleMessage() { + return message; + } +} diff --git a/src/java/davmail/exchange/ExchangeSession.java b/src/java/davmail/exchange/ExchangeSession.java index bd5858dc..b7467b13 100644 --- a/src/java/davmail/exchange/ExchangeSession.java +++ b/src/java/davmail/exchange/ExchangeSession.java @@ -1,9 +1,11 @@ package davmail.exchange; import davmail.Settings; +import davmail.BundleMessage; +import davmail.exception.DavMailAuthenticationException; +import davmail.exception.DavMailException; import davmail.http.DavGatewayHttpClientFacade; import org.apache.commons.httpclient.*; -import org.apache.commons.httpclient.auth.AuthenticationException; import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; @@ -145,7 +147,7 @@ public class ExchangeSession { httpURL = new HttpsURL(poolKey.userName, poolKey.password, urlObject.getHost(), urlObject.getPort()); } else { - throw new IllegalArgumentException("Invalid URL: " + poolKey.url); + throw new DavMailException("LOG_INVALID_URL", poolKey.url); } @@ -161,7 +163,7 @@ public class ExchangeSession { if (status == HttpStatus.SC_UNAUTHORIZED) { method.releaseConnection(); - throw new AuthenticationException("Authentication failed: invalid user or password"); + throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } else if (status != HttpStatus.SC_OK) { method.releaseConnection(); throw DavGatewayHttpClientFacade.buildHttpException(method); @@ -175,20 +177,12 @@ public class ExchangeSession { // got base http mailbox http url getWellKnownFolders(); - } catch (AuthenticationException exc) { - LOGGER.error(exc.toString()); + } catch (DavMailAuthenticationException exc) { + LOGGER.error(exc.getLogMessage()); throw exc; } catch (IOException exc) { - StringBuilder message = new StringBuilder(); - message.append("DavMail login exception: "); - if (exc.getMessage() != null) { - message.append(exc.getMessage()); - } else { - message.append(exc); - } - - LOGGER.error(message.toString()); - throw new IOException(message.toString()); + LOGGER.error(BundleMessage.formatLog("EXCEPTION_EXCHANGE_LOGIN_FAILED", exc)); + throw new DavMailException("EXCEPTION_EXCHANGE_LOGIN_FAILED", exc); } LOGGER.debug("Session " + this + " created"); } @@ -354,7 +348,7 @@ public class ExchangeSession { } if (logonMethod == null) { - throw new IOException("Authentication form not found at " + initmethod.getURI()); + throw new DavMailException("EXCEPTION_AUTHENTICATION_FORM_NOT_FOUND", initmethod.getURI()); } return logonMethod; } @@ -380,20 +374,19 @@ public class ExchangeSession { return logonMethod; } - protected void checkFormLoginQueryString(HttpMethod logonMethod) throws AuthenticationException { + protected void checkFormLoginQueryString(HttpMethod logonMethod) throws DavMailAuthenticationException { String queryString = logonMethod.getQueryString(); if (queryString != null && queryString.contains("reason=2")) { logonMethod.releaseConnection(); if (poolKey.userName != null && poolKey.userName.contains("\\")) { - throw new AuthenticationException("Authentication failed: invalid user or password"); + throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } else { - throw new AuthenticationException("Authentication failed: invalid user or password, " + - "retry with domain\\user"); + throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED_RETRY"); } } } - protected void buildMailPath(HttpMethod method) throws HttpException { + protected void buildMailPath(HttpMethod method) throws DavMailAuthenticationException { // get user mail URL from html body (multi frame) BufferedReader mainPageReader = null; try { @@ -432,11 +425,8 @@ public class ExchangeSession { method.releaseConnection(); } - if (mailPath == null) { - throw new AuthenticationException("Unable to build mail path, authentication failed: password expired ?"); - } - if (email == null) { - throw new AuthenticationException("Unable to get email, authentication failed: password expired ?"); + if (mailPath == null || email == null) { + throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED_PASSWORD_EXPIRED"); } } @@ -490,7 +480,7 @@ public class ExchangeSession { MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod( httpClient, URIUtil.encodePath(mailPath), 0, WELL_KNOWN_FOLDERS); if (responses.length == 0) { - throw new IOException("Unable to get mail folders"); + throw new DavMailException("EXCEPTION_UNABLE_TO_GET_MAIL_FOLDERS"); } DavPropertySet properties = responses[0].getProperties(HttpStatus.SC_OK); inboxUrl = getURIPropertyIfExists(properties, "inbox", URN_SCHEMAS_HTTPMAIL); @@ -528,7 +518,7 @@ public class ExchangeSession { // update message with blind carbon copy and other flags int statusCode = httpClient.executeMethod(patchMethod); if (statusCode != HttpStatus.SC_MULTI_STATUS) { - throw new IOException("Unable to create message " + messageUrl + ": " + statusCode + ' ' + patchMethod.getStatusLine()); + throw new DavMailException("EXCEPTION_UNABLE_TO_CREATE_MESSAGE", messageUrl, statusCode, ' ', patchMethod.getStatusLine()); } } finally { @@ -545,7 +535,7 @@ public class ExchangeSession { int code = httpClient.executeMethod(putmethod); if (code != HttpStatus.SC_OK && code != HttpStatus.SC_CREATED) { - throw new IOException("Unable to create message " + messageUrl + ": " + code + ' ' + putmethod.getStatusLine()); + throw new DavMailException("EXCEPTION_UNABLE_TO_CREATE_MESSAGE", messageUrl, code, ' ', putmethod.getStatusLine()); } } finally { putmethod.releaseConnection(); @@ -558,7 +548,7 @@ public class ExchangeSession { // update message with blind carbon copy and other flags int statusCode = httpClient.executeMethod(patchMethod); if (statusCode != HttpStatus.SC_MULTI_STATUS) { - throw new IOException("Unable to patch message " + messageUrl + ": " + statusCode + ' ' + patchMethod.getStatusLine()); + throw new DavMailException("EXCEPTION_UNABLE_TO_PATCH_MESSAGE", messageUrl, statusCode, ' ', patchMethod.getStatusLine()); } } finally { @@ -629,7 +619,7 @@ public class ExchangeSession { try { int statusCode = httpClient.executeMethod(patchMethod); if (statusCode != HttpStatus.SC_MULTI_STATUS) { - throw new IOException("Unable to update message properties"); + throw new DavMailException("EXCEPTION_UNABLE_TO_UPDATE_MESSAGE"); } } finally { @@ -683,7 +673,7 @@ public class ExchangeSession { return folders; } - protected Folder buildFolder(MultiStatusResponse entity) throws URIException { + protected Folder buildFolder(MultiStatusResponse entity) throws IOException { String href = URIUtil.decode(entity.getHref()); Folder folder = new Folder(); DavPropertySet properties = entity.getProperties(HttpStatus.SC_OK); @@ -714,7 +704,7 @@ public class ExchangeSession { folder.folderUrl = href.substring(index + mailPath.length()); } } else { - throw new URIException("Invalid folder url: " + folder.folderUrl); + throw new DavMailException("EXCEPTION_INVALID_FOLDER_URL", folder.folderUrl); } } return folder; @@ -917,7 +907,7 @@ public class ExchangeSession { try { int statusCode = httpClient.executeMethod(method); if (statusCode == HttpStatus.SC_PRECONDITION_FAILED) { - throw new HttpException("Unable to move message, target already exists"); + throw new DavMailException("EXCEPTION_UNABLE_TO_MOVE_MESSAGE"); } else if (statusCode != HttpStatus.SC_CREATED) { throw DavGatewayHttpClientFacade.buildHttpException(method); } @@ -934,7 +924,7 @@ public class ExchangeSession { try { int statusCode = httpClient.executeMethod(method); if (statusCode == HttpStatus.SC_PRECONDITION_FAILED) { - throw new HttpException("Unable to move folder, target already exists"); + throw new DavMailException("EXCEPTION_UNABLE_TO_MOVE_FOLDER"); } else if (statusCode != HttpStatus.SC_CREATED) { throw DavGatewayHttpClientFacade.buildHttpException(method); } @@ -1121,7 +1111,7 @@ public class ExchangeSession { int index = messageUrl.lastIndexOf('/'); if (index < 0) { - throw new IOException("Invalid message url: " + messageUrl); + throw new DavMailException("EXCEPTION_INVALID_MESSAGE_URL", messageUrl); } String encodedPath = URIUtil.encodePath(messageUrl.substring(0, index)); String encodedMessageName = URIUtil.encodePath(messageUrl.substring(index + 1)); @@ -1208,7 +1198,7 @@ public class ExchangeSession { ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.getDataHandler().writeTo(baos); baos.close(); - throw new IOException("Invalid calendar message content: " + new String(baos.toByteArray(), "UTF-8")); + throw new DavMailException("EXCEPTION_INVALID_MESSAGE_CONTENT", new String(baos.toByteArray(), "UTF-8")); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); bodyPart.getDataHandler().writeTo(baos); @@ -1216,7 +1206,7 @@ public class ExchangeSession { result = fixICS(new String(baos.toByteArray(), "UTF-8"), true); } catch (MessagingException e) { - throw new IOException(e.getMessage()); + throw new DavMailException("EXCEPTION_INVALID_MESSAGE_CONTENT", e.getMessage()); } finally { method.releaseConnection(); } @@ -1280,7 +1270,7 @@ public class ExchangeSession { String eventPath = URIUtil.encodePath(path + '/' + eventName); MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(httpClient, eventPath, 0, EVENT_REQUEST_PROPERTIES); if (responses.length == 0) { - throw new IOException("Unable to get calendar event"); + throw new DavMailException("EXCEPTION_EVENT_NOT_FOUND"); } return buildEvent(responses[0]); } @@ -1421,7 +1411,7 @@ public class ExchangeSession { int valueIndex = line.lastIndexOf(':'); int valueEndIndex = line.lastIndexOf('T'); if (valueIndex < 0 || valueEndIndex < 0) { - throw new IOException("Invalid ICS line: " + line); + throw new DavMailException("EXCEPTION_INVALID_ICS_LINE", line); } String dateValue = line.substring(valueIndex + 1, valueEndIndex); String key = line.substring(0, Math.max(keyIndex, valueIndex)); @@ -1669,13 +1659,13 @@ public class ExchangeSession { MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod( httpClient, URIUtil.encodePath(folderPath), 0, davPropertyNameSet); if (responses.length == 0) { - throw new IOException("Unable to get folder at "+folderPath); + throw new DavMailException("EXCEPTION_UNABLE_TO_GET_FOLDER", folderPath); } DavPropertySet properties = responses[0].getProperties(HttpStatus.SC_OK); DavPropertyName davPropertyName = davPropertyNameSet.iterator().nextPropertyName(); result = getPropertyIfExists(properties, davPropertyName); if (result == null) { - throw new IOException("Unable to get property "+davPropertyName); + throw new DavMailException("EXCEPTION_UNABLE_TO_GET_PROPERTY", davPropertyName); } return result; } @@ -1709,7 +1699,7 @@ public class ExchangeSession { if (index >= 0 && mailPath.endsWith("/")) { return mailPath.substring(index + 1, mailPath.length() - 1); } else { - throw new IOException("Invalid mail path: " + mailPath); + throw new DavMailException("EXCEPTION_INVALID_MAIL_PATH", mailPath); } } @@ -1721,7 +1711,7 @@ public class ExchangeSession { MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod( httpClient, URIUtil.encodePath(mailPath), 0, DISPLAY_NAME); if (responses.length == 0) { - throw new IOException("Unable to get mail folder"); + throw new DavMailException("EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER"); } displayName = getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "displayname", Namespace.getNamespace("DAV:")); return displayName; @@ -1734,7 +1724,7 @@ public class ExchangeSession { if (index >= 0 && mailPath.endsWith("/")) { buffer.append(mailPath.substring(0, index + 1)).append(principal).append('/'); } else { - throw new IOException("Invalid mail path: " + mailPath); + throw new DavMailException("EXCEPTION_INVALID_MAIL_PATH", mailPath); } } else if (principal != null) { buffer.append(mailPath); @@ -1770,7 +1760,7 @@ public class ExchangeSession { try { int status = httpClient.executeMethod(getMethod); if (status != HttpStatus.SC_OK) { - throw new IOException("Unable to get user email from: " + getMethod.getPath()); + throw new DavMailException("EXCEPTION_UNABLE_TO_GET_EMAIL", getMethod.getPath()); } Map> results = XMLStreamUtil.getElementContentsAsMap(getMethod.getResponseBodyAsStream(), "item", "AN"); Map result = results.get(alias.toLowerCase()); @@ -1897,7 +1887,7 @@ public class ExchangeSession { try { int status = httpClient.executeMethod(getMethod); if (status != HttpStatus.SC_OK) { - throw new IOException(status + "Unable to find users from: " + getMethod.getURI()); + throw new DavMailException("EXCEPTION_UNABLE_TO_FIND_USERS", status, getMethod.getURI()); } results = XMLStreamUtil.getElementContentsAsMap(getMethod.getResponseBodyAsStream(), "item", "AN"); } finally { @@ -1914,7 +1904,7 @@ public class ExchangeSession { getMethod = new GetMethod(URIUtil.encodePathQuery(getCmdBasePath()+"?Cmd=gallookup&ADDR=" + person.get("EM"))); int status = httpClient.executeMethod(getMethod); if (status != HttpStatus.SC_OK) { - throw new IOException(status + "Unable to find users from: " + getMethod.getURI()); + throw new DavMailException("EXCEPTION_UNABLE_TO_FIND_USERS", status, getMethod.getURI()); } Map> results = XMLStreamUtil.getElementContentsAsMap(getMethod.getResponseBodyAsStream(), "person", "alias"); // add detailed information @@ -1966,7 +1956,7 @@ public class ExchangeSession { "&interval=" + FREE_BUSY_INTERVAL + "&u=SMTP:" + attendee; } catch (ParseException e) { - throw new IOException(e.getMessage()); + throw new DavMailException("EXCEPTION_INVALID_DATES", e.getMessage()); } FreeBusy freeBusy = null; @@ -1976,7 +1966,7 @@ public class ExchangeSession { try { int status = httpClient.executeMethod(getMethod); if (status != HttpStatus.SC_OK) { - throw new IOException("Unable to get free-busy from: " + getMethod.getPath()); + throw new DavMailException("EXCEPTION_UNABLE_TO_GET_FREEBUSY", getMethod.getPath()); } String body = getMethod.getResponseBodyAsString(); int startIndex = body.lastIndexOf(""); diff --git a/src/java/davmail/exchange/ExchangeSessionFactory.java b/src/java/davmail/exchange/ExchangeSessionFactory.java index 96f0dada..23a1db5f 100644 --- a/src/java/davmail/exchange/ExchangeSessionFactory.java +++ b/src/java/davmail/exchange/ExchangeSessionFactory.java @@ -1,6 +1,8 @@ package davmail.exchange; import davmail.Settings; +import davmail.BundleMessage; +import davmail.exception.DavMailException; import davmail.http.DavGatewayHttpClientFacade; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; @@ -92,7 +94,7 @@ public final class ExchangeSessionFactory { if (checkNetwork()) { throw e; } else { - throw new NetworkDownException("All network interfaces down !"); + throw new NetworkDownException("EXCEPTION_NETWORK_DOWN"); } } } @@ -109,27 +111,24 @@ public final class ExchangeSessionFactory { ExchangeSession.LOGGER.debug("Test configuration status: " + status); if (status != HttpStatus.SC_OK && status != HttpStatus.SC_UNAUTHORIZED && status != HttpStatus.SC_MOVED_TEMPORARILY && status != HttpStatus.SC_MOVED_PERMANENTLY) { - throw new IOException("Unable to connect to OWA at " + url + ", status code " + - status + ", check configuration"); + throw new DavMailException("EXCEPTION_CONNECTION_FAILED", url, status); } } catch (UnknownHostException exc) { - String message = "DavMail configuration exception: \n"; if (checkNetwork()) { - message += "Unknown host " + exc.getMessage(); - ExchangeSession.LOGGER.error(message, exc); - throw new IOException(message); - } else { - message = "All network interfaces down !"; + BundleMessage message = new BundleMessage("EXCEPTION_UNKNOWN_HOST", exc.getMessage()); ExchangeSession.LOGGER.error(message); - throw new NetworkDownException(message); + throw new DavMailException("EXCEPTION_DAVMAIL_CONFIGURATION", message); + } else { + ExchangeSession.LOGGER.error(BundleMessage.formatLog("EXCEPTION_NETWORK_DOWN")); + throw new NetworkDownException("EXCEPTION_NETWORK_DOWN"); } } catch (NetworkDownException exc) { throw exc; } catch (Exception exc) { - ExchangeSession.LOGGER.error("DavMail configuration exception: \n" + exc.getMessage(), exc); - throw new IOException("DavMail configuration exception: \n" + exc.getMessage()); + ExchangeSession.LOGGER.error(BundleMessage.formatLog("EXCEPTION_DAVMAIL_CONFIGURATION", exc), exc); + throw new DavMailException("EXCEPTION_DAVMAIL_CONFIGURATION", exc); } finally { testMethod.releaseConnection(); } diff --git a/src/java/davmail/exchange/NetworkDownException.java b/src/java/davmail/exchange/NetworkDownException.java index df0f8e29..dda65a12 100644 --- a/src/java/davmail/exchange/NetworkDownException.java +++ b/src/java/davmail/exchange/NetworkDownException.java @@ -1,12 +1,12 @@ package davmail.exchange; -import java.io.IOException; +import davmail.exception.DavMailException; /** * Custom exception to mark network down case. */ -public class NetworkDownException extends IOException { - public NetworkDownException(String message) { - super(message); +public class NetworkDownException extends DavMailException { + public NetworkDownException(String key) { + super(key); } } diff --git a/src/java/davmail/imap/ImapConnection.java b/src/java/davmail/imap/ImapConnection.java index e99afb03..27821602 100644 --- a/src/java/davmail/imap/ImapConnection.java +++ b/src/java/davmail/imap/ImapConnection.java @@ -4,6 +4,7 @@ import com.sun.mail.imap.protocol.BASE64MailboxDecoder; import com.sun.mail.imap.protocol.BASE64MailboxEncoder; import davmail.AbstractConnection; import davmail.BundleMessage; +import davmail.exception.DavMailException; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.ui.tray.DavGatewayTray; @@ -483,7 +484,7 @@ public class ImapConnection extends AbstractConnection { SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss Z", Locale.ENGLISH); buffer.append(" INTERNALDATE \"").append(dateFormatter.format(date)).append('\"'); } catch (ParseException e) { - throw new IOException("Invalid date: " + message.date); + throw new DavMailException("EXCEPTION_INVALID_DATE", message.date); } } else if ("BODY.PEEK[HEADER]".equals(param) || param.startsWith("BODY.PEEK[HEADER")) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -560,7 +561,7 @@ public class ImapConnection extends AbstractConnection { } int slashIndex = multiPart.getContentType().indexOf('/'); if (slashIndex < 0) { - throw new IOException("Invalid content type: " + multiPart.getContentType()); + throw new DavMailException("EXCEPTION_INVALID_CONTENT_TYPE", multiPart.getContentType()); } int semiColonIndex = multiPart.getContentType().indexOf(';'); if (semiColonIndex < 0) { @@ -573,7 +574,7 @@ public class ImapConnection extends AbstractConnection { appendBodyStructure(buffer, mimeMessage); } } catch (MessagingException me) { - throw new IOException(me); + throw new DavMailException("EXCEPTION_INVALID_MESSAGE_CONTENT", me.getMessage()); } } @@ -581,7 +582,7 @@ public class ImapConnection extends AbstractConnection { String contentType = bodyPart.getContentType(); int slashIndex = contentType.indexOf('/'); if (slashIndex < 0) { - throw new IOException("Invalid content type: " + contentType); + throw new DavMailException("EXCEPTION_INVALID_CONTENT_TYPE", contentType); } buffer.append("(\"").append(contentType.substring(0, slashIndex).toUpperCase()).append("\" \""); int semiColonIndex = contentType.indexOf(';'); @@ -707,22 +708,23 @@ public class ImapConnection extends AbstractConnection { } else if (range.endsWith(":*")) { conditions.startUid = Long.parseLong(range.substring(0, range.indexOf(':'))); } else { - throw new IOException("Invalid search parameters"); + throw new DavMailException("EXCEPTION_INVALID_SEARCH_PARAMETERS", range); } } else if ("BEFORE".equals(token)) { SimpleDateFormat parser = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); dateFormatter.setTimeZone(ExchangeSession.GMT_TIMEZONE); + String dateToken = tokens.nextToken(); try { - Date date = parser.parse(tokens.nextToken()); + Date date = parser.parse(dateToken); conditions.append(operator).append("\"urn:schemas:httpmail:datereceived\"<'").append(dateFormatter.format(date)).append('\''); } catch (ParseException e) { - throw new IOException("Invalid search parameters"); + throw new DavMailException("EXCEPTION_INVALID_SEARCH_PARAMETERS", dateToken); } } else if ("OLD".equals(token) || "RECENT".equals(token)) { // ignore } else { - throw new IOException("Invalid search parameter: " + token); + throw new DavMailException("EXCEPTION_INVALID_SEARCH_PARAMETERS", token); } } @@ -733,14 +735,15 @@ public class ImapConnection extends AbstractConnection { parser.setTimeZone(ExchangeSession.GMT_TIMEZONE); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); dateFormatter.setTimeZone(ExchangeSession.GMT_TIMEZONE); + String dateToken = tokens.nextToken(); try { - startDate = parser.parse(tokens.nextToken()); + startDate = parser.parse(dateToken); Calendar calendar = Calendar.getInstance(); calendar.setTime(startDate); calendar.add(Calendar.DAY_OF_MONTH, 1); endDate = calendar.getTime(); } catch (ParseException e) { - throw new IOException("Invalid search parameters"); + throw new DavMailException("EXCEPTION_INVALID_SEARCH_PARAMETERS", dateToken); } if ("SENTON".equals(token)) { conditions.append("(\"urn:schemas:httpmail:date\" > '") @@ -862,13 +865,13 @@ public class ImapConnection extends AbstractConnection { if (tokens.hasMoreTokens()) { userName = tokens.nextToken(); } else { - throw new IOException("Invalid credentials"); + throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } if (tokens.hasMoreTokens()) { password = tokens.nextToken(); } else { - throw new IOException("Invalid credentials"); + throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } int backslashindex = userName.indexOf('\\'); if (backslashindex > 0) { diff --git a/src/java/davmail/ldap/LdapConnection.java b/src/java/davmail/ldap/LdapConnection.java index e60d8c35..0e4c4fc8 100644 --- a/src/java/davmail/ldap/LdapConnection.java +++ b/src/java/davmail/ldap/LdapConnection.java @@ -6,6 +6,7 @@ import com.sun.jndi.ldap.BerEncoder; import davmail.AbstractConnection; import davmail.Settings; import davmail.BundleMessage; +import davmail.exception.DavMailException; import davmail.exchange.ExchangeSessionFactory; import davmail.ui.tray.DavGatewayTray; @@ -817,7 +818,7 @@ public class LdapConnection extends AbstractConnection { responseBer.encodeString((String) value, isLdapV3()); } } else { - throw new IllegalArgumentException(); + throw new DavMailException("EXCEPTION_UNSUPPORTED_VALUE", values); } responseBer.endSeq(); responseBer.endSeq(); diff --git a/src/java/davmail/smtp/SmtpConnection.java b/src/java/davmail/smtp/SmtpConnection.java index fc5d34ae..983503a2 100644 --- a/src/java/davmail/smtp/SmtpConnection.java +++ b/src/java/davmail/smtp/SmtpConnection.java @@ -2,6 +2,7 @@ package davmail.smtp; import davmail.AbstractConnection; import davmail.BundleMessage; +import davmail.exception.DavMailException; import davmail.exchange.ExchangeSessionFactory; import davmail.ui.tray.DavGatewayTray; @@ -97,7 +98,7 @@ public class SmtpConnection extends AbstractConnection { InternetAddress internetAddress = new InternetAddress(line.substring("RCPT TO:".length())); recipients.add(internetAddress.getAddress()); } catch (AddressException e) { - throw new IOException("Invalid recipient: " + line); + throw new DavMailException("EXCEPTION_INVALID_RECIPIENT", line); } sendClient("250 Recipient OK"); } else { @@ -187,7 +188,7 @@ public class SmtpConnection extends AbstractConnection { userName = decodedCredentials.substring(1, index); password = decodedCredentials.substring(index + 1); } else { - throw new IOException("Invalid credentials"); + throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } } diff --git a/src/java/davmail/ui/tray/DavGatewayTray.java b/src/java/davmail/ui/tray/DavGatewayTray.java index 6ffd6c08..1db70b01 100644 --- a/src/java/davmail/ui/tray/DavGatewayTray.java +++ b/src/java/davmail/ui/tray/DavGatewayTray.java @@ -2,6 +2,7 @@ package davmail.ui.tray; import davmail.Settings; import davmail.BundleMessage; +import davmail.exception.DavMailException; import davmail.exchange.NetworkDownException; import org.apache.log4j.Logger; import org.apache.log4j.Priority; @@ -60,7 +61,9 @@ public class DavGatewayTray { if (message != null) { buffer.append(message.format(locale)).append(' '); } - if (e.getMessage() != null) { + if (e instanceof DavMailException) { + buffer.append(((DavMailException)e).getMessage(locale)); + } else if (e.getMessage() != null) { buffer.append(e.getMessage()); } else { buffer.append(e.toString()); diff --git a/src/java/davmailmessages.properties b/src/java/davmailmessages.properties index 90b2fe9e..c6fa9252 100644 --- a/src/java/davmailmessages.properties +++ b/src/java/davmailmessages.properties @@ -159,3 +159,45 @@ UI_UNTRUSTED_CERTIFICATE=Server provided an untrusted certificate,\n you can cho UI_UNTRUSTED_CERTIFICATE_HTML=Server provided an untrusted certificate,
you can choose to accept or deny access
UI_VALID_FROM=Valid from UI_VALID_UNTIL=Valid until +LOG_UNABLE_TO_CREATE_LOG_FILE_DIR=Unable to create log file directory +LOG_UNABLE_TO_SET_LOG_FILE_PATH=Unable to set log file path +EXCEPTION_INVALID_DATE=Invalid date: {0} +EXCEPTION_INVALID_CREDENTIALS=Invalid credentials +EXCEPTION_AUTHENTICATION_FAILED=Authentication failed: invalid user or password +EXCEPTION_AUTHENTICATION_FAILED_RETRY=Authentication failed: invalid user or password, retry with domain\\user +EXCEPTION_AUTHENTICATION_FAILED_PASSWORD_EXPIRED=Authentication failed: password expired ? +EXCEPTION_AUTHENTICATION_FORM_NOT_FOUND=Authentication form not found at {0} +EXCEPTION_INVALID_HEADER=Invalid header: {0} +EXCEPTION_INVALID_CONTENT_LENGTH=Invalid content length: {0} +EXCEPTION_END_OF_STREAM=End of stream reached reading content +EXCEPTION_INVALID_KEEPALIVE=Invalid Keep-Alive: {0} +EXCEPTION_INVALID_REQUEST=Invalid request: {0} +EXCEPTION_UNSUPPORTED_AUTHORIZATION_MODE=Unsupported authorization mode: {0} +EXCEPTION_INVALID_CALDAV_REQUEST=Invalid Caldav request: {0} +EXCEPTION_UNABLE_TO_GET_MAIL_FOLDERS=Unable to get mail folders +EXCEPTION_UNABLE_TO_CREATE_MESSAGE=Unable to create message {0}: {1}{2}{3} +EXCEPTION_UNABLE_TO_PATCH_MESSAGE=Unable to patch message {0}: {1}{2}{3} +EXCEPTION_UNABLE_TO_UPDATE_MESSAGE=Unable to update message properties +EXCEPTION_INVALID_FOLDER_URL=Invalid folder URL: {0} +EXCEPTION_UNABLE_TO_MOVE_MESSAGE=Unable to move message, target already exists +EXCEPTION_UNABLE_TO_MOVE_FOLDER=Unable to move folder, target already exists +EXCEPTION_INVALID_MESSAGE_URL=Invalid message URL: {0} +EXCEPTION_INVALID_MESSAGE_CONTENT=Invalid calendar message content: {0} +EXCEPTION_EVENT_NOT_FOUND=Calendar event not found +EXCEPTION_INVALID_ICS_LINE=Invalid ICS line: {0} +EXCEPTION_UNABLE_TO_GET_FOLDER=Unable to get folder at {0} +EXCEPTION_UNABLE_TO_GET_PROPERTY=Unable to get property {0} +EXCEPTION_INVALID_MAIL_PATH=Invalid mail path: {0} +EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER=Unable to get mail folder +EXCEPTION_UNABLE_TO_GET_EMAIL=Unable to get user email from: {0} +EXCEPTION_UNABLE_TO_FIND_USERS={0} Unable to find users from: {1} +EXCEPTION_INVALID_DATES=Invalid dates: {0} +EXCEPTION_UNABLE_TO_GET_FREEBUSY=Unable to get free-busy from: {0} +EXCEPTION_INVALID_RECIPIENT=Invalid recipient: {0} +EXCEPTION_UNSUPPORTED_VALUE=Unsupported value: {0} +EXCEPTION_INVALID_CONTENT_TYPE=Invalid content type: {0} +EXCEPTION_INVALID_SEARCH_PARAMETERS=Invalid search parameters: {0} +EXCEPTION_NETWORK_DOWN=All network interfaces down ! +EXCEPTION_DAVMAIL_CONFIGURATION=DavMail configuration exception: \n{0} +EXCEPTION_UNKNOWN_HOST=Unknown host {0} +EXCEPTION_CONNECTION_FAILED=Unable to connect to OWA at {0}, status code {1}, check configuration \ No newline at end of file diff --git a/src/java/davmailmessages_fr.properties b/src/java/davmailmessages_fr.properties index 77d41c91..4e262079 100644 --- a/src/java/davmailmessages_fr.properties +++ b/src/java/davmailmessages_fr.properties @@ -159,3 +159,45 @@ UI_UNTRUSTED_CERTIFICATE=Le certificat fourni par le serveur n''est certifi UI_UNTRUSTED_CERTIFICATE_HTML=Le certificat fourni par le serveur n''est certifié par aucune autorité de confiance,
vous pouvez choisir d''accepter ou de rejeter l''accès
UI_VALID_FROM=Emis le UI_VALID_UNTIL=Expire le +LOG_UNABLE_TO_CREATE_LOG_FILE_DIR=Impossible de créer le répertoire de traces +LOG_UNABLE_TO_SET_LOG_FILE_PATH=Echec à la mise à jour du chemin du fichier de traces +EXCEPTION_INVALID_DATE=Date invalide {0} +EXCEPTION_INVALID_CREDENTIALS=Identifiant ou mot de passe invalide +EXCEPTION_AUTHENTICATION_FAILED=Echec d''authentification : identifiant ou mot de passe invalide +EXCEPTION_AUTHENTICATION_FAILED_RETRY=Echec d''authentification : identifiant ou mot de passe invalide, réessayer avec domaine\\utilisateur +EXCEPTION_AUTHENTICATION_FAILED_PASSWORD_EXPIRED=Echec d''authentification : mot de passe expiré ? +EXCEPTION_AUTHENTICATION_FORM_NOT_FOUND=Formulaire d''authentification non trouvé à l''adresse {0} +EXCEPTION_INVALID_HEADER=Entête invalide : {0} +EXCEPTION_INVALID_CONTENT_LENGTH=Longueur du contenu invalide : {0} +EXCEPTION_END_OF_STREAM=Fin de flux âtteint pendant la lecture du contenu +EXCEPTION_INVALID_KEEPALIVE=Keep-Alive invalide : {0} +EXCEPTION_INVALID_REQUEST=Requête invalide {0} +EXCEPTION_UNSUPPORTED_AUTHORIZATION_MODE=Mode d'authentification invalide : {0} +EXCEPTION_INVALID_CALDAV_REQUEST=Reuqête Caldav invalide : {0} +EXCEPTION_UNABLE_TO_GET_MAIL_FOLDERS=Impossible d''obtenir les répertoires de messagerie +EXCEPTION_UNABLE_TO_CREATE_MESSAGE=Impossible de créer le message {0} : {1}{2}{3} +EXCEPTION_UNABLE_TO_PATCH_MESSAGE=Impossible de mettre ) jour le message {0} : {1}{2}{3} +EXCEPTION_UNABLE_TO_UPDATE_MESSAGE=Impossible de mettre à jour les propriétés du message +EXCEPTION_INVALID_FOLDER_URL=URL du dossier invalide : {0} +EXCEPTION_UNABLE_TO_MOVE_MESSAGE=Impossible de déplacer le message, la cible existe +EXCEPTION_UNABLE_TO_MOVE_FOLDER=Impossible de déplacer le dossier, la cible existe +EXCEPTION_INVALID_MESSAGE_URL=URL de message invalide : {0} +EXCEPTION_INVALID_MESSAGE_CONTENT=Contenu du message invalide : {0} +EXCEPTION_EVENT_NOT_FOUND=Evènement non trouvé +EXCEPTION_INVALID_ICS_LINE=Ligne ICS invalide : {0} +EXCEPTION_UNABLE_TO_GET_FOLDER=Impossible d''obtenir le dossier {0} +EXCEPTION_UNABLE_TO_GET_PROPERTY=Impossible d''obtenir la propriété {0} +EXCEPTION_INVALID_MAIL_PATH=Chemin de messagerie invalide : {0} +EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER=Impossible d''obtenir le dossier de messagerie +EXCEPTION_UNABLE_TO_GET_EMAIL=Impossible d''obtenir l''adresse de messagerie depuis : {0} +EXCEPTION_UNABLE_TO_FIND_USERS={0} Impossible de chercher les utilisateurs à l''adresse : {1} +EXCEPTION_INVALID_DATES=Dates invalides : {0} +EXCEPTION_UNABLE_TO_GET_FREEBUSY=Impossible d''obtenir les informations de disponibilité depuis : {0} +EXCEPTION_INVALID_RECIPIENT=Destinataire invalide : {0} +EXCEPTION_UNSUPPORTED_VALUE=Valeur non supportée : {0} +EXCEPTION_INVALID_CONTENT_TYPE=Type de contenu invalide : {0} +EXCEPTION_INVALID_SEARCH_PARAMETERS=Paremètres de recherche invalides : {0} +EXCEPTION_NETWORK_DOWN=Toutes les interfaces réseaux sont indisponibles ! +EXCEPTION_DAVMAIL_CONFIGURATION=Erreur de configuration DavMail : \n{0} +EXCEPTION_UNKNOWN_HOST=Nom de serveur invalide {0} +EXCEPTION_CONNECTION_FAILED=Connection OWA à {0} impossible, code retour {1}, vérifier la configuration \ No newline at end of file