diff options
Diffstat (limited to 'src/com/google/wireless/gdata/contacts/serializer/xml/XmlContactEntryGDataSerializer.java')
-rw-r--r-- | src/com/google/wireless/gdata/contacts/serializer/xml/XmlContactEntryGDataSerializer.java | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/src/com/google/wireless/gdata/contacts/serializer/xml/XmlContactEntryGDataSerializer.java b/src/com/google/wireless/gdata/contacts/serializer/xml/XmlContactEntryGDataSerializer.java new file mode 100644 index 0000000..670e24b --- /dev/null +++ b/src/com/google/wireless/gdata/contacts/serializer/xml/XmlContactEntryGDataSerializer.java @@ -0,0 +1,243 @@ +// Copyright 2007 The Android Open Source Project + +package com.google.wireless.gdata.contacts.serializer.xml; + +import com.google.wireless.gdata.contacts.data.ContactEntry; +import com.google.wireless.gdata.contacts.data.ContactsElement; +import com.google.wireless.gdata.contacts.data.EmailAddress; +import com.google.wireless.gdata.contacts.data.ImAddress; +import com.google.wireless.gdata.contacts.data.Organization; +import com.google.wireless.gdata.contacts.data.PhoneNumber; +import com.google.wireless.gdata.contacts.data.PostalAddress; +import com.google.wireless.gdata.contacts.data.GroupMembershipInfo; +import com.google.wireless.gdata.contacts.parser.xml.XmlContactsGDataParser; +import com.google.wireless.gdata.data.StringUtils; +import com.google.wireless.gdata.data.ExtendedProperty; +import com.google.wireless.gdata.parser.ParseException; +import com.google.wireless.gdata.parser.xml.XmlGDataParser; +import com.google.wireless.gdata.parser.xml.XmlParserFactory; +import com.google.wireless.gdata.serializer.xml.XmlEntryGDataSerializer; + +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; +import java.util.Enumeration; +import java.util.Hashtable; + +/** + * Serializes Google Contact entries into the Atom XML format. + */ +public class XmlContactEntryGDataSerializer extends XmlEntryGDataSerializer { + + public XmlContactEntryGDataSerializer(XmlParserFactory factory, ContactEntry entry) { + super(factory, entry); + } + + @Override + protected void declareExtraEntryNamespaces(XmlSerializer serializer) throws IOException { + super.declareExtraEntryNamespaces(serializer); + serializer.setPrefix(XmlContactsGDataParser.NAMESPACE_CONTACTS, + XmlContactsGDataParser.NAMESPACE_CONTACTS_URI); + } + + protected ContactEntry getContactEntry() { + return (ContactEntry) getEntry(); + } + + /* (non-Javadoc) + * @see XmlEntryGDataSerializer#serializeExtraEntryContents + */ + protected void serializeExtraEntryContents(XmlSerializer serializer, int format) + throws ParseException, IOException { + ContactEntry entry = getContactEntry(); + entry.validate(); + + serializeLink(serializer, XmlContactsGDataParser.LINK_REL_EDIT_PHOTO, + entry.getLinkEditPhotoHref(), entry.getLinkEditPhotoType()); + serializeLink(serializer, XmlContactsGDataParser.LINK_REL_PHOTO, + entry.getLinkPhotoHref(), entry.getLinkPhotoType()); + + // Serialize the contact specific parts of this entry. Note that + // gd:ContactSection and gd:geoPt are likely to be deprecated, and + // are not currently serialized. + Enumeration eachEmail = entry.getEmailAddresses().elements(); + while (eachEmail.hasMoreElements()) { + serialize(serializer, (EmailAddress) eachEmail.nextElement()); + } + + Enumeration eachIm = entry.getImAddresses().elements(); + while (eachIm.hasMoreElements()) { + serialize(serializer, (ImAddress) eachIm.nextElement()); + } + + Enumeration eachPhone = entry.getPhoneNumbers().elements(); + while (eachPhone.hasMoreElements()) { + serialize(serializer, (PhoneNumber) eachPhone.nextElement()); + } + + Enumeration eachAddress = entry.getPostalAddresses().elements(); + while (eachAddress.hasMoreElements()) { + serialize(serializer, (PostalAddress) eachAddress.nextElement()); + } + + Enumeration eachOrganization = entry.getOrganizations().elements(); + while (eachOrganization.hasMoreElements()) { + serialize(serializer, (Organization) eachOrganization.nextElement()); + } + + Enumeration eachExtendedProperty = entry.getExtendedProperties().elements(); + while (eachExtendedProperty.hasMoreElements()) { + serialize(serializer, (ExtendedProperty) eachExtendedProperty.nextElement()); + } + + Enumeration eachGroup = entry.getGroups().elements(); + while (eachGroup.hasMoreElements()) { + serialize(serializer, (GroupMembershipInfo) eachGroup.nextElement()); + } + } + + private static void serialize(XmlSerializer serializer, EmailAddress email) + throws IOException, ParseException { + if (StringUtils.isEmptyOrWhitespace(email.getAddress())) return; + serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "email"); + serializeContactsElement(serializer, email, XmlContactsGDataParser.TYPE_TO_REL_EMAIL); + serializer.attribute(null /* ns */, "address", email.getAddress()); + serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "email"); + } + + private static void serialize(XmlSerializer serializer, ImAddress im) + throws IOException, ParseException { + if (StringUtils.isEmptyOrWhitespace(im.getAddress())) return; + + serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "im"); + serializeContactsElement(serializer, im, XmlContactsGDataParser.TYPE_TO_REL_IM); + serializer.attribute(null /* ns */, "address", im.getAddress()); + + String protocolString; + switch (im.getProtocolPredefined()) { + case ImAddress.PROTOCOL_NONE: + // don't include the attribute if no protocol was specified + break; + + case ImAddress.PROTOCOL_CUSTOM: + protocolString = im.getProtocolCustom(); + if (protocolString == null) { + throw new IllegalArgumentException( + "the protocol is custom, but the custom string is null"); + } + serializer.attribute(null /* ns */, "protocol", protocolString); + break; + + default: + protocolString = (String)XmlContactsGDataParser.IM_PROTOCOL_TYPE_TO_STRING_MAP.get( + new Byte(im.getProtocolPredefined())); + serializer.attribute(null /* ns */, "protocol", protocolString); + break; + } + + serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "im"); + } + + private static void serialize(XmlSerializer serializer, PhoneNumber phone) + throws IOException, ParseException { + if (StringUtils.isEmptyOrWhitespace(phone.getPhoneNumber())) return; + serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "phoneNumber"); + serializeContactsElement(serializer, phone, XmlContactsGDataParser.TYPE_TO_REL_PHONE); + serializer.text(phone.getPhoneNumber()); + serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "phoneNumber"); + } + + private static void serialize(XmlSerializer serializer, Organization organization) + throws IOException, ParseException { + final String name = organization.getName(); + final String title = organization.getTitle(); + + if (StringUtils.isEmptyOrWhitespace(name) && StringUtils.isEmptyOrWhitespace(title)) return; + + serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "organization"); + serializeContactsElement(serializer, + organization, XmlContactsGDataParser.TYPE_TO_REL_ORGANIZATION); + if (!StringUtils.isEmpty(name)) { + serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "orgName"); + serializer.text(name); + serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "orgName"); + } + + if (!StringUtils.isEmpty(title)) { + serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "orgTitle"); + serializer.text(title); + serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "orgTitle"); + } + serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "organization"); + } + + private static void serialize(XmlSerializer serializer, PostalAddress addr) + throws IOException, ParseException { + if (StringUtils.isEmptyOrWhitespace(addr.getValue())) return; + serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "postalAddress"); + serializeContactsElement(serializer, addr, XmlContactsGDataParser.TYPE_TO_REL_POSTAL); + final String addressValue = addr.getValue(); + if (addressValue != null) serializer.text(addressValue); + serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "postalAddress"); + } + + private static void serializeContactsElement(XmlSerializer serializer, ContactsElement element, + Hashtable typeToRelMap) throws IOException, ParseException { + final String label = element.getLabel(); + boolean hasType = element.getType() != ContactsElement.TYPE_NONE; + + if (((label == null) && !hasType) || ((label != null) && hasType)) { + throw new ParseException("exactly one of label or rel must be set"); + } + + if (label != null) { + serializer.attribute(null /* ns */, "label", label); + } + if (hasType) { + serializer.attribute(null /* ns */, "rel", + (String)typeToRelMap.get(new Byte(element.getType()))); + } + if (element.isPrimary()) { + serializer.attribute(null /* ns */, "primary", "true"); + } + } + + private static void serialize(XmlSerializer serializer, GroupMembershipInfo groupMembershipInfo) + throws IOException, ParseException { + final String group = groupMembershipInfo.getGroup(); + final boolean isDeleted = groupMembershipInfo.isDeleted(); + + if (StringUtils.isEmptyOrWhitespace(group)) { + throw new ParseException("the group must not be empty"); + } + + serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "groupMembershipInfo"); + serializer.attribute(null /* ns */, "href", group); + serializer.attribute(null /* ns */, "deleted", isDeleted ? "true" : "false"); + serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "groupMembershipInfo"); + } + + private static void serialize(XmlSerializer serializer, ExtendedProperty extendedProperty) + throws IOException, ParseException { + final String name = extendedProperty.getName(); + final String value = extendedProperty.getValue(); + final String xmlBlob = extendedProperty.getXmlBlob(); + + serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "extendedProperty"); + if (!StringUtils.isEmpty(name)) { + serializer.attribute(null /* ns */, "name", name); + } + if (!StringUtils.isEmpty(value)) { + serializer.attribute(null /* ns */, "value", value); + } + if (!StringUtils.isEmpty(xmlBlob)) { + serializeBlob(serializer, xmlBlob); + } + serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "extendedProperty"); + } + + private static void serializeBlob(XmlSerializer serializer, String blob) + throws IOException, ParseException { + serializer.text(blob); + } +} |