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}