1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.kim.document;
17
18 import org.apache.commons.collections.CollectionUtils;
19 import org.apache.commons.lang.StringUtils;
20 import org.eclipse.persistence.annotations.JoinFetch;
21 import org.eclipse.persistence.annotations.JoinFetchType;
22 import org.kuali.rice.core.api.membership.MemberType;
23 import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
24 import org.kuali.rice.kim.api.KimConstants;
25 import org.kuali.rice.kim.api.identity.employment.EntityEmployment;
26 import org.kuali.rice.kim.api.role.Role;
27 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
28 import org.kuali.rice.kim.api.type.KimType;
29 import org.kuali.rice.kim.bo.ui.KimDocumentRoleMember;
30 import org.kuali.rice.kim.bo.ui.KimDocumentRoleQualifier;
31 import org.kuali.rice.kim.bo.ui.KimDocumentRoleResponsibilityAction;
32 import org.kuali.rice.kim.bo.ui.PersonDocumentAddress;
33 import org.kuali.rice.kim.bo.ui.PersonDocumentAffiliation;
34 import org.kuali.rice.kim.bo.ui.PersonDocumentCitizenship;
35 import org.kuali.rice.kim.bo.ui.PersonDocumentEmail;
36 import org.kuali.rice.kim.bo.ui.PersonDocumentEmploymentInfo;
37 import org.kuali.rice.kim.bo.ui.PersonDocumentGroup;
38 import org.kuali.rice.kim.bo.ui.PersonDocumentName;
39 import org.kuali.rice.kim.bo.ui.PersonDocumentPhone;
40 import org.kuali.rice.kim.bo.ui.PersonDocumentPrivacy;
41 import org.kuali.rice.kim.bo.ui.PersonDocumentRole;
42 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegation;
43 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMember;
44 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMemberQualifier;
45 import org.kuali.rice.kim.impl.role.RoleBo;
46 import org.kuali.rice.kim.impl.role.RoleMemberBo;
47 import org.kuali.rice.kim.impl.services.KimImplServiceLocator;
48 import org.kuali.rice.kim.impl.type.KimTypeAttributesHelper;
49 import org.kuali.rice.kim.service.KIMServiceLocatorInternal;
50 import org.kuali.rice.kim.service.UiDocumentService;
51 import org.kuali.rice.kns.service.DocumentHelperService;
52 import org.kuali.rice.kns.service.KNSServiceLocator;
53 import org.kuali.rice.krad.data.jpa.converters.BooleanYNConverter;
54 import org.kuali.rice.krad.data.jpa.converters.HashConverter;
55 import org.kuali.rice.krad.data.platform.MaxValueIncrementerFactory;
56 import org.kuali.rice.krad.rules.rule.event.DocumentEvent;
57 import org.kuali.rice.krad.util.GlobalVariables;
58 import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
59
60 import javax.persistence.AttributeOverride;
61 import javax.persistence.AttributeOverrides;
62 import javax.persistence.CascadeType;
63 import javax.persistence.Column;
64 import javax.persistence.Convert;
65 import javax.persistence.Entity;
66 import javax.persistence.JoinColumn;
67 import javax.persistence.OneToMany;
68 import javax.persistence.OneToOne;
69 import javax.persistence.PrimaryKeyJoinColumn;
70 import javax.persistence.Table;
71 import javax.persistence.Transient;
72 import java.util.ArrayList;
73 import java.util.HashMap;
74 import java.util.List;
75 import java.util.Map;
76
77
78
79
80
81
82
83
84 @AttributeOverrides({ @AttributeOverride(name = "documentNumber", column = @Column(name = "FDOC_NBR")) })
85 @Entity
86 @Table(name = "KRIM_PERSON_DOCUMENT_T")
87 public class IdentityManagementPersonDocument extends IdentityManagementKimDocument {
88
89 protected static final long serialVersionUID = -534993712085516925L;
90
91
92 @Column(name = "PRNCPL_ID")
93 protected String principalId;
94
95 @Column(name = "PRNCPL_NM")
96 protected String principalName;
97
98 @Column(name = "ENTITY_ID")
99 protected String entityId;
100
101
102 @Column(name = "PRNCPL_PSWD")
103 @Convert(converter = HashConverter.class)
104 protected String password;
105
106 @Column(name = "UNIV_ID")
107 protected String univId = "";
108
109
110 @JoinFetch(value= JoinFetchType.OUTER)
111 @OneToMany(targetEntity = PersonDocumentAffiliation.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
112 @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
113 protected List<PersonDocumentAffiliation> affiliations;
114
115 @Transient
116 protected String campusCode = "";
117
118
119 @Transient
120 protected Map<String, String> externalIdentifiers = null;
121
122 @Column(name = "ACTV_IND")
123 @Convert(converter = BooleanYNConverter.class)
124 protected boolean active;
125
126
127 @Transient
128 protected List<PersonDocumentCitizenship> citizenships;
129
130
131 @JoinFetch(value= JoinFetchType.OUTER)
132 @OneToMany(targetEntity = PersonDocumentName.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
133 @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
134 protected List<PersonDocumentName> names;
135
136 @JoinFetch(value= JoinFetchType.OUTER)
137 @OneToMany(targetEntity = PersonDocumentAddress.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
138 @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
139 protected List<PersonDocumentAddress> addrs;
140
141 @JoinFetch(value= JoinFetchType.OUTER)
142 @OneToMany(targetEntity = PersonDocumentPhone.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
143 @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
144 protected List<PersonDocumentPhone> phones;
145
146 @JoinFetch(value= JoinFetchType.OUTER)
147 @OneToMany(targetEntity = PersonDocumentEmail.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
148 @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
149 protected List<PersonDocumentEmail> emails;
150
151 @JoinFetch(value= JoinFetchType.OUTER)
152 @OneToMany(targetEntity = PersonDocumentGroup.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
153 @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
154 protected List<PersonDocumentGroup> groups;
155
156 @JoinFetch(value= JoinFetchType.OUTER)
157 @OneToMany(targetEntity = PersonDocumentRole.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
158 @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
159 protected List<PersonDocumentRole> roles;
160
161 @JoinFetch(value= JoinFetchType.OUTER)
162 @OneToOne(targetEntity = PersonDocumentPrivacy.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
163 @PrimaryKeyJoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR")
164 protected PersonDocumentPrivacy privacy;
165
166 public IdentityManagementPersonDocument() {
167 affiliations = new ArrayList<PersonDocumentAffiliation>();
168 citizenships = new ArrayList<PersonDocumentCitizenship>();
169
170 names = new ArrayList<PersonDocumentName>();
171 addrs = new ArrayList<PersonDocumentAddress>();
172 phones = new ArrayList<PersonDocumentPhone>();
173 emails = new ArrayList<PersonDocumentEmail>();
174 groups = new ArrayList<PersonDocumentGroup>();
175 roles = new ArrayList<PersonDocumentRole>();
176 privacy = new PersonDocumentPrivacy();
177 this.active = true;
178 }
179
180 public String getPrincipalId() {
181 return this.principalId;
182 }
183
184 public void setPrincipalId(String principalId) {
185 this.principalId = principalId;
186 }
187
188 public String getPrincipalName() {
189 return this.principalName;
190 }
191
192
193
194
195
196 public void setPrincipalName(String principalName) {
197 this.principalName = principalName;
198 }
199
200 public String getEntityId() {
201 return this.entityId;
202 }
203
204 public void setEntityId(String entityId) {
205 this.entityId = entityId;
206 }
207
208 public List<PersonDocumentAffiliation> getAffiliations() {
209 return this.affiliations;
210 }
211
212 public void setAffiliations(List<PersonDocumentAffiliation> affiliations) {
213 this.affiliations = affiliations;
214 }
215
216 public String getCampusCode() {
217 return this.campusCode;
218 }
219
220 public void setCampusCode(String campusCode) {
221 this.campusCode = campusCode;
222 }
223
224 public Map<String, String> getExternalIdentifiers() {
225 return this.externalIdentifiers;
226 }
227
228 public void setExternalIdentifiers(Map<String, String> externalIdentifiers) {
229 this.externalIdentifiers = externalIdentifiers;
230 }
231
232 public String getPassword() {
233 return this.password;
234 }
235
236 public void setPassword(String password) {
237 this.password = password;
238 }
239
240 public boolean isActive() {
241 return this.active;
242 }
243
244 public void setActive(boolean active) {
245 this.active = active;
246 }
247
248 public List<PersonDocumentCitizenship> getCitizenships() {
249 return this.citizenships;
250 }
251
252 public void setCitizenships(List<PersonDocumentCitizenship> citizenships) {
253 this.citizenships = citizenships;
254 }
255
256 public List<PersonDocumentName> getNames() {
257 return this.names;
258 }
259
260 public void setNames(List<PersonDocumentName> names) {
261 this.names = names;
262 }
263
264 public List<PersonDocumentAddress> getAddrs() {
265 return this.addrs;
266 }
267
268 public void setAddrs(List<PersonDocumentAddress> addrs) {
269 this.addrs = addrs;
270 }
271
272 public List<PersonDocumentPhone> getPhones() {
273 return this.phones;
274 }
275
276 public void setPhones(List<PersonDocumentPhone> phones) {
277 this.phones = phones;
278 }
279
280 public List<PersonDocumentEmail> getEmails() {
281 return this.emails;
282 }
283
284 public void setEmails(List<PersonDocumentEmail> emails) {
285 this.emails = emails;
286 }
287
288 public void setGroups(List<PersonDocumentGroup> groups) {
289 this.groups = groups;
290 }
291
292 public List<PersonDocumentRole> getRoles() {
293 return this.roles;
294 }
295
296 public void setRoles(List<PersonDocumentRole> roles) {
297 this.roles = roles;
298 }
299
300 public List<PersonDocumentGroup> getGroups() {
301 return this.groups;
302 }
303
304 public String getUnivId() {
305 return this.univId;
306 }
307
308 public void setUnivId(String univId) {
309 this.univId = univId;
310 }
311
312 public PersonDocumentPrivacy getPrivacy() {
313 return this.privacy;
314 }
315
316 public void setPrivacy(PersonDocumentPrivacy privacy) {
317 this.privacy = privacy;
318 }
319
320 public void initializeDocumentForNewPerson() {
321 if (StringUtils.isBlank(this.principalId)) {
322 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), KimConstants.SequenceNames.KRIM_PRNCPL_ID_S);
323 this.principalId = incrementer.nextStringValue();
324 }
325 if (StringUtils.isBlank(this.entityId)) {
326 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), KimConstants.SequenceNames.KRIM_ENTITY_ID_S);
327 this.entityId = incrementer.nextStringValue();
328 }
329 }
330
331 @SuppressWarnings({"unchecked", "rawtypes", "deprecation"})
332 @Override
333 public List buildListOfDeletionAwareLists() {
334 List managedLists = super.buildListOfDeletionAwareLists();
335 List<PersonDocumentEmploymentInfo> empInfos = new ArrayList<PersonDocumentEmploymentInfo>();
336 for (PersonDocumentAffiliation affiliation : getAffiliations()) {
337 empInfos.addAll(affiliation.getEmpInfos());
338 }
339 managedLists.add(empInfos);
340 managedLists.add(getAffiliations());
341 managedLists.add(getCitizenships());
342 managedLists.add(getPhones());
343 managedLists.add(getAddrs());
344 managedLists.add(getEmails());
345 managedLists.add(getNames());
346 managedLists.add(getGroups());
347 managedLists.add(getRoles());
348 return managedLists;
349 }
350
351
352
353
354 @Override
355 public void doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) {
356 super.doRouteStatusChange(statusChangeEvent);
357 if (getDocumentHeader().getWorkflowDocument().isProcessed()) {
358 setIfRolesEditable();
359 KIMServiceLocatorInternal.getUiDocumentService().saveEntityPerson(this);
360 }
361 }
362
363 @Override
364 public void prepareForSave() {
365 if (StringUtils.isBlank(getPrivacy().getDocumentNumber())) {
366 getPrivacy().setDocumentNumber(getDocumentNumber());
367 }
368 setEmployeeRecordIds();
369 for (PersonDocumentRole role : getRoles()) {
370 role.setDocumentNumber(getDocumentNumber());
371 for (KimDocumentRoleMember rolePrncpl : role.getRolePrncpls()) {
372 rolePrncpl.setDocumentNumber(getDocumentNumber());
373 rolePrncpl.setRoleId(role.getRoleId());
374 if (StringUtils.isEmpty(rolePrncpl.getRoleMemberId())) {
375 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ROLE_MBR_ID_S");
376 rolePrncpl.setRoleMemberId(incrementer.nextStringValue());
377 }
378 for (KimDocumentRoleQualifier qualifier : rolePrncpl.getQualifiers()) {
379 qualifier.setDocumentNumber(getDocumentNumber());
380 qualifier.setRoleMemberId(rolePrncpl.getRoleMemberId());
381 qualifier.setKimTypId(role.getKimTypeId());
382 }
383 for (KimDocumentRoleResponsibilityAction responsibilityAction : rolePrncpl.getRoleRspActions()) {
384 responsibilityAction.setDocumentNumber(getDocumentNumber());
385 responsibilityAction.setRoleMemberId(rolePrncpl.getRoleMemberId());
386 responsibilityAction.setRoleResponsibilityId("*");
387 }
388 }
389 }
390 if (getDelegationMembers() != null) {
391 for (RoleDocumentDelegationMember delegationMember : getDelegationMembers()) {
392 delegationMember.setDocumentNumber(getDocumentNumber());
393 for (RoleDocumentDelegationMemberQualifier qualifier : delegationMember.getQualifiers()) {
394 qualifier.setDocumentNumber(getDocumentNumber());
395 qualifier.setKimTypId(delegationMember.getRoleBo().getKimTypeId());
396 }
397 addDelegationMemberToDelegation(delegationMember);
398 }
399 }
400
401
402 if (getDelegations() != null) {
403 List<RoleDocumentDelegation> emptyDelegations = new ArrayList<>();
404 for (RoleDocumentDelegation delegation : getDelegations()) {
405 delegation.setDocumentNumber(getDocumentNumber());
406 if (delegation.getMembers().isEmpty()) {
407 emptyDelegations.add(delegation);
408 }
409 }
410
411 getDelegations().removeAll(emptyDelegations);
412 }
413 if (getAddrs() != null) {
414 for (PersonDocumentAddress address : getAddrs()) {
415 address.setDocumentNumber(getDocumentNumber());
416 if (StringUtils.isEmpty(address.getEntityAddressId())) {
417 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_ADDR_ID_S");
418 address.setEntityAddressId(incrementer.nextStringValue());
419 }
420 }
421 }
422 if (getAffiliations() != null) {
423 String nextValue = null;
424
425 for (PersonDocumentAffiliation affiliation : getAffiliations()) {
426 affiliation.setDocumentNumber(getDocumentNumber());
427 if (StringUtils.isEmpty(affiliation.getEntityAffiliationId())) {
428 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_AFLTN_ID_S");
429 nextValue = incrementer.nextStringValue();
430 affiliation.setEntityAffiliationId(nextValue);
431 }
432 for (PersonDocumentEmploymentInfo empInfo : affiliation.getEmpInfos()) {
433 empInfo.setDocumentNumber(getDocumentNumber());
434 if (StringUtils.isEmpty(empInfo.getEntityAffiliationId())) {
435 empInfo.setEntityAffiliationId(nextValue);
436 }
437 }
438 }
439 }
440 if (getEmails() != null) {
441 for (PersonDocumentEmail email : getEmails()) {
442 email.setDocumentNumber(getDocumentNumber());
443 if (StringUtils.isEmpty(email.getEntityEmailId())) {
444 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_EMAIL_ID_S");
445 email.setEntityEmailId(incrementer.nextStringValue());
446 }
447 }
448 }
449 if (getGroups() != null) {
450 for (PersonDocumentGroup group : getGroups()) {
451 group.setDocumentNumber(getDocumentNumber());
452 if (StringUtils.isEmpty(group.getGroupMemberId())) {
453 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_GRP_MBR_ID_S");
454 group.setGroupMemberId(incrementer.nextStringValue());
455 }
456 }
457 }
458 if (getNames() != null) {
459 for (PersonDocumentName name : getNames()) {
460 name.setDocumentNumber(getDocumentNumber());
461 if (StringUtils.isEmpty(name.getEntityNameId())) {
462 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_NM_ID_S");
463 name.setEntityNameId(incrementer.nextStringValue());
464 }
465 }
466 }
467 if (getPhones() != null) {
468 for (PersonDocumentPhone phone : getPhones()) {
469 phone.setDocumentNumber(getDocumentNumber());
470 if (StringUtils.isEmpty(phone.getEntityPhoneId())) {
471 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_PHONE_ID_S");
472 phone.setEntityPhoneId(incrementer.nextStringValue());
473 }
474 }
475 }
476 }
477
478 @Override
479 public void postProcessSave(DocumentEvent event) {
480 super.postProcessSave(event);
481
482
483 resyncTransientState();
484 }
485
486 public void resyncTransientState() {
487 getDelegationMembers().clear();
488 for (RoleDocumentDelegation delegation : getDelegations()) {
489 for (RoleDocumentDelegationMember delegationMember : delegation.getMembers()) {
490
491
492
493
494
495 RoleMemberBo roleMember = getUiDocumentService().getRoleMember(delegationMember.getRoleMemberId());
496 delegationMember.setRoleMemberMemberId(roleMember.getMemberId());
497 delegationMember.setRoleMemberMemberTypeCode(roleMember.getType().getCode());
498 delegationMember.setRoleMemberName(getUiDocumentService().getMemberName(MemberType.fromCode(delegationMember.getRoleMemberMemberTypeCode()), delegationMember.getRoleMemberMemberId()));
499 delegationMember.setRoleMemberNamespaceCode(getUiDocumentService().getMemberNamespaceCode(MemberType.fromCode(delegationMember.getRoleMemberMemberTypeCode()), delegationMember.getRoleMemberMemberId()));
500 delegationMember.setDelegationTypeCode(delegation.getDelegationTypeCode());
501 Role role = KimApiServiceLocator.getRoleService().getRole(roleMember.getRoleId());
502 delegationMember.setRoleBo(RoleBo.from(role));
503
504
505
506 delegationMember.setEdit(true);
507
508 getDelegationMembers().add(delegationMember);
509 }
510 }
511 }
512
513
514
515 protected void setEmployeeRecordIds() {
516 List<EntityEmployment> empInfos = getUiDocumentService().getEntityEmploymentInformationInfo(getEntityId());
517 for (PersonDocumentAffiliation affiliation : getAffiliations()) {
518 int employeeRecordCounter = CollectionUtils.isEmpty(empInfos) ? 0 : empInfos.size();
519 for (PersonDocumentEmploymentInfo empInfo : affiliation.getEmpInfos()) {
520 if (CollectionUtils.isNotEmpty(empInfos)) {
521 for (EntityEmployment origEmpInfo : empInfos) {
522 if (origEmpInfo.getId().equals(empInfo.getEntityEmploymentId())) {
523 empInfo.setEmploymentRecordId(origEmpInfo.getEmploymentRecordId());
524 }
525 }
526 }
527 if (StringUtils.isEmpty(empInfo.getEmploymentRecordId())) {
528 employeeRecordCounter++;
529 empInfo.setEmploymentRecordId(employeeRecordCounter + "");
530 }
531 }
532 }
533 }
534
535 public KimTypeAttributesHelper getKimTypeAttributesHelper(String roleId) {
536 Role role = KimApiServiceLocator.getRoleService().getRole(roleId);
537 KimType kimTypeInfo = KimApiServiceLocator.getKimTypeInfoService().getKimType(role.getKimTypeId());
538 return new KimTypeAttributesHelper(kimTypeInfo);
539 }
540
541 public void setIfRolesEditable() {
542 if (CollectionUtils.isNotEmpty(getRoles())) {
543 for (PersonDocumentRole role : getRoles()) {
544 role.setEditable(validAssignRole(role));
545 }
546 }
547 }
548
549 public boolean validAssignRole(PersonDocumentRole role) {
550 boolean rulePassed = true;
551 if (StringUtils.isNotEmpty(role.getNamespaceCode())) {
552 Map<String, String> additionalPermissionDetails = new HashMap<String, String>();
553 additionalPermissionDetails.put(KimConstants.AttributeConstants.NAMESPACE_CODE, role.getNamespaceCode());
554 additionalPermissionDetails.put(KimConstants.AttributeConstants.ROLE_NAME, role.getRoleName());
555 if (!getDocumentHelperService().getDocumentAuthorizer(this).isAuthorizedByTemplate(this, KimConstants.NAMESPACE_CODE, KimConstants.PermissionTemplateNames.ASSIGN_ROLE, GlobalVariables.getUserSession().getPrincipalId(), additionalPermissionDetails, null)) {
556 rulePassed = false;
557 }
558 }
559 return rulePassed;
560 }
561
562 @Transient
563 protected transient DocumentHelperService documentHelperService;
564
565 @Transient
566 protected transient UiDocumentService uiDocumentService;
567
568 protected DocumentHelperService getDocumentHelperService() {
569 if (documentHelperService == null) {
570 documentHelperService = KNSServiceLocator.getDocumentHelperService();
571 }
572 return this.documentHelperService;
573 }
574
575 protected UiDocumentService getUiDocumentService() {
576 if (uiDocumentService == null) {
577 uiDocumentService = KIMServiceLocatorInternal.getUiDocumentService();
578 }
579 return this.uiDocumentService;
580 }
581 }