001 /** 002 * Copyright 2005-2012 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 */ 016 package org.kuali.rice.kim.api.identity.name; 017 018 import java.io.Serializable; 019 import java.text.SimpleDateFormat; 020 import java.util.Collection; 021 import java.util.Date; 022 import javax.xml.bind.annotation.XmlAccessType; 023 import javax.xml.bind.annotation.XmlAccessorType; 024 import javax.xml.bind.annotation.XmlAnyElement; 025 import javax.xml.bind.annotation.XmlElement; 026 import javax.xml.bind.annotation.XmlRootElement; 027 import javax.xml.bind.annotation.XmlSchemaType; 028 import javax.xml.bind.annotation.XmlType; 029 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 030 031 import org.apache.commons.lang.StringUtils; 032 import org.joda.time.DateTime; 033 import org.kuali.rice.core.api.CoreConstants; 034 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 035 import org.kuali.rice.core.api.mo.ModelBuilder; 036 import org.kuali.rice.kim.api.KimConstants; 037 import org.kuali.rice.kim.api.identity.CodedAttribute; 038 import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter; 039 import org.w3c.dom.Element; 040 041 import javax.xml.bind.annotation.XmlAccessType; 042 import javax.xml.bind.annotation.XmlAccessorType; 043 import javax.xml.bind.annotation.XmlAnyElement; 044 import javax.xml.bind.annotation.XmlElement; 045 import javax.xml.bind.annotation.XmlRootElement; 046 import javax.xml.bind.annotation.XmlType; 047 import java.io.Serializable; 048 import 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 }) 079 public 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 public static Builder create() { 344 return new Builder(); 345 } 346 347 public static Builder create(EntityNameContract contract) { 348 if (contract == null) { 349 throw new IllegalArgumentException("contract was null"); 350 } 351 Builder builder = create(); 352 builder.setNameSuffix(contract.getNameSuffix()); 353 builder.setEntityId(contract.getEntityId()); 354 if (contract.getNameType() != null) { 355 builder.setNameType(CodedAttribute.Builder.create(contract.getNameType())); 356 } 357 builder.setFirstName(contract.getFirstName()); 358 builder.setMiddleName(contract.getMiddleName()); 359 builder.setLastName(contract.getLastName()); 360 builder.setNamePrefix(contract.getNamePrefix()); 361 builder.setNameTitle(contract.getNameTitle()); 362 builder.setNoteMessage(contract.getNoteMessage()); 363 builder.setNameChangedDate(contract.getNameChangedDate()); 364 builder.setSuppressName(contract.isSuppressName()); 365 builder.setVersionNumber(contract.getVersionNumber()); 366 builder.setObjectId(contract.getObjectId()); 367 builder.setDefaultValue(contract.isDefaultValue()); 368 builder.setActive(contract.isActive()); 369 builder.setId(contract.getId()); 370 builder.setCompositeName(contract.getCompositeName()); 371 return builder; 372 } 373 374 public EntityName build() { 375 return new EntityName(this); 376 } 377 378 @Override 379 public String getNameSuffix() { 380 if (isSuppressName()) { 381 return KimConstants.RESTRICTED_DATA_MASK; 382 } 383 return this.nameSuffix; 384 } 385 386 @Override 387 public String getEntityId() { 388 return this.entityId; 389 } 390 391 @Override 392 public CodedAttribute.Builder getNameType() { 393 return this.nameType; 394 } 395 396 @Override 397 public String getFirstName() { 398 if (isSuppressName()) { 399 return KimConstants.RESTRICTED_DATA_MASK; 400 } 401 return this.firstName; 402 } 403 404 @Override 405 public String getFirstNameUnmasked() { 406 return this.firstName; 407 } 408 409 @Override 410 public String getMiddleName() { 411 if (isSuppressName()) { 412 return KimConstants.RESTRICTED_DATA_MASK; 413 } 414 return this.middleName; 415 } 416 417 @Override 418 public String getMiddleNameUnmasked() { 419 return this.middleName; 420 } 421 422 @Override 423 public String getLastName() { 424 if (isSuppressName()) { 425 return KimConstants.RESTRICTED_DATA_MASK; 426 } 427 return this.lastName; 428 } 429 430 @Override 431 public String getLastNameUnmasked() { 432 return this.lastName; 433 } 434 435 @Override 436 public String getNamePrefix() { 437 if (isSuppressName()) { 438 return KimConstants.RESTRICTED_DATA_MASK; 439 } 440 return this.namePrefix; 441 } 442 443 @Override 444 public String getNamePrefixUnmasked() { 445 return this.namePrefix; 446 } 447 448 @Override 449 public String getNameTitle() { 450 if (isSuppressName()) { 451 return KimConstants.RESTRICTED_DATA_MASK; 452 } 453 return this.nameTitle; 454 } 455 456 @Override 457 public String getNameTitleUnmasked() { 458 return this.nameTitle; 459 } 460 461 @Override 462 public String getNameSuffixUnmasked() { 463 return this.nameSuffix; 464 } 465 466 @Override 467 public String getCompositeName() { 468 if (isSuppressName()) { 469 return KimConstants.RESTRICTED_DATA_MASK; 470 } 471 return getCompositeNameUnmasked(); 472 } 473 474 @Override 475 public String getCompositeNameUnmasked() { 476 if(this.compositeName == null) { 477 setCompositeName(getLastName() + ", " + getFirstName() + (getMiddleName()==null?"":" " + getMiddleName())); 478 } 479 return this.compositeName; 480 } 481 482 @Override 483 public String getNoteMessage() { 484 return this.noteMessage; 485 } 486 487 @Override 488 public DateTime getNameChangedDate() { 489 return this.nameChangedDate; 490 } 491 492 @Override 493 public boolean isSuppressName() { 494 return this.suppressName; 495 } 496 497 @Override 498 public Long getVersionNumber() { 499 return this.versionNumber; 500 } 501 502 @Override 503 public String getObjectId() { 504 return this.objectId; 505 } 506 507 @Override 508 public boolean isDefaultValue() { 509 return this.defaultValue; 510 } 511 512 @Override 513 public boolean isActive() { 514 return this.active; 515 } 516 517 @Override 518 public String getId() { 519 return this.id; 520 } 521 522 public void setNameSuffix(String nameSuffix) { 523 this.nameSuffix = nameSuffix; 524 } 525 526 public void setEntityId(String entityId) { 527 this.entityId = entityId; 528 } 529 530 public void setNameType(CodedAttribute.Builder nameType) { 531 this.nameType = nameType; 532 } 533 534 public void setFirstName(String firstName) { 535 this.firstName = firstName; 536 } 537 538 public void setMiddleName(String middleName) { 539 540 this.middleName = middleName; 541 } 542 543 public void setLastName(String lastName) { 544 this.lastName = lastName; 545 } 546 547 public void setNamePrefix(String namePrefix) { 548 this.namePrefix = namePrefix; 549 } 550 551 public void setNameTitle(String nameTitle) { 552 this.nameTitle = nameTitle; 553 } 554 555 public void setCompositeName(String compositeName) { 556 this.compositeName = compositeName; 557 } 558 559 public void setNoteMessage(String noteMessage) { 560 this.noteMessage = noteMessage; 561 } 562 563 public void setNameChangedDate(DateTime nameChangedDate) { 564 this.nameChangedDate = nameChangedDate; 565 } 566 567 private void setSuppressName(boolean suppressName) { 568 this.suppressName = suppressName; 569 } 570 571 public void setVersionNumber(Long versionNumber) { 572 this.versionNumber = versionNumber; 573 } 574 575 public void setObjectId(String objectId) { 576 this.objectId = objectId; 577 } 578 579 public void setDefaultValue(boolean defaultValue) { 580 this.defaultValue = defaultValue; 581 } 582 583 public void setActive(boolean active) { 584 this.active = active; 585 } 586 587 public void setId(String id) { 588 if (StringUtils.isWhitespace(id)) { 589 throw new IllegalArgumentException("id is blank"); 590 } 591 this.id = id; 592 } 593 594 } 595 596 597 /** 598 * Defines some internal constants used on this class. 599 * 600 */ 601 static class Constants { 602 603 final static String ROOT_ELEMENT_NAME = "entityName"; 604 final static String TYPE_NAME = "EntityNameType"; 605 } 606 607 608 /** 609 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 610 * 611 */ 612 static class Elements { 613 614 final static String NAME_SUFFIX = "nameSuffix"; 615 final static String ENTITY_ID = "entityId"; 616 final static String NAME_TYPE = "nameType"; 617 final static String FIRST_NAME = "firstName"; 618 final static String FIRST_NAME_UNMASKED = "firstNameUnmasked"; 619 final static String MIDDLE_NAME = "middleName"; 620 final static String MIDDLE_NAME_UNMASKED = "middleNameUnmasked"; 621 final static String LAST_NAME = "lastName"; 622 final static String LAST_NAME_UNMASKED = "lastNameUnmasked"; 623 final static String NAME_PREFIX = "namePrefix"; 624 final static String NAME_PREFIX_UNMASKED = "namePrefixUnmasked"; 625 final static String NAME_TITLE = "nameTitle"; 626 final static String NAME_TITLE_UNMASKED = "nameTitleUnmasked"; 627 final static String NAME_SUFFIX_UNMASKED = "nameSuffixUnmasked"; 628 final static String COMPOSITE_NAME = "compositeName"; 629 final static String COMPOSITE_NAME_UNMASKED = "compositeNameUnmasked"; 630 final static String NOTE_MESSAGE = "noteMessage"; 631 final static String NAME_CHANGED_DATE= "nameChangedDate"; 632 final static String SUPPRESS_NAME = "suppressName"; 633 final static String DEFAULT_VALUE = "defaultValue"; 634 final static String ACTIVE = "active"; 635 final static String ID = "id"; 636 637 } 638 639 }