Coverage Report - org.codeforamerica.open311.facade.data.operations.POSTServiceRequestData
 
Classes in this File Line Coverage Branch Coverage Complexity
POSTServiceRequestData
72%
40/55
50%
10/20
1.667
 
 1  
 package org.codeforamerica.open311.facade.data.operations;
 2  
 
 3  
 import java.util.HashMap;
 4  
 import java.util.LinkedList;
 5  
 import java.util.List;
 6  
 import java.util.Map;
 7  
 import java.util.regex.Matcher;
 8  
 import java.util.regex.Pattern;
 9  
 
 10  
 import org.codeforamerica.open311.facade.data.Attribute;
 11  
 import org.codeforamerica.open311.internals.parsing.DataParser;
 12  
 
 13  
 /**
 14  
  * Contains all the necessary data to add a new service request to the server.
 15  
  * It allows to add some optional arguments through the method chaining
 16  
  * (setters).
 17  
  * 
 18  
  * @author Santiago MunĂ­n <santimunin@gmail.com>
 19  
  * 
 20  
  */
 21  
 public class POSTServiceRequestData {
 22  
         /**
 23  
          * Required email syntax.
 24  
          */
 25  1
         private static final Pattern VALID_EMAIL_ADDRESS_REGEX = Pattern.compile(
 26  
                         "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$",
 27  
                         Pattern.CASE_INSENSITIVE);
 28  
         private Map<String, String> parameters;
 29  
         private List<Attribute> attributes;
 30  
 
 31  
         /**
 32  
          * Basic constructor. It isn't public because this operation needs at least
 33  
          * one of the location parameters in addition to the service code.
 34  
          * 
 35  
          * @param serviceCode
 36  
          *            Code of the service related to the request.
 37  
          * @param attributes
 38  
          *            List of attributes, <code>null</code> value is allowed.
 39  
          */
 40  
         private POSTServiceRequestData(String serviceCode,
 41  5
                         List<Attribute> attributes) {
 42  5
                 this.parameters = new HashMap<String, String>();
 43  5
                 this.attributes = new LinkedList<Attribute>();
 44  5
                 if (serviceCode != null && serviceCode.length() > 0) {
 45  5
                         parameters.put(DataParser.SERVICE_CODE_TAG, serviceCode);
 46  5
                         if (attributes != null) {
 47  0
                                 this.attributes = attributes;
 48  
                         }
 49  
                 } else {
 50  0
                         throw new NoSuchFieldError(
 51  
                                         "One or more of the arguments are not valid.");
 52  
                 }
 53  5
         }
 54  
 
 55  
         /**
 56  
          * Builds a POST service request data object from a lat & long location
 57  
          * value.
 58  
          * 
 59  
          * @param serviceCode
 60  
          *            Code of the service related to the request.
 61  
          * @param latitude
 62  
          *            Latitude using the (WGS84) projection.
 63  
          * @param longitude
 64  
          *            Longitude using the (WGS84) projection.
 65  
          * @param attributes
 66  
          *            List of attributes.
 67  
          */
 68  
         public POSTServiceRequestData(String serviceCode, float latitude,
 69  
                         float longitude, List<Attribute> attributes) {
 70  1
                 this(serviceCode, attributes);
 71  1
                 this.setLatLong(latitude, longitude);
 72  1
         }
 73  
 
 74  
         /**
 75  
          * Builds a POST service request data object from an address location value.
 76  
          * 
 77  
          * @param serviceCode
 78  
          *            Code of the service related to the request.
 79  
          * @param address
 80  
          *            Human-readable address.
 81  
          * @param attributes
 82  
          *            List of attributes.
 83  
          */
 84  
         public POSTServiceRequestData(String serviceCode, String address,
 85  
                         List<Attribute> attributes) {
 86  1
                 this(serviceCode, attributes);
 87  1
                 if (address != null && address.length() > 0) {
 88  1
                         this.setAddress(address);
 89  
                 } else {
 90  0
                         throw new NoSuchFieldError(
 91  
                                         "One or more of the arguments are not valid.");
 92  
                 }
 93  1
         }
 94  
 
 95  
         /**
 96  
          * Builds a POST service request data object from an address_id location
 97  
          * value.
 98  
          * 
 99  
          * @param serviceCode
 100  
          *            Code of the service related to the request.
 101  
          * @param addressId
 102  
          *            The internal address ID used by a jurisdiction's master
 103  
          *            address repository or other addressing system.
 104  
          * @param attributes
 105  
          *            List of attributes.
 106  
          */
 107  
         public POSTServiceRequestData(String serviceCode, long addressId,
 108  
                         List<Attribute> attributes) {
 109  3
                 this(serviceCode, attributes);
 110  3
                 this.setAddressId(addressId);
 111  3
         }
 112  
 
 113  
         /**
 114  
          * Sets a (latitude, longitude) coordinates.
 115  
          * 
 116  
          * @param latitude
 117  
          *            Latitude using the (WGS84) projection.
 118  
          * @param longitude
 119  
          *            Longitude using the (WGS84) projection.
 120  
          * @return Same instance with the new parameter added.
 121  
          */
 122  
         public POSTServiceRequestData setLatLong(float latitude, float longitude) {
 123  1
                 parameters.put(DataParser.LATITUDE_TAG, String.valueOf(latitude));
 124  1
                 parameters.put(DataParser.LONGITUDE_TAG, String.valueOf(longitude));
 125  1
                 return this;
 126  
         }
 127  
 
 128  
         /**
 129  
          * Sets an address parameter.
 130  
          * 
 131  
          * @param address
 132  
          *            Human-readable address.
 133  
          * @return Same instance with the new parameter added.
 134  
          */
 135  
         public POSTServiceRequestData setAddress(String address) {
 136  2
                 tryToAddString(DataParser.ADDRESS_TAG, address);
 137  2
                 return this;
 138  
         }
 139  
 
 140  
         /**
 141  
          * Sets an address_id parameter.
 142  
          * 
 143  
          * @param addressId
 144  
          *            The internal address ID used by a jurisdiction's master
 145  
          *            address repository or other addressing system.
 146  
          * @return Same instance with the new parameter added.
 147  
          */
 148  
         public POSTServiceRequestData setAddressId(long addressId) {
 149  3
                 tryToAddString(DataParser.ADDRESS_ID_TAG, String.valueOf(addressId));
 150  3
                 return this;
 151  
         }
 152  
 
 153  
         /**
 154  
          * Sets an email.
 155  
          * 
 156  
          * @param email
 157  
          *            The email address of the person submitting the request. It
 158  
          *            requires a correct email syntax.
 159  
          * @return Same instance with the new parameter added.
 160  
          */
 161  
         public POSTServiceRequestData setEmail(String email) {
 162  0
                 Matcher matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(email);
 163  0
                 if (matcher.find()) {
 164  0
                         tryToAddString(DataParser.EMAIL_TAG, email);
 165  
                 }
 166  0
                 return this;
 167  
         }
 168  
 
 169  
         /**
 170  
          * Sets a device_id.
 171  
          * 
 172  
          * @param deviceId
 173  
          *            The unique device ID of the device submitting the request.
 174  
          *            This is usually only used for mobile devices. Android devices
 175  
          *            can use <code>TelephonyManager.getDeviceId()</code> and
 176  
          *            iPhones can use
 177  
          *            <code>[UIDevice currentDevice].uniqueIdentifier</code>.
 178  
          * 
 179  
          * @return Same instance with the new parameter added.
 180  
          */
 181  
         public POSTServiceRequestData setDeviceId(String deviceId) {
 182  2
                 tryToAddString(DataParser.DEVICE_ID_TAG, deviceId);
 183  2
                 return this;
 184  
         }
 185  
 
 186  
         /**
 187  
          * Sets an account_id.
 188  
          * 
 189  
          * @param accountId
 190  
          *            The unique ID for the user account of the person submitting
 191  
          *            the request.
 192  
          * @return Same instance with the new parameter added.
 193  
          */
 194  
         public POSTServiceRequestData setAccountId(long accountId) {
 195  0
                 tryToAddString(DataParser.ACCOUNT_ID_TAG, String.valueOf(accountId));
 196  0
                 return this;
 197  
         }
 198  
 
 199  
         /**
 200  
          * Sets the first_name.
 201  
          * 
 202  
          * @param firstName
 203  
          *            The given name of the person submitting the request.
 204  
          * @return Same instance with the new parameter added.
 205  
          */
 206  
         public POSTServiceRequestData setFirstName(String firstName) {
 207  0
                 tryToAddString(DataParser.FIRST_NAME_TAG, firstName);
 208  0
                 return this;
 209  
         }
 210  
 
 211  
         /**
 212  
          * Sets the last_name.
 213  
          * 
 214  
          * @param lastName
 215  
          *            The family name of the person submitting the request .
 216  
          * @return Same instance with the new parameter added.
 217  
          */
 218  
         public POSTServiceRequestData setLastName(String lastName) {
 219  0
                 tryToAddString(DataParser.LAST_NAME_TAG, lastName);
 220  0
                 return this;
 221  
         }
 222  
 
 223  
         /**
 224  
          * Sets the phone.
 225  
          * 
 226  
          * @param phone
 227  
          *            The phone number of the person submitting the request.
 228  
          * @return Same instance with the new parameter added.
 229  
          */
 230  
         public POSTServiceRequestData setPhone(String phone) {
 231  0
                 tryToAddString(DataParser.PHONE_TAG, phone);
 232  0
                 return this;
 233  
         }
 234  
 
 235  
         /**
 236  
          * Sets a description.
 237  
          * 
 238  
          * @param description
 239  
          *            A full description of the request or report being submitted.
 240  
          *            This may contain line breaks, but not HTML or code. Otherwise,
 241  
          *            this is free form text limited to 4,000 characters.
 242  
          * @return Same instance with the new parameter added.
 243  
          */
 244  
         public POSTServiceRequestData setDescription(String description) {
 245  1
                 tryToAddString(DataParser.DESCRIPTION_TAG, description);
 246  1
                 return this;
 247  
         }
 248  
 
 249  
         /**
 250  
          * Sets a media URL.
 251  
          * 
 252  
          * @param mediaUrl
 253  
          *            A URL to media associated with the request, eg an image.
 254  
          * @return Same instance with the new parameter added.
 255  
          */
 256  
         public POSTServiceRequestData setMediaUrl(String mediaUrl) {
 257  1
                 tryToAddString(DataParser.MEDIA_URL_TAG, mediaUrl);
 258  1
                 return this;
 259  
         }
 260  
 
 261  
         /**
 262  
          * Tries to add a pair (key, value) to the parameter list. Key and value has
 263  
          * to be valid parameters (not null and not empty).
 264  
          * 
 265  
          * @param key
 266  
          *            Key of the pair.
 267  
          * @param value
 268  
          *            Value of the pair.
 269  
          */
 270  
         private void tryToAddString(String key, String value) {
 271  9
                 if (key != null && key.length() > 0 && value != null
 272  
                                 && value.length() > 0) {
 273  5
                         parameters.put(key, value);
 274  
                 }
 275  9
         }
 276  
 
 277  
         /**
 278  
          * Builds a map containing all the arguments.
 279  
          * 
 280  
          * @return List of pairs (key, value) with the required arguments.
 281  
          */
 282  
         public Map<String, String> getBodyRequestParameters() {
 283  20
                 Map<String, String> result = new HashMap<String, String>();
 284  20
                 result.putAll(parameters);
 285  20
                 return result;
 286  
         }
 287  
 
 288  
         /**
 289  
          * Obtains the attributes related to the object.
 290  
          * 
 291  
          * @return A copy of the inner attribute list.
 292  
          */
 293  
         public List<Attribute> getAttributes() {
 294  10
                 List<Attribute> result = new LinkedList<Attribute>();
 295  10
                 result.addAll(attributes);
 296  10
                 return result;
 297  
         }
 298  
 
 299  
 }