mirror of
https://github.com/moparisthebest/davmail
synced 2025-01-05 18:58:02 -05:00
Caldav: Refactor getItem
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1288 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
f043b80973
commit
f8eb0adda7
@ -856,7 +856,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
LOGGER.warn("Unable to patch event to trigger activeSync push");
|
LOGGER.warn("Unable to patch event to trigger activeSync push");
|
||||||
} else {
|
} else {
|
||||||
// need to retrieve new etag
|
// need to retrieve new etag
|
||||||
Item newItem = getItem(getHref());
|
Item newItem = getItem(folderPath, itemName);
|
||||||
itemResult.etag = newItem.etag;
|
itemResult.etag = newItem.etag;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -935,7 +935,6 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
for (String attribute : FOLDER_PROPERTIES) {
|
for (String attribute : FOLDER_PROPERTIES) {
|
||||||
FOLDER_PROPERTIES_NAME_SET.add(Field.getPropertyName(attribute));
|
FOLDER_PROPERTIES_NAME_SET.add(Field.getPropertyName(attribute));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1191,21 +1190,62 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
httpClient, URIUtil.encodePath(folderUrl), searchRequest.toString());
|
httpClient, URIUtil.encodePath(folderUrl), searchRequest.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static final Set<String> EVENT_REQUEST_PROPERTIES = new HashSet<String>();
|
||||||
protected static final DavPropertyNameSet EVENT_REQUEST_PROPERTIES = new DavPropertyNameSet();
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
EVENT_REQUEST_PROPERTIES.add(Field.getPropertyName("permanenturl"));
|
EVENT_REQUEST_PROPERTIES.add("permanenturl");
|
||||||
EVENT_REQUEST_PROPERTIES.add(Field.getPropertyName("urlcompname"));
|
EVENT_REQUEST_PROPERTIES.add("urlcompname");
|
||||||
EVENT_REQUEST_PROPERTIES.add(Field.getPropertyName("etag"));
|
EVENT_REQUEST_PROPERTIES.add("etag");
|
||||||
EVENT_REQUEST_PROPERTIES.add(Field.getPropertyName("contentclass"));
|
EVENT_REQUEST_PROPERTIES.add("contentclass");
|
||||||
EVENT_REQUEST_PROPERTIES.add(Field.getPropertyName("displayname"));
|
EVENT_REQUEST_PROPERTIES.add("displayname");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static final DavPropertyNameSet EVENT_REQUEST_PROPERTIES_NAME_SET = new DavPropertyNameSet();
|
||||||
|
static {
|
||||||
|
for (String attribute : EVENT_REQUEST_PROPERTIES) {
|
||||||
|
EVENT_REQUEST_PROPERTIES_NAME_SET.add(Field.getPropertyName(attribute));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item getItem(String folderPath, String itemName) throws IOException {
|
public Item getItem(String folderPath, String itemName) throws IOException {
|
||||||
String itemPath = getFolderPath(folderPath) + '/' + convertItemNameToEML(itemName);
|
String emlItemName = convertItemNameToEML(itemName);
|
||||||
return getItem(itemPath);
|
String itemPath = getFolderPath(folderPath) + '/' + emlItemName;
|
||||||
|
MultiStatusResponse[] responses;
|
||||||
|
try {
|
||||||
|
responses = DavGatewayHttpClientFacade.executePropFindMethod(httpClient, URIUtil.encodePath(itemPath), 0, EVENT_REQUEST_PROPERTIES_NAME_SET);
|
||||||
|
if (responses.length == 0) {
|
||||||
|
throw new HttpNotFoundException(itemPath);
|
||||||
|
}
|
||||||
|
} catch (HttpNotFoundException e) {
|
||||||
|
LOGGER.debug(itemPath +" not found, searching by urlcompname");
|
||||||
|
// failover: try to get event by displayname
|
||||||
|
responses = searchItems(folderPath, EVENT_REQUEST_PROPERTIES, equals("urlcompname", emlItemName), FolderQueryTraversal.Shallow);
|
||||||
|
if (responses.length == 0) {
|
||||||
|
throw new HttpNotFoundException(itemPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// build item
|
||||||
|
String contentClass = getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "contentclass");
|
||||||
|
String urlcompname = getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "urlcompname");
|
||||||
|
if ("urn:content-classes:person".equals(contentClass)) {
|
||||||
|
// retrieve Contact properties
|
||||||
|
List<ExchangeSession.Contact> contacts = searchContacts(folderPath, CONTACT_ATTRIBUTES, equals("urlcompname", urlcompname));
|
||||||
|
if (contacts.isEmpty()) {
|
||||||
|
LOGGER.warn("Item found, but unable to build contact");
|
||||||
|
throw new HttpNotFoundException(itemPath);
|
||||||
|
}
|
||||||
|
return contacts.get(0);
|
||||||
|
} else if ("urn:content-classes:appointment".equals(contentClass)
|
||||||
|
|| "urn:content-classes:calendarmessage".equals(contentClass)) {
|
||||||
|
return new Event(responses[0]);
|
||||||
|
} else {
|
||||||
|
LOGGER.warn("wrong contentclass on item "+itemPath+": "+contentClass);
|
||||||
|
// return item anyway
|
||||||
|
return new Event(responses[0]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1283,35 +1323,6 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
DavGatewayHttpClientFacade.executeMethod(httpClient, patchMethod);
|
DavGatewayHttpClientFacade.executeMethod(httpClient, patchMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get item by url
|
|
||||||
*
|
|
||||||
* @param itemPath Event path
|
|
||||||
* @return event object
|
|
||||||
* @throws IOException on error
|
|
||||||
*/
|
|
||||||
public Item getItem(String itemPath) throws IOException {
|
|
||||||
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(httpClient, URIUtil.encodePath(itemPath), 0, EVENT_REQUEST_PROPERTIES);
|
|
||||||
if (responses.length == 0) {
|
|
||||||
throw new DavMailException("EXCEPTION_ITEM_NOT_FOUND");
|
|
||||||
}
|
|
||||||
String contentClass = getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "contentclass");
|
|
||||||
String urlcompname = getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "urlcompname");
|
|
||||||
if ("urn:content-classes:person".equals(contentClass)) {
|
|
||||||
// retrieve Contact properties
|
|
||||||
List<ExchangeSession.Contact> contacts = searchContacts(itemPath.substring(0, itemPath.lastIndexOf('/')), CONTACT_ATTRIBUTES, equals("urlcompname", urlcompname));
|
|
||||||
if (contacts.isEmpty()) {
|
|
||||||
throw new DavMailException("EXCEPTION_ITEM_NOT_FOUND");
|
|
||||||
}
|
|
||||||
return contacts.get(0);
|
|
||||||
} else if ("urn:content-classes:appointment".equals(contentClass)
|
|
||||||
|| "urn:content-classes:calendarmessage".equals(contentClass)) {
|
|
||||||
return new Event(responses[0]);
|
|
||||||
} else {
|
|
||||||
throw new DavMailException("EXCEPTION_ITEM_NOT_FOUND");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException {
|
public ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException {
|
||||||
return new Event(getFolderPath(folderPath), itemName, contentClass, icsBody, etag, noneMatch).createOrUpdate();
|
return new Event(getFolderPath(folderPath), itemName, contentClass, icsBody, etag, noneMatch).createOrUpdate();
|
||||||
|
@ -22,6 +22,10 @@ import davmail.exchange.ExchangeSession;
|
|||||||
import davmail.http.DavGatewaySSLProtocolSocketFactory;
|
import davmail.http.DavGatewaySSLProtocolSocketFactory;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import javax.mail.Session;
|
||||||
|
import javax.mail.internet.MimeMessage;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -70,4 +74,18 @@ public class AbstractDavMailTestCase extends TestCase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected MimeMessage createMimeMessage() throws MessagingException {
|
||||||
|
MimeMessage mimeMessage = new MimeMessage((Session) null);
|
||||||
|
mimeMessage.addHeader("To", "test@test.local");
|
||||||
|
mimeMessage.setText("Test message");
|
||||||
|
mimeMessage.setSubject("Test subject");
|
||||||
|
return mimeMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected byte[] getMimeBody(MimeMessage mimeMessage) throws IOException, MessagingException {
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
mimeMessage.writeTo(baos);
|
||||||
|
return baos.toByteArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,6 @@ import davmail.Settings;
|
|||||||
import davmail.exchange.dav.DavExchangeSession;
|
import davmail.exchange.dav.DavExchangeSession;
|
||||||
import davmail.exchange.ews.EwsExchangeSession;
|
import davmail.exchange.ews.EwsExchangeSession;
|
||||||
|
|
||||||
import javax.mail.MessagingException;
|
|
||||||
import javax.mail.Session;
|
|
||||||
import javax.mail.internet.MimeMessage;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,18 +47,4 @@ public class AbstractExchangeSessionTestCase extends AbstractDavMailTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected MimeMessage createMimeMessage() throws MessagingException {
|
|
||||||
MimeMessage mimeMessage = new MimeMessage((Session) null);
|
|
||||||
mimeMessage.addHeader("To", "test@test.local");
|
|
||||||
mimeMessage.setText("Test message");
|
|
||||||
mimeMessage.setSubject("Test subject");
|
|
||||||
return mimeMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected byte[] getMimeBody(MimeMessage mimeMessage) throws IOException, MessagingException {
|
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
||||||
mimeMessage.writeTo(baos);
|
|
||||||
return baos.toByteArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user