private void updateContact(Contact contact, DataSourceItem dsi, Stats stats) throws ServiceException { int cid = contact.getId(); ContactData cd = new ContactData(contact); if (!cd.isEmpty()) { ParsedContact pc = new ParsedContact(localData.getContact(dsi.itemId)); cd.modifyParsedContact(pc); localData.modifyContact(dsi.itemId, pc); updateContactMapping(dsi.itemId, contact); stats.updated++; LOG.debug("Modified local contact: itemId=%d, cid=%d", dsi.itemId, cid); } else { LOG.debug( "Removing contact with cid %d since changes would " + "result in an empty contact", cid); deleteContact(dsi.itemId, stats); } }
private SyncRequestEvent getContactEvent(Change change) throws ServiceException { int itemId = change.getItemId(); if (change.isAdd() || change.isUpdate()) { com.zimbra.cs.mailbox.Contact zcontact = localData.getContact(itemId); if (ContactGroup.isContactGroup(zcontact)) { // Delete mapping so contact group will no longer be sync'd localData.deleteMapping(itemId); } else { ContactData cd = new ContactData(zcontact); if (change.isAdd()) { Contact contact = cd.getContact(); pushedContacts.put(itemId, contact); return SyncRequestEvent.addContact(contact); } else { // LOG.debug("count = " + cd.getCategories().size()); Contact newContact = cd.getContact(); Contact oldContact = getContact(localData.getMapping(itemId)); // LOG.debug("oldContact: " + oldContact); // LOG.debug("newContact: " + newContact); newContact.setId(oldContact.getId()); // Add categories so we can track updates for (Category category : oldContact.getCategories()) { newContact.addCategory(category); } pushedContacts.put(itemId, newContact); ContactChange cc = cd.getContactChange(oldContact); return cc.isEmpty() ? null : SyncRequestEvent.updateContact(cc); } } } else if (change.isDelete()) { DataSourceItem dsi = localData.getMapping(itemId); RemoteId rid = RemoteId.parse(dsi.remoteId); if (rid.isContact()) { pushedContacts.put(itemId, new Contact(rid.getId())); return SyncRequestEvent.removeContact(rid.getId()); } else { // Remove mapping for deleted contact group localData.deleteMapping(rid.getId()); } } return null; }