mirror of
https://github.com/moparisthebest/davmail
synced 2024-12-14 03:32:22 -05:00
Refactor folder search to use searchItems
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1104 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
c0d4e791f9
commit
0b5968a7c8
@ -62,6 +62,10 @@ import java.util.zip.GZIPInputStream;
|
|||||||
* Compatible with Exchange 2003 and 2007 with webdav available.
|
* Compatible with Exchange 2003 and 2007 with webdav available.
|
||||||
*/
|
*/
|
||||||
public class DavExchangeSession extends ExchangeSession {
|
public class DavExchangeSession extends ExchangeSession {
|
||||||
|
protected static enum FolderQueryTraversal {
|
||||||
|
Shallow, Deep
|
||||||
|
}
|
||||||
|
|
||||||
protected static final DavPropertyNameSet WELL_KNOWN_FOLDERS = new DavPropertyNameSet();
|
protected static final DavPropertyNameSet WELL_KNOWN_FOLDERS = new DavPropertyNameSet();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@ -961,18 +965,26 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
return folder;
|
return folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static final DavPropertyNameSet FOLDER_PROPERTIES = new DavPropertyNameSet();
|
protected static final List<String> FOLDER_PROPERTIES = new ArrayList<String>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
FOLDER_PROPERTIES.add(Field.getPropertyName("displayname"));
|
FOLDER_PROPERTIES.add("displayname");
|
||||||
FOLDER_PROPERTIES.add(Field.getPropertyName("folderclass"));
|
FOLDER_PROPERTIES.add("folderclass");
|
||||||
FOLDER_PROPERTIES.add(Field.getPropertyName("hassubs"));
|
FOLDER_PROPERTIES.add("hassubs");
|
||||||
FOLDER_PROPERTIES.add(Field.getPropertyName("nosubs"));
|
FOLDER_PROPERTIES.add("nosubs");
|
||||||
FOLDER_PROPERTIES.add(Field.getPropertyName("unreadcount"));
|
FOLDER_PROPERTIES.add("unreadcount");
|
||||||
FOLDER_PROPERTIES.add(Field.getPropertyName("contenttag"));
|
FOLDER_PROPERTIES.add("contenttag");
|
||||||
FOLDER_PROPERTIES.add(Field.getPropertyName("lastmodified"));
|
FOLDER_PROPERTIES.add("lastmodified");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static final DavPropertyNameSet FOLDER_PROPERTIES_NAME_SET = new DavPropertyNameSet();
|
||||||
|
|
||||||
|
static {
|
||||||
|
for (String attribute : FOLDER_PROPERTIES) {
|
||||||
|
FOLDER_PROPERTIES_NAME_SET.add(Field.getPropertyName(attribute));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
@ -980,7 +992,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
@Override
|
@Override
|
||||||
public Folder getFolder(String folderPath) throws IOException {
|
public Folder getFolder(String folderPath) throws IOException {
|
||||||
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(
|
||||||
httpClient, URIUtil.encodePath(getFolderPath(folderPath)), 0, FOLDER_PROPERTIES);
|
httpClient, URIUtil.encodePath(getFolderPath(folderPath)), 0, FOLDER_PROPERTIES_NAME_SET);
|
||||||
Folder folder = null;
|
Folder folder = null;
|
||||||
if (responses.length > 0) {
|
if (responses.length > 0) {
|
||||||
folder = buildFolder(responses[0]);
|
folder = buildFolder(responses[0]);
|
||||||
@ -995,19 +1007,10 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
@Override
|
@Override
|
||||||
public List<Folder> getSubFolders(String folderPath, Condition condition, boolean recursive) throws IOException {
|
public List<Folder> getSubFolders(String folderPath, Condition condition, boolean recursive) throws IOException {
|
||||||
boolean isPublic = folderPath.startsWith("/public");
|
boolean isPublic = folderPath.startsWith("/public");
|
||||||
String mode = (!isPublic && recursive) ? "DEEP" : "SHALLOW";
|
FolderQueryTraversal mode = (!isPublic && recursive) ? FolderQueryTraversal.Deep : FolderQueryTraversal.Shallow;
|
||||||
List<Folder> folders = new ArrayList<Folder>();
|
List<Folder> folders = new ArrayList<Folder>();
|
||||||
StringBuilder searchRequest = new StringBuilder();
|
|
||||||
searchRequest.append("Select \"DAV:nosubs\", \"DAV:hassubs\", \"http://schemas.microsoft.com/exchange/outlookfolderclass\", " +
|
MultiStatusResponse[] responses = searchItems(folderPath, FOLDER_PROPERTIES, and(isTrue("isfolder"), condition), mode);
|
||||||
"\"http://schemas.microsoft.com/repl/contenttag\", \"http://schemas.microsoft.com/mapi/proptag/x30080040\", " +
|
|
||||||
"\"urn:schemas:httpmail:unreadcount\" FROM Scope('").append(mode).append(" TRAVERSAL OF \"").append(getFolderPath(folderPath)).append("\"')\n" +
|
|
||||||
" WHERE \"DAV:ishidden\" = False AND \"DAV:isfolder\" = True \n");
|
|
||||||
if (condition != null) {
|
|
||||||
searchRequest.append(" AND ");
|
|
||||||
condition.appendTo(searchRequest);
|
|
||||||
}
|
|
||||||
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executeSearchMethod(
|
|
||||||
httpClient, URIUtil.encodePath(getFolderPath(folderPath)), searchRequest.toString());
|
|
||||||
|
|
||||||
for (MultiStatusResponse response : responses) {
|
for (MultiStatusResponse response : responses) {
|
||||||
Folder folder = buildFolder(response);
|
Folder folder = buildFolder(response);
|
||||||
@ -1132,7 +1135,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
@Override
|
@Override
|
||||||
public MessageList searchMessages(String folderPath, List<String> attributes, Condition condition) throws IOException {
|
public MessageList searchMessages(String folderPath, List<String> attributes, Condition condition) throws IOException {
|
||||||
MessageList messages = new MessageList();
|
MessageList messages = new MessageList();
|
||||||
MultiStatusResponse[] responses = searchItems(folderPath, attributes, condition);
|
MultiStatusResponse[] responses = searchItems(folderPath, attributes, condition, FolderQueryTraversal.Shallow);
|
||||||
|
|
||||||
for (MultiStatusResponse response : responses) {
|
for (MultiStatusResponse response : responses) {
|
||||||
Message message = buildMessage(response);
|
Message message = buildMessage(response);
|
||||||
@ -1149,7 +1152,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
@Override
|
@Override
|
||||||
protected List<ExchangeSession.Contact> searchContacts(String folderPath, List<String> attributes, Condition condition) throws IOException {
|
protected List<ExchangeSession.Contact> searchContacts(String folderPath, List<String> attributes, Condition condition) throws IOException {
|
||||||
List<ExchangeSession.Contact> contacts = new ArrayList<ExchangeSession.Contact>();
|
List<ExchangeSession.Contact> contacts = new ArrayList<ExchangeSession.Contact>();
|
||||||
MultiStatusResponse[] responses = searchItems(folderPath, attributes, condition);
|
MultiStatusResponse[] responses = searchItems(folderPath, attributes, condition, FolderQueryTraversal.Shallow);
|
||||||
for (MultiStatusResponse response : responses) {
|
for (MultiStatusResponse response : responses) {
|
||||||
contacts.add(new Contact(response));
|
contacts.add(new Contact(response));
|
||||||
}
|
}
|
||||||
@ -1159,7 +1162,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
@Override
|
@Override
|
||||||
protected List<ExchangeSession.Event> searchEvents(String folderPath, List<String> attributes, Condition condition) throws IOException {
|
protected List<ExchangeSession.Event> searchEvents(String folderPath, List<String> attributes, Condition condition) throws IOException {
|
||||||
List<ExchangeSession.Event> events = new ArrayList<ExchangeSession.Event>();
|
List<ExchangeSession.Event> events = new ArrayList<ExchangeSession.Event>();
|
||||||
MultiStatusResponse[] responses = searchItems(folderPath, attributes, condition);
|
MultiStatusResponse[] responses = searchItems(folderPath, attributes, condition, FolderQueryTraversal.Shallow);
|
||||||
for (MultiStatusResponse response : responses) {
|
for (MultiStatusResponse response : responses) {
|
||||||
String instancetype = getPropertyIfExists(response.getProperties(HttpStatus.SC_OK), "instancetype");
|
String instancetype = getPropertyIfExists(response.getProperties(HttpStatus.SC_OK), "instancetype");
|
||||||
Event event = new Event(response);
|
Event event = new Event(response);
|
||||||
@ -1181,7 +1184,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
return events;
|
return events;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected MultiStatusResponse[] searchItems(String folderPath, List<String> attributes, Condition condition) throws IOException {
|
protected MultiStatusResponse[] searchItems(String folderPath, List<String> attributes, Condition condition, FolderQueryTraversal folderQueryTraversal) throws IOException {
|
||||||
String folderUrl = getFolderPath(folderPath);
|
String folderUrl = getFolderPath(folderPath);
|
||||||
StringBuilder searchRequest = new StringBuilder();
|
StringBuilder searchRequest = new StringBuilder();
|
||||||
searchRequest.append("SELECT ")
|
searchRequest.append("SELECT ")
|
||||||
@ -1192,7 +1195,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
searchRequest.append(',').append(Field.getRequestPropertyString(field.getAlias()));
|
searchRequest.append(',').append(Field.getRequestPropertyString(field.getAlias()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
searchRequest.append(" FROM SCOPE('SHALLOW TRAVERSAL OF \"").append(folderUrl).append("\"')")
|
searchRequest.append(" FROM SCOPE('").append(folderQueryTraversal).append(" TRAVERSAL OF \"").append(folderUrl).append("\"')")
|
||||||
.append(" WHERE \"DAV:ishidden\" = False AND \"DAV:isfolder\" = False");
|
.append(" WHERE \"DAV:ishidden\" = False AND \"DAV:isfolder\" = False");
|
||||||
if (condition != null) {
|
if (condition != null) {
|
||||||
searchRequest.append(" AND ");
|
searchRequest.append(" AND ");
|
||||||
|
Loading…
Reference in New Issue
Block a user