diff --git a/src/java/davmail/exchange/VCardReader.java b/src/java/davmail/exchange/VCardReader.java index 0b139a95..5482f6d9 100644 --- a/src/java/davmail/exchange/VCardReader.java +++ b/src/java/davmail/exchange/VCardReader.java @@ -104,7 +104,9 @@ public class VCardReader extends ICSBufferedReader { } else if (c == 'r') { c = '\r'; } - } else if (c == ',' && !"NOTE".equals(key)) { + } + // iPhone encodes category separator + if (c == ',' && !"NOTE".equals(key)) { // convert multiple values to multiline values (e.g. street) c = '\n'; } diff --git a/src/java/davmail/exchange/ews/EwsExchangeSession.java b/src/java/davmail/exchange/ews/EwsExchangeSession.java index ea45ed71..9e916a49 100644 --- a/src/java/davmail/exchange/ews/EwsExchangeSession.java +++ b/src/java/davmail/exchange/ews/EwsExchangeSession.java @@ -754,9 +754,9 @@ public class EwsExchangeSession extends ExchangeSession { //noinspection VariableNotUsedInsideIf if (etag == null) { itemResult.status = HttpStatus.SC_CREATED; - LOGGER.debug("Created event " + getHref()); + LOGGER.debug("Created contact " + getHref()); } else { - LOGGER.warn("Updated event " + getHref()); + LOGGER.debug("Updated contact " + getHref()); } } @@ -946,8 +946,11 @@ public class EwsExchangeSession extends ExchangeSession { String itemType = responses.get(0).type; if ("Contact".equals(itemType)) { // retrieve Contact properties - // TODO: need to check list size - return searchContacts(folderPath, CONTACT_ATTRIBUTES, equals("urlcompname", urlcompname)).get(0); + List contacts = searchContacts(folderPath, CONTACT_ATTRIBUTES, equals("urlcompname", urlcompname)); + if (contacts.isEmpty()) { + throw new DavMailException("EXCEPTION_ITEM_NOT_FOUND"); + } + return contacts.get(0); } else if ("CalendarItem".equals(itemType) || "MeetingRequest".equals(itemType)) { return new Event(responses.get(0)); diff --git a/src/test/davmail/exchange/TestExchangeSessionContact.java b/src/test/davmail/exchange/TestExchangeSessionContact.java index 4aa963f9..98e73886 100644 --- a/src/test/davmail/exchange/TestExchangeSessionContact.java +++ b/src/test/davmail/exchange/TestExchangeSessionContact.java @@ -25,6 +25,7 @@ import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.List; import java.util.UUID; /** @@ -34,6 +35,16 @@ import java.util.UUID; public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase { static String itemName; + protected ExchangeSession.Contact getCurrentContact() throws IOException { + if (itemName != null) { + return (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + } else { + List contacts = session.searchContacts("testcontactfolder", ExchangeSession.CONTACT_ATTRIBUTES, null); + itemName = contacts.get(0).itemName; + return contacts.get(0); + } + } + public void testCreateFolder() throws IOException { // recreate empty folder session.deleteFolder("testcontactfolder"); @@ -76,7 +87,7 @@ public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase vCardWriter.appendProperty("ROLE", "profession"); vCardWriter.appendProperty("X-AIM", "im"); vCardWriter.appendProperty("BDAY", "20000102T000000Z"); - vCardWriter.appendProperty("CATEGORIES", "keywords"); + vCardWriter.appendProperty("CATEGORIES", "keyword1,keyword2"); vCardWriter.appendProperty("X-ASSISTANT", "secretarycn"); vCardWriter.appendProperty("X-MANAGER", "manager"); @@ -159,7 +170,7 @@ public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase assertEquals("secretarycn", contact.get("secretarycn")); assertEquals("manager", contact.get("manager")); assertEquals("spousecn", contact.get("spousecn")); - assertEquals("keywords", contact.get("keywords")); + assertEquals("keyword1,keyword2", contact.get("keywords")); assertEquals("true", contact.get("private")); @@ -168,7 +179,7 @@ public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase } public void testUpdateContact() throws IOException { - ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + ExchangeSession.Contact contact = getCurrentContact(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); @@ -178,7 +189,7 @@ public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); - contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + contact = getCurrentContact(); assertNull(contact.get("cn")); assertNull(contact.get("sn")); assertNull(contact.get("givenName")); @@ -249,87 +260,105 @@ public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase } public void testUpperCaseParamName() throws IOException { - ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + ExchangeSession.Contact contact = getCurrentContact(); - VCardWriter vCardWriter = new VCardWriter(); - vCardWriter.startCard(); - vCardWriter.appendProperty("TEL;TYPE=CELL", "mobile"); - vCardWriter.endCard(); + VCardWriter vCardWriter = new VCardWriter(); + vCardWriter.startCard(); + vCardWriter.appendProperty("TEL;TYPE=CELL", "mobile"); + vCardWriter.endCard(); - ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); - assertEquals(200, result.status); + ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); + assertEquals(200, result.status); - contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + contact = getCurrentContact(); - assertEquals("mobile", contact.get("mobile")); + assertEquals("mobile", contact.get("mobile")); } public void testMultipleTypesParamName() throws IOException { - ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); - VCardWriter vCardWriter = new VCardWriter(); - vCardWriter.startCard(); - vCardWriter.appendProperty("TEL;TYPE=CELL;TYPE=pref", "another mobile"); - vCardWriter.endCard(); + VCardWriter vCardWriter = new VCardWriter(); + vCardWriter.startCard(); + vCardWriter.appendProperty("TEL;TYPE=CELL;TYPE=pref", "another mobile"); + vCardWriter.endCard(); - ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); - assertEquals(200, result.status); + ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); + assertEquals(200, result.status); - contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); - assertEquals("another mobile", contact.get("mobile")); + assertEquals("another mobile", contact.get("mobile")); } public void testLowerCaseTypesParamName() throws IOException { - ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); - VCardWriter vCardWriter = new VCardWriter(); - vCardWriter.startCard(); - vCardWriter.appendProperty("TEL;type=HOME;type=pref", "5 68 99 3"); - vCardWriter.endCard(); + VCardWriter vCardWriter = new VCardWriter(); + vCardWriter.startCard(); + vCardWriter.appendProperty("TEL;type=HOME;type=pref", "5 68 99 3"); + vCardWriter.endCard(); - ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); - assertEquals(200, result.status); + ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); + assertEquals(200, result.status); - contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + + assertEquals("5 68 99 3", contact.get("homePhone")); - assertEquals("5 68 99 3", contact.get("homePhone")); - } public void testKeyPrefix() throws IOException { - ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); - VCardWriter vCardWriter = new VCardWriter(); - vCardWriter.startCard(); - vCardWriter.appendProperty("ITEM1.TEL;TYPE=CELL;TYPE=pref", "mobile with prefix"); - vCardWriter.endCard(); + VCardWriter vCardWriter = new VCardWriter(); + vCardWriter.startCard(); + vCardWriter.appendProperty("ITEM1.TEL;TYPE=CELL;TYPE=pref", "mobile with prefix"); + vCardWriter.endCard(); - ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); - assertEquals(200, result.status); + ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); + assertEquals(200, result.status); - contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); - assertEquals("mobile with prefix", contact.get("mobile")); + assertEquals("mobile with prefix", contact.get("mobile")); } public void testIphonePersonalHomePage() throws IOException { - ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); - VCardWriter vCardWriter = new VCardWriter(); - vCardWriter.startCard(); - vCardWriter.appendProperty("ITEM1.URL", "http://www.myhomepage.org"); - vCardWriter.endCard(); + VCardWriter vCardWriter = new VCardWriter(); + vCardWriter.startCard(); + vCardWriter.appendProperty("ITEM1.URL", "http://www.myhomepage.org"); + vCardWriter.endCard(); - ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); - assertEquals(200, result.status); + ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); + assertEquals(200, result.status); - contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); + contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); - assertEquals("http://www.myhomepage.org", contact.get("personalHomePage")); + assertEquals("http://www.myhomepage.org", contact.get("personalHomePage")); + + } + + + public void testIphoneEncodedCategories() throws IOException { + ExchangeSession.Contact contact = getCurrentContact(); + + VCardWriter vCardWriter = new VCardWriter(); + vCardWriter.startCard(); + vCardWriter.appendProperty("CATEGORIES", "rouge,vert"); + vCardWriter.endCard(); + + ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); + assertEquals(200, result.status); + + contact = getCurrentContact(); + + assertEquals("rouge,vert", contact.get("keywords")); } }