diff options
Diffstat (limited to 'src/main/java/com/p4square/ccbapi/serializer')
5 files changed, 310 insertions, 0 deletions
| diff --git a/src/main/java/com/p4square/ccbapi/serializer/AbstractFormSerializer.java b/src/main/java/com/p4square/ccbapi/serializer/AbstractFormSerializer.java new file mode 100644 index 0000000..06a83a1 --- /dev/null +++ b/src/main/java/com/p4square/ccbapi/serializer/AbstractFormSerializer.java @@ -0,0 +1,96 @@ +package com.p4square.ccbapi.serializer; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * AbstractFormSerializer provides default implementations for some methods defined in Serializer + * and methods to support encoding form data for CCB. + */ +public abstract class AbstractFormSerializer<T> implements Serializer<T> { + +    /** +     * This is the datetime format specified by the CCB API Doc. +     */ +    private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + +    @Override +    public String encode(final T obj) { +        final StringBuilder sb = new StringBuilder(); +        encode(obj, sb); +        return sb.toString(); +    } + +    /** +     * Append a field to the form. +     * +     * @param builder The StringBuilder to use. +     * @param key The form key, which must be URLEncoded before calling this method. +     * @param value The value associated with the key. The value will be URLEncoded by this method. +     */ +    protected void appendField(final StringBuilder builder, final String key, final String value) { +        if (builder.length() > 0) { +            builder.append("&"); +        } + +        try { +            builder.append(key).append("=").append(URLEncoder.encode(value, "UTF-8")); +        } catch (UnsupportedEncodingException e) { +            throw new AssertionError("UTF-8 encoding should always be available."); +        } +    } + +    /** +     * Append an integer field to the form. +     * +     * @param builder The StringBuilder to use. +     * @param key The form key, which must be URLEncoded before calling this method. +     * @param value The value associated with the key. +     */ +    protected void appendField(final StringBuilder builder, final String key, final int value) { +        if (builder.length() > 0) { +            builder.append("&"); +        } +        builder.append(key).append("=").append(value); +    } + +    /** +     * Append a boolean field to the form. +     * +     * @param builder The StringBuilder to use. +     * @param key The form key, which must be URLEncoded before calling this method. +     * @param value The value associated with the key. +     */ +    protected void appendField(final StringBuilder builder, final String key, final boolean value) { +        if (builder.length() > 0) { +            builder.append("&"); +        } +        builder.append(key).append("=").append(value ? "true" : "false"); +    } + +    /** +     * Append a LocalDate field to the form. +     * +     * @param builder The StringBuilder to use. +     * @param key The form key, which must be URLEncoded before calling this method. +     * @param value The value associated with the key. +     */ +    protected void appendField(final StringBuilder builder, final String key, final LocalDate value) { +        appendField(builder, key, value.toString()); + +    } + +    /** +     * Append a LocalDateTime field to the form. +     * +     * @param builder The StringBuilder to use. +     * @param key The form key, which must be URLEncoded before calling this method. +     * @param value The value associated with the key. +     */ +    protected void appendField(final StringBuilder builder, final String key, final LocalDateTime value) { +        appendField(builder, key, DATE_TIME_FORMAT.format(value)); +    } +} diff --git a/src/main/java/com/p4square/ccbapi/serializer/AddressFormSerializer.java b/src/main/java/com/p4square/ccbapi/serializer/AddressFormSerializer.java new file mode 100644 index 0000000..00af004 --- /dev/null +++ b/src/main/java/com/p4square/ccbapi/serializer/AddressFormSerializer.java @@ -0,0 +1,54 @@ +package com.p4square.ccbapi.serializer; + +import com.p4square.ccbapi.model.Address; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +/** + * Encode an Address object as form data for CCB. + */ +public class AddressFormSerializer extends AbstractFormSerializer<Address> { + +    @Override +    public void encode(final Address address, final StringBuilder builder) { +        // Sanity check. +        if (address.getType() == null) { +            throw new IllegalArgumentException("Address type cannot be null"); +        } + +        // Every form field will be prefixed with the type. +        final String type = address.getType().toString().toLowerCase(); + +        if (address.getStreetAddress() != null) { +            appendField(builder, type, "street_address", address.getStreetAddress()); +        } + +        if (address.getCity() != null) { +            appendField(builder, type, "city", address.getCity()); +        } + +        if (address.getState() != null) { +            appendField(builder, type, "state", address.getState()); +        } + +        if (address.getZip() != null) { +            appendField(builder, type, "zip", address.getZip()); +        } + +        if (address.getCountry() != null) { +            appendField(builder, type, "country", address.getCountry().getCountryCode()); +        } +    } + +    private void appendField(final StringBuilder builder, final String type, final String key, final String value) { +        if (builder.length() > 0) { +            builder.append("&"); +        } +        try { +            builder.append(type).append("_").append(key).append("=").append(URLEncoder.encode(value, "UTF-8")); +        } catch (UnsupportedEncodingException e) { +            throw new AssertionError("UTF-8 encoding should always be available."); +        } +    } +} diff --git a/src/main/java/com/p4square/ccbapi/serializer/IndividualProfileSerializer.java b/src/main/java/com/p4square/ccbapi/serializer/IndividualProfileSerializer.java new file mode 100644 index 0000000..52b1a44 --- /dev/null +++ b/src/main/java/com/p4square/ccbapi/serializer/IndividualProfileSerializer.java @@ -0,0 +1,125 @@ +package com.p4square.ccbapi.serializer; + +import com.p4square.ccbapi.model.Address; +import com.p4square.ccbapi.model.Phone; +import com.p4square.ccbapi.model.UpdateIndividualProfileRequest; + +import java.time.LocalDate; +import java.util.Map; + +/** + * Serializes an {@link UpdateIndividualProfileRequest} into a form suitable for the update_individual API. + */ +public class IndividualProfileSerializer extends AbstractFormSerializer<UpdateIndividualProfileRequest> { + +    private static final AddressFormSerializer ADDRESS_FORM_SERIALIZER = new AddressFormSerializer(); +    private static final PhoneFormSerializer PHONE_FORM_SERIALIZER = new PhoneFormSerializer(); + +    @Override +    public void encode(final UpdateIndividualProfileRequest request, final StringBuilder builder) { +        // Encode any fields which are present. +        if (request.getSyncId() != null) { +            appendField(builder, "sync_id", request.getSyncId()); +        } +        if (request.getOtherId() != null) { +            appendField(builder, "other_id", request.getOtherId()); +        } +        if (request.getGivingNumber() != null) { +            appendField(builder, "giving_number", request.getGivingNumber()); +        } +        if (request.getFirstName() != null) { +            appendField(builder, "first_name", request.getFirstName()); +        } +        if (request.getLastName() != null) { +            appendField(builder, "last_name", request.getLastName()); +        } +        if (request.getMiddleName() != null) { +            appendField(builder, "middle_name", request.getMiddleName()); +        } +        if (request.getLegalFirstName() != null) { +            appendField(builder, "legal_first_name", request.getLegalFirstName()); +        } +        if (request.getSalutation() != null) { +            appendField(builder, "salutation", request.getSalutation()); +        } +        if (request.getSuffix() != null) { +            appendField(builder, "suffix", request.getSuffix()); +        } +        if (request.getFamilyId() != null) { +            appendField(builder, "family_id", request.getFamilyId()); +        } +        if (request.getFamilyPosition() != null) { +            appendField(builder, "family_position", request.getFamilyPosition().getCode()); +        } +        if (request.getMaritalStatus() != null) { +            appendField(builder, "marital_status", request.getMaritalStatus().getCode()); +        } +        if (request.getGender() != null) { +            appendField(builder, "gender", request.getGender().getCode()); +        } +        if (request.getBirthday() != null) { +            appendField(builder, "birthday", request.getBirthday()); +        } +        if (request.getAnniversary() != null) { +            appendField(builder, "anniversary", request.getAnniversary()); +        } +        if (request.getDeceased() != null) { +            appendField(builder, "deceased", request.getDeceased()); +        } +        if (request.getMembershipDate() != null) { +            appendField(builder, "membership_date", request.getMembershipDate()); +        } +        if (request.getMembershipEnd() != null) { +            appendField(builder, "membership_end", request.getMembershipEnd()); +        } +        if (request.getEmail() != null) { +            appendField(builder, "email", request.getEmail()); +        } +        if (request.getEmergencyContactName() != null) { +            appendField(builder, "emergency_contact_name", request.getEmergencyContactName()); +        } +        if (request.getAllergies() != null) { +            appendField(builder, "allergies", request.getAllergies()); +        } +        if (request.getConfirmedNoAllergies() != null) { +            appendField(builder, "confirmed_no_allergies", request.getConfirmedNoAllergies()); +        } +        if (request.getBaptized() != null) { +            appendField(builder, "baptized", request.getBaptized()); +        } +        if (request.getModifiedById() != null) { +            appendField(builder, "modifier_id", request.getModifiedById()); +        } + +        // Encode all the addresses. +        if (request.getAddresses() != null) { +            for (Address address : request.getAddresses()) { +                ADDRESS_FORM_SERIALIZER.encode(address, builder); +            } +        } + +        // and the phone numbers. +        if (request.getPhones() != null) { +            for (Phone phone : request.getPhones()) { +                PHONE_FORM_SERIALIZER.encode(phone, builder); +            } +        } + +        // Add the User-defined fields. +        for (Map.Entry<String, String> entry : request.getCustomTextFields().entrySet()) { +            if (entry.getValue() != null) { +                appendField(builder, entry.getKey(), entry.getValue()); +            } +        } +        for (Map.Entry<String, LocalDate> entry : request.getCustomDateFields().entrySet()) { +            if (entry.getValue() != null) { +                appendField(builder, entry.getKey(), entry.getValue()); +            } +        } +        for (Map.Entry<String, Integer> entry : request.getCustomPulldownFields().entrySet()) { +            if (entry.getValue() != null) { +                appendField(builder, entry.getKey(), entry.getValue()); +            } +        } +    } +} diff --git a/src/main/java/com/p4square/ccbapi/serializer/PhoneFormSerializer.java b/src/main/java/com/p4square/ccbapi/serializer/PhoneFormSerializer.java new file mode 100644 index 0000000..3569321 --- /dev/null +++ b/src/main/java/com/p4square/ccbapi/serializer/PhoneFormSerializer.java @@ -0,0 +1,24 @@ +package com.p4square.ccbapi.serializer; + +import com.p4square.ccbapi.model.Phone; + +/** + * Encode a Phone object as form data for CCB. + */ +public class PhoneFormSerializer extends AbstractFormSerializer<Phone> { +    @Override +    public void encode(final Phone phone, final StringBuilder builder) { +        // Sanity check. +        if (phone.getType() == null) { +            throw new IllegalArgumentException("Phone type cannot be null"); +        } + +        final String key; +        if (phone.getType() == Phone.Type.EMERGENCY) { +            key = "phone_emergency"; +        } else { +            key = phone.getType().toString().toLowerCase() + "_phone"; +        } +        appendField(builder, key, phone.getNumber()); +    } +} diff --git a/src/main/java/com/p4square/ccbapi/serializer/Serializer.java b/src/main/java/com/p4square/ccbapi/serializer/Serializer.java new file mode 100644 index 0000000..775aa09 --- /dev/null +++ b/src/main/java/com/p4square/ccbapi/serializer/Serializer.java @@ -0,0 +1,11 @@ +package com.p4square.ccbapi.serializer; + +/** + * A Serializer converts an object of type T to a payload suitable for CCB. + */ +public interface Serializer<T> { + +    String encode(T obj); + +    void encode(T obj, StringBuilder builder); +} | 
