From e6ef48c90ef895708d80f2ae29b7e6a73f1ab5b8 Mon Sep 17 00:00:00 2001 From: mguessan Date: Tue, 6 Jul 2010 10:20:52 +0000 Subject: [PATCH] Carddav: fix contact folder path handling and add create contact unit test git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1136 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- src/java/davmail/exchange/VCardReader.java | 4 ++ src/java/davmail/exchange/VCardWriter.java | 2 + .../exchange/dav/DavExchangeSession.java | 38 +++---------------- .../exchange/TestExchangeSessionContact.java | 25 ++++++++++-- 4 files changed, 32 insertions(+), 37 deletions(-) diff --git a/src/java/davmail/exchange/VCardReader.java b/src/java/davmail/exchange/VCardReader.java index 6a20b9b3..ff05c510 100644 --- a/src/java/davmail/exchange/VCardReader.java +++ b/src/java/davmail/exchange/VCardReader.java @@ -85,6 +85,10 @@ public class VCardReader extends ICSBufferedReader { */ public VCardReader(Reader in) throws IOException { super(in); + String firstLine = readLine(); + if (firstLine == null || !"BEGIN:VCARD".equals(firstLine)) { + throw new IOException("Invalid VCard body: "+firstLine); + } } protected static enum State { diff --git a/src/java/davmail/exchange/VCardWriter.java b/src/java/davmail/exchange/VCardWriter.java index 032fa63d..4e6d8dc4 100644 --- a/src/java/davmail/exchange/VCardWriter.java +++ b/src/java/davmail/exchange/VCardWriter.java @@ -33,6 +33,8 @@ public class VCardWriter extends ICSBufferedWriter { write(":"); if (propertyValue.indexOf('\n') >= 0) { writeLine(propertyValue.replaceAll("\\n", "\\\\n")); + } else { + writeLine(propertyValue); } } } diff --git a/src/java/davmail/exchange/dav/DavExchangeSession.java b/src/java/davmail/exchange/dav/DavExchangeSession.java index 27f1279f..0d62a929 100644 --- a/src/java/davmail/exchange/dav/DavExchangeSession.java +++ b/src/java/davmail/exchange/dav/DavExchangeSession.java @@ -583,38 +583,10 @@ public class DavExchangeSession extends ExchangeSession { protected List buildProperties() throws IOException { ArrayList list = new ArrayList(); - list.add(Field.createDavProperty("contentclass", contentClass)); - list.add(Field.createDavProperty("outlookmessageclass", "IPM.Contact")); - - ICSBufferedReader reader = new ICSBufferedReader(new StringReader(itemBody)); - String line; - while ((line = reader.readLine()) != null) { - int index = line.indexOf(':'); - if (index >= 0) { - String key = line.substring(0, index); - String value = line.substring(index + 1); - if ("FN".equals(key)) { - list.add(Field.createDavProperty("cn", value)); - list.add(Field.createDavProperty("subject", value)); - list.add(Field.createDavProperty("fileas", value)); - - } else if ("N".equals(key)) { - String[] values = value.split(";"); - if (values.length > 0) { - list.add(Field.createDavProperty("sn", values[0])); - } - if (values.length > 1) { - list.add(Field.createDavProperty("givenName", values[1])); - } - } else if ("TEL;TYPE=cell".equals(key)) { - list.add(Field.createDavProperty("mobile", value)); - } else if ("TEL;TYPE=work".equals(key)) { - list.add(Field.createDavProperty("telephoneNumber", value)); - } else if ("TEL;TYPE=home".equals(key)) { - list.add(Field.createDavProperty("homePhone", value)); - } - } + for (Map.Entry entry : entrySet()) { + list.add(Field.createDavProperty(entry.getKey(), entry.getValue())); } + return list; } @@ -1260,7 +1232,7 @@ public class DavExchangeSession extends ExchangeSession { @Override public ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException { - return new Event(folderPath, itemName, contentClass, icsBody, etag, noneMatch).createOrUpdate(); + return new Event(getFolderPath(folderPath), itemName, contentClass, icsBody, etag, noneMatch).createOrUpdate(); } /** @@ -1374,7 +1346,7 @@ public class DavExchangeSession extends ExchangeSession { @Override protected ItemResult internalCreateOrUpdateContact(String folderPath, String itemName, Map properties, String etag, String noneMatch) throws IOException { - return new Contact(folderPath, itemName, properties, etag, noneMatch).createOrUpdate(); + return new Contact(getFolderPath(folderPath), itemName, properties, etag, noneMatch).createOrUpdate(); } protected List buildProperties(Map properties) { diff --git a/src/test/davmail/exchange/TestExchangeSessionContact.java b/src/test/davmail/exchange/TestExchangeSessionContact.java index 42335723..3c9307e4 100644 --- a/src/test/davmail/exchange/TestExchangeSessionContact.java +++ b/src/test/davmail/exchange/TestExchangeSessionContact.java @@ -21,10 +21,7 @@ package davmail.exchange; import davmail.exchange.dav.DavExchangeSession; import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * Test ExchangeSession contact features. @@ -32,6 +29,15 @@ import java.util.Set; @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase { + @Override + public void setUp() throws IOException { + super.setUp(); + // recreate empty folder + session.deleteFolder("testcontactfolder"); + session.createContactFolder("testcontactfolder"); + } + + public void testSearchContacts() throws IOException { List contacts = session.searchContacts(ExchangeSession.CONTACTS, ExchangeSession.CONTACT_ATTRIBUTES, null); for (ExchangeSession.Contact contact : contacts) { @@ -56,4 +62,15 @@ public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase System.out.println(session.searchContacts(ExchangeSession.CONTACTS, attributes, session.equals("uid", contact.get("uid")))); } } + + public void testCreateContact() throws IOException { + VCardWriter vCardWriter = new VCardWriter(); + vCardWriter.startCard(); + vCardWriter.appendProperty("N", "surname", "given name", "honorific prefix", "honorific suffix"); + vCardWriter.appendProperty("FN", "test name"); + vCardWriter.endCard(); + + session.createOrUpdateContact("testcontactfolder", UUID.randomUUID().toString() + ".vcf", vCardWriter.toString(), null, null); + + } }