diff options
5 files changed, 178 insertions, 44 deletions
| diff --git a/src/main/java/com/p4square/ccbapi/serializer/AbstractFormSerializer.java b/src/main/java/com/p4square/ccbapi/serializer/AbstractFormSerializer.java index 06a83a1..969b11d 100644 --- a/src/main/java/com/p4square/ccbapi/serializer/AbstractFormSerializer.java +++ b/src/main/java/com/p4square/ccbapi/serializer/AbstractFormSerializer.java @@ -24,6 +24,20 @@ public abstract class AbstractFormSerializer<T> implements Serializer<T> {          return sb.toString();      } +    @Override +    public void encode(final T obj, final StringBuilder sb) { +        FormBuilder builder = new FormBuilder(sb); +        encode(obj, builder); +    } + +    /** +     * This method performs the actual serialize of T into a URL encoded form. +     * +     * @param obj The object to serialize +     * @param builder The FormBuilder to use. +     */ +    protected abstract void encode(final T obj, final FormBuilder builder); +      /**       * Append a field to the form.       * diff --git a/src/main/java/com/p4square/ccbapi/serializer/AddressFormSerializer.java b/src/main/java/com/p4square/ccbapi/serializer/AddressFormSerializer.java index 00af004..22ed5c2 100644 --- a/src/main/java/com/p4square/ccbapi/serializer/AddressFormSerializer.java +++ b/src/main/java/com/p4square/ccbapi/serializer/AddressFormSerializer.java @@ -8,7 +8,14 @@ import java.net.URLEncoder;  /**   * Encode an Address object as form data for CCB.   */ -public class AddressFormSerializer extends AbstractFormSerializer<Address> { +public class AddressFormSerializer implements Serializer<Address> { + +    @Override +    public String encode(final Address address) { +        final StringBuilder sb = new StringBuilder(); +        encode(address, sb); +        return sb.toString(); +    }      @Override      public void encode(final Address address, final StringBuilder builder) { diff --git a/src/main/java/com/p4square/ccbapi/serializer/FormBuilder.java b/src/main/java/com/p4square/ccbapi/serializer/FormBuilder.java new file mode 100644 index 0000000..b9f59d7 --- /dev/null +++ b/src/main/java/com/p4square/ccbapi/serializer/FormBuilder.java @@ -0,0 +1,119 @@ +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; + +/** + * Utility for building URL encoded form payloads. + */ +public class FormBuilder { + +    /** +     * 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"); + +    private final StringBuilder builder; + +    /** +     * Construct a new FormBuilder. +     */ +    public FormBuilder() { +        this(new StringBuilder()); +    } + +    /** +     * Construct a new FormBuilder which will append fields to the given StringBuilder. +     * +     * @param builder The StringBuilder to append to. +     */ +    public FormBuilder(StringBuilder builder) { +        this.builder = builder; +    } + +    /** +     * This methods provides access to the StringBuilder. +     * +     * @return The StringBuilder passed in at construct time. +     */ +    public StringBuilder getStringBuilder() { +        return builder; +    } + +    /** +     * Build the entire URL encoded form. +     * +     * @return All form fields as a URL encoded string. +     */ +    public String build() { +        return builder.toString(); +    } + +    /** +     * Append a field to the form. +     * +     * @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. +     */ +    public void appendField(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 key The form key, which must be URLEncoded before calling this method. +     * @param value The value associated with the key. +     */ +    public void appendField(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 key The form key, which must be URLEncoded before calling this method. +     * @param value The value associated with the key. +     */ +    public void appendField(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 key The form key, which must be URLEncoded before calling this method. +     * @param value The value associated with the key. +     */ +    public void appendField(final String key, final LocalDate value) { +        appendField(key, value.toString()); + +    } + +    /** +     * Append a LocalDateTime field to the form. +     * +     * @param key The form key, which must be URLEncoded before calling this method. +     * @param value The value associated with the key. +     */ +    public void appendField(final String key, final LocalDateTime value) { +        appendField(key, DATE_TIME_FORMAT.format(value)); +    } +} diff --git a/src/main/java/com/p4square/ccbapi/serializer/IndividualProfileSerializer.java b/src/main/java/com/p4square/ccbapi/serializer/IndividualProfileSerializer.java index 52b1a44..c9cc095 100644 --- a/src/main/java/com/p4square/ccbapi/serializer/IndividualProfileSerializer.java +++ b/src/main/java/com/p4square/ccbapi/serializer/IndividualProfileSerializer.java @@ -16,85 +16,85 @@ public class IndividualProfileSerializer extends AbstractFormSerializer<UpdateIn      private static final PhoneFormSerializer PHONE_FORM_SERIALIZER = new PhoneFormSerializer();      @Override -    public void encode(final UpdateIndividualProfileRequest request, final StringBuilder builder) { +    public void encode(final UpdateIndividualProfileRequest request, final FormBuilder builder) {          // Encode any fields which are present.          if (request.getSyncId() != null) { -            appendField(builder, "sync_id", request.getSyncId()); +            builder.appendField("sync_id", request.getSyncId());          }          if (request.getOtherId() != null) { -            appendField(builder, "other_id", request.getOtherId()); +            builder.appendField("other_id", request.getOtherId());          }          if (request.getGivingNumber() != null) { -            appendField(builder, "giving_number", request.getGivingNumber()); +            builder.appendField("giving_number", request.getGivingNumber());          }          if (request.getFirstName() != null) { -            appendField(builder, "first_name", request.getFirstName()); +            builder.appendField("first_name", request.getFirstName());          }          if (request.getLastName() != null) { -            appendField(builder, "last_name", request.getLastName()); +            builder.appendField("last_name", request.getLastName());          }          if (request.getMiddleName() != null) { -            appendField(builder, "middle_name", request.getMiddleName()); +            builder.appendField("middle_name", request.getMiddleName());          }          if (request.getLegalFirstName() != null) { -            appendField(builder, "legal_first_name", request.getLegalFirstName()); +            builder.appendField("legal_first_name", request.getLegalFirstName());          }          if (request.getSalutation() != null) { -            appendField(builder, "salutation", request.getSalutation()); +            builder.appendField("salutation", request.getSalutation());          }          if (request.getSuffix() != null) { -            appendField(builder, "suffix", request.getSuffix()); +            builder.appendField("suffix", request.getSuffix());          }          if (request.getFamilyId() != null) { -            appendField(builder, "family_id", request.getFamilyId()); +            builder.appendField("family_id", request.getFamilyId());          }          if (request.getFamilyPosition() != null) { -            appendField(builder, "family_position", request.getFamilyPosition().getCode()); +            builder.appendField("family_position", request.getFamilyPosition().getCode());          }          if (request.getMaritalStatus() != null) { -            appendField(builder, "marital_status", request.getMaritalStatus().getCode()); +            builder.appendField("marital_status", request.getMaritalStatus().getCode());          }          if (request.getGender() != null) { -            appendField(builder, "gender", request.getGender().getCode()); +            builder.appendField("gender", request.getGender().getCode());          }          if (request.getBirthday() != null) { -            appendField(builder, "birthday", request.getBirthday()); +            builder.appendField("birthday", request.getBirthday());          }          if (request.getAnniversary() != null) { -            appendField(builder, "anniversary", request.getAnniversary()); +            builder.appendField("anniversary", request.getAnniversary());          }          if (request.getDeceased() != null) { -            appendField(builder, "deceased", request.getDeceased()); +            builder.appendField("deceased", request.getDeceased());          }          if (request.getMembershipDate() != null) { -            appendField(builder, "membership_date", request.getMembershipDate()); +            builder.appendField("membership_date", request.getMembershipDate());          }          if (request.getMembershipEnd() != null) { -            appendField(builder, "membership_end", request.getMembershipEnd()); +            builder.appendField("membership_end", request.getMembershipEnd());          }          if (request.getEmail() != null) { -            appendField(builder, "email", request.getEmail()); +            builder.appendField("email", request.getEmail());          }          if (request.getEmergencyContactName() != null) { -            appendField(builder, "emergency_contact_name", request.getEmergencyContactName()); +            builder.appendField("emergency_contact_name", request.getEmergencyContactName());          }          if (request.getAllergies() != null) { -            appendField(builder, "allergies", request.getAllergies()); +            builder.appendField("allergies", request.getAllergies());          }          if (request.getConfirmedNoAllergies() != null) { -            appendField(builder, "confirmed_no_allergies", request.getConfirmedNoAllergies()); +            builder.appendField("confirmed_no_allergies", request.getConfirmedNoAllergies());          }          if (request.getBaptized() != null) { -            appendField(builder, "baptized", request.getBaptized()); +            builder.appendField("baptized", request.getBaptized());          }          if (request.getModifiedById() != null) { -            appendField(builder, "modifier_id", request.getModifiedById()); +            builder.appendField("modifier_id", request.getModifiedById());          }          // Encode all the addresses.          if (request.getAddresses() != null) {              for (Address address : request.getAddresses()) { -                ADDRESS_FORM_SERIALIZER.encode(address, builder); +                ADDRESS_FORM_SERIALIZER.encode(address, builder.getStringBuilder());              }          } @@ -106,20 +106,14 @@ public class IndividualProfileSerializer extends AbstractFormSerializer<UpdateIn          }          // 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()); -            } -        } +        request.getCustomTextFields().entrySet().stream() +                .filter(entry -> entry.getValue() != null) +                .forEach(entry -> builder.appendField(entry.getKey(), entry.getValue())); +        request.getCustomDateFields().entrySet().stream() +                .filter(entry -> entry.getValue() != null) +                .forEach(entry -> builder.appendField(entry.getKey(), entry.getValue())); +        request.getCustomPulldownFields().entrySet().stream() +                .filter(entry -> entry.getValue() != null) +                .forEach(entry -> builder.appendField(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 index 3569321..360e330 100644 --- a/src/main/java/com/p4square/ccbapi/serializer/PhoneFormSerializer.java +++ b/src/main/java/com/p4square/ccbapi/serializer/PhoneFormSerializer.java @@ -7,7 +7,7 @@ import com.p4square.ccbapi.model.Phone;   */  public class PhoneFormSerializer extends AbstractFormSerializer<Phone> {      @Override -    public void encode(final Phone phone, final StringBuilder builder) { +    public void encode(final Phone phone, final FormBuilder builder) {          // Sanity check.          if (phone.getType() == null) {              throw new IllegalArgumentException("Phone type cannot be null"); @@ -19,6 +19,6 @@ public class PhoneFormSerializer extends AbstractFormSerializer<Phone> {          } else {              key = phone.getType().toString().toLowerCase() + "_phone";          } -        appendField(builder, key, phone.getNumber()); +        builder.appendField(key, phone.getNumber());      }  } | 
