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}