mirror of
https://github.com/moparisthebest/davmail
synced 2025-01-13 06:28:19 -05:00
Carddav: refactor Contact creation and create VCardReader
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1134 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
6e6326ac70
commit
b988bd2f12
@ -22,6 +22,7 @@ import davmail.BundleMessage;
|
|||||||
import davmail.Settings;
|
import davmail.Settings;
|
||||||
import davmail.exception.DavMailAuthenticationException;
|
import davmail.exception.DavMailAuthenticationException;
|
||||||
import davmail.exception.DavMailException;
|
import davmail.exception.DavMailException;
|
||||||
|
import davmail.exchange.dav.Field;
|
||||||
import davmail.http.DavGatewayHttpClientFacade;
|
import davmail.http.DavGatewayHttpClientFacade;
|
||||||
import davmail.http.DavGatewayOTPPrompt;
|
import davmail.http.DavGatewayOTPPrompt;
|
||||||
import davmail.util.StringUtil;
|
import davmail.util.StringUtil;
|
||||||
@ -30,6 +31,7 @@ import org.apache.commons.httpclient.methods.GetMethod;
|
|||||||
import org.apache.commons.httpclient.methods.PostMethod;
|
import org.apache.commons.httpclient.methods.PostMethod;
|
||||||
import org.apache.commons.httpclient.params.HttpClientParams;
|
import org.apache.commons.httpclient.params.HttpClientParams;
|
||||||
import org.apache.commons.httpclient.util.URIUtil;
|
import org.apache.commons.httpclient.util.URIUtil;
|
||||||
|
import org.apache.jackrabbit.webdav.DavConstants;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.htmlcleaner.CommentToken;
|
import org.htmlcleaner.CommentToken;
|
||||||
import org.htmlcleaner.HtmlCleaner;
|
import org.htmlcleaner.HtmlCleaner;
|
||||||
@ -1390,6 +1392,7 @@ public abstract class ExchangeSession {
|
|||||||
* @throws IOException on error
|
* @throws IOException on error
|
||||||
* @deprecated move to byte array handling instead
|
* @deprecated move to byte array handling instead
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void write(OutputStream os, boolean doubleDot) throws IOException {
|
public void write(OutputStream os, boolean doubleDot) throws IOException {
|
||||||
BufferedReader reader = getContentReader(this);
|
BufferedReader reader = getContentReader(this);
|
||||||
try {
|
try {
|
||||||
@ -1590,7 +1593,8 @@ public abstract class ExchangeSession {
|
|||||||
* Generic folder item.
|
* Generic folder item.
|
||||||
*/
|
*/
|
||||||
public abstract static class Item extends HashMap<String, String> {
|
public abstract static class Item extends HashMap<String, String> {
|
||||||
protected String href;
|
protected String folderPath;
|
||||||
|
protected String itemName;
|
||||||
protected String permanentUrl;
|
protected String permanentUrl;
|
||||||
/**
|
/**
|
||||||
* Display name.
|
* Display name.
|
||||||
@ -1610,16 +1614,14 @@ public abstract class ExchangeSession {
|
|||||||
/**
|
/**
|
||||||
* Build item instance.
|
* Build item instance.
|
||||||
*
|
*
|
||||||
* @param messageUrl message url
|
* @param folderPath folder path
|
||||||
* @param contentClass content class
|
* @param itemName item name class
|
||||||
* @param itemBody item body
|
* @param etag item etag
|
||||||
* @param etag item etag
|
* @param noneMatch none match flag
|
||||||
* @param noneMatch none match flag
|
|
||||||
*/
|
*/
|
||||||
public Item(String messageUrl, String contentClass, String itemBody, String etag, String noneMatch) {
|
public Item(String folderPath, String itemName, String etag, String noneMatch) {
|
||||||
this.href = messageUrl;
|
this.folderPath = folderPath;
|
||||||
this.contentClass = contentClass;
|
this.itemName = itemName;
|
||||||
this.itemBody = itemBody;
|
|
||||||
this.etag = etag;
|
this.etag = etag;
|
||||||
this.noneMatch = noneMatch;
|
this.noneMatch = noneMatch;
|
||||||
}
|
}
|
||||||
@ -1651,12 +1653,7 @@ public abstract class ExchangeSession {
|
|||||||
* @return event name
|
* @return event name
|
||||||
*/
|
*/
|
||||||
public String getName() {
|
public String getName() {
|
||||||
int index = href.lastIndexOf('/');
|
return itemName;
|
||||||
if (index >= 0) {
|
|
||||||
return href.substring(index + 1);
|
|
||||||
} else {
|
|
||||||
return href;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1673,6 +1670,20 @@ public abstract class ExchangeSession {
|
|||||||
LOGGER.warn(message);
|
LOGGER.warn(message);
|
||||||
return new HttpException(message);
|
return new HttpException(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setHref(String href) {
|
||||||
|
int index = href.lastIndexOf('/');
|
||||||
|
if (index >= 0) {
|
||||||
|
folderPath = href.substring(0, index);
|
||||||
|
itemName = href.substring(index + 1);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException(href);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHref() {
|
||||||
|
return folderPath + '/' + itemName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1683,8 +1694,9 @@ public abstract class ExchangeSession {
|
|||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
*/
|
*/
|
||||||
public Contact(String messageUrl, String contentClass, String itemBody, String etag, String noneMatch) {
|
public Contact(String folderPath, String itemName, Map<String, String> properties, String etag, String noneMatch) {
|
||||||
super(messageUrl.endsWith(".vcf") ? messageUrl.substring(0, messageUrl.length() - 3) + "EML" : messageUrl, contentClass, itemBody, etag, noneMatch);
|
super(folderPath, itemName.endsWith(".vcf") ? itemName.substring(0, itemName.length() - 3) + "EML" : itemName, etag, noneMatch);
|
||||||
|
this.putAll(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1760,7 +1772,7 @@ public abstract class ExchangeSession {
|
|||||||
writer.appendProperty("ORG", get("o"), get("department"));
|
writer.appendProperty("ORG", get("o"), get("department"));
|
||||||
writer.appendProperty("URL;WORK", get("businesshomepage"));
|
writer.appendProperty("URL;WORK", get("businesshomepage"));
|
||||||
writer.appendProperty("TITLE", get("title"));
|
writer.appendProperty("TITLE", get("title"));
|
||||||
writer.appendProperty("NOTE", get("textdescription"));
|
writer.appendProperty("NOTE", get("description"));
|
||||||
|
|
||||||
writer.appendProperty("CUSTOM1", get("extensionattribute1"));
|
writer.appendProperty("CUSTOM1", get("extensionattribute1"));
|
||||||
writer.appendProperty("CUSTOM2", get("extensionattribute2"));
|
writer.appendProperty("CUSTOM2", get("extensionattribute2"));
|
||||||
@ -1796,12 +1808,16 @@ public abstract class ExchangeSession {
|
|||||||
* Calendar event object.
|
* Calendar event object.
|
||||||
*/
|
*/
|
||||||
public abstract class Event extends Item {
|
public abstract class Event extends Item {
|
||||||
|
protected String contentClass;
|
||||||
|
protected String itemBody;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
*/
|
*/
|
||||||
public Event(String messageUrl, String contentClass, String itemBody, String etag, String noneMatch) {
|
public Event(String folderPath, String itemName, String contentClass, String itemBody, String etag, String noneMatch) {
|
||||||
super(messageUrl, contentClass, itemBody, etag, noneMatch);
|
super(folderPath, itemName, etag, noneMatch);
|
||||||
|
this.contentClass = contentClass;
|
||||||
|
this.itemBody = itemBody;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2601,19 +2617,55 @@ public abstract class ExchangeSession {
|
|||||||
* @throws IOException on error
|
* @throws IOException on error
|
||||||
*/
|
*/
|
||||||
public ItemResult createOrUpdateItem(String folderPath, String itemName, String itemBody, String etag, String noneMatch) throws IOException {
|
public ItemResult createOrUpdateItem(String folderPath, String itemName, String itemBody, String etag, String noneMatch) throws IOException {
|
||||||
String messageUrl = folderPath + '/' + itemName;
|
|
||||||
if (itemBody.startsWith("BEGIN:VCALENDAR")) {
|
if (itemBody.startsWith("BEGIN:VCALENDAR")) {
|
||||||
return internalCreateOrUpdateEvent(messageUrl, "urn:content-classes:appointment", itemBody, etag, noneMatch);
|
return internalCreateOrUpdateEvent(folderPath, itemName, "urn:content-classes:appointment", itemBody, etag, noneMatch);
|
||||||
} else if (itemBody.startsWith("BEGIN:VCARD")) {
|
} else if (itemBody.startsWith("BEGIN:VCARD")) {
|
||||||
return internalCreateOrUpdateContact(messageUrl, "urn:content-classes:person", itemBody, etag, noneMatch);
|
return createOrUpdateContact(folderPath, itemName, itemBody, etag, noneMatch);
|
||||||
} else {
|
} else {
|
||||||
throw new IOException(BundleMessage.format("EXCEPTION_INVALID_MESSAGE_CONTENT", itemBody));
|
throw new IOException(BundleMessage.format("EXCEPTION_INVALID_MESSAGE_CONTENT", itemBody));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract ItemResult internalCreateOrUpdateContact(String messageUrl, String contentClass, String icsBody, String etag, String noneMatch) throws IOException;
|
protected ItemResult createOrUpdateContact(String folderPath, String itemName, String itemBody, String etag, String noneMatch) throws IOException {
|
||||||
|
// parse VCARD body to build contact property map
|
||||||
|
Map<String, String> properties = new HashMap<String, String>();
|
||||||
|
properties.put("outlookmessageclass", "IPM.Contact");
|
||||||
|
|
||||||
protected abstract ItemResult internalCreateOrUpdateEvent(String messageUrl, String contentClass, String icsBody, String etag, String noneMatch) throws IOException;
|
VCardReader reader = new VCardReader(new StringReader(itemBody));
|
||||||
|
VCardReader.Property property;
|
||||||
|
while ((property = reader.readProperty()) != null) {
|
||||||
|
if ("FN".equals(property.getKey())) {
|
||||||
|
properties.put("cn", property.getValue());
|
||||||
|
properties.put("subject", property.getValue());
|
||||||
|
properties.put("fileas", property.getValue());
|
||||||
|
|
||||||
|
} else if ("N".equals(property.getKey())) {
|
||||||
|
String[] values = property.getValues();
|
||||||
|
if (values.length > 0) {
|
||||||
|
properties.put("sn", values[0]);
|
||||||
|
}
|
||||||
|
if (values.length > 1) {
|
||||||
|
properties.put("givenName", values[1]);
|
||||||
|
}
|
||||||
|
} else if ("TEL".equals(property.getKey())) {
|
||||||
|
if (property.hasParam("TYPE", "cell")) {
|
||||||
|
properties.put("mobile", property.getValue());
|
||||||
|
}
|
||||||
|
if (property.hasParam("TYPE", "work")) {
|
||||||
|
properties.put("telephoneNumber", property.getValue());
|
||||||
|
}
|
||||||
|
if (property.hasParam("TYPE", "home")) {
|
||||||
|
properties.put("homePhone", property.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return internalCreateOrUpdateContact(folderPath, itemName, properties, etag, noneMatch);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected abstract ItemResult internalCreateOrUpdateContact(String folderPath, String itemName, Map<String, String> properties, String etag, String noneMatch) throws IOException;
|
||||||
|
|
||||||
|
protected abstract ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current Exchange alias name from login name
|
* Get current Exchange alias name from login name
|
||||||
@ -2897,7 +2949,7 @@ public abstract class ExchangeSession {
|
|||||||
public static final Set<String> CONTACT_ATTRIBUTES = new HashSet<String>();
|
public static final Set<String> CONTACT_ATTRIBUTES = new HashSet<String>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
CONTACT_ATTRIBUTES.add("uid");
|
CONTACT_ATTRIBUTES.add("imapUid");
|
||||||
CONTACT_ATTRIBUTES.add("extensionattribute1");
|
CONTACT_ATTRIBUTES.add("extensionattribute1");
|
||||||
CONTACT_ATTRIBUTES.add("extensionattribute2");
|
CONTACT_ATTRIBUTES.add("extensionattribute2");
|
||||||
CONTACT_ATTRIBUTES.add("extensionattribute3");
|
CONTACT_ATTRIBUTES.add("extensionattribute3");
|
||||||
@ -2938,7 +2990,7 @@ public abstract class ExchangeSession {
|
|||||||
CONTACT_ATTRIBUTES.add("street");
|
CONTACT_ATTRIBUTES.add("street");
|
||||||
CONTACT_ATTRIBUTES.add("telephoneNumber");
|
CONTACT_ATTRIBUTES.add("telephoneNumber");
|
||||||
CONTACT_ATTRIBUTES.add("title");
|
CONTACT_ATTRIBUTES.add("title");
|
||||||
CONTACT_ATTRIBUTES.add("textdescription");
|
CONTACT_ATTRIBUTES.add("description");
|
||||||
CONTACT_ATTRIBUTES.add("im");
|
CONTACT_ATTRIBUTES.add("im");
|
||||||
CONTACT_ATTRIBUTES.add("middlename");
|
CONTACT_ATTRIBUTES.add("middlename");
|
||||||
CONTACT_ATTRIBUTES.add("lastmodified");
|
CONTACT_ATTRIBUTES.add("lastmodified");
|
||||||
|
143
src/java/davmail/exchange/VCardReader.java
Normal file
143
src/java/davmail/exchange/VCardReader.java
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway
|
||||||
|
* Copyright (C) 2010 Mickael Guessant
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
package davmail.exchange;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VCARD reader.
|
||||||
|
*/
|
||||||
|
public class VCardReader extends ICSBufferedReader {
|
||||||
|
/**
|
||||||
|
* VCard property
|
||||||
|
*/
|
||||||
|
public class Property {
|
||||||
|
protected String key;
|
||||||
|
protected Map<String, Set<String>> params;
|
||||||
|
protected String value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property key, without optional parameters (e.g. TEL).
|
||||||
|
*
|
||||||
|
* @return key
|
||||||
|
*/
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property value.
|
||||||
|
*
|
||||||
|
* @return value
|
||||||
|
*/
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property values, split on ;.
|
||||||
|
*
|
||||||
|
* @return values
|
||||||
|
*/
|
||||||
|
public String[] getValues() {
|
||||||
|
// TODO: handle protected characters
|
||||||
|
return value.split(";");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasParam(String paramName, String paramValue) {
|
||||||
|
return params.containsKey(paramName) && params.get(paramName).contains(paramValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addParam(String paramName, Set<String> paramValues) {
|
||||||
|
if (params == null) {
|
||||||
|
params = new HashMap<String, Set<String>>();
|
||||||
|
}
|
||||||
|
params.put(paramName, paramValues);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a VCARD reader on the provided reader
|
||||||
|
*
|
||||||
|
* @param in input reader
|
||||||
|
* @throws IOException on error
|
||||||
|
*/
|
||||||
|
public VCardReader(Reader in) throws IOException {
|
||||||
|
super(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static enum State {
|
||||||
|
KEY, PARAM_NAME, PARAM_VALUE, VALUE
|
||||||
|
}
|
||||||
|
|
||||||
|
public Property readProperty() throws IOException {
|
||||||
|
Property property = null;
|
||||||
|
String line = readLine();
|
||||||
|
if (line != null && !"END:VCARD".equals(line)) {
|
||||||
|
property = new Property();
|
||||||
|
State state = State.KEY;
|
||||||
|
String paramName = null;
|
||||||
|
Set<String> paramValues = null;
|
||||||
|
int startIndex = 0;
|
||||||
|
for (int i = 0; i < line.length(); i++) {
|
||||||
|
char currentChar = line.charAt(i);
|
||||||
|
if (state == State.KEY) {
|
||||||
|
if (currentChar == ':') {
|
||||||
|
property.key = line.substring(startIndex, i);
|
||||||
|
state = State.VALUE;
|
||||||
|
startIndex = i + 1;
|
||||||
|
} else if (currentChar == ';') {
|
||||||
|
property.key = line.substring(startIndex, i);
|
||||||
|
state = State.PARAM_NAME;
|
||||||
|
startIndex = i + 1;
|
||||||
|
}
|
||||||
|
} else if (state == State.PARAM_NAME) {
|
||||||
|
if (currentChar == '=') {
|
||||||
|
paramName = line.substring(startIndex, i);
|
||||||
|
state = State.PARAM_VALUE;
|
||||||
|
paramValues = new HashSet<String>();
|
||||||
|
startIndex = i + 1;
|
||||||
|
}
|
||||||
|
} else if (state == State.PARAM_VALUE) {
|
||||||
|
if (currentChar == ':') {
|
||||||
|
paramValues.add(line.substring(startIndex, i));
|
||||||
|
property.addParam(paramName, paramValues);
|
||||||
|
state = State.VALUE;
|
||||||
|
startIndex = i + 1;
|
||||||
|
} else if (currentChar == ';') {
|
||||||
|
paramValues.add(line.substring(startIndex, i));
|
||||||
|
property.addParam(paramName, paramValues);
|
||||||
|
state = State.PARAM_NAME;
|
||||||
|
startIndex = i + 1;
|
||||||
|
} else if (currentChar == ',') {
|
||||||
|
paramValues.add(line.substring(startIndex, i));
|
||||||
|
startIndex = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
property.value = line.substring(startIndex);
|
||||||
|
}
|
||||||
|
return property;
|
||||||
|
}
|
||||||
|
}
|
@ -425,7 +425,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
//noinspection VariableNotUsedInsideIf
|
//noinspection VariableNotUsedInsideIf
|
||||||
if (field.cast != null) {
|
if (field.cast != null) {
|
||||||
buffer.append("CAST (\"");
|
buffer.append("CAST (\"");
|
||||||
} else if (!isIntValue) {
|
} else if (!isIntValue && !field.isIntValue()) {
|
||||||
buffer.append('\'');
|
buffer.append('\'');
|
||||||
}
|
}
|
||||||
if (Operator.Like == operator) {
|
if (Operator.Like == operator) {
|
||||||
@ -437,7 +437,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
if (field.cast != null) {
|
if (field.cast != null) {
|
||||||
buffer.append("\" as '").append(field.cast).append("')");
|
buffer.append("\" as '").append(field.cast).append("')");
|
||||||
} else if (!isIntValue) {
|
} else if (!isIntValue && !field.isIntValue()) {
|
||||||
buffer.append('\'');
|
buffer.append('\'');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -561,7 +561,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
* @throws URIException on error
|
* @throws URIException on error
|
||||||
*/
|
*/
|
||||||
public Contact(MultiStatusResponse multiStatusResponse) throws URIException {
|
public Contact(MultiStatusResponse multiStatusResponse) throws URIException {
|
||||||
href = URIUtil.decode(multiStatusResponse.getHref());
|
setHref(URIUtil.decode(multiStatusResponse.getHref()));
|
||||||
DavPropertySet properties = multiStatusResponse.getProperties(HttpStatus.SC_OK);
|
DavPropertySet properties = multiStatusResponse.getProperties(HttpStatus.SC_OK);
|
||||||
permanentUrl = getPropertyIfExists(properties, "permanenturl");
|
permanentUrl = getPropertyIfExists(properties, "permanenturl");
|
||||||
etag = getPropertyIfExists(properties, "etag");
|
etag = getPropertyIfExists(properties, "etag");
|
||||||
@ -577,8 +577,8 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
*/
|
*/
|
||||||
public Contact(String messageUrl, String contentClass, String itemBody, String etag, String noneMatch) {
|
public Contact(String folderPath, String itemName, Map<String, String> properties, String etag, String noneMatch) {
|
||||||
super(messageUrl, contentClass, itemBody, etag, noneMatch);
|
super(folderPath, itemName, properties, etag, noneMatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<DavConstants> buildProperties() throws IOException {
|
protected List<DavConstants> buildProperties() throws IOException {
|
||||||
@ -626,7 +626,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
*/
|
*/
|
||||||
public ItemResult createOrUpdate() throws IOException {
|
public ItemResult createOrUpdate() throws IOException {
|
||||||
int status = 0;
|
int status = 0;
|
||||||
PropPatchMethod propPatchMethod = new PropPatchMethod(URIUtil.encodePath(href), buildProperties());
|
PropPatchMethod propPatchMethod = new PropPatchMethod(URIUtil.encodePath(getHref()), buildProperties());
|
||||||
propPatchMethod.setRequestHeader("Translate", "f");
|
propPatchMethod.setRequestHeader("Translate", "f");
|
||||||
if (etag != null) {
|
if (etag != null) {
|
||||||
propPatchMethod.setRequestHeader("If-Match", etag);
|
propPatchMethod.setRequestHeader("If-Match", etag);
|
||||||
@ -643,9 +643,9 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (status == HttpStatus.SC_CREATED) {
|
if (status == HttpStatus.SC_CREATED) {
|
||||||
LOGGER.debug("Created contact " + href);
|
LOGGER.debug("Created contact " + getHref());
|
||||||
} else {
|
} else {
|
||||||
LOGGER.debug("Updated contact " + href);
|
LOGGER.debug("Updated contact " + getHref());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOGGER.warn("Unable to create or update contact " + status + ' ' + propPatchMethod.getStatusLine());
|
LOGGER.warn("Unable to create or update contact " + status + ' ' + propPatchMethod.getStatusLine());
|
||||||
@ -663,7 +663,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
itemResult.status = status;
|
itemResult.status = status;
|
||||||
// need to retrieve new etag
|
// need to retrieve new etag
|
||||||
HeadMethod headMethod = new HeadMethod(URIUtil.encodePath(href));
|
HeadMethod headMethod = new HeadMethod(URIUtil.encodePath(getHref()));
|
||||||
try {
|
try {
|
||||||
httpClient.executeMethod(headMethod);
|
httpClient.executeMethod(headMethod);
|
||||||
if (headMethod.getResponseHeader("ETag") != null) {
|
if (headMethod.getResponseHeader("ETag") != null) {
|
||||||
@ -690,7 +690,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
* @throws URIException on error
|
* @throws URIException on error
|
||||||
*/
|
*/
|
||||||
public Event(MultiStatusResponse multiStatusResponse) throws URIException {
|
public Event(MultiStatusResponse multiStatusResponse) throws URIException {
|
||||||
href = URIUtil.decode(multiStatusResponse.getHref());
|
setHref(URIUtil.decode(multiStatusResponse.getHref()));
|
||||||
DavPropertySet properties = multiStatusResponse.getProperties(HttpStatus.SC_OK);
|
DavPropertySet properties = multiStatusResponse.getProperties(HttpStatus.SC_OK);
|
||||||
permanentUrl = getPropertyIfExists(properties, "permanenturl");
|
permanentUrl = getPropertyIfExists(properties, "permanenturl");
|
||||||
etag = getPropertyIfExists(properties, "etag");
|
etag = getPropertyIfExists(properties, "etag");
|
||||||
@ -701,8 +701,8 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
*/
|
*/
|
||||||
public Event(String messageUrl, String contentClass, String itemBody, String etag, String noneMatch) {
|
public Event(String folderPath, String itemName, String contentClass, String itemBody, String etag, String noneMatch) {
|
||||||
super(messageUrl, contentClass, itemBody, etag, noneMatch);
|
super(folderPath, itemName, contentClass, itemBody, etag, noneMatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -803,7 +803,7 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected ItemResult createOrUpdate(byte[] messageContent) throws IOException {
|
protected ItemResult createOrUpdate(byte[] messageContent) throws IOException {
|
||||||
PutMethod putmethod = new PutMethod(URIUtil.encodePath(href));
|
PutMethod putmethod = new PutMethod(URIUtil.encodePath(getHref()));
|
||||||
putmethod.setRequestHeader("Translate", "f");
|
putmethod.setRequestHeader("Translate", "f");
|
||||||
putmethod.setRequestHeader("Overwrite", "f");
|
putmethod.setRequestHeader("Overwrite", "f");
|
||||||
if (etag != null) {
|
if (etag != null) {
|
||||||
@ -819,9 +819,9 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
status = httpClient.executeMethod(putmethod);
|
status = httpClient.executeMethod(putmethod);
|
||||||
if (status == HttpURLConnection.HTTP_OK) {
|
if (status == HttpURLConnection.HTTP_OK) {
|
||||||
if (etag != null) {
|
if (etag != null) {
|
||||||
LOGGER.debug("Updated event " + href);
|
LOGGER.debug("Updated event " + getHref());
|
||||||
} else {
|
} else {
|
||||||
LOGGER.warn("Overwritten event " + href);
|
LOGGER.warn("Overwritten event " + getHref());
|
||||||
}
|
}
|
||||||
} else if (status != HttpURLConnection.HTTP_CREATED) {
|
} else if (status != HttpURLConnection.HTTP_CREATED) {
|
||||||
LOGGER.warn("Unable to create or update message " + status + ' ' + putmethod.getStatusLine());
|
LOGGER.warn("Unable to create or update message " + status + ' ' + putmethod.getStatusLine());
|
||||||
@ -847,13 +847,13 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
propertyList.add(Field.createDavProperty("contentclass", contentClass));
|
propertyList.add(Field.createDavProperty("contentclass", contentClass));
|
||||||
// ... but also set PR_INTERNET_CONTENT to preserve custom properties
|
// ... but also set PR_INTERNET_CONTENT to preserve custom properties
|
||||||
propertyList.add(Field.createDavProperty("internetContent", new String(Base64.encodeBase64(messageContent))));
|
propertyList.add(Field.createDavProperty("internetContent", new String(Base64.encodeBase64(messageContent))));
|
||||||
PropPatchMethod propPatchMethod = new PropPatchMethod(URIUtil.encodePath(href), propertyList);
|
PropPatchMethod propPatchMethod = new PropPatchMethod(URIUtil.encodePath(getHref()), propertyList);
|
||||||
int patchStatus = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, propPatchMethod);
|
int patchStatus = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, propPatchMethod);
|
||||||
if (patchStatus != HttpStatus.SC_MULTI_STATUS) {
|
if (patchStatus != HttpStatus.SC_MULTI_STATUS) {
|
||||||
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(href);
|
Item newItem = getItem(getHref());
|
||||||
itemResult.etag = newItem.etag;
|
itemResult.etag = newItem.etag;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1201,12 +1201,12 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int sendEvent(String icsBody) throws IOException {
|
public int sendEvent(String icsBody) throws IOException {
|
||||||
String messageUrl = draftsUrl + '/' + UUID.randomUUID().toString() + ".EML";
|
String itemName = UUID.randomUUID().toString() + ".EML";
|
||||||
int status = internalCreateOrUpdateEvent(messageUrl, "urn:content-classes:calendarmessage", icsBody, null, null).status;
|
int status = internalCreateOrUpdateEvent(draftsUrl, itemName, "urn:content-classes:calendarmessage", icsBody, null, null).status;
|
||||||
if (status != HttpStatus.SC_CREATED) {
|
if (status != HttpStatus.SC_CREATED) {
|
||||||
return status;
|
return status;
|
||||||
} else {
|
} else {
|
||||||
MoveMethod method = new MoveMethod(URIUtil.encodePath(messageUrl), URIUtil.encodePath(sendmsgUrl), true);
|
MoveMethod method = new MoveMethod(URIUtil.encodePath(draftsUrl + '/' + itemName), URIUtil.encodePath(sendmsgUrl), true);
|
||||||
status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
||||||
if (status != HttpStatus.SC_OK) {
|
if (status != HttpStatus.SC_OK) {
|
||||||
throw DavGatewayHttpClientFacade.buildHttpException(method);
|
throw DavGatewayHttpClientFacade.buildHttpException(method);
|
||||||
@ -1259,8 +1259,8 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemResult internalCreateOrUpdateEvent(String messageUrl, 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(messageUrl, contentClass, icsBody, etag, noneMatch).createOrUpdate();
|
return new Event(folderPath, itemName, contentClass, icsBody, etag, noneMatch).createOrUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1373,8 +1373,8 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ItemResult internalCreateOrUpdateContact(String messageUrl, String contentClass, String icsBody, String etag, String noneMatch) throws IOException {
|
protected ItemResult internalCreateOrUpdateContact(String folderPath, String itemName, Map<String, String> properties, String etag, String noneMatch) throws IOException {
|
||||||
return new Contact(messageUrl, contentClass, icsBody, etag, noneMatch).createOrUpdate();
|
return new Contact(folderPath, itemName, properties, etag, noneMatch).createOrUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<DavConstants> buildProperties(Map<String, String> properties) {
|
protected List<DavConstants> buildProperties(Map<String, String> properties) {
|
||||||
|
@ -658,12 +658,12 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ItemResult internalCreateOrUpdateContact(String messageUrl, String contentClass, String icsBody, String etag, String noneMatch) throws IOException {
|
protected ItemResult internalCreateOrUpdateContact(String folderPath, String itemName, Map<String, String> properties, String etag, String noneMatch) throws IOException {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ItemResult internalCreateOrUpdateEvent(String messageUrl, String contentClass, String icsBody, String etag, String noneMatch) throws IOException {
|
protected ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user