View Javadoc

1   /**
2    * Copyright 2005-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kim.api.identity.name;
17  
18  import java.io.Serializable;
19  import java.text.SimpleDateFormat;
20  import java.util.Collection;
21  import java.util.Date;
22  import javax.xml.bind.annotation.XmlAccessType;
23  import javax.xml.bind.annotation.XmlAccessorType;
24  import javax.xml.bind.annotation.XmlAnyElement;
25  import javax.xml.bind.annotation.XmlElement;
26  import javax.xml.bind.annotation.XmlRootElement;
27  import javax.xml.bind.annotation.XmlSchemaType;
28  import javax.xml.bind.annotation.XmlType;
29  import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
30  
31  import org.apache.commons.lang.StringUtils;
32  import org.joda.time.DateTime;
33  import org.kuali.rice.core.api.CoreConstants;
34  import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
35  import org.kuali.rice.core.api.mo.ModelBuilder;
36  import org.kuali.rice.kim.api.KimConstants;
37  import org.kuali.rice.kim.api.identity.CodedAttribute;
38  import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
39  import org.w3c.dom.Element;
40  
41  import javax.xml.bind.annotation.XmlAccessType;
42  import javax.xml.bind.annotation.XmlAccessorType;
43  import javax.xml.bind.annotation.XmlAnyElement;
44  import javax.xml.bind.annotation.XmlElement;
45  import javax.xml.bind.annotation.XmlRootElement;
46  import javax.xml.bind.annotation.XmlType;
47  import java.io.Serializable;
48  import java.util.Collection;
49  
50  @XmlRootElement(name = EntityName.Constants.ROOT_ELEMENT_NAME)
51  @XmlAccessorType(XmlAccessType.NONE)
52  @XmlType(name = EntityName.Constants.TYPE_NAME, propOrder = {
53      EntityName.Elements.ID,
54      EntityName.Elements.ENTITY_ID,
55      EntityName.Elements.NAME_TYPE,
56      EntityName.Elements.NAME_PREFIX,
57      EntityName.Elements.NAME_TITLE,
58      EntityName.Elements.FIRST_NAME,
59      EntityName.Elements.MIDDLE_NAME,
60      EntityName.Elements.LAST_NAME,
61      EntityName.Elements.NAME_SUFFIX,
62      EntityName.Elements.COMPOSITE_NAME,
63      EntityName.Elements.NAME_PREFIX_UNMASKED,
64      EntityName.Elements.NAME_TITLE_UNMASKED,
65      EntityName.Elements.FIRST_NAME_UNMASKED,
66      EntityName.Elements.MIDDLE_NAME_UNMASKED,
67      EntityName.Elements.LAST_NAME_UNMASKED,
68      EntityName.Elements.NAME_SUFFIX_UNMASKED,
69      EntityName.Elements.COMPOSITE_NAME_UNMASKED,
70      EntityName.Elements.NOTE_MESSAGE,
71      EntityName.Elements.NAME_CHANGED_DATE,
72      EntityName.Elements.SUPPRESS_NAME,
73      EntityName.Elements.DEFAULT_VALUE,
74      EntityName.Elements.ACTIVE,
75      CoreConstants.CommonElements.VERSION_NUMBER,
76      CoreConstants.CommonElements.OBJECT_ID,
77      CoreConstants.CommonElements.FUTURE_ELEMENTS
78  })
79  public final class EntityName extends AbstractDataTransferObject
80      implements EntityNameContract
81  {
82  
83      @XmlElement(name = Elements.NAME_SUFFIX, required = false)
84      private final String nameSuffix;
85      @XmlElement(name = Elements.ENTITY_ID, required = false)
86      private final String entityId;
87      @XmlElement(name = Elements.NAME_TYPE, required = false)
88      private final CodedAttribute nameType;
89      @XmlElement(name = Elements.FIRST_NAME, required = false)
90      private final String firstName;
91      @XmlElement(name = Elements.FIRST_NAME_UNMASKED, required = false)
92      private final String firstNameUnmasked;
93      @XmlElement(name = Elements.MIDDLE_NAME, required = false)
94      private final String middleName;
95      @XmlElement(name = Elements.MIDDLE_NAME_UNMASKED, required = false)
96      private final String middleNameUnmasked;
97      @XmlElement(name = Elements.LAST_NAME, required = false)
98      private final String lastName;
99      @XmlElement(name = Elements.LAST_NAME_UNMASKED, required = false)
100     private final String lastNameUnmasked;
101     @XmlElement(name = Elements.NAME_PREFIX, required = false)
102     private final String namePrefix;
103     @XmlElement(name = Elements.NAME_PREFIX_UNMASKED, required = false)
104     private final String namePrefixUnmasked;
105     @XmlElement(name = Elements.NAME_TITLE, required = false)
106     private final String nameTitle;
107     @XmlElement(name = Elements.NAME_TITLE_UNMASKED, required = false)
108     private final String nameTitleUnmasked;
109     @XmlElement(name = Elements.NAME_SUFFIX_UNMASKED, required = false)
110     private final String nameSuffixUnmasked;
111     @XmlElement(name = Elements.COMPOSITE_NAME, required = false)
112     private final String compositeName;
113     @XmlElement(name = Elements.COMPOSITE_NAME_UNMASKED, required = false)
114     private final String compositeNameUnmasked;
115     @XmlElement(name = Elements.NOTE_MESSAGE, required = false)
116     private final String noteMessage;
117     @XmlElement(name = Elements.NAME_CHANGED_DATE, required = false)
118     @XmlJavaTypeAdapter(DateTimeAdapter.class)
119     private final DateTime nameChangedDate;
120     @XmlElement(name = Elements.SUPPRESS_NAME, required = false)
121     private final boolean suppressName;
122     @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
123     private final Long versionNumber;
124     @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
125     private final String objectId;
126     @XmlElement(name = Elements.DEFAULT_VALUE, required = false)
127     private final boolean defaultValue;
128     @XmlElement(name = Elements.ACTIVE, required = false)
129     private final boolean active;
130     @XmlElement(name = Elements.ID, required = false)
131     private final String id;
132     @SuppressWarnings("unused")
133     @XmlAnyElement
134     private final Collection<Element> _futureElements = null;
135 
136     /**
137      * Private constructor used only by JAXB.
138      * 
139      */
140     private EntityName() {
141         this.nameSuffix = null;
142         this.entityId = null;
143         this.nameType = null;
144         this.firstName = null;
145         this.firstNameUnmasked = null;
146         this.middleName = null;
147         this.middleNameUnmasked = null;
148         this.lastName = null;
149         this.lastNameUnmasked = null;
150         this.namePrefix = null;
151         this.namePrefixUnmasked = null;
152         this.nameTitle = null;
153         this.nameTitleUnmasked = null;
154         this.nameSuffixUnmasked = null;
155         this.compositeName = null;
156         this.compositeNameUnmasked = null;
157         this.noteMessage = null;
158         this.nameChangedDate = null;
159         this.suppressName = false;
160         this.versionNumber = null;
161         this.objectId = null;
162         this.defaultValue = false;
163         this.active = false;
164         this.id = null;
165     }
166 
167     private EntityName(Builder builder) {
168         this.nameSuffix = builder.getNameSuffix();
169         this.entityId = builder.getEntityId();
170         this.nameType = builder.getNameType() != null ? builder.getNameType().build() : null;
171         this.firstName = builder.getFirstName();
172         this.firstNameUnmasked = builder.getFirstNameUnmasked();
173         this.middleName = builder.getMiddleName();
174         this.middleNameUnmasked = builder.getMiddleNameUnmasked();
175         this.lastName = builder.getLastName();
176         this.lastNameUnmasked = builder.getLastNameUnmasked();
177         this.namePrefix = builder.getNamePrefix();
178         this.namePrefixUnmasked = builder.getNamePrefixUnmasked();
179         this.nameTitle = builder.getNameTitle();
180         this.nameTitleUnmasked = builder.getNameTitleUnmasked();
181         this.nameSuffixUnmasked = builder.getNameSuffixUnmasked();
182         this.compositeName = builder.getCompositeName();
183         this.compositeNameUnmasked = builder.getCompositeNameUnmasked();
184         this.noteMessage = builder.getNoteMessage();
185         this.nameChangedDate = builder.getNameChangedDate();
186         this.suppressName = builder.isSuppressName();
187         this.versionNumber = builder.getVersionNumber();
188         this.objectId = builder.getObjectId();
189         this.defaultValue = builder.isDefaultValue();
190         this.active = builder.isActive();
191         this.id = builder.getId();
192     }
193 
194     @Override
195     public String getNameSuffix() {
196         return this.nameSuffix;
197     }
198 
199     @Override
200     public String getEntityId() {
201         return this.entityId;
202     }
203 
204     @Override
205     public CodedAttribute getNameType() {
206         return this.nameType;
207     }
208 
209     @Override
210     public String getFirstName() {
211         return this.firstName;
212     }
213 
214     @Override
215     public String getFirstNameUnmasked() {
216         return this.firstNameUnmasked;
217     }
218 
219     @Override
220     public String getMiddleName() {
221         return this.middleName;
222     }
223 
224     @Override
225     public String getMiddleNameUnmasked() {
226         return this.middleNameUnmasked;
227     }
228 
229     @Override
230     public String getLastName() {
231         return this.lastName;
232     }
233 
234     @Override
235     public String getLastNameUnmasked() {
236         return this.lastNameUnmasked;
237     }
238 
239     @Override
240     public String getNamePrefix() {
241         return this.namePrefix;
242     }
243 
244     @Override
245     public String getNamePrefixUnmasked() {
246         return this.namePrefixUnmasked;
247     }
248 
249     @Override
250     public String getNameTitle() {
251         return this.nameTitle;
252     }
253 
254     @Override
255     public String getNameTitleUnmasked() {
256         return this.nameTitleUnmasked;
257     }
258 
259     @Override
260     public String getNameSuffixUnmasked() {
261         return this.nameSuffixUnmasked;
262     }
263 
264     @Override
265     public String getCompositeName() {
266         return this.compositeName;
267     }
268 
269     @Override
270     public String getCompositeNameUnmasked() {
271         return this.compositeNameUnmasked;
272     }
273 
274     @Override
275     public String getNoteMessage() {
276         return this.noteMessage;
277     }
278 
279     @Override
280     public DateTime getNameChangedDate() {
281         return this.nameChangedDate;
282     }
283 
284     @Override
285     public boolean isSuppressName() {
286         return this.suppressName;
287     }
288 
289     @Override
290     public Long getVersionNumber() {
291         return this.versionNumber;
292     }
293 
294     @Override
295     public String getObjectId() {
296         return this.objectId;
297     }
298 
299     @Override
300     public boolean isDefaultValue() {
301         return this.defaultValue;
302     }
303 
304     @Override
305     public boolean isActive() {
306         return this.active;
307     }
308 
309     @Override
310     public String getId() {
311         return this.id;
312     }
313 
314 
315     /**
316      * A builder which can be used to construct {@link EntityName} instances.  Enforces the constraints of the {@link EntityNameContract}.
317      * 
318      */
319     public final static class Builder
320         implements Serializable, ModelBuilder, EntityNameContract
321     {
322 
323         private String nameSuffix;
324         private String entityId;
325         private CodedAttribute.Builder nameType;
326         private String firstName;
327         private String middleName;
328         private String lastName;
329         private String namePrefix;
330         private String nameTitle;
331         private String compositeName;
332         private String noteMessage;
333         private DateTime nameChangedDate;
334         private boolean suppressName;
335         private Long versionNumber;
336         private String objectId;
337         private boolean defaultValue;
338         private boolean active;
339         private String id;
340 
341         private Builder() { }
342 
343         private Builder(String id, String entityId, String firstName, String lastName, boolean suppressName) {
344             setId(id);
345             setEntityId(entityId);
346             setFirstName(firstName);
347             setLastName(lastName);
348             setSuppressName(suppressName);
349         }
350 
351         public static Builder create() {
352             return new Builder();
353         }
354 
355         public static Builder create(String id, String entityId, String firstName,
356         						     String lastName, boolean suppressName) {
357 			return new Builder(id, entityId, firstName, lastName, suppressName);
358         }
359 
360         public static Builder create(EntityNameContract contract) {
361             if (contract == null) {
362                 throw new IllegalArgumentException("contract was null");
363             }
364             Builder builder = create();
365             builder.setNameSuffix(contract.getNameSuffix());
366             builder.setEntityId(contract.getEntityId());
367             if (contract.getNameType() != null) {
368                 builder.setNameType(CodedAttribute.Builder.create(contract.getNameType()));
369             }
370             builder.setFirstName(contract.getFirstName());
371             builder.setMiddleName(contract.getMiddleName());
372             builder.setLastName(contract.getLastName());
373             builder.setNamePrefix(contract.getNamePrefix());
374             builder.setNameTitle(contract.getNameTitle());
375             builder.setNoteMessage(contract.getNoteMessage());
376             builder.setNameChangedDate(contract.getNameChangedDate());
377             builder.setSuppressName(contract.isSuppressName());
378             builder.setVersionNumber(contract.getVersionNumber());
379             builder.setObjectId(contract.getObjectId());
380             builder.setDefaultValue(contract.isDefaultValue());
381             builder.setActive(contract.isActive());
382             builder.setId(contract.getId());
383             builder.setCompositeName(contract.getCompositeName());
384             return builder;
385         }
386 
387         public EntityName build() {
388             return new EntityName(this);
389         }
390 
391         @Override
392         public String getNameSuffix() {
393             if (isSuppressName()) {
394                 return KimConstants.RESTRICTED_DATA_MASK;
395             }
396             return this.nameSuffix;
397         }
398 
399         @Override
400         public String getEntityId() {
401             return this.entityId;
402         }
403 
404         @Override
405         public CodedAttribute.Builder getNameType() {
406             return this.nameType;
407         }
408 
409         @Override
410         public String getFirstName() {
411             if (isSuppressName()) {
412                 return KimConstants.RESTRICTED_DATA_MASK;
413             }
414             return this.firstName;
415         }
416 
417         @Override
418         public String getFirstNameUnmasked() {
419             return this.firstName;
420         }
421 
422         @Override
423         public String getMiddleName() {
424             if (isSuppressName()) {
425                 return KimConstants.RESTRICTED_DATA_MASK;
426             }
427             return this.middleName;
428         }
429 
430         @Override
431         public String getMiddleNameUnmasked() {
432             return this.middleName;
433         }
434 
435         @Override
436         public String getLastName() {
437             if (isSuppressName()) {
438                 return KimConstants.RESTRICTED_DATA_MASK;
439             }
440             return this.lastName;
441         }
442 
443         @Override
444         public String getLastNameUnmasked() {
445             return this.lastName;
446         }
447 
448         @Override
449         public String getNamePrefix() {
450             if (isSuppressName()) {
451                 return KimConstants.RESTRICTED_DATA_MASK;
452             }
453             return this.namePrefix;
454         }
455 
456         @Override
457         public String getNamePrefixUnmasked() {
458             return this.namePrefix;
459         }
460 
461         @Override
462         public String getNameTitle() {
463             if (isSuppressName()) {
464                 return KimConstants.RESTRICTED_DATA_MASK;
465             }
466             return this.nameTitle;
467         }
468 
469         @Override
470         public String getNameTitleUnmasked() {
471             return this.nameTitle;
472         }
473 
474         @Override
475         public String getNameSuffixUnmasked() {
476             return this.nameSuffix;
477         }
478 
479         @Override
480         public String getCompositeName() {
481             if (isSuppressName()) {
482                 return KimConstants.RESTRICTED_DATA_MASK;
483             }
484             return getCompositeNameUnmasked();
485         }
486 
487         @Override
488         public String getCompositeNameUnmasked() {
489         	if(this.compositeName == null) {
490         		setCompositeName((getLastName() + ", " + getFirstName() + (getMiddleName()==null?"":" " + getMiddleName())).trim());
491         	}
492             return this.compositeName;
493         }
494 
495         @Override
496         public String getNoteMessage() {
497             return this.noteMessage;
498         }
499 
500         @Override
501         public DateTime getNameChangedDate() {
502             return this.nameChangedDate;
503         }
504 
505         @Override
506         public boolean isSuppressName() {
507             return this.suppressName;
508         }
509 
510         @Override
511         public Long getVersionNumber() {
512             return this.versionNumber;
513         }
514 
515         @Override
516         public String getObjectId() {
517             return this.objectId;
518         }
519 
520         @Override
521         public boolean isDefaultValue() {
522             return this.defaultValue;
523         }
524 
525         @Override
526         public boolean isActive() {
527             return this.active;
528         }
529 
530         @Override
531         public String getId() {
532             return this.id;
533         }
534 
535         public void setNameSuffix(String nameSuffix) {
536             this.nameSuffix = nameSuffix;
537         }
538 
539         public void setEntityId(String entityId) {
540             this.entityId = entityId;
541         }
542 
543         public void setNameType(CodedAttribute.Builder nameType) {
544             this.nameType = nameType;
545         }
546 
547         public void setFirstName(String firstName) {
548             this.firstName = firstName;
549         }
550 
551         public void setMiddleName(String middleName) {
552 
553             this.middleName = middleName;
554         }
555 
556         public void setLastName(String lastName) {
557             this.lastName = lastName;
558         }
559 
560         public void setNamePrefix(String namePrefix) {
561             this.namePrefix = namePrefix;
562         }
563 
564         public void setNameTitle(String nameTitle) {
565             this.nameTitle = nameTitle;
566         }
567 
568         public void setCompositeName(String compositeName) {
569         	this.compositeName = compositeName;
570         }
571         
572         public void setNoteMessage(String noteMessage) {
573             this.noteMessage = noteMessage;
574         }
575 
576         public void setNameChangedDate(DateTime nameChangedDate) {
577             this.nameChangedDate = nameChangedDate;
578         }
579 
580         private void setSuppressName(boolean suppressName) {
581             this.suppressName = suppressName;
582         }
583 
584         public void setVersionNumber(Long versionNumber) {
585             this.versionNumber = versionNumber;
586         }
587 
588         public void setObjectId(String objectId) {
589             this.objectId = objectId;
590         }
591 
592         public void setDefaultValue(boolean defaultValue) {
593             this.defaultValue = defaultValue;
594         }
595 
596         public void setActive(boolean active) {
597             this.active = active;
598         }
599 
600         public void setId(String id) {
601             if (StringUtils.isWhitespace(id)) {
602                 throw new IllegalArgumentException("id is blank");
603             }
604             this.id = id;
605         }
606 
607     }
608 
609 
610     /**
611      * Defines some internal constants used on this class.
612      * 
613      */
614     static class Constants {
615 
616         final static String ROOT_ELEMENT_NAME = "entityName";
617         final static String TYPE_NAME = "EntityNameType";
618     }
619 
620 
621     /**
622      * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
623      * 
624      */
625     static class Elements {
626 
627         final static String NAME_SUFFIX = "nameSuffix";
628         final static String ENTITY_ID = "entityId";
629         final static String NAME_TYPE = "nameType";
630         final static String FIRST_NAME = "firstName";
631         final static String FIRST_NAME_UNMASKED = "firstNameUnmasked";
632         final static String MIDDLE_NAME = "middleName";
633         final static String MIDDLE_NAME_UNMASKED = "middleNameUnmasked";
634         final static String LAST_NAME = "lastName";
635         final static String LAST_NAME_UNMASKED = "lastNameUnmasked";
636         final static String NAME_PREFIX = "namePrefix";
637         final static String NAME_PREFIX_UNMASKED = "namePrefixUnmasked";
638         final static String NAME_TITLE = "nameTitle";
639         final static String NAME_TITLE_UNMASKED = "nameTitleUnmasked";
640         final static String NAME_SUFFIX_UNMASKED = "nameSuffixUnmasked";
641         final static String COMPOSITE_NAME = "compositeName";
642         final static String COMPOSITE_NAME_UNMASKED = "compositeNameUnmasked";
643         final static String NOTE_MESSAGE = "noteMessage";
644         final static String NAME_CHANGED_DATE= "nameChangedDate";
645         final static String SUPPRESS_NAME = "suppressName";
646         final static String DEFAULT_VALUE = "defaultValue";
647         final static String ACTIVE = "active";
648         final static String ID = "id";
649 
650     }
651 
652 }