001/* 002 * Copyright 2011-2016 UnboundID Corp. 003 * 004 * This program is free software; you can redistribute it and/or modify 005 * it under the terms of the GNU General Public License (GPLv2 only) 006 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only) 007 * as published by the Free Software Foundation. 008 * 009 * This program is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 * GNU General Public License for more details. 013 * 014 * You should have received a copy of the GNU General Public License 015 * along with this program; if not, see <http://www.gnu.org/licenses>. 016 */ 017 018package com.unboundid.scim.data; 019 020import com.unboundid.scim.schema.AttributeDescriptor; 021import com.unboundid.scim.sdk.InvalidResourceException; 022import com.unboundid.scim.sdk.SCIMAttribute; 023import com.unboundid.scim.sdk.SCIMAttributeValue; 024 025import java.util.ArrayList; 026import java.util.List; 027 028/** 029 * This class represents the address complex attribute in user resources. 030 */ 031public class Address 032{ 033 /** 034 * The <code>AttributeValueResolver</code> that resolves SCIM attribute values 035 * to/from <code>Address</code> instances. 036 */ 037 public static final AttributeValueResolver<Address> ADDRESS_RESOLVER = 038 new AttributeValueResolver<Address>() 039 { 040 public Address toInstance(final SCIMAttributeValue value) { 041 Boolean p = value.getSubAttributeValue("primary", 042 BOOLEAN_RESOLVER); 043 return new Address( 044 value.getSubAttributeValue("formatted", 045 STRING_RESOLVER), 046 value.getSubAttributeValue("streetAddress", 047 STRING_RESOLVER), 048 value.getSubAttributeValue("locality", 049 STRING_RESOLVER), 050 value.getSubAttributeValue("region", 051 STRING_RESOLVER), 052 value.getSubAttributeValue("postalCode", 053 STRING_RESOLVER), 054 value.getSubAttributeValue("country", 055 STRING_RESOLVER), 056 value.getSubAttributeValue("type", 057 STRING_RESOLVER), 058 p == null ? false : p); 059 } 060 061 @Override 062 public SCIMAttributeValue fromInstance( 063 final AttributeDescriptor addressDescriptor, final Address value) 064 throws InvalidResourceException { 065 final List<SCIMAttribute> subAttributes = 066 new ArrayList<SCIMAttribute>(8); 067 068 if (value.type != null) 069 { 070 subAttributes.add( 071 SCIMAttribute.create( 072 addressDescriptor.getSubAttribute("type"), 073 SCIMAttributeValue.createStringValue(value.type))); 074 } 075 076 if (value.formatted != null) 077 { 078 subAttributes.add( 079 SCIMAttribute.create( 080 addressDescriptor.getSubAttribute("formatted"), 081 SCIMAttributeValue.createStringValue(value.formatted))); 082 } 083 084 if (value.streetAddress != null) 085 { 086 subAttributes.add( 087 SCIMAttribute.create( 088 addressDescriptor.getSubAttribute("streetAddress"), 089 SCIMAttributeValue.createStringValue(value.streetAddress))); 090 } 091 092 if (value.locality != null) 093 { 094 subAttributes.add( 095 SCIMAttribute.create( 096 addressDescriptor.getSubAttribute("locality"), 097 SCIMAttributeValue.createStringValue(value.locality))); 098 } 099 100 if (value.region != null) 101 { 102 subAttributes.add( 103 SCIMAttribute.create( 104 addressDescriptor.getSubAttribute("region"), 105 SCIMAttributeValue.createStringValue(value.region))); 106 } 107 108 if (value.postalCode != null) 109 { 110 subAttributes.add( 111 SCIMAttribute.create( 112 addressDescriptor.getSubAttribute("postalCode"), 113 SCIMAttributeValue.createStringValue(value.postalCode))); 114 } 115 116 if (value.country != null) 117 { 118 subAttributes.add( 119 SCIMAttribute.create( 120 addressDescriptor.getSubAttribute("country"), 121 SCIMAttributeValue.createStringValue(value.country))); 122 } 123 124 if (value.primary) 125 { 126 subAttributes.add( 127 SCIMAttribute.create( 128 addressDescriptor.getSubAttribute("primary"), 129 SCIMAttributeValue.createBooleanValue(value.primary))); 130 } 131 132 return SCIMAttributeValue.createComplexValue(subAttributes); 133 } 134 }; 135 136 137 138 private String country; 139 private String formatted; 140 private String locality; 141 private String postalCode; 142 private String region; 143 private String streetAddress; 144 private String type; 145 private boolean primary; 146 147 /** 148 * Create an instance of the SCIM addresses attribute. 149 * 150 * @param primary Specifies whether this value is the primary value. 151 * @param streetAddress The full street address component, which may include 152 * house number, street name, PO BOX, and multi-line 153 * extended street address information. 154 * @param locality The city or locality component. 155 * @param region The state or region component. 156 * @param postalCode The zip code or postal code component. 157 * @param country The country name component. 158 * @param formatted The full mailing address, formatted for display or 159 * use with a mailing label. 160 * @param type The type of address, "work", "home" or "other". 161 */ 162 public Address(final String formatted, final String streetAddress, 163 final String locality, final String region, 164 final String postalCode, final String country, 165 final String type, final boolean primary) { 166 this.country = country; 167 this.formatted = formatted; 168 this.locality = locality; 169 this.postalCode = postalCode; 170 this.primary = primary; 171 this.region = region; 172 this.streetAddress = streetAddress; 173 this.type = type; 174 } 175 176 /** 177 * Retrieves the country name component. 178 * 179 * @return The country name component. 180 */ 181 public String getCountry() { 182 return country; 183 } 184 185 /** 186 * Sets the country name component. 187 * 188 * @param country The country name component. 189 */ 190 public void setCountry(final String country) { 191 this.country = country; 192 } 193 194 /** 195 * Retrieves the full mailing address, formatted for display or use with a 196 * mailing label. 197 * 198 * @return The full mailing address 199 */ 200 public String getFormatted() { 201 return formatted; 202 } 203 204 /** 205 * Sets the full mailing address, formatted for display or use with a 206 * mailing label. 207 * 208 * @param formatted The full mailing address. 209 */ 210 public void setFormatted(final String formatted) { 211 this.formatted = formatted; 212 } 213 214 /** 215 * Retrieves the city or locality component. 216 * @return The city or locality component. 217 */ 218 public String getLocality() { 219 return locality; 220 } 221 222 /** 223 * Sets the city or locality component. 224 * @param locality The city or locality component. 225 */ 226 public void setLocality(final String locality) { 227 this.locality = locality; 228 } 229 230 /** 231 * Retrieves the zip code or postal code component. 232 * @return The zip code or postal code component. 233 */ 234 public String getPostalCode() { 235 return postalCode; 236 } 237 238 /** 239 * Sets the zip code or postal code component. 240 * @param postalCode The zip code or postal code component. 241 */ 242 public void setPostalCode(final String postalCode) { 243 this.postalCode = postalCode; 244 } 245 246 /** 247 * Whether this value is the primary value. 248 * 249 * @return <code>true</code> if this value is the primary value or 250 * <code>false</code> otherwise. 251 */ 252 public boolean isPrimary() { 253 return primary; 254 } 255 256 /** 257 * Specifies whether this value is the primary value. 258 * 259 * @param primary Whether this value is the primary value. 260 */ 261 public void setPrimary(final boolean primary) { 262 this.primary = primary; 263 } 264 265 /** 266 * Retrieves the state or region component. 267 * 268 * @return The state or region component. 269 */ 270 public String getRegion() { 271 return region; 272 } 273 274 /** 275 * Sets the state or region component. 276 * 277 * @param region The state or region component. 278 */ 279 public void setRegion(final String region) { 280 this.region = region; 281 } 282 283 /** 284 * Retrieves the full street address component, which may include house 285 * number, street name, PO BOX, and multi-line. 286 * 287 * @return The full street address component. 288 */ 289 public String getStreetAddress() { 290 return streetAddress; 291 } 292 293 /** 294 * Sets The full street address component, which may include house number, 295 * street name, PO BOX, and multi-line. 296 * 297 * @param streetAddress The full street address component. 298 */ 299 public void setStreetAddress(final String streetAddress) { 300 this.streetAddress = streetAddress; 301 } 302 303 /** 304 * Retrieves the type of address, "work", "home" or "other". 305 * 306 * @return The type of address. 307 */ 308 public String getType() { 309 return type; 310 } 311 312 /** 313 * Sets the type of address, "work", "home" or "other". 314 * 315 * @param type he type of address. 316 */ 317 public void setType(final String type) { 318 this.type = type; 319 } 320 321 /** 322 * {@inheritDoc} 323 */ 324 @Override 325 public boolean equals(final Object o) { 326 if (this == o) { 327 return true; 328 } 329 if (o == null || getClass() != o.getClass()) { 330 return false; 331 } 332 333 Address address = (Address) o; 334 335 if (primary != address.primary) { 336 return false; 337 } 338 if (country != null ? !country.equals(address.country) : 339 address.country != null) { 340 return false; 341 } 342 if (formatted != null ? !formatted.equals(address.formatted) : 343 address.formatted != null) { 344 return false; 345 } 346 if (locality != null ? !locality.equals(address.locality) : 347 address.locality != null) { 348 return false; 349 } 350 if (postalCode != null ? !postalCode.equals(address.postalCode) : 351 address.postalCode != null) { 352 return false; 353 } 354 if (region != null ? !region.equals(address.region) : 355 address.region != null) { 356 return false; 357 } 358 if (streetAddress != null ? !streetAddress.equals(address.streetAddress) : 359 address.streetAddress != null) { 360 return false; 361 } 362 if (type != null ? !type.equals(address.type) : address.type != null) { 363 return false; 364 } 365 366 return true; 367 } 368 369 /** 370 * {@inheritDoc} 371 */ 372 @Override 373 public int hashCode() { 374 int result = country != null ? country.hashCode() : 0; 375 result = 31 * result + (formatted != null ? formatted.hashCode() : 0); 376 result = 31 * result + (locality != null ? locality.hashCode() : 0); 377 result = 31 * result + (postalCode != null ? postalCode.hashCode() : 0); 378 result = 31 * result + (region != null ? region.hashCode() : 0); 379 result = 31 * result + (streetAddress != null ? 380 streetAddress.hashCode() : 0); 381 result = 31 * result + (type != null ? type.hashCode() : 0); 382 result = 31 * result + (primary ? 1 : 0); 383 return result; 384 } 385 386 /** 387 * {@inheritDoc} 388 */ 389 @Override 390 public String toString() { 391 return "Address{" + 392 "formatted='" + formatted + '\'' + 393 ", streetAddress='" + streetAddress + '\'' + 394 ", locality='" + locality + '\'' + 395 ", region='" + region + '\'' + 396 ", postalCode='" + postalCode + '\'' + 397 ", country='" + country + '\'' + 398 ", type='" + type + '\'' + 399 ", primary=" + primary + 400 '}'; 401 } 402}