001    /*
002     * Copyright 2011-2012 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    
018    package com.unboundid.scim.data;
019    
020    import com.unboundid.scim.schema.AttributeDescriptor;
021    import com.unboundid.scim.sdk.InvalidResourceException;
022    import com.unboundid.scim.sdk.SCIMAttribute;
023    import com.unboundid.scim.sdk.SCIMAttributeValue;
024    
025    import java.util.ArrayList;
026    import java.util.List;
027    
028    /**
029     * A complex type containing the components of the User's real name.
030     */
031    public class Name
032    {
033      /**
034       * The <code>AttributeValueResolver</code> that resolves SCIM attribute values
035       * to/from <code>Name</code> instances.
036       */
037      public static final AttributeValueResolver<Name> NAME_RESOLVER =
038          new AttributeValueResolver<Name>()
039          {
040            /**
041             * {@inheritDoc}
042             */
043            @Override
044            public Name toInstance(final SCIMAttributeValue value) {
045              return new Name(
046                  value.getSubAttributeValue("formatted",
047                      STRING_RESOLVER),
048                  value.getSubAttributeValue("familyName",
049                      STRING_RESOLVER),
050                  value.getSubAttributeValue("middleName",
051                      STRING_RESOLVER),
052                  value.getSubAttributeValue("givenName",
053                      STRING_RESOLVER),
054                  value.getSubAttributeValue("honorificPrefix",
055                      STRING_RESOLVER),
056                  value.getSubAttributeValue("honorificSuffix",
057                      STRING_RESOLVER));
058            }
059    
060            /**
061             * {@inheritDoc}
062             */
063            @Override
064            public SCIMAttributeValue fromInstance(
065                final AttributeDescriptor attributeDescriptor, final Name value)
066                throws InvalidResourceException {
067              final List<SCIMAttribute> subAttributes =
068                  new ArrayList<SCIMAttribute>(6);
069    
070              if (value.formatted != null)
071              {
072                subAttributes.add(
073                    SCIMAttribute.create(
074                        attributeDescriptor.getSubAttribute("formatted"),
075                        SCIMAttributeValue.createStringValue(value.formatted)));
076              }
077    
078              if (value.givenName != null)
079              {
080                subAttributes.add(
081                    SCIMAttribute.create(
082                        attributeDescriptor.getSubAttribute("givenName"),
083                        SCIMAttributeValue.createStringValue(value.givenName)));
084              }
085    
086              if (value.familyName != null)
087              {
088                subAttributes.add(
089                    SCIMAttribute.create(
090                        attributeDescriptor.getSubAttribute("familyName"),
091                        SCIMAttributeValue.createStringValue(value.familyName)));
092              }
093    
094              if (value.middleName != null)
095              {
096                subAttributes.add(
097                    SCIMAttribute.create(
098                        attributeDescriptor.getSubAttribute("middleName"),
099                        SCIMAttributeValue.createStringValue(value.middleName)));
100              }
101    
102              if (value.honorificPrefix != null)
103              {
104                subAttributes.add(
105                    SCIMAttribute.create(
106                        attributeDescriptor.getSubAttribute("honorificPrefix"),
107                        SCIMAttributeValue.createStringValue(
108                            value.honorificPrefix)));
109              }
110    
111              if (value.honorificSuffix != null)
112              {
113                subAttributes.add(
114                    SCIMAttribute.create(
115                        attributeDescriptor.getSubAttribute("honorificSuffix"),
116                        SCIMAttributeValue.createStringValue(
117                            value.honorificSuffix)));
118              }
119    
120              return SCIMAttributeValue.createComplexValue(subAttributes);
121            }
122          };
123    
124      private String formatted;
125      private String familyName;
126      private String middleName;
127      private String givenName;
128      private String honorificPrefix;
129      private String honorificSuffix;
130    
131      /**
132       * Creates a SCIM core user 'name' attribute. Any of the arguments may be
133       * {@code null} if they are not to be included.
134       *
135       * @param formatted        The The full name, including all middle names,
136       *                         titles, and suffixes as appropriate, formatted
137       *                         for display.
138       * @param familyName       The family name of the User, or "Last Name" in
139       *                         most Western languages.
140       * @param givenName        The given name of the User, or "First Name" in
141       *                         most Western languages.
142       * @param middleName       The middle name(s) of the User.
143       * @param honorificPrefix  The honorific prefix(es) of the User, or "Title"
144       *                         in most Western languages.
145       * @param honorificSuffix  The honorifix suffix(es) of the User, or "Suffix"
146       *                         in most Western languages.
147       */
148      public Name(final String formatted, final String familyName,
149                  final String middleName, final String givenName,
150                  final String honorificPrefix, final String honorificSuffix) {
151        this.formatted = formatted;
152        this.familyName = familyName;
153        this.middleName = middleName;
154        this.givenName = givenName;
155        this.honorificPrefix = honorificPrefix;
156        this.honorificSuffix = honorificSuffix;
157      }
158    
159      /**
160       * Retrieves the family name of the User, or "Last Name" in  most Western
161       * languages.
162       *
163       * @return The family name of the User, or "Last Name" in  most Western
164       * languages.
165       */
166      public String getFamilyName() {
167        return familyName;
168      }
169    
170      /**
171       * Sets the family name of the User, or "Last Name" in  most Western
172       * languages.
173       *
174       * @param familyName The family name of the User, or "Last Name" in  most
175       * Western languages.
176       */
177      public void setFamilyName(final String familyName) {
178        this.familyName = familyName;
179      }
180    
181      /**
182       * Retrieves the full name, including all middle names, titles, and
183       * suffixes as appropriate, formatted for display.
184       *
185       * @return The full name, including all middle names, titles, and
186       * suffixes as appropriate, formatted for display.
187       */
188      public String getFormatted() {
189        return formatted;
190      }
191    
192      /**
193       * Sets the full name, including all middle names, titles, and
194       * suffixes as appropriate, formatted for display.
195       *
196       * @param formatted The full name, including all middle names, titles, and
197       * suffixes as appropriate, formatted for display.
198       */
199      public void setFormatted(final String formatted) {
200        this.formatted = formatted;
201      }
202    
203      /**
204       * Retrieves the given name of the User, or "First Name" in most Western
205       * languages.
206       *
207       * @return The given name of the User, or "First Name" in most Western
208       * languages.
209       */
210      public String getGivenName() {
211        return givenName;
212      }
213    
214      /**
215       * Sets the given name of the User, or "First Name" in most Western
216       * languages.
217       *
218       * @param givenName The given name of the User, or "First Name" in most
219       * Western languages.
220       */
221      public void setGivenName(final String givenName) {
222        this.givenName = givenName;
223      }
224    
225      /**
226       * Retrieves the honorific prefix(es) of the User, or "Title" in most Western
227       * languages.
228       *
229       * @return The honorific prefix(es) of the User, or "Title" in most Western
230       * languages.
231       */
232      public String getHonorificPrefix() {
233        return honorificPrefix;
234      }
235    
236      /**
237       * Sets the honorific prefix(es) of the User, or "Title" in most Western
238       * languages.
239       *
240       * @param honorificPrefix The honorific prefix(es) of the User, or "Title"
241       * in most Western languages.
242       */
243      public void setHonorificPrefix(final String honorificPrefix) {
244        this.honorificPrefix = honorificPrefix;
245      }
246    
247      /**
248       * Retrieves the honorific suffix(es) of the User, or "Suffix" in most
249       * Western languages.
250       *
251       * @return The honorific suffix(es) of the User, or "Suffix" in most
252       * Western languages.
253       */
254      public String getHonorificSuffix() {
255        return honorificSuffix;
256      }
257    
258      /**
259       * Sets the honorific suffix(es) of the User, or "Suffix" in most
260       * Western languages.
261       *
262       * @param honorificSuffix The honorific suffix(es) of the User, or "Suffix"
263       * in most Western languages.
264       */
265      public void setHonorificSuffix(final String honorificSuffix) {
266        this.honorificSuffix = honorificSuffix;
267      }
268    
269      /**
270       * Retrieves the middle name(s) of the User.
271       *
272       * @return The middle name(s) of the User.
273       */
274      public String getMiddleName() {
275        return middleName;
276      }
277    
278      /**
279       * Retrieves the middle name(s) of the User.
280       *
281       * @param middleName The middle name(s) of the User.
282       */
283      public void setMiddleName(final String middleName) {
284        this.middleName = middleName;
285      }
286    
287      /**
288       * {@inheritDoc}
289       */
290      @Override
291      public boolean equals(final Object o) {
292        if (this == o) {
293          return true;
294        }
295        if (o == null || getClass() != o.getClass()) {
296          return false;
297        }
298    
299        Name name = (Name) o;
300    
301        if (familyName != null ? !familyName.equals(name.familyName) :
302            name.familyName != null) {
303          return false;
304        }
305        if (formatted != null ? !formatted.equals(name.formatted) :
306            name.formatted != null) {
307          return false;
308        }
309        if (givenName != null ? !givenName.equals(name.givenName) :
310            name.givenName != null) {
311          return false;
312        }
313        if (honorificPrefix != null ?
314            !honorificPrefix.equals(name.honorificPrefix) :
315            name.honorificPrefix != null) {
316          return false;
317        }
318        if (honorificSuffix != null ?
319            !honorificSuffix.equals(name.honorificSuffix) :
320            name.honorificSuffix != null) {
321          return false;
322        }
323        if (middleName != null ? !middleName.equals(name.middleName) :
324            name.middleName != null) {
325          return false;
326        }
327    
328        return true;
329      }
330    
331      /**
332       * {@inheritDoc}
333       */
334      @Override
335      public int hashCode() {
336        int result = formatted != null ? formatted.hashCode() : 0;
337        result = 31 * result + (familyName != null ? familyName.hashCode() : 0);
338        result = 31 * result + (middleName != null ? middleName.hashCode() : 0);
339        result = 31 * result + (givenName != null ? givenName.hashCode() : 0);
340        result = 31 * result + (honorificPrefix != null ?
341            honorificPrefix.hashCode() : 0);
342        result = 31 * result + (honorificSuffix != null ?
343            honorificSuffix.hashCode() : 0);
344        return result;
345      }
346    
347      @Override
348      public String toString() {
349        return "Name{" +
350            "formatted='" + formatted + '\'' +
351            ", familyName='" + familyName + '\'' +
352            ", middleName='" + middleName + '\'' +
353            ", givenName='" + givenName + '\'' +
354            ", honorificPrefix='" + honorificPrefix + '\'' +
355            ", honorificSuffix='" + honorificSuffix + '\'' +
356            '}';
357      }
358    }