summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfmantek <fmantek@google.com>2009-07-17 11:33:04 +0200
committerfmantek <fmantek@google.com>2009-07-20 17:42:05 +0200
commit49cdd8974bdce306f0b897bc4a7d9eda225dfb18 (patch)
treef7008af6223b862c39414c7f8795d447adb438fc
parent79ec156d0b56c9563362873953d607e9c286bf9a (diff)
downloadgdata-49cdd8974bdce306f0b897bc4a7d9eda225dfb18.tar.gz
contacts v3 serializer
Fixed J2ME issues Fixed Debajit Feedback Fixed Jen's comments and removed finally 2 obsolete methods
-rw-r--r--src/com/google/wireless/gdata2/contacts/data/ContactEntry.java4
-rw-r--r--src/com/google/wireless/gdata2/contacts/data/Jot.java6
-rw-r--r--src/com/google/wireless/gdata2/contacts/data/Language.java9
-rw-r--r--src/com/google/wireless/gdata2/contacts/data/StructuredPostalAddress.java21
-rw-r--r--src/com/google/wireless/gdata2/contacts/data/UserDefinedField.java3
-rw-r--r--src/com/google/wireless/gdata2/contacts/parser/xml/XmlContactsGDataParser.java4
-rw-r--r--src/com/google/wireless/gdata2/contacts/parser/xml/XmlNametable.java4
-rw-r--r--src/com/google/wireless/gdata2/contacts/serializer/xml/XmlContactEntryGDataSerializer.java416
8 files changed, 373 insertions, 94 deletions
diff --git a/src/com/google/wireless/gdata2/contacts/data/ContactEntry.java b/src/com/google/wireless/gdata2/contacts/data/ContactEntry.java
index a98ee53..e508ae1 100644
--- a/src/com/google/wireless/gdata2/contacts/data/ContactEntry.java
+++ b/src/com/google/wireless/gdata2/contacts/data/ContactEntry.java
@@ -1,4 +1,4 @@
-// Copyright 2007 The Android Open Source Project
+// Copyright 2009 The Android Open Source Project
package com.google.wireless.gdata2.contacts.data;
@@ -146,7 +146,7 @@ public class ContactEntry extends Entry {
/**
* Accessor to the CalendarLink Collection
*/
- public Vector getcalendarLinks() {
+ public Vector getCalendarLinks() {
return calendarLinks;
}
diff --git a/src/com/google/wireless/gdata2/contacts/data/Jot.java b/src/com/google/wireless/gdata2/contacts/data/Jot.java
index 619e2e4..ce896a7 100644
--- a/src/com/google/wireless/gdata2/contacts/data/Jot.java
+++ b/src/com/google/wireless/gdata2/contacts/data/Jot.java
@@ -22,4 +22,10 @@ public class Jot extends TypedElement {
* default empty constructor
*/
public Jot() {}
+
+ /**
+ * override default behaviour, a jot is not relying on either
+ * label or type
+ */
+ public void validate() throws ParseException {}
}
diff --git a/src/com/google/wireless/gdata2/contacts/data/Language.java b/src/com/google/wireless/gdata2/contacts/data/Language.java
index 2b99942..e04c1e4 100644
--- a/src/com/google/wireless/gdata2/contacts/data/Language.java
+++ b/src/com/google/wireless/gdata2/contacts/data/Language.java
@@ -80,10 +80,15 @@ public class Language {
}
/**
- * Currently empty, will be filled when the parser is done
- *
+ * A Language either has a code or a label, not both
*/
public void validate() throws ParseException {
+ if ((StringUtils.isEmpty(label) &&
+ StringUtils.isEmpty(code)) ||
+ (!StringUtils.isEmpty(label) &&
+ !StringUtils.isEmpty(code))) {
+ throw new ParseException("exactly one of label or code must be set");
+ }
}
}
diff --git a/src/com/google/wireless/gdata2/contacts/data/StructuredPostalAddress.java b/src/com/google/wireless/gdata2/contacts/data/StructuredPostalAddress.java
index 3b3e5f5..49695c1 100644
--- a/src/com/google/wireless/gdata2/contacts/data/StructuredPostalAddress.java
+++ b/src/com/google/wireless/gdata2/contacts/data/StructuredPostalAddress.java
@@ -21,7 +21,6 @@ public class StructuredPostalAddress extends ContactsElement {
private String pobox;
private String neighborhood;
private String city;
- private String subregion;
private String region;
private String postcode;
private String country;
@@ -110,25 +109,6 @@ public class StructuredPostalAddress extends ContactsElement {
this.city = city;
}
- /**
- * Getter for subregion
- * Handles administrative districts such as U.S. or U.K.
- * counties that are not used for mail addressing purposes.
- * Subregion is not intended for delivery addresses.
- */
- public String getSubregion() {
- return this.subregion;
- }
-
- /**
- * Setter for subregion
- * Handles administrative districts such as U.S. or U.K.
- * counties that are not used for mail addressing purposes.
- * Subregion is not intended for delivery addresses.
- */
- public void setSubregion(String subregion) {
- this.subregion = subregion;
- }
/**
* Getter for region
@@ -205,7 +185,6 @@ public class StructuredPostalAddress extends ContactsElement {
if (pobox != null) sb.append(" pobox:").append(pobox);
if (neighborhood != null) sb.append(" neighborhood:").append(neighborhood);
if (city != null) sb.append(" city:").append(city);
- if (subregion != null) sb.append(" subregion:").append(subregion);
if (region != null) sb.append(" region:").append(region);
if (postcode != null) sb.append(" postcode:").append(postcode);
if (country != null) sb.append(" country:").append(country);
diff --git a/src/com/google/wireless/gdata2/contacts/data/UserDefinedField.java b/src/com/google/wireless/gdata2/contacts/data/UserDefinedField.java
index 2ddb8cb..8696422 100644
--- a/src/com/google/wireless/gdata2/contacts/data/UserDefinedField.java
+++ b/src/com/google/wireless/gdata2/contacts/data/UserDefinedField.java
@@ -85,6 +85,9 @@ public class UserDefinedField {
*
*/
public void validate() throws ParseException {
+ if (StringUtils.isEmpty(key)) {
+ throw new ParseException("key has to be set");
+ }
}
}
diff --git a/src/com/google/wireless/gdata2/contacts/parser/xml/XmlContactsGDataParser.java b/src/com/google/wireless/gdata2/contacts/parser/xml/XmlContactsGDataParser.java
index 3020716..cc82148 100644
--- a/src/com/google/wireless/gdata2/contacts/parser/xml/XmlContactsGDataParser.java
+++ b/src/com/google/wireless/gdata2/contacts/parser/xml/XmlContactsGDataParser.java
@@ -501,7 +501,7 @@ public class XmlContactsGDataParser extends XmlGDataParser {
private static void parseContactsElement(ContactsElement element, XmlPullParser parser,
Hashtable relToTypeMap) throws XmlPullParserException {
parseTypedElement(element, parser, relToTypeMap);
- element.setIsPrimary("true".equals(parser.getAttributeValue(null /* ns */, "primary")));
+ element.setIsPrimary("true".equals(parser.getAttributeValue(null /* ns */, XmlNametable.PRIMARY)));
}
private static void parseTypedElement(TypedElement element, XmlPullParser parser,
@@ -578,7 +578,7 @@ public class XmlContactsGDataParser extends XmlGDataParser {
while (true) {
String tag = XmlUtils.nextDirectChildTag(parser, depth);
if (tag == null) break;
- if (XmlNametable.GD_NAME.equals(tag)) {
+ if (XmlNametable.GD_NAME_GIVENNAME.equals(tag)) {
element.setGivenName(XmlUtils.extractChildText(parser));
} else if (XmlNametable.GD_NAME_ADDITIONALNAME.equals(tag)) {
element.setAdditionalNameYomi(
diff --git a/src/com/google/wireless/gdata2/contacts/parser/xml/XmlNametable.java b/src/com/google/wireless/gdata2/contacts/parser/xml/XmlNametable.java
index b7c7d03..44c3219 100644
--- a/src/com/google/wireless/gdata2/contacts/parser/xml/XmlNametable.java
+++ b/src/com/google/wireless/gdata2/contacts/parser/xml/XmlNametable.java
@@ -19,6 +19,7 @@ public final class XmlNametable {
public static String ETAG = "etag";
public static String VALUESTRING = "valueString";
public static String STARTTIME = "startTime";
+ public static String PRIMARY = "primary";
// GD namespace
public static String GD_EMAIL = "email";
@@ -28,6 +29,7 @@ public final class XmlNametable {
public static String GD_IM = "im";
public static String GD_DELETED = "deleted";
public static String GD_NAME = "name";
+ public static String GD_NAME_GIVENNAME = "givenName";
public static String GD_NAME_ADDITIONALNAME = "additionalName";
public static String GD_NAME_YOMI = "yomi";
public static String GD_NAME_FAMILYNAME = "familyName";
@@ -78,4 +80,4 @@ public final class XmlNametable {
public static String GC_SUBJECT = "subject";
public static String GC_UDF = "userDefinedField";
public static String GC_WEBSITE ="website";
-}
+} \ No newline at end of file
diff --git a/src/com/google/wireless/gdata2/contacts/serializer/xml/XmlContactEntryGDataSerializer.java b/src/com/google/wireless/gdata2/contacts/serializer/xml/XmlContactEntryGDataSerializer.java
index 4646490..ead1352 100644
--- a/src/com/google/wireless/gdata2/contacts/serializer/xml/XmlContactEntryGDataSerializer.java
+++ b/src/com/google/wireless/gdata2/contacts/serializer/xml/XmlContactEntryGDataSerializer.java
@@ -1,29 +1,41 @@
-// Copyright 2007 The Android Open Source Project
+// Copyright 2009 The Android Open Source Project
package com.google.wireless.gdata2.contacts.serializer.xml;
+import com.google.wireless.gdata2.contacts.data.CalendarLink;
import com.google.wireless.gdata2.contacts.data.ContactEntry;
import com.google.wireless.gdata2.contacts.data.ContactsElement;
import com.google.wireless.gdata2.contacts.data.EmailAddress;
+import com.google.wireless.gdata2.contacts.data.Event;
+import com.google.wireless.gdata2.contacts.data.ExternalId;
+import com.google.wireless.gdata2.contacts.data.GroupMembershipInfo;
import com.google.wireless.gdata2.contacts.data.ImAddress;
+import com.google.wireless.gdata2.contacts.data.Jot;
+import com.google.wireless.gdata2.contacts.data.Language;
+import com.google.wireless.gdata2.contacts.data.Name;
import com.google.wireless.gdata2.contacts.data.Organization;
import com.google.wireless.gdata2.contacts.data.PhoneNumber;
+import com.google.wireless.gdata2.contacts.data.Relation;
import com.google.wireless.gdata2.contacts.data.StructuredPostalAddress;
-import com.google.wireless.gdata2.contacts.data.GroupMembershipInfo;
+import com.google.wireless.gdata2.contacts.data.TypedElement;
+import com.google.wireless.gdata2.contacts.data.UserDefinedField;
+import com.google.wireless.gdata2.contacts.data.WebSite;
import com.google.wireless.gdata2.contacts.parser.xml.XmlContactsGDataParser;
-import com.google.wireless.gdata2.data.StringUtils;
+import com.google.wireless.gdata2.contacts.parser.xml.XmlNametable;
import com.google.wireless.gdata2.data.ExtendedProperty;
+import com.google.wireless.gdata2.data.StringUtils;
import com.google.wireless.gdata2.parser.ParseException;
import com.google.wireless.gdata2.parser.xml.XmlGDataParser;
import com.google.wireless.gdata2.parser.xml.XmlParserFactory;
import com.google.wireless.gdata2.serializer.xml.XmlEntryGDataSerializer;
-import org.xmlpull.v1.XmlSerializer;
-
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
+import org.xmlpull.v1.XmlSerializer;
+
+
/**
* Serializes Google Contact entries into the Atom XML format.
*/
@@ -54,9 +66,6 @@ public class XmlContactEntryGDataSerializer extends XmlEntryGDataSerializer {
serializeLink(serializer, XmlContactsGDataParser.LINK_REL_PHOTO,
entry.getLinkPhotoHref(), entry.getLinkPhotoType(), entry.getLinkPhotoETag());
- // 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());
@@ -91,24 +100,84 @@ public class XmlContactEntryGDataSerializer extends XmlEntryGDataSerializer {
while (eachGroup.hasMoreElements()) {
serialize(serializer, (GroupMembershipInfo) eachGroup.nextElement());
}
+
+ Enumeration eachCalendar = entry.getCalendarLinks().elements();
+ while (eachCalendar.hasMoreElements()) {
+ serialize(serializer, (CalendarLink) eachCalendar.nextElement());
+ }
+
+ Enumeration eachEvent = entry.getEvents().elements();
+ while (eachEvent.hasMoreElements()) {
+ serialize(serializer, (Event) eachEvent.nextElement());
+ }
+
+ Enumeration eachExternalId = entry.getExternalIds().elements();
+ while (eachExternalId.hasMoreElements()) {
+ serialize(serializer, (ExternalId) eachExternalId.nextElement());
+ }
+
+ Enumeration eachHobby = entry.getHobbies().elements();
+ while (eachHobby.hasMoreElements()) {
+ serializeHobby(serializer, (String) eachHobby.nextElement());
+ }
+
+ Enumeration eachJot = entry.getJots().elements();
+ while (eachJot.hasMoreElements()) {
+ serialize(serializer, (Jot) eachJot.nextElement());
+ }
+
+ Enumeration eachLanguage = entry.getLanguages().elements();
+ while (eachLanguage.hasMoreElements()) {
+ serialize(serializer, (Language) eachLanguage.nextElement());
+ }
+
+ Enumeration eachRelation = entry.getRelations().elements();
+ while (eachRelation.hasMoreElements()) {
+ serialize(serializer, (Relation) eachRelation.nextElement());
+ }
+
+ Enumeration eachUDF = entry.getUserDefinedFields().elements();
+ while (eachUDF.hasMoreElements()) {
+ serialize(serializer, (UserDefinedField) eachUDF.nextElement());
+ }
+
+ // now serialize simple properties
+
+ serializeElement(serializer, entry.getDirectoryServer(), XmlNametable.GC_DIRECTORYSERVER);
+ serializeElement(serializer, entry.getGender(), XmlNametable.GC_GENDER);
+ serializeElement(serializer, entry.getInitials(), XmlNametable.GC_INITIALS);
+ serializeElement(serializer, entry.getMaidenName(), XmlNametable.GC_MAIDENNAME);
+ serializeElement(serializer, entry.getMileage(), XmlNametable.GC_MILEAGE);
+ serializeElement(serializer, entry.getNickname(), XmlNametable.GC_NICKNAME);
+ serializeElement(serializer, entry.getOccupation(), XmlNametable.GC_OCCUPATION);
+ serializeElement(serializer, entry.getShortName(), XmlNametable.GC_SHORTNAME);
+ serializeElement(serializer, entry.getSubject(), XmlNametable.GC_SUBJECT);
+ serializeElement(serializer, entry.getBirthday(), XmlNametable.GC_BIRTHDAY);
+ serializeElement(serializer, entry.getBillingInformation(), XmlNametable.GC_BILLINGINFO);
+ serializeElement(serializer, entry.getPriority(),
+ XmlNametable.GC_PRIORITY, XmlContactsGDataParser.TYPE_TO_REL_PRIORITY);
+ serializeElement(serializer, entry.getSensitivity(),
+ XmlNametable.GC_SENSITIVITY, XmlContactsGDataParser.TYPE_TO_REL_SENSITIVITY);
+
+ serializeName(serializer, entry.getName());
}
private static void serialize(XmlSerializer serializer, EmailAddress email)
throws IOException, ParseException {
if (StringUtils.isEmptyOrWhitespace(email.getAddress())) return;
- serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "email");
+ serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_EMAIL);
serializeContactsElement(serializer, email, XmlContactsGDataParser.TYPE_TO_REL_EMAIL);
- serializer.attribute(null /* ns */, "address", email.getAddress());
- serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "email");
+ serializer.attribute(null /* ns */, XmlNametable.GD_ADDRESS, email.getAddress());
+ serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_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");
+ serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_IM);
serializeContactsElement(serializer, im, XmlContactsGDataParser.TYPE_TO_REL_IM);
- serializer.attribute(null /* ns */, "address", im.getAddress());
+ serializer.attribute(null /* ns */, XmlNametable.GD_ADDRESS, im.getAddress());
String protocolString;
switch (im.getProtocolPredefined()) {
@@ -122,82 +191,119 @@ public class XmlContactEntryGDataSerializer extends XmlEntryGDataSerializer {
throw new IllegalArgumentException(
"the protocol is custom, but the custom string is null");
}
- serializer.attribute(null /* ns */, "protocol", protocolString);
+ serializer.attribute(null /* ns */, XmlNametable.GD_PROTOCOL, protocolString);
break;
default:
protocolString = (String)XmlContactsGDataParser.IM_PROTOCOL_TYPE_TO_STRING_MAP.get(
new Byte(im.getProtocolPredefined()));
- serializer.attribute(null /* ns */, "protocol", protocolString);
+ serializer.attribute(null /* ns */, XmlNametable.GD_PROTOCOL, protocolString);
break;
}
- serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "im");
+ serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_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");
+ serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_PHONENUMBER);
serializeContactsElement(serializer, phone, XmlContactsGDataParser.TYPE_TO_REL_PHONE);
serializer.text(phone.getPhoneNumber());
- serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "phoneNumber");
+ serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_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");
+ serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_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");
+ serializeGDSubelement(serializer, organization.getName(),
+ XmlNametable.GD_ORG_NAME);
+ serializeGDSubelement(serializer, organization.getTitle(),
+ XmlNametable.GD_ORG_TITLE);
+ serializeGDSubelement(serializer, organization.getOrgDepartment(),
+ XmlNametable.GD_ORG_DEPARTMENT);
+ serializeGDSubelement(serializer, organization.getOrgJobDescription(),
+ XmlNametable.GD_ORG_JOBDESC);
+ serializeGDSubelement(serializer, organization.getOrgSymbol(),
+ XmlNametable.GD_ORG_SYMBOL);
+
+ final String where = organization.getWhere();
+ if (!StringUtils.isEmpty(where)) {
+ serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_WHERE);
+ serializer.attribute(null /* ns */, XmlNametable.VALUESTRING, where);
+ serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_WHERE);
}
- 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");
+ serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_ORGANIZATION);
}
+
+ /**
+ * Gets called out of the main serializer loop. Parameters are
+ * not null.
+ *
+ * @param serializer
+ * @param addr
+ */
private static void serialize(XmlSerializer serializer, StructuredPostalAddress addr)
throws IOException, ParseException {
- // todo: replace this with a real check
- // if (StringUtils.isEmptyOrWhitespace(addr.getValue())) return;
- serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "structuredPostalAddress");
+ serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_SPA);
serializeContactsElement(serializer, addr, XmlContactsGDataParser.TYPE_TO_REL_POSTAL);
- // todo: need to write serializer code
- final String addressValue = null;
- if (addressValue != null) serializer.text(addressValue);
- serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "postalAddress");
+ serializeGDSubelement(serializer, addr.getStreet(), XmlNametable.GD_SPA_STREET);
+ serializeGDSubelement(serializer, addr.getPobox(), XmlNametable.GD_SPA_POBOX);
+ serializeGDSubelement(serializer, addr.getNeighborhood(), XmlNametable.GD_SPA_NEIGHBORHOOD);
+ serializeGDSubelement(serializer, addr.getCity(), XmlNametable.GD_SPA_CITY);
+ serializeGDSubelement(serializer, addr.getRegion(), XmlNametable.GD_SPA_REGION);
+ serializeGDSubelement(serializer, addr.getPostcode(), XmlNametable.GD_SPA_POSTCODE);
+ serializeGDSubelement(serializer, addr.getCountry(), XmlNametable.GD_SPA_COUNTRY);
+ serializeGDSubelement(serializer, addr.getFormatedAddress(),
+ XmlNametable.GD_SPA_FORMATTEDADDRESS);
+ serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_SPA);
}
- private static void serializeContactsElement(XmlSerializer serializer, ContactsElement element,
- Hashtable typeToRelMap) throws IOException, ParseException {
+ private static void serializeGDSubelement(XmlSerializer serializer, String value,
+ String elementName)
+ throws IOException, ParseException {
+ if (StringUtils.isEmpty(value)) return;
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_GD_URI, elementName);
+ serializer.text(value);
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_GD_URI, elementName);
+ }
+
+
+ private static void serializeTypedElement(XmlSerializer serializer, TypedElement element,
+ Hashtable typeToRelMap) throws IOException, ParseException {
+
final String label = element.getLabel();
- boolean hasType = element.getType() != ContactsElement.TYPE_NONE;
+ byte type = element.getType();
+ boolean hasType = type != TypedElement.TYPE_NONE;
- if (((label == null) && !hasType) || ((label != null) && hasType)) {
- throw new ParseException("exactly one of label or rel must be set");
- }
+ // validate the element
+ element.validate();
if (label != null) {
- serializer.attribute(null /* ns */, "label", label);
+ serializer.attribute(null /* ns */, XmlNametable.LABEL, label);
}
if (hasType) {
- serializer.attribute(null /* ns */, "rel",
- (String)typeToRelMap.get(new Byte(element.getType())));
+ serializeRelation(serializer, type, typeToRelMap);
}
+ }
+
+ private static void serializeRelation(XmlSerializer serializer, byte type,
+ Hashtable typeToRelMap) throws IOException, ParseException {
+
+ serializer.attribute(null /* ns */, XmlNametable.REL,
+ (String)typeToRelMap.get(new Byte(type)));
+ }
+
+ private static void serializeContactsElement(XmlSerializer serializer, ContactsElement element,
+ Hashtable typeToRelMap) throws IOException, ParseException {
+ serializeTypedElement(serializer, element, typeToRelMap);
if (element.isPrimary()) {
- serializer.attribute(null /* ns */, "primary", "true");
+ serializer.attribute(null /* ns */, XmlNametable.PRIMARY, "true");
}
}
@@ -210,10 +316,10 @@ public class XmlContactEntryGDataSerializer extends XmlEntryGDataSerializer {
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");
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_GMI);
+ serializer.attribute(null /* ns */, XmlNametable.HREF, group);
+ serializer.attribute(null /* ns */, XmlNametable.GD_DELETED, isDeleted ? "true" : "false");
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_GMI);
}
private static void serialize(XmlSerializer serializer, ExtendedProperty extendedProperty)
@@ -222,17 +328,17 @@ public class XmlContactEntryGDataSerializer extends XmlEntryGDataSerializer {
final String value = extendedProperty.getValue();
final String xmlBlob = extendedProperty.getXmlBlob();
- serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, "extendedProperty");
+ serializer.startTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_EXTENDEDPROPERTY);
if (!StringUtils.isEmpty(name)) {
- serializer.attribute(null /* ns */, "name", name);
+ serializer.attribute(null /* ns */, XmlNametable.GD_NAME, name);
}
if (!StringUtils.isEmpty(value)) {
- serializer.attribute(null /* ns */, "value", value);
+ serializer.attribute(null /* ns */, XmlNametable.VALUE, value);
}
if (!StringUtils.isEmpty(xmlBlob)) {
serializeBlob(serializer, xmlBlob);
}
- serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, "extendedProperty");
+ serializer.endTag(XmlGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_EXTENDEDPROPERTY);
}
private static void serializeBlob(XmlSerializer serializer, String blob)
@@ -240,14 +346,192 @@ public class XmlContactEntryGDataSerializer extends XmlEntryGDataSerializer {
serializer.text(blob);
}
- private static void serializeYomiName(XmlSerializer serializer,
- String yomiName)
- throws IOException {
- if (StringUtils.isEmpty(yomiName)) {
- return;
+ /**
+ * takes a typed element and a string value and determines if
+ * the element and the string together should be serialized.
+ * if the string is non empty, or the typedelement is worthy of
+ * serialization, this will return true.
+ *
+ * @param element
+ * @param value
+ *
+ * @return boolean
+ */
+ private static boolean shouldSerialize(TypedElement element, String value)
+ {
+ if (element.getType() != TypedElement.TYPE_NONE) {
+ return true;
+ }
+ if (!StringUtils.isEmptyOrWhitespace(element.getLabel())) {
+ return true;
+ }
+ if (!StringUtils.isEmptyOrWhitespace(value)) {
+ return true;
+ }
+ return false;
+ }
+
+ private static void serialize(XmlSerializer serializer, CalendarLink calendarLink)
+ throws IOException, ParseException {
+ final String href = calendarLink.getHRef();
+
+ if (shouldSerialize(calendarLink, href)) {
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI,
+ XmlNametable.GC_CALENDARLINK);
+ serializeContactsElement(serializer, calendarLink,
+ XmlContactsGDataParser.TYPE_TO_REL_CALENDARLINK);
+ if (!StringUtils.isEmpty(href)) {
+ serializer.attribute(null /* ns */, XmlNametable.HREF, href);
+ }
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI,
+ XmlNametable.GC_CALENDARLINK);
+ }
+ }
+
+ private static void serialize(XmlSerializer serializer, Event event)
+ throws IOException, ParseException {
+ final String startDate = event.getStartDate();
+ if (shouldSerialize(event, startDate)) {
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_EVENT);
+ serializeTypedElement(serializer, event, XmlContactsGDataParser.TYPE_TO_REL_EVENT);
+ if (!StringUtils.isEmpty(startDate)) {
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_WHEN);
+ serializer.attribute(null /* ns */, XmlNametable.STARTTIME, startDate);
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_WHEN);
+ }
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_EVENT);
+ }
+ }
+
+ private static void serialize(XmlSerializer serializer, ExternalId externalId)
+ throws IOException, ParseException {
+ final String value = externalId.getValue();
+ if (shouldSerialize(externalId, value)) {
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI,
+ XmlNametable.GC_EXTERNALID);
+ serializeTypedElement(serializer, externalId,
+ XmlContactsGDataParser.TYPE_TO_REL_EXTERNALID);
+ if (!StringUtils.isEmpty(value)) {
+ serializer.attribute(null /* ns */, XmlNametable.VALUE, value);
+ }
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI,
+ XmlNametable.GC_EXTERNALID);
+ }
+ }
+
+ private static void serializeHobby(XmlSerializer serializer, String hobby)
+ throws IOException, ParseException {
+ if (StringUtils.isEmptyOrWhitespace(hobby)) return;
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_HOBBY);
+ serializer.text(hobby);
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_HOBBY);
+ }
+
+ private static void serialize(XmlSerializer serializer, Jot jot)
+ throws IOException, ParseException {
+ final String value = jot.getLabel();
+
+ if (!StringUtils.isEmptyOrWhitespace(value)) {
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_JOT);
+ serializeRelation(serializer, jot.getType(), XmlContactsGDataParser.TYPE_TO_REL_JOT);
+ serializer.text(value);
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_JOT);
+ }
+ }
+
+ private static void serialize(XmlSerializer serializer, Language language)
+ throws IOException, ParseException {
+ language.validate();
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_LANGUAGE);
+ final String value = language.getCode();
+ if (!StringUtils.isEmptyOrWhitespace(value)) {
+ serializer.attribute(null /* ns */, XmlNametable.CODE, value);
+ } else {
+ serializer.attribute(null /* ns */, XmlNametable.LABEL, language.getLabel());
+ }
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_LANGUAGE);
+ }
+
+ private static void serialize(XmlSerializer serializer, Relation relation)
+ throws IOException, ParseException {
+ final String value = relation.getText();
+ if (shouldSerialize(relation, value)) {
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_RELATION);
+ serializeTypedElement(serializer, relation, XmlContactsGDataParser.TYPE_TO_REL_RELATION);
+ serializer.text(value);
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_RELATION);
+ }
+ }
+
+ private static void serialize(XmlSerializer serializer, UserDefinedField udf)
+ throws IOException, ParseException {
+ udf.validate();
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_UDF);
+ serializer.attribute(null /* ns */, XmlNametable.KEY, udf.getKey());
+ serializer.attribute(null /* ns */, XmlNametable.VALUE, udf.getValue());
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_UDF);
+ }
+
+ private static void serialize(XmlSerializer serializer, WebSite webSite)
+ throws IOException, ParseException {
+ final String href = webSite.getHRef();
+
+ if (shouldSerialize(webSite, href)) {
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_WEBSITE);
+ serializeContactsElement(serializer, webSite, XmlContactsGDataParser.TYPE_TO_REL_WEBSITE);
+ if (!StringUtils.isEmpty(href)) {
+ serializer.attribute(null /* ns */, XmlNametable.HREF, href);
+ }
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, XmlNametable.GC_WEBSITE);
+ }
+ }
+
+ private static void serializeElement(XmlSerializer serializer, String value, String elementName)
+ throws IOException, ParseException {
+ if (StringUtils.isEmpty(value)) return;
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, elementName);
+ serializer.text(value);
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, elementName);
+ }
+
+ private static void serializeElement(XmlSerializer serializer, byte value, String elementName,
+ Hashtable typeToRelMap) throws IOException, ParseException {
+ if (value == TypedElement.TYPE_NONE) return;
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, elementName);
+ serializeRelation(serializer, value, typeToRelMap);
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, elementName);
+ }
+
+ private static void serializeName(XmlSerializer serializer, Name name)
+ throws IOException, ParseException {
+
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_NAME);
+ serializeNameSubelement(serializer, name.getGivenName(),
+ name.getGivenNameYomi(), XmlNametable.GD_NAME_GIVENNAME);
+ serializeNameSubelement(serializer, name.getAdditionalName(),
+ name.getAdditionalNameYomi(), XmlNametable.GD_NAME_ADDITIONALNAME);
+ serializeNameSubelement(serializer, name.getFamilyName(),
+ name.getFamilyNameYomi(), XmlNametable.GD_NAME_FAMILYNAME);
+ serializeNameSubelement(serializer, name.getAdditionalName(),
+ name.getAdditionalNameYomi(), XmlNametable.GD_NAME_ADDITIONALNAME);
+ serializeNameSubelement(serializer, name.getNamePrefix(),
+ null /* yomi */, XmlNametable.GD_NAME_PREFIX);
+ serializeNameSubelement(serializer, name.getNameSuffix(),
+ null /* yomi */, XmlNametable.GD_NAME_SUFFIX);
+ serializeNameSubelement(serializer, name.getFullName(),
+ null /* yomi */, XmlNametable.GD_NAME_FULLNAME);
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_GD_URI, XmlNametable.GD_NAME);
+ }
+
+ private static void serializeNameSubelement(XmlSerializer serializer, String value,
+ String yomi, String elementName)
+ throws IOException, ParseException {
+ if (StringUtils.isEmpty(value)) return;
+ serializer.startTag(XmlContactsGDataParser.NAMESPACE_GD_URI, elementName);
+ if (!StringUtils.isEmpty(yomi)) {
+ serializer.attribute(null /* ns */, XmlNametable.GD_NAME_YOMI, yomi);
}
- serializer.startTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "yomiName");
- serializer.text(yomiName);
- serializer.endTag(XmlContactsGDataParser.NAMESPACE_CONTACTS_URI, "yomiName");
+ serializer.text(value);
+ serializer.endTag(XmlContactsGDataParser.NAMESPACE_GD_URI, elementName);
}
}