001 /** 002 * Copyright 2005-2013 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.personal; 017 018 import org.apache.commons.collections.CollectionUtils; 019 import org.apache.commons.lang.StringUtils; 020 import org.apache.log4j.Logger; 021 import org.joda.time.DateTime; 022 import org.joda.time.Years; 023 import org.kuali.rice.core.api.CoreConstants; 024 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 025 import org.kuali.rice.core.api.mo.ModelBuilder; 026 import org.kuali.rice.core.api.mo.common.active.InactivatableFromToUtils; 027 import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter; 028 import org.kuali.rice.kim.api.KimConstants; 029 import org.w3c.dom.Element; 030 031 import javax.xml.bind.annotation.XmlAccessType; 032 import javax.xml.bind.annotation.XmlAccessorType; 033 import javax.xml.bind.annotation.XmlAnyElement; 034 import javax.xml.bind.annotation.XmlElement; 035 import javax.xml.bind.annotation.XmlElementWrapper; 036 import javax.xml.bind.annotation.XmlRootElement; 037 import javax.xml.bind.annotation.XmlType; 038 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 039 import java.io.Serializable; 040 import java.text.ParseException; 041 import java.text.SimpleDateFormat; 042 import java.util.ArrayList; 043 import java.util.Collection; 044 import java.util.Collections; 045 import java.util.Date; 046 import java.util.List; 047 048 @XmlRootElement(name = EntityBioDemographicsHistory.Constants.ROOT_ELEMENT_NAME) 049 @XmlAccessorType(XmlAccessType.NONE) 050 @XmlType(name = EntityBioDemographicsHistory.Constants.TYPE_NAME, propOrder = { 051 EntityBioDemographicsHistory.Elements.ENTITY_ID, 052 EntityBioDemographicsHistory.Elements.DECEASED_DATE, 053 EntityBioDemographicsHistory.Elements.BIRTH_DATE, 054 EntityBioDemographicsHistory.Elements.AGE, 055 EntityBioDemographicsHistory.Elements.GENDER_CODE, 056 EntityBioDemographicsHistory.Elements.GENDER_CHANGE_CODE, 057 EntityBioDemographicsHistory.Elements.MARITAL_STATUS_CODE, 058 EntityBioDemographicsHistory.Elements.PRIMARY_LANGUAGE_CODE, 059 EntityBioDemographicsHistory.Elements.SECONDARY_LANGUAGE_CODE, 060 EntityBioDemographicsHistory.Elements.BIRTH_COUNTRY, 061 EntityBioDemographicsHistory.Elements.BIRTH_STATE_PROVINCE_CODE, 062 EntityBioDemographicsHistory.Elements.BIRTH_CITY, 063 EntityBioDemographicsHistory.Elements.GEOGRAPHIC_ORIGIN, 064 EntityBioDemographicsHistory.Elements.BIRTH_DATE_UNMASKED, 065 EntityBioDemographicsHistory.Elements.GENDER_CODE_UNMASKED, 066 EntityBioDemographicsHistory.Elements.GENDER_CHANGE_CODE_UNMASKED, 067 EntityBioDemographicsHistory.Elements.MARITAL_STATUS_CODE_UNMASKED, 068 EntityBioDemographicsHistory.Elements.PRIMARY_LANGUAGE_CODE_UNMASKED, 069 EntityBioDemographicsHistory.Elements.SECONDARY_LANGUAGE_CODE_UNMASKED, 070 EntityBioDemographicsHistory.Elements.BIRTH_COUNTRY_UNMASKED, 071 EntityBioDemographicsHistory.Elements.BIRTH_STATE_PROVINCE_CODE_UNMASKED, 072 EntityBioDemographicsHistory.Elements.BIRTH_CITY_UNMASKED, 073 EntityBioDemographicsHistory.Elements.GEOGRAPHIC_ORIGIN_UNMASKED, 074 EntityBioDemographicsHistory.Elements.NOTE_MESSAGE, 075 EntityBioDemographicsHistory.Elements.SUPPRESS_PERSONAL, 076 EntityBioDemographicsHistory.Elements.DISABLED, 077 EntityBioDemographicsHistory.Elements.DISABILITIES, 078 EntityBioDemographicsHistory.Elements.VETERAN, 079 EntityBioDemographicsHistory.Elements.MILITARY_RECORDS, 080 CoreConstants.CommonElements.HISTORY_ID, 081 CoreConstants.CommonElements.ACTIVE_FROM_DATE, 082 CoreConstants.CommonElements.ACTIVE_TO_DATE, 083 CoreConstants.CommonElements.VERSION_NUMBER, 084 CoreConstants.CommonElements.OBJECT_ID, 085 CoreConstants.CommonElements.FUTURE_ELEMENTS 086 }) 087 public final class EntityBioDemographicsHistory extends AbstractDataTransferObject 088 implements EntityBioDemographicsHistoryContract 089 { 090 private static final Logger LOG = Logger.getLogger(EntityBioDemographicsHistory.class); 091 092 @XmlElement(name = Elements.ENTITY_ID, required = false) 093 private final String entityId; 094 @XmlElement(name = Elements.DECEASED_DATE, required = false) 095 private final String deceasedDate; 096 @XmlElement(name = Elements.BIRTH_DATE, required = false) 097 private final String birthDate; 098 @XmlElement(name = Elements.GENDER_CODE, required = false) 099 private final String genderCode; 100 @XmlElement(name = Elements.GENDER_CHANGE_CODE, required = false) 101 private final String genderChangeCode; 102 @XmlElement(name = Elements.MARITAL_STATUS_CODE, required = false) 103 private final String maritalStatusCode; 104 @XmlElement(name = Elements.PRIMARY_LANGUAGE_CODE, required = false) 105 private final String primaryLanguageCode; 106 @XmlElement(name = Elements.SECONDARY_LANGUAGE_CODE, required = false) 107 private final String secondaryLanguageCode; 108 @XmlElement(name = Elements.BIRTH_COUNTRY, required = false) 109 private final String birthCountry; 110 @XmlElement(name = Elements.BIRTH_STATE_PROVINCE_CODE, required = false) 111 private final String birthStateProvinceCode; 112 @XmlElement(name = Elements.BIRTH_CITY, required = false) 113 private final String birthCity; 114 @XmlElement(name = Elements.GEOGRAPHIC_ORIGIN, required = false) 115 private final String geographicOrigin; 116 117 @XmlElement(name = Elements.BIRTH_DATE_UNMASKED, required = false) 118 private final String birthDateUnmasked; 119 @XmlElement(name = Elements.GENDER_CODE_UNMASKED, required = false) 120 private final String genderCodeUnmasked; 121 @XmlElement(name = Elements.GENDER_CHANGE_CODE_UNMASKED, required = false) 122 private final String genderChangeCodeUnmasked; 123 @XmlElement(name = Elements.MARITAL_STATUS_CODE_UNMASKED, required = false) 124 private final String maritalStatusCodeUnmasked; 125 @XmlElement(name = Elements.PRIMARY_LANGUAGE_CODE_UNMASKED, required = false) 126 private final String primaryLanguageCodeUnmasked; 127 @XmlElement(name = Elements.SECONDARY_LANGUAGE_CODE_UNMASKED, required = false) 128 private final String secondaryLanguageCodeUnmasked; 129 @XmlElement(name = Elements.BIRTH_COUNTRY_UNMASKED, required = false) 130 private final String birthCountryUnmasked; 131 @XmlElement(name = Elements.BIRTH_STATE_PROVINCE_CODE_UNMASKED, required = false) 132 private final String birthStateProvinceCodeUnmasked; 133 @XmlElement(name = Elements.BIRTH_CITY_UNMASKED, required = false) 134 private final String birthCityUnmasked; 135 @XmlElement(name = Elements.GEOGRAPHIC_ORIGIN_UNMASKED, required = false) 136 private final String geographicOriginUnmasked; 137 138 @XmlElement(name = Elements.NOTE_MESSAGE, required = false) 139 private final String noteMessage; 140 @XmlElement(name = Elements.SUPPRESS_PERSONAL, required = false) 141 private final boolean suppressPersonal; 142 143 @XmlElementWrapper(name = Elements.DISABILITIES, required = false) 144 @XmlElement(name = Elements.DISABILITY, required = false) 145 private final List<EntityDisabilityHistory> disabilities; 146 @XmlElementWrapper(name = Elements.MILITARY_RECORDS, required = false) 147 @XmlElement(name = Elements.MILITARY_RECORD, required = false) 148 private final List<EntityMilitaryHistory> militaryRecords; 149 @XmlElement(name = CoreConstants.CommonElements.HISTORY_ID, required = false) 150 private final Long historyId; 151 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_FROM_DATE, required = false) 152 @XmlJavaTypeAdapter(DateTimeAdapter.class) 153 private final DateTime activeFromDate; 154 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_TO_DATE, required = false) 155 @XmlJavaTypeAdapter(DateTimeAdapter.class) 156 private final DateTime activeToDate; 157 158 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false) 159 private final Long versionNumber; 160 @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false) 161 private final String objectId; 162 @SuppressWarnings("unused") 163 @XmlAnyElement 164 private final Collection<Element> _futureElements = null; 165 166 /** 167 * Private constructor used only by JAXB. 168 * 169 */ 170 private EntityBioDemographicsHistory() { 171 this.entityId = null; 172 this.deceasedDate = null; 173 this.birthDate = null; 174 this.genderCode = null; 175 this.genderChangeCode = null; 176 this.maritalStatusCode = null; 177 this.primaryLanguageCode = null; 178 this.secondaryLanguageCode = null; 179 this.birthCountry = null; 180 this.birthStateProvinceCode = null; 181 this.birthCity = null; 182 this.geographicOrigin = null; 183 184 this.birthDateUnmasked = null; 185 this.genderCodeUnmasked = null; 186 this.genderChangeCodeUnmasked = null; 187 this.maritalStatusCodeUnmasked = null; 188 this.primaryLanguageCodeUnmasked = null; 189 this.secondaryLanguageCodeUnmasked = null; 190 this.birthCountryUnmasked = null; 191 this.birthStateProvinceCodeUnmasked = null; 192 this.birthCityUnmasked = null; 193 this.geographicOriginUnmasked = null; 194 195 this.noteMessage = null; 196 this.militaryRecords = null; 197 this.disabilities = null; 198 this.suppressPersonal = false; 199 this.historyId = null; 200 this.activeFromDate = null; 201 this.activeToDate = null; 202 this.versionNumber = null; 203 this.objectId = null; 204 } 205 206 private EntityBioDemographicsHistory(Builder builder) { 207 this.entityId = builder.getEntityId(); 208 this.deceasedDate = builder.getDeceasedDate(); 209 this.birthDate = builder.getBirthDate(); 210 this.genderCode = builder.getGenderCode(); 211 this.genderChangeCode = builder.getGenderChangeCode(); 212 this.maritalStatusCode = builder.getMaritalStatusCode(); 213 this.primaryLanguageCode = builder.getPrimaryLanguageCode(); 214 this.secondaryLanguageCode = builder.getSecondaryLanguageCode(); 215 this.birthCountry = builder.getBirthCountry(); 216 this.birthStateProvinceCode = builder.getBirthStateProvinceCode(); 217 this.birthCity = builder.getBirthCity(); 218 this.geographicOrigin = builder.getGeographicOrigin(); 219 220 this.birthDateUnmasked = builder.getBirthDateUnmasked(); 221 this.genderCodeUnmasked = builder.getGenderCodeUnmasked(); 222 this.genderChangeCodeUnmasked = builder.getGenderChangeCodeUnmasked(); 223 this.maritalStatusCodeUnmasked = builder.getMaritalStatusCodeUnmasked(); 224 this.primaryLanguageCodeUnmasked = builder.getPrimaryLanguageCodeUnmasked(); 225 this.secondaryLanguageCodeUnmasked = builder.getSecondaryLanguageCodeUnmasked(); 226 this.birthCountryUnmasked = builder.getBirthCountryUnmasked(); 227 this.birthStateProvinceCodeUnmasked = builder.getBirthStateProvinceCodeUnmasked(); 228 this.birthCityUnmasked = builder.getBirthCityUnmasked(); 229 this.geographicOriginUnmasked = builder.getGeographicOriginUnmasked(); 230 231 this.noteMessage = builder.getNoteMessage(); 232 this.disabilities = new ArrayList<EntityDisabilityHistory>(); 233 if (CollectionUtils.isNotEmpty(builder.getDisabilities())) { 234 for (EntityDisabilityHistory.Builder disability : builder.getDisabilities()) { 235 this.disabilities.add(disability.build()); 236 } 237 } 238 239 this.militaryRecords = new ArrayList<EntityMilitaryHistory>(); 240 if (CollectionUtils.isNotEmpty(builder.getMilitaryRecords())) { 241 for (EntityMilitaryHistory.Builder military : builder.getMilitaryRecords()) { 242 this.militaryRecords.add(military.build()); 243 } 244 } 245 246 this.historyId = builder.getHistoryId(); 247 this.activeFromDate = builder.getActiveFromDate(); 248 this.activeToDate = builder.getActiveToDate(); 249 this.suppressPersonal = builder.isSuppressPersonal(); 250 this.versionNumber = builder.getVersionNumber(); 251 this.objectId = builder.getObjectId(); 252 } 253 254 @Override 255 public String getEntityId() { 256 return this.entityId; 257 } 258 259 @Override 260 public String getDeceasedDate() { 261 return this.deceasedDate; 262 } 263 264 @Override 265 public String getBirthDate() { 266 return this.birthDate; 267 } 268 269 @Override 270 @XmlElement(name = Elements.VETERAN, required = false) 271 public boolean isVeteran() { 272 return CollectionUtils.isNotEmpty(this.militaryRecords); 273 } 274 275 @Override 276 @XmlElement(name = Elements.DISABLED, required = false) 277 public boolean isDisabled() { 278 return CollectionUtils.isNotEmpty(this.disabilities); 279 } 280 281 @Override 282 @XmlElement(name = Elements.AGE, required = true) 283 public Integer getAge() { 284 return calculateAge(this.birthDate, this.deceasedDate, isSuppressPersonal()); 285 } 286 287 @Override 288 public String getGenderCode() { 289 return this.genderCode; 290 } 291 292 @Override 293 public String getGenderChangeCode() { 294 return this.genderChangeCode; 295 } 296 297 @Override 298 public String getMaritalStatusCode() { 299 return this.maritalStatusCode; 300 } 301 302 @Override 303 public String getPrimaryLanguageCode() { 304 return this.primaryLanguageCode; 305 } 306 307 @Override 308 public String getSecondaryLanguageCode() { 309 return this.secondaryLanguageCode; 310 } 311 312 @Override 313 public String getBirthCountry() { 314 return this.birthCountry; 315 } 316 317 @Override 318 public String getBirthStateProvinceCode() { 319 return this.birthStateProvinceCode; 320 } 321 322 @Override 323 public String getBirthCity() { 324 return this.birthCity; 325 } 326 327 @Override 328 public String getGeographicOrigin() { 329 return this.geographicOrigin; 330 } 331 332 @Override 333 public String getBirthDateUnmasked() { 334 return this.birthDateUnmasked; 335 } 336 337 @Override 338 public String getGenderCodeUnmasked() { 339 return this.genderCodeUnmasked; 340 } 341 342 @Override 343 public String getGenderChangeCodeUnmasked() { 344 return this.genderChangeCodeUnmasked; 345 } 346 347 @Override 348 public String getMaritalStatusCodeUnmasked() { 349 return this.maritalStatusCodeUnmasked; 350 } 351 352 @Override 353 public String getPrimaryLanguageCodeUnmasked() { 354 return this.primaryLanguageCodeUnmasked; 355 } 356 357 @Override 358 public String getSecondaryLanguageCodeUnmasked() { 359 return this.secondaryLanguageCodeUnmasked; 360 } 361 362 @Override 363 public String getBirthCountryUnmasked() { 364 return this.birthCountryUnmasked; 365 } 366 367 @Override 368 public String getBirthStateProvinceCodeUnmasked() { 369 return this.birthStateProvinceCodeUnmasked; 370 } 371 372 @Override 373 public String getBirthCityUnmasked() { 374 return this.birthCityUnmasked; 375 } 376 377 @Override 378 public String getGeographicOriginUnmasked() { 379 return this.geographicOriginUnmasked; 380 } 381 382 @Override 383 public String getNoteMessage() { 384 return this.noteMessage; 385 } 386 387 @Override 388 public boolean isSuppressPersonal() { 389 return this.suppressPersonal; 390 } 391 392 @Override 393 public Long getVersionNumber() { 394 return this.versionNumber; 395 } 396 397 @Override 398 public String getObjectId() { 399 return this.objectId; 400 } 401 402 @Override 403 public List<EntityDisabilityHistory> getDisabilities() { 404 return Collections.unmodifiableList(this.disabilities); 405 } 406 407 @Override 408 public List<EntityMilitaryHistory> getMilitaryRecords() { 409 return Collections.unmodifiableList(this.militaryRecords); 410 } 411 412 @Override 413 public Long getHistoryId() { 414 return this.historyId; 415 } 416 417 @Override 418 public DateTime getActiveFromDate() { 419 return this.activeFromDate; 420 } 421 422 @Override 423 public DateTime getActiveToDate() { 424 return this.activeToDate; 425 } 426 427 @Override 428 public boolean isActiveNow() { 429 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null); 430 } 431 432 @Override 433 public boolean isActive(DateTime activeAsOf) { 434 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOf); 435 } 436 437 @Override 438 public boolean isActive() { 439 return isActiveNow(); 440 } 441 442 443 /** 444 * Helper to parse the birth date for age calculation 445 * @param birthDate the birth date in EntityBioDemographicsContract BIRTH_DATE_FORMAT format 446 * @param deceasedDate the deceased date in EntityBioDemographicsContract DECEASED_DATE_FORMAT format 447 * @param suppressPersonal whether personal information is being suppressed 448 * @return the age in years or null if unavailable, suppressed, or an error occurs during calculation 449 */ 450 private static Integer calculateAge(String birthDate, String deceasedDate, boolean suppressPersonal) { 451 if (birthDate != null && ! suppressPersonal) { 452 Date parsedBirthDate; 453 try { 454 parsedBirthDate = new SimpleDateFormat(BIRTH_DATE_FORMAT).parse(birthDate); 455 } catch (ParseException pe) { 456 LOG.error("Error parsing EntityBioDemographics birth date: '" + birthDate + "'", pe); 457 return null; 458 } 459 DateTime endDate; 460 if (deceasedDate != null) { 461 try { 462 endDate = new DateTime(new SimpleDateFormat(BIRTH_DATE_FORMAT).parse(deceasedDate)); 463 } catch (ParseException pe) { 464 LOG.error("Error parsing EntityBioDemographics deceased date: '" + deceasedDate+ "'", pe); 465 return null; 466 } 467 } else { 468 endDate = new DateTime(); 469 } 470 return Years.yearsBetween(new DateTime(parsedBirthDate), endDate).getYears(); 471 } 472 return null; 473 } 474 475 /** 476 * A builder which can be used to construct {@link org.kuali.rice.kim.api.identity.personal.EntityBioDemographicsHistory} instances. Enforces the constraints of the {@link org.kuali.rice.kim.api.identity.personal.EntityBioDemographicsContract}. 477 * 478 */ 479 public final static class Builder 480 implements Serializable, ModelBuilder, EntityBioDemographicsHistoryContract 481 { 482 483 private String entityId; 484 private String deceasedDate; 485 private String birthDate; 486 private String genderCode; 487 private String maritalStatusCode; 488 private String primaryLanguageCode; 489 private String secondaryLanguageCode; 490 private String birthCountry; 491 private String birthStateProvinceCode; 492 private String birthCity; 493 private String geographicOrigin; 494 private String genderChangeCode; 495 private String noteMessage; 496 private boolean suppressPersonal; 497 private List<EntityDisabilityHistory.Builder> disabilities; 498 private List<EntityMilitaryHistory.Builder> militaryRecords; 499 private Long versionNumber; 500 private String objectId; 501 private Long historyId; 502 private DateTime activeFromDate; 503 private DateTime activeToDate; 504 505 private Builder(String entityId, String genderCode) { 506 setEntityId(entityId); 507 setGenderCode(genderCode); 508 } 509 510 public static Builder create(String entityId, String genderCode) { 511 // TODO modify as needed to pass any required values and add them to the signature of the 'create' method 512 return new Builder(entityId, genderCode); 513 } 514 515 public static Builder create(EntityBioDemographicsHistoryContract contract) { 516 if (contract == null) { 517 throw new IllegalArgumentException("contract was null"); 518 } 519 Builder builder = create(contract.getEntityId(), contract.getGenderCode()); 520 builder.setDeceasedDate(contract.getDeceasedDate()); 521 builder.setBirthDate(contract.getBirthDate()); 522 builder.setMaritalStatusCode(contract.getMaritalStatusCode()); 523 builder.setPrimaryLanguageCode(contract.getPrimaryLanguageCode()); 524 builder.setSecondaryLanguageCode(contract.getSecondaryLanguageCode()); 525 builder.setBirthCountry(contract.getBirthCountry()); 526 builder.setBirthStateProvinceCode(contract.getBirthStateProvinceCode()); 527 builder.setBirthCity(contract.getBirthCity()); 528 builder.setGeographicOrigin(contract.getGeographicOrigin()); 529 builder.setGenderChangeCode(contract.getGenderChangeCode()); 530 builder.setNoteMessage(contract.getNoteMessage()); 531 builder.setSuppressPersonal(contract.isSuppressPersonal()); 532 if (contract.getDisabilities() != null) { 533 List<EntityDisabilityHistory.Builder> disabilities = new ArrayList<EntityDisabilityHistory.Builder>(); 534 for (EntityDisabilityHistoryContract disability : contract.getDisabilities()) { 535 disabilities.add(EntityDisabilityHistory.Builder.create(disability)); 536 } 537 builder.setDisabilities(disabilities); 538 } 539 if (contract.getMilitaryRecords() != null) { 540 List<EntityMilitaryHistory.Builder> militaryRecs = new ArrayList<EntityMilitaryHistory.Builder>(); 541 for (EntityMilitaryHistoryContract military : contract.getMilitaryRecords()) { 542 militaryRecs.add(EntityMilitaryHistory.Builder.create(military)); 543 } 544 builder.setMilitaryRecords(militaryRecs); 545 } 546 547 builder.setVersionNumber(contract.getVersionNumber()); 548 builder.setObjectId(contract.getObjectId()); 549 builder.setHistoryId(contract.getHistoryId()); 550 builder.setActiveFromDate(contract.getActiveFromDate()); 551 builder.setActiveToDate(contract.getActiveToDate()); 552 return builder; 553 } 554 555 public EntityBioDemographicsHistory build() { 556 return new EntityBioDemographicsHistory(this); 557 } 558 559 @Override 560 public String getEntityId() { 561 return this.entityId; 562 } 563 564 @Override 565 public String getDeceasedDate() { 566 return this.deceasedDate; 567 } 568 569 @Override 570 public String getBirthDate() { 571 if (isSuppressPersonal()) { 572 return KimConstants.RESTRICTED_DATA_MASK; 573 } 574 return this.birthDate; 575 } 576 577 @Override 578 public Integer getAge() { 579 return calculateAge(this.birthDate, this.deceasedDate, isSuppressPersonal()); 580 } 581 582 @Override 583 public String getGenderCode() { 584 if (isSuppressPersonal()) { 585 return KimConstants.RESTRICTED_DATA_MASK; 586 } 587 return this.genderCode; 588 } 589 590 @Override 591 public String getGenderChangeCode() { 592 if (isSuppressPersonal()) { 593 return KimConstants.RESTRICTED_DATA_MASK; 594 } 595 return this.genderChangeCode; 596 } 597 598 @Override 599 public String getMaritalStatusCode() { 600 if (isSuppressPersonal()) { 601 return KimConstants.RESTRICTED_DATA_MASK; 602 } 603 return this.maritalStatusCode; 604 } 605 606 @Override 607 public String getPrimaryLanguageCode() { 608 if (isSuppressPersonal()) { 609 return KimConstants.RESTRICTED_DATA_MASK; 610 } 611 return this.primaryLanguageCode; 612 } 613 614 @Override 615 public String getSecondaryLanguageCode() { 616 if (isSuppressPersonal()) { 617 return KimConstants.RESTRICTED_DATA_MASK; 618 } 619 return this.secondaryLanguageCode; 620 } 621 622 @Override 623 public String getBirthCountry() { 624 if (isSuppressPersonal()) { 625 return KimConstants.RESTRICTED_DATA_MASK; 626 } 627 return this.birthCountry; 628 } 629 630 @Override 631 public String getBirthStateProvinceCode() { 632 if (isSuppressPersonal()) { 633 return KimConstants.RESTRICTED_DATA_MASK; 634 } 635 return this.birthStateProvinceCode; 636 } 637 638 @Override 639 public String getBirthCity() { 640 if (isSuppressPersonal()) { 641 return KimConstants.RESTRICTED_DATA_MASK; 642 } 643 return this.birthCity; 644 } 645 646 @Override 647 public String getGeographicOrigin() { 648 if (isSuppressPersonal()) { 649 return KimConstants.RESTRICTED_DATA_MASK; 650 } 651 return this.geographicOrigin; 652 } 653 654 @Override 655 public String getBirthDateUnmasked() { 656 return this.birthDate; 657 } 658 659 @Override 660 public String getGenderCodeUnmasked() { 661 return this.genderCode; 662 } 663 664 @Override 665 public String getGenderChangeCodeUnmasked() { 666 return this.genderChangeCode; 667 } 668 669 @Override 670 public String getMaritalStatusCodeUnmasked() { 671 return this.maritalStatusCode; 672 } 673 674 @Override 675 public String getPrimaryLanguageCodeUnmasked() { 676 return this.primaryLanguageCode; 677 } 678 679 @Override 680 public String getSecondaryLanguageCodeUnmasked() { 681 return this.secondaryLanguageCode; 682 } 683 684 @Override 685 public String getBirthCountryUnmasked() { 686 return this.birthCountry; 687 } 688 689 @Override 690 public String getBirthStateProvinceCodeUnmasked() { 691 return this.birthStateProvinceCode; 692 } 693 694 @Override 695 public String getBirthCityUnmasked() { 696 return this.birthCity; 697 } 698 699 @Override 700 public String getGeographicOriginUnmasked() { 701 return this.geographicOrigin; 702 } 703 704 @Override 705 public String getNoteMessage() { 706 return this.noteMessage; 707 } 708 709 @Override 710 public boolean isSuppressPersonal() { 711 return this.suppressPersonal; 712 } 713 714 @Override 715 public Long getVersionNumber() { 716 return this.versionNumber; 717 } 718 719 @Override 720 public String getObjectId() { 721 return this.objectId; 722 } 723 724 @Override 725 public boolean isVeteran() { 726 return CollectionUtils.isNotEmpty(this.militaryRecords); 727 } 728 729 @Override 730 public boolean isDisabled() { 731 return CollectionUtils.isNotEmpty(this.disabilities); 732 } 733 734 @Override 735 public List<EntityDisabilityHistory.Builder> getDisabilities() { 736 return this.disabilities; 737 } 738 739 @Override 740 public List<EntityMilitaryHistory.Builder> getMilitaryRecords() { 741 return this.militaryRecords; 742 } 743 744 @Override 745 public Long getHistoryId() { 746 return this.historyId; 747 } 748 749 @Override 750 public boolean isActiveNow() { 751 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null); 752 } 753 754 @Override 755 public boolean isActive(DateTime activeAsOf) { 756 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOf); 757 } 758 759 @Override 760 public boolean isActive() { 761 return isActiveNow(); 762 } 763 764 @Override 765 public DateTime getActiveFromDate() { 766 return this.activeFromDate; 767 } 768 769 @Override 770 public DateTime getActiveToDate() { 771 return this.activeToDate; 772 } 773 774 public void setHistoryId(Long historyId) { 775 this.historyId = historyId; 776 } 777 778 public void setActiveFromDate(DateTime activeFromDate) { 779 this.activeFromDate = activeFromDate; 780 } 781 782 public void setActiveToDate(DateTime activeToDate) { 783 this.activeToDate = activeToDate; 784 } 785 786 public void setEntityId(String entityId) { 787 if (StringUtils.isEmpty(entityId)) { 788 throw new IllegalArgumentException("id is empty"); 789 } 790 this.entityId = entityId; 791 } 792 793 public void setDeceasedDate(String deceasedDate) { 794 if (deceasedDate != null) { 795 SimpleDateFormat format = new SimpleDateFormat(DECEASED_DATE_FORMAT); 796 try{ 797 format.parse(deceasedDate); 798 this.deceasedDate = deceasedDate; 799 } 800 catch(ParseException e) { 801 throw new IllegalArgumentException("deceasedDate is not of the format 'yyyy-MM-DD'"); 802 } 803 } 804 } 805 806 public void setBirthDate(String birthDate) { 807 if (birthDate != null) { 808 SimpleDateFormat format = new SimpleDateFormat(BIRTH_DATE_FORMAT); 809 try{ 810 format.parse(birthDate); 811 this.birthDate = birthDate; 812 } 813 catch(ParseException e) { 814 throw new IllegalArgumentException("birthDate is not of the format 'yyyy-MM-DD'"); 815 } 816 } 817 } 818 819 public void setDeceasedDate(Date deceasedDate) { 820 this.deceasedDate = new SimpleDateFormat(DECEASED_DATE_FORMAT).format(deceasedDate); 821 } 822 823 public void setBirthDate(Date birthDate) { 824 this.birthDate = new SimpleDateFormat(BIRTH_DATE_FORMAT).format(birthDate); 825 } 826 827 public void setGenderCode(String genderCode) { 828 if (StringUtils.isEmpty(genderCode)) { 829 throw new IllegalArgumentException("genderCode is empty"); 830 } 831 this.genderCode = genderCode; 832 } 833 834 public void setGenderChangeCode(String genderChangeCode) { 835 this.genderChangeCode = genderChangeCode; 836 } 837 838 public void setMaritalStatusCode(String maritalStatusCode) { 839 this.maritalStatusCode = maritalStatusCode; 840 } 841 842 public void setPrimaryLanguageCode(String primaryLanguageCode) { 843 this.primaryLanguageCode = primaryLanguageCode; 844 } 845 846 public void setSecondaryLanguageCode(String secondaryLanguageCode) { 847 this.secondaryLanguageCode = secondaryLanguageCode; 848 } 849 850 public void setBirthCountry(String birthCountry) { 851 this.birthCountry = birthCountry; 852 } 853 854 public void setBirthStateProvinceCode(String birthStateProvinceCode) { 855 this.birthStateProvinceCode = birthStateProvinceCode; 856 } 857 858 public void setBirthCity(String birthCity) { 859 this.birthCity = birthCity; 860 } 861 862 public void setGeographicOrigin(String geographicOrigin) { 863 this.geographicOrigin = geographicOrigin; 864 } 865 866 private void setNoteMessage(String noteMessage) { 867 this.noteMessage = noteMessage; 868 } 869 870 private void setSuppressPersonal(boolean suppressPersonal) { 871 this.suppressPersonal = suppressPersonal; 872 } 873 874 public void setVersionNumber(Long versionNumber) { 875 this.versionNumber = versionNumber; 876 } 877 878 public void setObjectId(String objectId) { 879 this.objectId = objectId; 880 } 881 882 public void setDisabilities(List<EntityDisabilityHistory.Builder> disabilities) { 883 this.disabilities = disabilities; 884 } 885 886 public void setMilitaryRecords(List<EntityMilitaryHistory.Builder> militaryRecords) { 887 this.militaryRecords = militaryRecords; 888 } 889 890 } 891 892 893 /** 894 * Defines some internal constants used on this class. 895 * 896 */ 897 static class Constants { 898 899 final static String ROOT_ELEMENT_NAME = "entityBioDemographics"; 900 final static String TYPE_NAME = "EntityBioDemographicsType"; 901 } 902 903 904 /** 905 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 906 * 907 */ 908 static class Elements { 909 910 final static String ENTITY_ID = "entityId"; 911 final static String DECEASED_DATE = "deceasedDate"; 912 final static String BIRTH_DATE = "birthDate"; 913 final static String AGE = "age"; 914 final static String GENDER_CODE = "genderCode"; 915 final static String MARITAL_STATUS_CODE = "maritalStatusCode"; 916 final static String PRIMARY_LANGUAGE_CODE = "primaryLanguageCode"; 917 final static String SECONDARY_LANGUAGE_CODE = "secondaryLanguageCode"; 918 final static String BIRTH_COUNTRY = "birthCountry"; 919 final static String BIRTH_STATE_PROVINCE_CODE = "birthStateProvinceCode"; 920 final static String BIRTH_CITY = "birthCity"; 921 final static String GEOGRAPHIC_ORIGIN = "geographicOrigin"; 922 final static String BIRTH_DATE_UNMASKED = "birthDateUnmasked"; 923 final static String GENDER_CODE_UNMASKED = "genderCodeUnmasked"; 924 final static String MARITAL_STATUS_CODE_UNMASKED = "maritalStatusCodeUnmasked"; 925 final static String PRIMARY_LANGUAGE_CODE_UNMASKED = "primaryLanguageCodeUnmasked"; 926 final static String SECONDARY_LANGUAGE_CODE_UNMASKED = "secondaryLanguageCodeUnmasked"; 927 final static String BIRTH_COUNTRY_UNMASKED = "birthCountryUnmasked"; 928 final static String BIRTH_STATE_PROVINCE_CODE_UNMASKED = "birthStateProvinceCodeUnmasked"; 929 final static String BIRTH_CITY_UNMASKED = "birthCityUnmasked"; 930 final static String GEOGRAPHIC_ORIGIN_UNMASKED = "geographicOriginUnmasked"; 931 final static String GENDER_CHANGE_CODE = "genderChangeCode"; 932 final static String GENDER_CHANGE_CODE_UNMASKED = "genderChangeCodeUnmasked"; 933 final static String NOTE_MESSAGE = "noteMessage"; 934 935 final static String DISABLED = "disabled"; 936 final static String DISABILITIES = "disabilities"; 937 final static String DISABILITY = "disability"; 938 final static String VETERAN = "veteran"; 939 final static String MILITARY_RECORDS = "militaryRecords"; 940 final static String MILITARY_RECORD = "militaryRecord"; 941 942 final static String SUPPRESS_PERSONAL = "suppressPersonal"; 943 944 } 945 946 }