summaryrefslogtreecommitdiff
path: root/src/com/google/wireless/gdata/contacts/serializer/xml/XmlContactEntryGDataSerializer.java
diff options
context:
space:
mode:
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.java243
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);
+ }
+}