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); +} |