com.googlecode.gwtphonegap.client.contacts.browser.ContactBrowserImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.googlecode.gwtphonegap.client.contacts.browser.ContactBrowserImpl.java

Source

/*
 * Copyright 2011 Daniel Kurka
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.googlecode.gwtphonegap.client.contacts.browser;

import java.util.Date;

import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONNull;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.googlecode.gwtphonegap.client.contacts.Contact;
import com.googlecode.gwtphonegap.client.contacts.ContactAddress;
import com.googlecode.gwtphonegap.client.contacts.ContactField;
import com.googlecode.gwtphonegap.client.contacts.ContactName;
import com.googlecode.gwtphonegap.client.contacts.ContactOrganisation;
import com.googlecode.gwtphonegap.collection.shared.CollectionFactory;
import com.googlecode.gwtphonegap.collection.shared.LightArray;

public class ContactBrowserImpl implements Contact {

    private static final String CONTACT_FIELD_PREF = "pref";

    private static final String CONTACT_FIELD_VALUE = "value";

    private static final String CONTACT_FIELD_TYPE = "type";

    private static final String NAME_SUFFIX = "suffix";

    private static final String NAME_PREFIX = "prefix";

    private static final String NAME_MIDDLE_NAME = "middleName";

    private static final String NAME_GIVEN_NAME = "givenName";

    private static final String NAME_FAMILY_NAME = "familyName";

    private static final String NAME_FORMATTED = "formatted";

    private static final String ADDRESS_COUNTRY = "country";

    private static final String ADDRESS_POSTAL_CODE = "postalCode";

    private static final String ADDRESS_REGION = "region";

    private static final String ADDRESS_LOCALITY = "locality";

    private static final String ADDRESS_STREET_ADDRESS = "streetAddress";

    private static final String ADDRESS_FORMATTED = "formatted";

    private static final String ORGANISATION_TITLE = "title";

    private static final String ORGANISATION_DEPARTMENT = "department";

    private static final String ORGANISATION_TYPE = "type";

    private static final String ORGANISATION_PREF = "pref";

    private static final String CONTACT_ORGANISATION = "organisation";

    private static final String CONTACT_ADDRESSES = "addresses";

    private static final String CONTACT_NAME = "name";

    private static final String CONTACT_URLS = "urls";

    private static final String CONTACT_CATEGORIES = "categories";

    private static final String CONTACT_PHOTOS = "photos";

    private static final String CONTACT_IMS = "ims";

    private static final String CONTACT_EMAILS = "emails";

    private static final String CONTACT_PHONE_NUMBERS = "phoneNumbers";

    private static final String CONTACT_BIRTHDAY = "birthday";

    private static final String CONTACT_NOTE = "note";

    private static final String CONTACT_NICK_NAME = "nickName";

    private static final String CONTACT_DISPLAY_NAME = "displayName";

    private static final String FIELD_ID = "id";

    private static final String ORGANISATION_NAME = "name";

    private static final String ADDRESS_TYPE = "type";

    private static final String ADDRESS_PREF = "pref";

    private final ContactsBrowserImpl contactBrowserImpl;

    private String id;
    private String displayName;
    private String nickName;
    private Date birthday;
    private String note;

    private ContactName contactName;

    private LightArray<ContactField> phoneNumbers;

    private LightArray<ContactField> emails;

    private LightArray<ContactAddress> contactAddresses;

    private LightArray<ContactField> ims;

    private LightArray<ContactOrganisation> organisations;

    private LightArray<ContactField> photos;

    private LightArray<ContactField> categories;

    private LightArray<ContactField> urls;

    public ContactBrowserImpl(ContactsBrowserImpl contactBrowserImpl) {
        this.contactBrowserImpl = contactBrowserImpl;

    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void setDisplayName(String displayName) {
        this.displayName = displayName;

    }

    @Override
    public String getDisplayName() {
        if (displayName == null || "".equals(displayName)) {
            String first = getName().getGivenName();
            String lastName = getName().getGivenName();

            String disp = "";
            if (first != null) {
                disp += first + " ";

            }
            if (lastName != null) {
                disp += lastName;
            }
            displayName = disp;
        }

        return displayName;
    }

    @Override
    public void setName(ContactName contactName) {
        this.contactName = contactName;

    }

    @Override
    public ContactName getName() {
        if (contactName == null) {
            contactName = new ContactNameBrowserImpl();
        }
        return contactName;
    }

    @Override
    public void setNickName(String name) {
        this.nickName = name;

    }

    @Override
    public String getNickName() {
        return nickName;
    }

    @Override
    public LightArray<ContactField> getPhoneNumbers() {
        if (phoneNumbers == null) {
            phoneNumbers = CollectionFactory.constructArray();
        }
        return this.phoneNumbers;
    }

    @Override
    public void setPhoneNumbers(LightArray<ContactField> array) {
        this.phoneNumbers = array;

    }

    @Override
    public void setEmails(LightArray<ContactField> emails) {
        this.emails = emails;

    }

    @Override
    public LightArray<ContactField> getEmails() {
        if (emails == null) {
            emails = CollectionFactory.constructArray();
        }
        return emails;
    }

    @Override
    public void setContactAddresses(LightArray<ContactAddress> contactAddresses) {
        this.contactAddresses = contactAddresses;

    }

    @Override
    public LightArray<ContactAddress> getContactAddresses() {
        if (contactAddresses == null) {
            contactAddresses = CollectionFactory.constructArray();
        }
        return contactAddresses;
    }

    @Override
    public void setIms(LightArray<ContactField> ims) {
        this.ims = ims;

    }

    @Override
    public LightArray<ContactField> getIms() {
        if (ims == null) {
            ims = CollectionFactory.constructArray();
        }
        return ims;
    }

    @Override
    public void setOrganisations(LightArray<ContactOrganisation> organisations) {
        this.organisations = organisations;

    }

    @Override
    public LightArray<ContactOrganisation> getOrganisations() {
        if (organisations == null) {
            organisations = CollectionFactory.constructArray();
        }
        return this.organisations;
    }

    @Override
    public Date getBirthDay() {
        return birthday;
    }

    @Override
    public void setBirthDay(Date birthday) {
        this.birthday = birthday;

    }

    @Override
    public void setNote(String note) {
        this.note = note;

    }

    @Override
    public String getNote() {
        return note;
    }

    @Override
    public void setPhotos(LightArray<ContactField> photos) {
        this.photos = photos;

    }

    @Override
    public LightArray<ContactField> getPhotos() {
        if (photos == null) {
            photos = CollectionFactory.constructArray();
        }
        return photos;
    }

    @Override
    public void setCategories(LightArray<ContactField> categories) {
        this.categories = categories;

    }

    @Override
    public LightArray<ContactField> getCategories() {
        if (categories == null) {
            categories = CollectionFactory.constructArray();
        }
        return categories;
    }

    @Override
    public void setUrls(LightArray<ContactField> urls) {
        this.urls = urls;

    }

    @Override
    public LightArray<ContactField> getUrls() {
        if (urls == null) {
            urls = CollectionFactory.constructArray();
        }
        return this.urls;
    }

    @Override
    public void remove() {
        contactBrowserImpl.remove(this);

    }

    @Override
    public void save() {
        contactBrowserImpl.save(this);

    }

    @Override
    public Contact cloneContact() {
        return contactBrowserImpl.cloneContact(this);
    }

    public static Contact fromJSON(ContactsBrowserImpl controller, JSONObject jsonContact) {
        ContactBrowserImpl contact = new ContactBrowserImpl(controller);

        // simple fields
        contact.setId(getFieldAsString(jsonContact.get(FIELD_ID)));
        contact.setDisplayName(getFieldAsString(jsonContact.get(CONTACT_DISPLAY_NAME)));
        contact.setNickName(getFieldAsString(jsonContact.get(CONTACT_NICK_NAME)));
        contact.setNote(getFieldAsString(jsonContact.get(CONTACT_NOTE)));

        // birthday
        JSONValue dateValue = jsonContact.get(CONTACT_BIRTHDAY);
        if (dateValue != null && dateValue.isNumber() != null) {
            contact.setBirthDay(new Date((long) dateValue.isNumber().doubleValue()));
        }

        // contact fields
        JSONArray phoneNumberArray = jsonContact.get(CONTACT_PHONE_NUMBERS).isArray();
        LightArray<ContactField> phoneNumbers = getContactFieldsForArray(phoneNumberArray);
        contact.setPhoneNumbers(phoneNumbers);

        JSONArray emailsArray = jsonContact.get(CONTACT_EMAILS).isArray();
        LightArray<ContactField> emails = getContactFieldsForArray(emailsArray);
        contact.setEmails(emails);

        JSONArray imsArray = jsonContact.get(CONTACT_IMS).isArray();
        LightArray<ContactField> ims = getContactFieldsForArray(imsArray);
        contact.setIms(ims);

        JSONArray photosArray = jsonContact.get(CONTACT_PHOTOS).isArray();
        LightArray<ContactField> photos = getContactFieldsForArray(photosArray);
        contact.setPhotos(photos);

        JSONArray categoriesArray = jsonContact.get(CONTACT_CATEGORIES).isArray();
        LightArray<ContactField> categories = getContactFieldsForArray(categoriesArray);
        contact.setCategories(categories);

        JSONArray urlsArray = jsonContact.get(CONTACT_URLS).isArray();
        LightArray<ContactField> urls = getContactFieldsForArray(urlsArray);
        contact.setUrls(urls);

        ContactName name = getName(jsonContact.get(CONTACT_NAME).isObject());
        contact.setName(name);

        LightArray<ContactAddress> addresses = getAddressArray(jsonContact.get(CONTACT_ADDRESSES).isArray());
        contact.setContactAddresses(addresses);

        LightArray<ContactOrganisation> organisations = getContactOrganisationArray(
                jsonContact.get(CONTACT_ORGANISATION).isArray());
        contact.setOrganisations(organisations);

        return contact;
    }

    private static LightArray<ContactOrganisation> getContactOrganisationArray(JSONArray jsonArray) {
        LightArray<ContactOrganisation> array = CollectionFactory.constructArray();

        if (jsonArray == null) {
            return array;
        }

        for (int i = 0; i < jsonArray.size(); i++) {
            array.push(getOrganisation(jsonArray.get(i).isObject()));
        }

        return array;
    }

    private static ContactOrganisation getOrganisation(JSONObject object) {
        ContactOrganisationBrowserImpl co = new ContactOrganisationBrowserImpl();
        if (object == null) {
            return co;
        }

        String name = getFieldAsString(object.get(ORGANISATION_NAME));
        String department = getFieldAsString(object.get(ORGANISATION_DEPARTMENT));
        String title = getFieldAsString(object.get(ORGANISATION_TITLE));
        String type = getFieldAsString(object.get(ORGANISATION_TYPE));
        boolean pref = getFieldAsBoolean(object.get(ORGANISATION_PREF));

        co.setDepartment(department);
        co.setName(name);
        co.setTitle(title);
        co.setType(type);
        co.setPref(pref);

        return co;
    }

    private static LightArray<ContactAddress> getAddressArray(JSONArray jsonArray) {
        LightArray<ContactAddress> array = CollectionFactory.constructArray();

        if (jsonArray == null) {
            return array;
        }

        for (int i = 0; i < jsonArray.size(); i++) {
            array.push(getAddress(jsonArray.get(i).isObject()));
        }

        return array;
    }

    private static ContactAddress getAddress(JSONObject object) {
        ContactAddressBrowserImpl ca = new ContactAddressBrowserImpl();
        if (object == null) {
            return ca;
        }

        String formatted = getFieldAsString(object.get(ADDRESS_FORMATTED));
        String streetAddress = getFieldAsString(object.get(ADDRESS_STREET_ADDRESS));
        String locality = getFieldAsString(object.get(ADDRESS_LOCALITY));
        String region = getFieldAsString(object.get(ADDRESS_REGION));
        String postalCode = getFieldAsString(object.get(ADDRESS_POSTAL_CODE));
        String country = getFieldAsString(object.get(ADDRESS_COUNTRY));
        String type = getFieldAsString(object.get(ADDRESS_TYPE));
        boolean pref = getFieldAsBoolean(object.get(ADDRESS_PREF));

        ca.setFormatted(formatted);
        ca.setStreetAddress(streetAddress);
        ca.setLocality(locality);
        ca.setRegion(region);
        ca.setPostalCode(postalCode);
        ca.setCountry(country);
        ca.setType(type);
        ca.setPref(pref);

        return ca;
    }

    private static ContactName getName(JSONObject object) {
        ContactNameBrowserImpl name = new ContactNameBrowserImpl();
        if (object == null) {
            return name;
        }

        String formatted = getFieldAsString(object.get(NAME_FORMATTED));
        String familyName = getFieldAsString(object.get(NAME_FAMILY_NAME));
        String givenName = getFieldAsString(object.get(NAME_GIVEN_NAME));
        String middleName = getFieldAsString(object.get(NAME_MIDDLE_NAME));
        String prefix = getFieldAsString(object.get(NAME_PREFIX));
        String suffix = getFieldAsString(object.get(NAME_SUFFIX));

        name.setFormatted(formatted);
        name.setFamilyName(familyName);
        name.setGivenName(givenName);
        name.setMiddleName(middleName);
        name.setHonorificPrefix(prefix);
        name.setHonorificSuffix(suffix);

        return name;
    }

    private static LightArray<ContactField> getContactFieldsForArray(JSONArray jsonArray) {
        LightArray<ContactField> array = CollectionFactory.constructArray();
        if (jsonArray == null) {
            return array;
        }

        for (int i = 0; i < jsonArray.size(); i++) {
            ContactFieldBrowserImpl cf = new ContactFieldBrowserImpl();
            JSONObject object = jsonArray.get(i).isObject();

            String type = getFieldAsString(object.get(CONTACT_FIELD_TYPE));
            String value = getFieldAsString(object.get(CONTACT_FIELD_VALUE));
            boolean pref = getFieldAsBoolean(object.get(CONTACT_FIELD_PREF));
            cf.setPref(pref);
            cf.setType(type);
            cf.setValue(value);
            array.push(cf);
        }

        return array;
    }

    private static boolean getFieldAsBoolean(JSONValue field) {
        return field.isBoolean() != null ? field.isBoolean().booleanValue() : false;
    }

    private static String getFieldAsString(JSONValue field) {
        return (field != null && field.isString() != null) ? field.isString().stringValue() : "";
    }

    public JSONObject serializeContact() {
        JSONObject root = new JSONObject();

        // simple values
        root.put(FIELD_ID, getAsJSONString(this.getId()));
        root.put(CONTACT_DISPLAY_NAME, getAsJSONString(this.getDisplayName()));
        root.put(CONTACT_NICK_NAME, getAsJSONString(this.getNickName()));

        if (this.getBirthDay() != null) {
            double value = this.getBirthDay().getTime();
            root.put(CONTACT_BIRTHDAY, new JSONNumber(value));
        }

        root.put(CONTACT_PHONE_NUMBERS, toJSONArray(this.getPhoneNumbers()));

        root.put(CONTACT_EMAILS, toJSONArray(this.getEmails()));
        root.put(CONTACT_IMS, toJSONArray(this.getIms()));
        root.put(CONTACT_PHOTOS, toJSONArray(this.getPhotos()));
        root.put(CONTACT_CATEGORIES, toJSONArray(this.getCategories()));
        root.put(CONTACT_URLS, toJSONArray(this.getUrls()));

        root.put(CONTACT_NAME, createContact(this.getName()));

        root.put(CONTACT_ADDRESSES, createAddresses(this.getContactAddresses()));

        root.put(CONTACT_ORGANISATION, createOrganisation(this.getOrganisations()));

        return root;
    }

    private JSONArray createOrganisation(LightArray<ContactOrganisation> organisations) {
        JSONArray jsonArray = new JSONArray();

        for (int i = 0; i < organisations.length(); i++) {
            ContactOrganisation co = organisations.get(i);
            JSONObject orga = new JSONObject();

            orga.put(ORGANISATION_NAME, getAsJSONString(co.getName()));
            orga.put(ORGANISATION_DEPARTMENT, getAsJSONString(co.getDepartment()));
            orga.put(ORGANISATION_TITLE, getAsJSONString(co.getTitle()));
            orga.put(ORGANISATION_TYPE, getAsJSONString(co.getType()));
            orga.put(ORGANISATION_PREF, JSONBoolean.getInstance(co.isPref()));

            jsonArray.set(i, orga);
        }

        return jsonArray;
    }

    private JSONArray createAddresses(LightArray<ContactAddress> addresses) {
        JSONArray jsonArray = new JSONArray();

        for (int i = 0; i < addresses.length(); i++) {
            ContactAddress contactAddress = addresses.get(i);
            JSONObject address = new JSONObject();
            address.put(ADDRESS_FORMATTED, getAsJSONString(contactAddress.getFormatted()));
            address.put(ADDRESS_STREET_ADDRESS, getAsJSONString(contactAddress.getStreetAddress()));
            address.put(ADDRESS_LOCALITY, getAsJSONString(contactAddress.getLocality()));
            address.put(ADDRESS_REGION, getAsJSONString(contactAddress.getRegion()));
            address.put(ADDRESS_POSTAL_CODE, getAsJSONString(contactAddress.getPostalCode()));
            address.put(ADDRESS_COUNTRY, getAsJSONString(contactAddress.getCountry()));
            address.put(ADDRESS_TYPE, getAsJSONString(contactAddress.getType()));
            address.put(ADDRESS_PREF, JSONBoolean.getInstance(contactAddress.isPref()));
            jsonArray.set(i, address);
        }

        return jsonArray;
    }

    private JSONObject createContact(ContactName contactName) {
        JSONObject jsonName = new JSONObject();

        jsonName.put(NAME_FORMATTED, getAsJSONString(contactName.getFormatted()));
        jsonName.put(NAME_FAMILY_NAME, getAsJSONString(contactName.getFamilyName()));
        jsonName.put(NAME_GIVEN_NAME, getAsJSONString(contactName.getGivenName()));
        jsonName.put(NAME_MIDDLE_NAME, getAsJSONString(contactName.getMiddleName()));
        jsonName.put(NAME_PREFIX, getAsJSONString(contactName.getHonorificPrefix()));
        jsonName.put(NAME_SUFFIX, getAsJSONString(contactName.getHonorificSuffix()));

        return jsonName;
    }

    private JSONValue toJSONArray(LightArray<ContactField> contactField) {
        JSONArray jsonArray = new JSONArray();
        for (int i = 0; i < contactField.length(); i++) {
            ContactField field = contactField.get(i);
            JSONObject jsonField = new JSONObject();
            jsonField.put(CONTACT_FIELD_TYPE, getAsJSONString(field.getType()));
            jsonField.put(CONTACT_FIELD_VALUE, getAsJSONString(field.getValue()));

            jsonField.put(CONTACT_FIELD_PREF, JSONBoolean.getInstance(field.isPref()));
            jsonArray.set(i, jsonField);
        }

        return jsonArray;
    }

    private static JSONValue getAsJSONString(String id) {
        if (id == null) {
            return JSONNull.getInstance();
        }

        return new JSONString(id);
    }

}