From ea9c8239b45006f218ccc9bb0feed943eeda0ea7 Mon Sep 17 00:00:00 2001 From: mguessan Date: Tue, 17 Nov 2009 23:11:08 +0000 Subject: [PATCH] Caldav: failover for Exchange 2007 plus encoding issue, search event by displayname to get permanent Url git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@843 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- src/java/davmail/caldav/CaldavConnection.java | 20 +++++++++++++++--- .../davmail/exchange/ExchangeSession.java | 21 ++++++++++++------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/java/davmail/caldav/CaldavConnection.java b/src/java/davmail/caldav/CaldavConnection.java index ef9117d7..a5109cf7 100644 --- a/src/java/davmail/caldav/CaldavConnection.java +++ b/src/java/davmail/caldav/CaldavConnection.java @@ -20,15 +20,16 @@ package davmail.caldav; import davmail.AbstractConnection; import davmail.BundleMessage; -import davmail.Settings; import davmail.DavGateway; -import davmail.util.StringUtil; +import davmail.Settings; import davmail.exception.DavMailAuthenticationException; import davmail.exception.DavMailException; +import davmail.exception.HttpNotFoundException; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.ICSBufferedReader; import davmail.ui.tray.DavGatewayTray; +import davmail.util.StringUtil; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.util.URIUtil; @@ -612,7 +613,20 @@ public class CaldavConnection extends AbstractConnection { // ignore cases for Sunbird if (eventName != null && eventName.length() > 0 && !"inbox".equals(eventName) && !"calendar".equals(eventName)) { - appendEventResponse(response, request, session.getEvent(folderPath, eventName)); + ExchangeSession.Event event; + try { + event = session.getEvent(folderPath, eventName); + } catch (HttpNotFoundException hnfe) { + // failover for Exchange 2007 plus encoding issue + String decodedEventName = eventName.replaceAll("_xF8FF_", "/").replaceAll("_x003F_", "?").replaceAll("'", "''"); + ExchangeSession.MessageList messages = session.searchMessages(folderPath, " AND \"DAV:displayname\"='"+decodedEventName+ '\''); + if (!messages.isEmpty()) { + event = session.getEvent(messages.get(0).getPermanentUrl()); + } else { + throw hnfe; + } + } + appendEventResponse(response, request, event); } } catch (HttpException e) { DavGatewayTray.warn(new BundleMessage("LOG_EVENT_NOT_FOUND", href)); diff --git a/src/java/davmail/exchange/ExchangeSession.java b/src/java/davmail/exchange/ExchangeSession.java index cbf5a32f..4d4717cb 100644 --- a/src/java/davmail/exchange/ExchangeSession.java +++ b/src/java/davmail/exchange/ExchangeSession.java @@ -1392,12 +1392,12 @@ public class ExchangeSession { } /** - * Return encoded message url. - * @return encoded message url + * Return permanent message url. + * @return permanent message url * @throws URIException on error */ - public String getEncodedMessageUrl() throws URIException { - return URIUtil.encodePath(messageUrl); + public String getPermanentUrl() throws URIException { + return permanentUrl; } /** @@ -1768,12 +1768,19 @@ public class ExchangeSession { * @throws IOException on error */ public Event getEvent(String folderPath, String eventName) throws IOException { - String eventPath = URIUtil.encodePath(folderPath + '/' + eventName); + String eventPath = folderPath + '/' + eventName; return getEvent(eventPath); } - protected Event getEvent(String eventPath) throws IOException { - MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(httpClient, eventPath, 0, EVENT_REQUEST_PROPERTIES); + /** + * Get event by url + * + * @param eventPath Event path + * @return event object + * @throws IOException on error + */ + public Event getEvent(String eventPath) throws IOException { + MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(httpClient, URIUtil.encodePath(eventPath), 0, EVENT_REQUEST_PROPERTIES); if (responses.length == 0) { throw new DavMailException("EXCEPTION_EVENT_NOT_FOUND"); }