blob: 70752b3c0070067a5ad0e3b235b5e5e33f93f052 [file] [log] [blame]
// 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());
}
serializeYomiName(serializer, entry.getYomiName());
}
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);
}
private static void serializeYomiName(XmlSerializer serializer,
String yomiName)
throws IOException {
if (StringUtils.isEmpty(yomiName)) {
return;
}
serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "yomiName");
serializer.text(yomiName);
serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "yomiName");
}
}