PageRenderTime 39ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/src/com/google/wireless/gdata/contacts/serializer/xml/XmlContactEntryGDataSerializer.java

https://github.com/Jib-BAOSP/platform_external_gdata
Java | 256 lines | 204 code | 41 blank | 11 comment | 36 complexity | ac5de8e8af7cc1d59be9018619a7f8d4 MD5 | raw file
  1. // Copyright 2007 The Android Open Source Project
  2. package com.google.wireless.gdata.contacts.serializer.xml;
  3. import com.google.wireless.gdata.contacts.data.ContactEntry;
  4. import com.google.wireless.gdata.contacts.data.ContactsElement;
  5. import com.google.wireless.gdata.contacts.data.EmailAddress;
  6. import com.google.wireless.gdata.contacts.data.ImAddress;
  7. import com.google.wireless.gdata.contacts.data.Organization;
  8. import com.google.wireless.gdata.contacts.data.PhoneNumber;
  9. import com.google.wireless.gdata.contacts.data.PostalAddress;
  10. import com.google.wireless.gdata.contacts.data.GroupMembershipInfo;
  11. import com.google.wireless.gdata.contacts.parser.xml.XmlContactsGDataParser;
  12. import com.google.wireless.gdata.data.StringUtils;
  13. import com.google.wireless.gdata.data.ExtendedProperty;
  14. import com.google.wireless.gdata.parser.ParseException;
  15. import com.google.wireless.gdata.parser.xml.XmlGDataParser;
  16. import com.google.wireless.gdata.parser.xml.XmlParserFactory;
  17. import com.google.wireless.gdata.serializer.xml.XmlEntryGDataSerializer;
  18. import org.xmlpull.v1.XmlSerializer;
  19. import java.io.IOException;
  20. import java.util.Enumeration;
  21. import java.util.Hashtable;
  22. /**
  23. * Serializes Google Contact entries into the Atom XML format.
  24. */
  25. public class XmlContactEntryGDataSerializer extends XmlEntryGDataSerializer {
  26. public XmlContactEntryGDataSerializer(XmlParserFactory factory, ContactEntry entry) {
  27. super(factory, entry);
  28. }
  29. @Override
  30. protected void declareExtraEntryNamespaces(XmlSerializer serializer) throws IOException {
  31. super.declareExtraEntryNamespaces(serializer);
  32. serializer.setPrefix(XmlContactsGDataParser.NAMESPACE_CONTACTS,
  33. XmlContactsGDataParser.NAMESPACE_CONTACTS_URI);
  34. }
  35. protected ContactEntry getContactEntry() {
  36. return (ContactEntry) getEntry();
  37. }
  38. /* (non-Javadoc)
  39. * @see XmlEntryGDataSerializer#serializeExtraEntryContents
  40. */
  41. protected void serializeExtraEntryContents(XmlSerializer serializer, int format)
  42. throws ParseException, IOException {
  43. ContactEntry entry = getContactEntry();
  44. entry.validate();
  45. serializeLink(serializer, XmlContactsGDataParser.LINK_REL_EDIT_PHOTO,
  46. entry.getLinkEditPhotoHref(), entry.getLinkEditPhotoType());
  47. serializeLink(serializer, XmlContactsGDataParser.LINK_REL_PHOTO,
  48. entry.getLinkPhotoHref(), entry.getLinkPhotoType());
  49. // Serialize the contact specific parts of this entry. Note that
  50. // gd:ContactSection and gd:geoPt are likely to be deprecated, and
  51. // are not currently serialized.
  52. Enumeration eachEmail = entry.getEmailAddresses().elements();
  53. while (eachEmail.hasMoreElements()) {
  54. serialize(serializer, (EmailAddress) eachEmail.nextElement());
  55. }
  56. Enumeration eachIm = entry.getImAddresses().elements();
  57. while (eachIm.hasMoreElements()) {
  58. serialize(serializer, (ImAddress) eachIm.nextElement());
  59. }
  60. Enumeration eachPhone = entry.getPhoneNumbers().elements();
  61. while (eachPhone.hasMoreElements()) {
  62. serialize(serializer, (PhoneNumber) eachPhone.nextElement());
  63. }
  64. Enumeration eachAddress = entry.getPostalAddresses().elements();
  65. while (eachAddress.hasMoreElements()) {
  66. serialize(serializer, (PostalAddress) eachAddress.nextElement());
  67. }
  68. Enumeration eachOrganization = entry.getOrganizations().elements();
  69. while (eachOrganization.hasMoreElements()) {
  70. serialize(serializer, (Organization) eachOrganization.nextElement());
  71. }
  72. Enumeration eachExtendedProperty = entry.getExtendedProperties().elements();
  73. while (eachExtendedProperty.hasMoreElements()) {
  74. serialize(serializer, (ExtendedProperty) eachExtendedProperty.nextElement());
  75. }
  76. Enumeration eachGroup = entry.getGroups().elements();
  77. while (eachGroup.hasMoreElements()) {
  78. serialize(serializer, (GroupMembershipInfo) eachGroup.nextElement());
  79. }
  80. serializeYomiName(serializer, entry.getYomiName());
  81. }
  82. private static void serialize(XmlSerializer serializer, EmailAddress email)
  83. throws IOException, ParseException {
  84. if (StringUtils.isEmptyOrWhitespace(email.getAddress())) return;
  85. serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "email");
  86. serializeContactsElement(serializer, email, XmlContactsGDataParser.TYPE_TO_REL_EMAIL);
  87. serializer.attribute(null /* ns */, "address", email.getAddress());
  88. serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "email");
  89. }
  90. private static void serialize(XmlSerializer serializer, ImAddress im)
  91. throws IOException, ParseException {
  92. if (StringUtils.isEmptyOrWhitespace(im.getAddress())) return;
  93. serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "im");
  94. serializeContactsElement(serializer, im, XmlContactsGDataParser.TYPE_TO_REL_IM);
  95. serializer.attribute(null /* ns */, "address", im.getAddress());
  96. String protocolString;
  97. switch (im.getProtocolPredefined()) {
  98. case ImAddress.PROTOCOL_NONE:
  99. // don't include the attribute if no protocol was specified
  100. break;
  101. case ImAddress.PROTOCOL_CUSTOM:
  102. protocolString = im.getProtocolCustom();
  103. if (protocolString == null) {
  104. throw new IllegalArgumentException(
  105. "the protocol is custom, but the custom string is null");
  106. }
  107. serializer.attribute(null /* ns */, "protocol", protocolString);
  108. break;
  109. default:
  110. protocolString = (String)XmlContactsGDataParser.IM_PROTOCOL_TYPE_TO_STRING_MAP.get(
  111. new Byte(im.getProtocolPredefined()));
  112. serializer.attribute(null /* ns */, "protocol", protocolString);
  113. break;
  114. }
  115. serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "im");
  116. }
  117. private static void serialize(XmlSerializer serializer, PhoneNumber phone)
  118. throws IOException, ParseException {
  119. if (StringUtils.isEmptyOrWhitespace(phone.getPhoneNumber())) return;
  120. serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "phoneNumber");
  121. serializeContactsElement(serializer, phone, XmlContactsGDataParser.TYPE_TO_REL_PHONE);
  122. serializer.text(phone.getPhoneNumber());
  123. serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "phoneNumber");
  124. }
  125. private static void serialize(XmlSerializer serializer, Organization organization)
  126. throws IOException, ParseException {
  127. final String name = organization.getName();
  128. final String title = organization.getTitle();
  129. if (StringUtils.isEmptyOrWhitespace(name) && StringUtils.isEmptyOrWhitespace(title)) return;
  130. serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "organization");
  131. serializeContactsElement(serializer,
  132. organization, XmlContactsGDataParser.TYPE_TO_REL_ORGANIZATION);
  133. if (!StringUtils.isEmpty(name)) {
  134. serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "orgName");
  135. serializer.text(name);
  136. serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "orgName");
  137. }
  138. if (!StringUtils.isEmpty(title)) {
  139. serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "orgTitle");
  140. serializer.text(title);
  141. serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "orgTitle");
  142. }
  143. serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "organization");
  144. }
  145. private static void serialize(XmlSerializer serializer, PostalAddress addr)
  146. throws IOException, ParseException {
  147. if (StringUtils.isEmptyOrWhitespace(addr.getValue())) return;
  148. serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "postalAddress");
  149. serializeContactsElement(serializer, addr, XmlContactsGDataParser.TYPE_TO_REL_POSTAL);
  150. final String addressValue = addr.getValue();
  151. if (addressValue != null) serializer.text(addressValue);
  152. serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "postalAddress");
  153. }
  154. private static void serializeContactsElement(XmlSerializer serializer, ContactsElement element,
  155. Hashtable typeToRelMap) throws IOException, ParseException {
  156. final String label = element.getLabel();
  157. boolean hasType = element.getType() != ContactsElement.TYPE_NONE;
  158. if (((label == null) && !hasType) || ((label != null) && hasType)) {
  159. throw new ParseException("exactly one of label or rel must be set");
  160. }
  161. if (label != null) {
  162. serializer.attribute(null /* ns */, "label", label);
  163. }
  164. if (hasType) {
  165. serializer.attribute(null /* ns */, "rel",
  166. (String)typeToRelMap.get(new Byte(element.getType())));
  167. }
  168. if (element.isPrimary()) {
  169. serializer.attribute(null /* ns */, "primary", "true");
  170. }
  171. }
  172. private static void serialize(XmlSerializer serializer, GroupMembershipInfo groupMembershipInfo)
  173. throws IOException, ParseException {
  174. final String group = groupMembershipInfo.getGroup();
  175. final boolean isDeleted = groupMembershipInfo.isDeleted();
  176. if (StringUtils.isEmptyOrWhitespace(group)) {
  177. throw new ParseException("the group must not be empty");
  178. }
  179. serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "groupMembershipInfo");
  180. serializer.attribute(null /* ns */, "href", group);
  181. serializer.attribute(null /* ns */, "deleted", isDeleted ? "true" : "false");
  182. serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "groupMembershipInfo");
  183. }
  184. private static void serialize(XmlSerializer serializer, ExtendedProperty extendedProperty)
  185. throws IOException, ParseException {
  186. final String name = extendedProperty.getName();
  187. final String value = extendedProperty.getValue();
  188. final String xmlBlob = extendedProperty.getXmlBlob();
  189. serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "extendedProperty");
  190. if (!StringUtils.isEmpty(name)) {
  191. serializer.attribute(null /* ns */, "name", name);
  192. }
  193. if (!StringUtils.isEmpty(value)) {
  194. serializer.attribute(null /* ns */, "value", value);
  195. }
  196. if (!StringUtils.isEmpty(xmlBlob)) {
  197. serializeBlob(serializer, xmlBlob);
  198. }
  199. serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "extendedProperty");
  200. }
  201. private static void serializeBlob(XmlSerializer serializer, String blob)
  202. throws IOException, ParseException {
  203. serializer.text(blob);
  204. }
  205. private static void serializeYomiName(XmlSerializer serializer,
  206. String yomiName)
  207. throws IOException {
  208. if (StringUtils.isEmpty(yomiName)) {
  209. return;
  210. }
  211. serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "yomiName");
  212. serializer.text(yomiName);
  213. serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "yomiName");
  214. }
  215. }