001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.kim.api.identity.name;
017
018import java.io.Serializable;
019import java.text.SimpleDateFormat;
020import java.util.Collection;
021import java.util.Date;
022import javax.xml.bind.annotation.XmlAccessType;
023import javax.xml.bind.annotation.XmlAccessorType;
024import javax.xml.bind.annotation.XmlAnyElement;
025import javax.xml.bind.annotation.XmlElement;
026import javax.xml.bind.annotation.XmlRootElement;
027import javax.xml.bind.annotation.XmlSchemaType;
028import javax.xml.bind.annotation.XmlType;
029import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
030
031import org.apache.commons.lang.StringUtils;
032import org.joda.time.DateTime;
033import org.kuali.rice.core.api.CoreConstants;
034import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
035import org.kuali.rice.core.api.mo.ModelBuilder;
036import org.kuali.rice.kim.api.KimConstants;
037import org.kuali.rice.kim.api.identity.CodedAttribute;
038import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
039import org.w3c.dom.Element;
040
041import javax.xml.bind.annotation.XmlAccessType;
042import javax.xml.bind.annotation.XmlAccessorType;
043import javax.xml.bind.annotation.XmlAnyElement;
044import javax.xml.bind.annotation.XmlElement;
045import javax.xml.bind.annotation.XmlRootElement;
046import javax.xml.bind.annotation.XmlType;
047import java.io.Serializable;
048import java.util.Collection;
049
050@XmlRootElement(name = EntityName.Constants.ROOT_ELEMENT_NAME)
051@XmlAccessorType(XmlAccessType.NONE)
052@XmlType(name = EntityName.Constants.TYPE_NAME, propOrder = {
053    EntityName.Elements.ID,
054    EntityName.Elements.ENTITY_ID,
055    EntityName.Elements.NAME_TYPE,
056    EntityName.Elements.NAME_PREFIX,
057    EntityName.Elements.NAME_TITLE,
058    EntityName.Elements.FIRST_NAME,
059    EntityName.Elements.MIDDLE_NAME,
060    EntityName.Elements.LAST_NAME,
061    EntityName.Elements.NAME_SUFFIX,
062    EntityName.Elements.COMPOSITE_NAME,
063    EntityName.Elements.NAME_PREFIX_UNMASKED,
064    EntityName.Elements.NAME_TITLE_UNMASKED,
065    EntityName.Elements.FIRST_NAME_UNMASKED,
066    EntityName.Elements.MIDDLE_NAME_UNMASKED,
067    EntityName.Elements.LAST_NAME_UNMASKED,
068    EntityName.Elements.NAME_SUFFIX_UNMASKED,
069    EntityName.Elements.COMPOSITE_NAME_UNMASKED,
070    EntityName.Elements.NOTE_MESSAGE,
071    EntityName.Elements.NAME_CHANGED_DATE,
072    EntityName.Elements.SUPPRESS_NAME,
073    EntityName.Elements.DEFAULT_VALUE,
074    EntityName.Elements.ACTIVE,
075    CoreConstants.CommonElements.VERSION_NUMBER,
076    CoreConstants.CommonElements.OBJECT_ID,
077    CoreConstants.CommonElements.FUTURE_ELEMENTS
078})
079public final class EntityName extends AbstractDataTransferObject
080    implements EntityNameContract
081{
082
083    @XmlElement(name = Elements.NAME_SUFFIX, required = false)
084    private final String nameSuffix;
085    @XmlElement(name = Elements.ENTITY_ID, required = false)
086    private final String entityId;
087    @XmlElement(name = Elements.NAME_TYPE, required = false)
088    private final CodedAttribute nameType;
089    @XmlElement(name = Elements.FIRST_NAME, required = false)
090    private final String firstName;
091    @XmlElement(name = Elements.FIRST_NAME_UNMASKED, required = false)
092    private final String firstNameUnmasked;
093    @XmlElement(name = Elements.MIDDLE_NAME, required = false)
094    private final String middleName;
095    @XmlElement(name = Elements.MIDDLE_NAME_UNMASKED, required = false)
096    private final String middleNameUnmasked;
097    @XmlElement(name = Elements.LAST_NAME, required = false)
098    private final String lastName;
099    @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}