Caldav: need to encode colon (:) in urlcompname search, implement a last failover on item search

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1351 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2010-08-17 09:57:15 +00:00
parent 3eaa08c431
commit 4835b2ba2d
2 changed files with 31 additions and 8 deletions

View File

@ -239,7 +239,7 @@ public class DavExchangeSession extends ExchangeSession {
protected Map<String, Map<String, String>> galFind(String query) throws IOException {
Map<String, Map<String, String>> results;
String path = getCmdBasePath() + "?Cmd=galfind" + query;
String path = getCmdBasePath() + "?Cmd=galfind" + query;
GetMethod getMethod = new GetMethod(path);
try {
DavGatewayHttpClientFacade.executeGetMethod(httpClient, getMethod, true);
@ -580,7 +580,7 @@ public class DavExchangeSession extends ExchangeSession {
emailResult = result.get("EM");
}
} catch (IOException e) {
LOGGER.debug("getEmail("+alias+") failed");
LOGGER.debug("getEmail(" + alias + ") failed");
}
}
return emailResult;
@ -1117,6 +1117,10 @@ public class DavExchangeSession extends ExchangeSession {
displayName = getPropertyIfExists(properties, "displayname");
}
protected String getPermanentUrl() {
return permanentUrl;
}
/**
* @inheritDoc
@ -1678,18 +1682,33 @@ public class DavExchangeSession extends ExchangeSession {
public Item getItem(String folderPath, String itemName) throws IOException {
String emlItemName = convertItemNameToEML(itemName);
String itemPath = getFolderPath(folderPath) + '/' + emlItemName;
MultiStatusResponse[] responses;
MultiStatusResponse[] responses = null;
try {
responses = DavGatewayHttpClientFacade.executePropFindMethod(httpClient, URIUtil.encodePath(itemPath), 0, EVENT_REQUEST_PROPERTIES_NAME_SET);
if (responses.length == 0) {
throw new HttpNotFoundException(itemPath + " not found");
}
} catch (HttpNotFoundException e) {
LOGGER.debug(itemPath + " not found, searching by urlcompname");
// failover: try to get event by displayname
responses = searchItems(folderPath, EVENT_REQUEST_PROPERTIES, isEqualTo("urlcompname", emlItemName), FolderQueryTraversal.Shallow, 1);
if (responses.length == 0) {
throw new HttpNotFoundException(itemPath + " not found");
try {
LOGGER.debug(itemPath + " not found, searching by urlcompname");
// failover: try to get event by displayname
responses = searchItems(folderPath, EVENT_REQUEST_PROPERTIES, isEqualTo("urlcompname", emlItemName), FolderQueryTraversal.Shallow, 1);
if (responses.length == 0) {
throw new HttpNotFoundException(itemPath + " not found");
}
} catch (HttpNotFoundException e2) {
LOGGER.debug("last failover: search all items");
List<ExchangeSession.Event> events = getAllEvents(folderPath);
for (ExchangeSession.Event event : events) {
if (itemName.equals(event.getName())) {
responses = DavGatewayHttpClientFacade.executePropFindMethod(httpClient, ((DavExchangeSession.Event) event).getPermanentUrl(), 0, EVENT_REQUEST_PROPERTIES_NAME_SET);
break;
}
}
if (responses == null || responses.length == 0) {
throw new HttpNotFoundException(itemPath + " not found");
}
LOGGER.warn("search by urlcompname failed, actual value is "+getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "urlcompname"));
}
}
// build item

View File

@ -137,6 +137,7 @@ public final class StringUtil {
private static final Pattern F8FF_PATTERN = Pattern.compile("_xF8FF_");
private static final Pattern PLUS_PATTERN = Pattern.compile("\\+");
private static final Pattern COLON_PATTERN = Pattern.compile(":");
private static final Pattern SLASH_PATTERN = Pattern.compile("/");
private static final Pattern UNDERSCORE_PATTERN = Pattern.compile("_");
private static final Pattern DASH_PATTERN = Pattern.compile("-");
@ -255,6 +256,9 @@ public final class StringUtil {
if (result.indexOf('+') >= 0) {
result = PLUS_PATTERN.matcher(result).replaceAll("%2B");
}
if (result.indexOf(':') >= 0) {
result = COLON_PATTERN.matcher(result).replaceAll("%3A");
}
return result;
}