View Javadoc
1   /**
2    * Copyright 2005-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kim.service.impl;
17  
18  import static org.junit.Assert.assertEquals;
19  import static org.junit.Assert.assertFalse;
20  import static org.junit.Assert.assertNotNull;
21  import static org.junit.Assert.assertTrue;
22  
23  import java.lang.reflect.Field;
24  import java.sql.Timestamp;
25  import java.util.ArrayList;
26  import java.util.Arrays;
27  import java.util.HashMap;
28  import java.util.List;
29  import java.util.Map;
30  import java.util.UUID;
31  
32  import org.joda.time.DateTime;
33  import org.joda.time.format.DateTimeFormat;
34  import org.joda.time.format.DateTimeFormatter;
35  import org.junit.BeforeClass;
36  import org.junit.Test;
37  import org.kuali.rice.core.api.membership.MemberType;
38  import org.kuali.rice.core.api.util.type.KualiDecimal;
39  import org.kuali.rice.kew.api.WorkflowDocument;
40  import org.kuali.rice.kew.api.WorkflowDocumentFactory;
41  import org.kuali.rice.kim.api.KimConstants;
42  import org.kuali.rice.kim.api.identity.IdentityService;
43  import org.kuali.rice.kim.api.identity.Person;
44  import org.kuali.rice.kim.api.identity.address.EntityAddressContract;
45  import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliation;
46  import org.kuali.rice.kim.api.identity.email.EntityEmailContract;
47  import org.kuali.rice.kim.api.identity.employment.EntityEmploymentContract;
48  import org.kuali.rice.kim.api.identity.entity.Entity;
49  import org.kuali.rice.kim.api.identity.entity.EntityDefault;
50  import org.kuali.rice.kim.api.identity.name.EntityNameContract;
51  import org.kuali.rice.kim.api.identity.phone.EntityPhoneContract;
52  import org.kuali.rice.kim.api.identity.principal.PrincipalContract;
53  import org.kuali.rice.kim.api.identity.type.EntityTypeContactInfo;
54  import org.kuali.rice.kim.api.role.RoleMember;
55  import org.kuali.rice.kim.api.role.RoleMemberContract;
56  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
57  import org.kuali.rice.kim.api.type.KimType;
58  import org.kuali.rice.kim.bo.ui.KimDocumentRoleMember;
59  import org.kuali.rice.kim.bo.ui.PersonDocumentAddress;
60  import org.kuali.rice.kim.bo.ui.PersonDocumentAffiliation;
61  import org.kuali.rice.kim.bo.ui.PersonDocumentEmail;
62  import org.kuali.rice.kim.bo.ui.PersonDocumentEmploymentInfo;
63  import org.kuali.rice.kim.bo.ui.PersonDocumentName;
64  import org.kuali.rice.kim.bo.ui.PersonDocumentPhone;
65  import org.kuali.rice.kim.bo.ui.PersonDocumentPrivacy;
66  import org.kuali.rice.kim.bo.ui.PersonDocumentRole;
67  import org.kuali.rice.kim.document.IdentityManagementPersonDocument;
68  import org.kuali.rice.kim.document.IdentityManagementRoleDocument;
69  import org.kuali.rice.kim.framework.type.KimTypeService;
70  import org.kuali.rice.kim.impl.common.delegate.DelegateMemberBo;
71  import org.kuali.rice.kim.impl.identity.address.EntityAddressTypeBo;
72  import org.kuali.rice.kim.impl.identity.affiliation.EntityAffiliationTypeBo;
73  import org.kuali.rice.kim.impl.identity.email.EntityEmailTypeBo;
74  import org.kuali.rice.kim.impl.identity.name.EntityNameTypeBo;
75  import org.kuali.rice.kim.impl.identity.phone.EntityPhoneTypeBo;
76  import org.kuali.rice.kim.impl.identity.privacy.EntityPrivacyPreferencesBo;
77  import org.kuali.rice.kim.impl.role.RoleMemberBo;
78  import org.kuali.rice.kim.impl.type.KimTypeAttributeBo;
79  import org.kuali.rice.kim.impl.type.KimTypeBo;
80  import org.kuali.rice.kim.service.KIMServiceLocatorInternal;
81  import org.kuali.rice.kim.service.UiDocumentService;
82  import org.kuali.rice.kim.test.KIMTestCase;
83  import org.kuali.rice.kns.kim.type.DataDictionaryTypeServiceBase;
84  import org.kuali.rice.krad.bo.DocumentHeader;
85  import org.kuali.rice.krad.data.KradDataServiceLocator;
86  import org.kuali.rice.krad.data.PersistenceOption;
87  import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
88  import org.kuali.rice.test.BaselineTestCase;
89  
90  /**
91   * This is a description of what this class does - shyu don't forget to fill this in.
92   *
93   * @author Kuali Rice Team (rice.collab@kuali.org)
94   *
95   */
96  @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.ROLLBACK_CLEAR_DB)
97  public class UiDocumentServiceImplTest extends KIMTestCase {
98  
99  	private UiDocumentService uiDocumentService;
100 	static Person adminPerson = null;
101 
102 	@BeforeClass
103 	public static void beforeClassSetup() {
104         adminPerson = KimApiServiceLocator.getPersonService().getPersonByPrincipalName("admin");
105 	}
106 
107     @Override
108 	public void setUp() throws Exception {
109 		super.setUp();
110 		uiDocumentService = KIMServiceLocatorInternal.getUiDocumentService();
111 	}
112 
113     protected EntityDefault createTestingEntity() {
114         IdentityManagementPersonDocument personDoc = initPersonDoc();
115 
116         WorkflowDocument document = WorkflowDocumentFactory.createDocument(adminPerson.getPrincipalId(),"TestDocumentType");
117         DocumentHeader documentHeader = new DocumentHeader();
118         documentHeader.setWorkflowDocument(document);
119         documentHeader.setDocumentNumber(document.getDocumentId());
120         personDoc.setDocumentHeader(documentHeader);
121 
122         // first - save them so we can inactivate them
123         uiDocumentService.saveEntityPerson(personDoc);
124         // verify that the record was saved
125         EntityDefault entity = KimApiServiceLocator.getIdentityService().getEntityDefault(personDoc.getEntityId());
126         assertNotNull( "Entity was not saved: " + personDoc, entity);
127         assertNotNull( "Principal list was null on retrieved record", entity.getPrincipals() );
128         assertEquals( "Principal list was incorrect length", 1, entity.getPrincipals().size() );
129         assertTrue( "Principal is not active on saved record", entity.getPrincipals().get(0).isActive() );
130         return entity;
131     }
132 
133     @Test
134     public void testInactiveRoleMemberOnly() {
135 
136         KimType.Builder ktBuilder = KimType.Builder.create();
137         ktBuilder.setId("1");
138         ktBuilder.setNamespaceCode("KUALI");
139         ktBuilder.setName("Default");
140         Long version = new Long(1) ;
141         ktBuilder.setVersionNumber(version);
142         KimType kt = ktBuilder.build() ;
143 
144         IdentityManagementRoleDocument identityManagementRoleDocument = new IdentityManagementRoleDocument();
145         identityManagementRoleDocument.setKimType(kt);
146         identityManagementRoleDocument.setRoleId("KRSAP10003");
147         identityManagementRoleDocument.setRoleTypeId("1");
148         identityManagementRoleDocument.setRoleName("Default");
149         identityManagementRoleDocument.setRoleNamespace("KR_SAP");
150         identityManagementRoleDocument.setRoleName("Sample App Admin");
151 
152         RoleMemberBo roleMemberBo = new RoleMemberBo();
153         roleMemberBo.setId("KRSAP10003");
154         roleMemberBo.setRoleId("KRSAP1003");
155         roleMemberBo.setMemberId("dev1");
156         roleMemberBo.setTypeCode("P");
157 
158         // make the role member inactive
159         Timestamp timestamp = new Timestamp(System.currentTimeMillis());
160         roleMemberBo.setActiveToDateValue(timestamp);
161         ArrayList<RoleMemberBo> roleMemberBos = new ArrayList<RoleMemberBo>();
162         roleMemberBos.add(roleMemberBo);
163 
164         // We've got one role member, and it is inactive.
165         UiDocumentServiceImpl uiDocumentServiceImpl = new UiDocumentServiceImpl() ;
166         List<KimDocumentRoleMember> kimDocumentRoleMembers = uiDocumentServiceImpl.loadRoleMembers(identityManagementRoleDocument, roleMemberBos);
167         assertEquals("KimDocuemtnRoleMember size is incorrect", 0, kimDocumentRoleMembers.size());
168     }
169 
170 
171     @Test
172     public void testInactivatePrincipal() {
173         createTestingEntity();
174         // create a new person document and inactivate the record we just created
175         IdentityManagementPersonDocument personDoc = initPersonDoc();
176 
177         WorkflowDocument document = WorkflowDocumentFactory.createDocument(adminPerson.getPrincipalId(),"TestDocumentType");
178         DocumentHeader documentHeader = new DocumentHeader();
179         documentHeader.setWorkflowDocument(document);
180         documentHeader.setDocumentNumber(document.getDocumentId());
181         personDoc.setDocumentHeader(documentHeader);
182 
183         personDoc.setActive(false);
184         uiDocumentService.saveEntityPerson(personDoc);
185         EntityDefault entity = KimApiServiceLocator.getIdentityService().getEntityDefault(personDoc.getEntityId());
186 
187         assertNotNull( "Entity missing after inactivation: " + personDoc, entity);
188         assertNotNull( "Principal list was null on retrieved record", entity.getPrincipals() );
189         assertEquals( "Principal list was incorrect length", 1, entity.getPrincipals().size() );
190         assertFalse( "Principal is active on saved record (after inactivation)", entity.getPrincipals().get(0).isActive() );
191     }
192 
193     @Test
194     public void testInactivatePrincipalDelegations() {
195         EntityDefault entity = createTestingEntity();
196 
197         // create a delegation for the system to inactivate
198         String delegateMemberId = UUID.randomUUID().toString();
199         DelegateMemberBo delegateMemberBo = new DelegateMemberBo();
200         delegateMemberBo.setMemberId(entity.getPrincipals().get(0).getPrincipalId());
201         delegateMemberBo.setType(MemberType.PRINCIPAL);
202         delegateMemberBo.setDelegationMemberId(delegateMemberId);
203         KradDataServiceLocator.getDataObjectService().save(delegateMemberBo,PersistenceOption.FLUSH);
204 
205         // attempt to reload - to make sure it's all working
206         delegateMemberBo = KradDataServiceLocator.getDataObjectService().find(DelegateMemberBo.class, delegateMemberId);
207         assertNotNull( "Unable to find delegate member bo", delegateMemberBo);
208         assertTrue( "delegate member should be active", delegateMemberBo.isActive() );
209 
210         // create a new person document and inactivate the record we just created
211         IdentityManagementPersonDocument personDoc = initPersonDoc();
212 
213         WorkflowDocument document = WorkflowDocumentFactory.createDocument(adminPerson.getPrincipalId(),"TestDocumentType");
214         DocumentHeader documentHeader = new DocumentHeader();
215         documentHeader.setWorkflowDocument(document);
216         documentHeader.setDocumentNumber(document.getDocumentId());
217         personDoc.setDocumentHeader(documentHeader);
218 
219         personDoc.setActive(false);
220         uiDocumentService.saveEntityPerson(personDoc);
221 
222         delegateMemberBo = KradDataServiceLocator.getDataObjectService().find(DelegateMemberBo.class, delegateMemberId);
223         assertNotNull( "Unable to find delegate member bo", delegateMemberBo);
224         assertFalse( "delegate member should be inactive: " + delegateMemberBo, delegateMemberBo.isActive() );
225     }
226 
227 	@Test
228 	public void testSaveToEntity() {
229 	    Person adminPerson = KimApiServiceLocator.getPersonService().getPersonByPrincipalName("admin");
230 		IdentityManagementPersonDocument personDoc = initPersonDoc();
231 
232 		WorkflowDocument document = WorkflowDocumentFactory.createDocument(adminPerson.getPrincipalId(),"TestDocumentType");
233         DocumentHeader documentHeader = new DocumentHeader();
234         documentHeader.setWorkflowDocument(document);
235         documentHeader.setDocumentNumber(document.getDocumentId());
236         personDoc.setDocumentHeader(documentHeader);
237 
238 		uiDocumentService.saveEntityPerson(personDoc);
239 
240 		Entity entity = KimApiServiceLocator.getIdentityService().getEntity(personDoc.getEntityId());
241         EntityTypeContactInfo entityType = entity.getEntityTypeContactInfos().get(0);
242         personDoc.getExternalIdentifiers();
243 		assertAddressTrue(personDoc.getAddrs().get(0), entityType.getAddresses().get(0));
244 		assertPhoneTrue(personDoc.getPhones().get(0), entityType.getPhoneNumbers().get(0));
245 		assertEmailTrue(personDoc.getEmails().get(0), entityType.getEmailAddresses().get(0));
246 		assertNameTrue(personDoc.getNames().get(0), entity.getNames().get(0));
247 		assertPrincipalTrue(personDoc, entity.getPrincipals().get(0));
248 
249 		assertAffiliationTrue(personDoc.getAffiliations().get(0), entity.getAffiliations().get(0));
250 		assertEmpInfoTrue(personDoc.getAffiliations().get(0).getEmpInfos().get(0), entity.getEmploymentInformation().get(0));
251 
252 		//verify that update doesn't cause external identifier to be encrypted twice
253 		// and that update doesn't cause any problems
254 		uiDocumentService.saveEntityPerson(personDoc);
255 		Entity entity2 = ((IdentityService) KIMServiceLocatorInternal.getService("kimIdentityDelegateService")).getEntity(
256                 personDoc.getEntityId());
257         EntityTypeContactInfo entityType2 = entity2.getEntityTypeContactInfos().get(0);
258         personDoc.getExternalIdentifiers();
259         assertAddressTrue(personDoc.getAddrs().get(0), entityType2.getAddresses().get(0));
260         assertPhoneTrue(personDoc.getPhones().get(0), entityType2.getPhoneNumbers().get(0));
261         assertEmailTrue(personDoc.getEmails().get(0), entityType2.getEmailAddresses().get(0));
262         assertNameTrue(personDoc.getNames().get(0), entity2.getNames().get(0));
263         assertPrincipalTrue(personDoc, entity2.getPrincipals().get(0));
264 
265 
266 
267 		//		List<String> groupIds = groupService.getDirectMemberGroupIds("g1");
268 //		System.out.println( groupIds );
269 //		assertTrue( "g1 must contain group g2", groupIds.contains( "g2" ) );
270 //		assertFalse( "g1 must not contain group g3", groupIds.contains( "g3" ) );
271 //
272 //		groupIds = groupService.getDirectMemberGroupIds("g2");
273 //		System.out.println( groupIds );
274 //		assertTrue( "g2 must contain group g3", groupIds.contains( "g3" ) );
275 //		assertFalse( "g2 must not contain group g4 (inactive)", groupIds.contains( "g4" ) );
276 
277 	}
278 
279 	@Test
280 	public void testLoadToPersonDocument() {
281 
282 		Entity entity = KimApiServiceLocator.getIdentityService().getEntity("entity123eId");
283 		assertNotNull(entity);
284 		IdentityManagementPersonDocument personDoc = new IdentityManagementPersonDocument();
285 		uiDocumentService.loadEntityToPersonDoc(personDoc, "entity123pId");
286         EntityTypeContactInfo entityType = entity.getEntityTypeContactInfos().get(0);
287         personDoc.getExternalIdentifiers();
288 		assertAddressTrue(personDoc.getAddrs().get(0), entityType.getAddresses().get(0));
289 		assertPhoneTrue(personDoc.getPhones().get(0), entityType.getPhoneNumbers().get(0));
290 		assertEmailTrue(personDoc.getEmails().get(0), entityType.getEmailAddresses().get(0));
291 		assertNameTrue(personDoc.getNames().get(0), entity.getNames().get(0));
292 		//assertPrincipalTrue(personDoc, identity.getPrincipals().get(0));
293 		assertAffiliationTrue(personDoc.getAffiliations().get(0), entity.getAffiliations().get(0));
294 		assertEmpInfoTrue(personDoc.getAffiliations().get(0).getEmpInfos().get(0), entity.getEmploymentInformation().get(0));
295 
296 	}
297 
298 	// test principal membership
299 	@Test
300 	public void testSetAttributeEntry() throws Exception {
301 		PersonDocumentRole personDocRole = initPersonDocRole();
302         KimTypeService kimTypeService = (DataDictionaryTypeServiceBase) KIMServiceLocatorInternal.getService(personDocRole.getKimRoleType().getServiceName());
303 		personDocRole.setDefinitions(kimTypeService.getAttributeDefinitions(personDocRole.getKimTypeId()));
304 
305 		personDocRole.setAttributeEntry( uiDocumentService.getAttributeEntries( personDocRole.getDefinitions() ) );
306 		for (Object key : personDocRole.getAttributeEntry().keySet()) {
307 			if (key.equals(KimConstants.AttributeConstants.NAMESPACE_CODE)) {
308 				Map value = (Map)personDocRole.getAttributeEntry().get(key);
309 				assertEquals("Parameter Namespace Code", value.get("label"));
310 				assertEquals("Nmspc Cd", value.get("shortLabel"));
311 				assertEquals(new Integer(20), value.get("maxLength"));
312 			} else if (key.equals("campusCode")) {
313 				Map value = (Map)personDocRole.getAttributeEntry().get(key);
314 				assertEquals("Campus Code", value.get("label"));
315 				assertEquals("Campus Code", value.get("shortLabel"));
316 				assertEquals(new Integer(2), value.get("maxLength"));
317 			} else {
318 				assertFalse("Should not have this key "+key, true);
319 			}
320 		}
321 	}
322 
323 	private PersonDocumentRole initPersonDocRole() throws Exception {
324 //		Map pkMap = new HashMap();
325 //		pkMap.put("roleId", "r1");
326 //		PersonDocumentRole docRole = (PersonDocumentRole)uiDocumentService.getBusinessObjectService().findByPrimaryKey(PersonDocumentRole.class, pkMap);
327 		PersonDocumentRole docRole = new PersonDocumentRole();
328 		docRole.setKimTypeId("roleType1");
329 		docRole.setRoleId("r1");
330 		KimTypeBo kimType = new KimTypeBo();
331 		kimType.setId("roleType1");
332 		kimType.setServiceName("kimRoleTypeService");
333 		List<KimTypeAttributeBo> attributeDefinitions = new ArrayList<KimTypeAttributeBo>();
334 		KimTypeAttributeBo attr1 = KradDataServiceLocator.getDataObjectService().find(KimTypeAttributeBo.class, "kimAttr3");
335 
336 //		attr1.setKimAttributeId("kimAttrDefn2");
337 //		attr1.setSortCode("a");
338 //		attr1.setKimTypeAttributeId("kimAttr3");
339 
340 		attributeDefinitions.add(attr1);
341 //		attr1 = new KimTypeAttributeBo();
342 //		attr1.setKimAttributeId("kimAttrDefn3");
343 //		attr1.setSortCode("b");
344 //		attr1.setKimTypeAttributeId("kimAttr4");
345 
346 		KimTypeAttributeBo attr2 = KradDataServiceLocator.getDataObjectService().find(KimTypeAttributeBo.class, "kimAttr4");
347 
348 		attributeDefinitions.add(attr2);
349 		kimType.setAttributeDefinitions(attributeDefinitions);
350 
351         Field fld = PersonDocumentRole.class.getDeclaredField("kimRoleType");
352         fld.setAccessible(true);
353         fld.set(docRole, kimType);
354 
355 		return docRole;
356 	}
357 
358 	// init section
359 	private IdentityManagementPersonDocument initPersonDoc() {
360 		IdentityManagementPersonDocument personDoc = new IdentityManagementPersonDocument();
361 		personDoc.setEntityId("ent123");
362 		personDoc.setDocumentNumber("1");
363 		personDoc.setPrincipalId("pid123");
364 		personDoc.setPrincipalName("test");
365 //		personDoc.setUnivId("1234567890");
366 		personDoc.setAffiliations(initAffiliations());
367 		personDoc.setNames(initNames());
368 		personDoc.setAddrs(initAddresses());
369 		//personDoc.setRoles(initRoles());
370 		//personDoc.setGroups();
371 		personDoc.setPhones(initPhones());
372 		personDoc.setEmails(initEmails());
373 		return personDoc;
374 	}
375 
376 	private List<PersonDocumentName> initNames() {
377 		List<PersonDocumentName> docNames = new ArrayList<PersonDocumentName>();
378 			PersonDocumentName docName = new PersonDocumentName();
379 			docName.setEntityNameId("nameId123");
380 			docName.setNameCode("PRFR");
381             docName.setEntityNameType(
382                     EntityNameTypeBo.from(KimApiServiceLocator.getIdentityService().getNameType("PRFR")));
383 			docName.setFirstName("John");
384 			docName.setLastName("Doe");
385 			docName.setMiddleName("M");
386 			docName.setNamePrefix("Mr");
387 			docName.setNameSuffix("Jr");
388 			docName.setActive(true);
389 			docName.setDflt(true);
390 			docNames.add(docName);
391 		return docNames;
392 	}
393 
394 	private List<PersonDocumentAffiliation> initAffiliations() {
395 		List<PersonDocumentAffiliation> docAffiliations = new ArrayList<PersonDocumentAffiliation>();
396 			PersonDocumentAffiliation docAffiliation = new PersonDocumentAffiliation();
397 			docAffiliation.setAffiliationTypeCode("FCLTY");
398             docAffiliation.setAffiliationType(
399                     EntityAffiliationTypeBo.from(KimApiServiceLocator.getIdentityService().getAffiliationType("FCLTY")));
400 			docAffiliation.setEntityAffiliationId("aflID123");
401 			docAffiliation.setCampusCode("BL");
402 			docAffiliation.setActive(true);
403 			docAffiliation.setDflt(true);
404 
405 			// EntityAffiliationImpl does not define empinfos as collection
406 			docAffiliations.add(docAffiliation);
407 			List<PersonDocumentEmploymentInfo> docEmploymentInformations = new ArrayList<PersonDocumentEmploymentInfo>();
408 				PersonDocumentEmploymentInfo docEmpInfo = new PersonDocumentEmploymentInfo();
409 				docEmpInfo.setEmployeeId("12345");
410 				docEmpInfo.setEntityAffiliationId(docAffiliation.getEntityAffiliationId());
411 				docEmpInfo.setEntityEmploymentId("empId123");
412 				docEmpInfo.setEmploymentRecordId("1");
413 				docEmpInfo.setBaseSalaryAmount(new KualiDecimal(8000));
414 				docEmpInfo.setPrimaryDepartmentCode("BL-CHEM");
415 				docEmpInfo.setEmploymentStatusCode("A");
416 				docEmpInfo.setEmploymentTypeCode("P");
417 				docEmpInfo.setActive(true);
418 				docEmploymentInformations.add(docEmpInfo);
419 			docAffiliation.setEmpInfos(docEmploymentInformations);
420 
421 		return docAffiliations;
422 
423 	}
424 
425 	private PersonDocumentPrivacy initPrivacyReferences(EntityPrivacyPreferencesBo privacyPreferences) {
426 		PersonDocumentPrivacy docPrivacy = new PersonDocumentPrivacy();
427 		docPrivacy.setSuppressAddress(true);
428 		docPrivacy.setSuppressEmail(false);
429 		docPrivacy.setSuppressName(false);
430 		docPrivacy.setSuppressPhone(false);
431 		docPrivacy.setSuppressPersonal(true);
432 		return docPrivacy;
433 	}
434 	private List<PersonDocumentPhone> initPhones() {
435 		List<PersonDocumentPhone> docPhones = new ArrayList<PersonDocumentPhone>();
436 			PersonDocumentPhone docPhone = new PersonDocumentPhone();
437 			docPhone.setPhoneTypeCode("HM");
438             docPhone.setPhoneType(EntityPhoneTypeBo.from(KimApiServiceLocator.getIdentityService().getPhoneType("HM")));
439 			docPhone.setEntityPhoneId("phoneId123");
440 			docPhone.setEntityTypeCode("PERSON");
441 			docPhone.setPhoneNumber("123-45'6789");
442 			docPhone.setExtensionNumber("123");
443 			docPhone.setActive(true);
444 			docPhone.setDflt(true);
445 			docPhones.add(docPhone);
446 		return  docPhones;
447 
448 	}
449 
450 	private List<PersonDocumentEmail> initEmails() {
451 		List<PersonDocumentEmail> emails = new ArrayList<PersonDocumentEmail>();
452 			PersonDocumentEmail docEmail = new PersonDocumentEmail();
453 			//docEmail.setEntityId(email.getEntityId());
454 			docEmail.setEntityEmailId("emailId123");
455 			docEmail.setEntityTypeCode("PERSON");
456 			docEmail.setEmailTypeCode("HM");
457             docEmail.setEmailType(
458                     EntityEmailTypeBo.from(KimApiServiceLocator.getIdentityService().getEmailType("HM")));
459 			docEmail.setEmailAddress("test@abc.com");
460 			docEmail.setActive(true);
461 			docEmail.setDflt(true);
462 			emails.add(docEmail);
463 		return emails;
464 	}
465 
466 	private  List<PersonDocumentAddress> initAddresses() {
467 		List<PersonDocumentAddress> docAddresses = new ArrayList<PersonDocumentAddress>();
468 			PersonDocumentAddress docAddress = new PersonDocumentAddress();
469 			docAddress.setEntityTypeCode("PERSON");
470 			docAddress.setEntityAddressId("addrId123");
471 			docAddress.setAddressTypeCode("HM");
472             docAddress.setAddressType(EntityAddressTypeBo.from(KimApiServiceLocator.getIdentityService().getAddressType("HM")));
473 			docAddress.setLine1("PO box 123");
474 			docAddress.setStateProvinceCode("IN");
475 			docAddress.setPostalCode("46123");
476 			docAddress.setCountryCode("US");
477 			docAddress.setCity("Indianapolis");
478 			docAddress.setActive(true);
479 			docAddress.setDflt(true);
480 			docAddresses.add(docAddress);
481 		return docAddresses;
482 	}
483 
484 // assert section
485 
486 	private void assertPrincipalTrue(IdentityManagementPersonDocument personDoc, PrincipalContract principal) {
487 		assertEquals(personDoc.getPrincipalId(), principal.getPrincipalId());
488 		assertEquals(personDoc.getPrincipalName(), principal.getPrincipalName());
489 	}
490 
491 	private void assertAddressTrue(PersonDocumentAddress docAddress, EntityAddressContract entityAddress) {
492 
493 		assertEquals(docAddress.getAddressTypeCode(), entityAddress.getAddressType().getCode());
494 		assertEquals(docAddress.getCountryCode(), entityAddress.getCountryCode());
495 		assertEquals(docAddress.getLine1(), entityAddress.getLine1());
496 		assertEquals(docAddress.getCity(), entityAddress.getCity());
497 		assertEquals(docAddress.getPostalCode(), entityAddress.getPostalCode());
498 		assertEquals(docAddress.getStateProvinceCode(), entityAddress.getStateProvinceCode());
499 	}
500 
501 	private void assertEmailTrue(PersonDocumentEmail docEmail, EntityEmailContract entityEmail) {
502 		assertEquals(docEmail.getEntityEmailId(), entityEmail.getId());
503 		assertEquals(docEmail.getEmailAddress(), entityEmail.getEmailAddressUnmasked());
504 		assertEquals(docEmail.getEmailTypeCode(), entityEmail.getEmailType().getCode());
505 	}
506 
507 	private void assertPhoneTrue(PersonDocumentPhone docPhone, EntityPhoneContract entityPhone) {
508 		assertEquals(docPhone.getEntityPhoneId(), entityPhone.getId());
509 		assertEquals(docPhone.getCountryCode(), entityPhone.getCountryCode());
510 		assertEquals(docPhone.getPhoneNumber(), entityPhone.getPhoneNumber());
511 		assertEquals(docPhone.getExtensionNumber(), entityPhone.getExtensionNumber());
512 		assertEquals(docPhone.getPhoneTypeCode(), entityPhone.getPhoneType().getCode());
513 	}
514 
515 	private void assertNameTrue(PersonDocumentName docName, EntityNameContract entityName) {
516 		assertEquals(docName.getEntityNameId(), entityName.getId());
517 		assertEquals(docName.getFirstName(), entityName.getFirstName());
518 		assertEquals(docName.getLastName(), entityName.getLastName());
519 		assertEquals(docName.getNameCode(), entityName.getNameType().getCode());
520 		assertEquals(docName.getNameSuffix(), entityName.getNameSuffix());
521 		assertEquals(docName.getNamePrefix(), entityName.getNamePrefix());
522 	}
523 
524 	private void assertAffiliationTrue(PersonDocumentAffiliation docAffln, EntityAffiliation entityAffln) {
525 		assertEquals(docAffln.getAffiliationTypeCode(), entityAffln.getAffiliationType().getCode());
526 		assertEquals(docAffln.getCampusCode(), entityAffln.getCampusCode());
527 		assertEquals(docAffln.getEntityAffiliationId(), entityAffln.getId());
528 	}
529 
530 	private void assertEmpInfoTrue(PersonDocumentEmploymentInfo docEmpInfo, EntityEmploymentContract entityEmpInfo) {
531 		assertEquals(docEmpInfo.getEmployeeId(), entityEmpInfo.getEmployeeId());
532 		assertEquals(docEmpInfo.getEmploymentTypeCode(), entityEmpInfo.getEmployeeType().getCode());
533 		assertEquals(docEmpInfo.getEmploymentStatusCode(), entityEmpInfo.getEmployeeStatus().getCode());
534 		assertEquals(docEmpInfo.getEmploymentRecordId(), entityEmpInfo.getEmploymentRecordId());
535 		assertEquals(docEmpInfo.getBaseSalaryAmount(), entityEmpInfo.getBaseSalaryAmount());
536 	}
537 
538     @Test
539     public void test_KimDocumentRoleMember_copyProperties() {
540         //
541         // KimDocumentRoleMember.copyProperties is called by the UiDocumentServiceImpl.getRoleMembers
542         // method.  This test verifies that KimDocumentRoleMember.copyProperties is working as
543         // expected and also will fail if fields are added to KimDocumentRoleMember to ensure that
544         // KimDocumentRoleMember.copyProperties is kept up to date.
545         //
546 
547         DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
548         String ROLE_MEMBER_ID = "1";
549         String ROLE_ID = "23";
550         Map<String, String> ATTRIBUTES = new HashMap<String, String>();
551         String MEMBER_NAME = "WorkflowAdmin";
552         String MEMBER_NAMESPACE_CODE = "KR-WKFLW";
553         String MEMBER_ID = "1";
554         MemberType MEMBER_TYPE = MemberType.GROUP;
555         String ACTIVE_FROM_STRING = "2011-01-01 12:00:00";
556         DateTime ACTIVE_FROM = new DateTime(FORMATTER.parseDateTime(ACTIVE_FROM_STRING));
557         String ACTIVE_TO_STRING = "2115-01-01 12:00:00";
558         DateTime ACTIVE_TO = new DateTime(FORMATTER.parseDateTime(ACTIVE_TO_STRING));
559         String OBJ_ID = "123";
560         long VER_NUM = 4;
561 
562         KimDocumentRoleMember newKimDocumentRoleMember = new KimDocumentRoleMember();
563 
564         RoleMemberContract rmc = RoleMember.Builder.create(ROLE_ID, ROLE_MEMBER_ID, MEMBER_ID, MEMBER_TYPE, ACTIVE_FROM,
565                 ACTIVE_TO, ATTRIBUTES, MEMBER_NAME, MEMBER_NAMESPACE_CODE).build();
566         RoleMember rm = RoleMember.Builder.create(rmc).build();
567         RoleMemberBo roleMemberBo = RoleMemberBo.from(rm);
568         roleMemberBo.setObjectId(OBJ_ID);
569         roleMemberBo.setVersionNumber(VER_NUM);
570 
571         KimDocumentRoleMember.copyProperties(newKimDocumentRoleMember, roleMemberBo);
572 
573         assertTrue("newKimDocumentRoleMember should have a roleId of " + ROLE_ID,
574                 newKimDocumentRoleMember.getRoleId().equals(ROLE_ID));
575         assertTrue("newKimDocumentRoleMember should have a MemberId of " + MEMBER_ID,
576                 newKimDocumentRoleMember.getMemberId().equals(MEMBER_ID));
577         assertTrue("newKimDocumentRoleMember should have a MemberName of " + MEMBER_NAME,
578                 newKimDocumentRoleMember.getMemberName().equals(MEMBER_NAME));
579         assertTrue("newKimDocumentRoleMember should have a MemberNamespaceCode of " + MEMBER_NAMESPACE_CODE,
580                 newKimDocumentRoleMember.getMemberNamespaceCode().equals(MEMBER_NAMESPACE_CODE));
581         assertTrue("newKimDocumentRoleMember should be active.",
582                 newKimDocumentRoleMember.isActive());
583         assertTrue("newKimDocumentRoleMember should have a ActiveToDate of " + MEMBER_NAMESPACE_CODE,
584                 newKimDocumentRoleMember.getActiveToDate().equals(roleMemberBo.getActiveToDateValue()));
585         assertTrue("newKimDocumentRoleMember should have a ActiveFromDate of " + ACTIVE_FROM_STRING,
586                 newKimDocumentRoleMember.getActiveFromDate().equals(roleMemberBo.getActiveFromDateValue()));
587         assertTrue("newKimDocumentRoleMember should have a VersionNumber of " + VER_NUM,
588                 newKimDocumentRoleMember.getVersionNumber().equals(VER_NUM));
589         assertTrue("newKimDocumentRoleMember should have a ObjectId of " + OBJ_ID,
590                 newKimDocumentRoleMember.getObjectId().equals(OBJ_ID));
591 
592         Class<?> c = newKimDocumentRoleMember.getClass();
593         Field[] fields = c.getDeclaredFields();
594         List<Field> fieldsList = Arrays.asList(fields);
595 
596         int numberOfFieldsInKimDocumentRoleMember = 11;
597         assertTrue("KimDocumentRoleMember.copyProperties may need to be updated if the number of fields"
598                 + "in KimDocumentRoleMember does not equal " + numberOfFieldsInKimDocumentRoleMember + ".  Size is " +
599                 fieldsList.size(), fieldsList.size() == numberOfFieldsInKimDocumentRoleMember);
600     }
601 }