/**
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package edu.wisc.hrs.dao.person;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import org.springframework.ws.client.core.WebServiceOperations;
import com.googlecode.ehcache.annotations.Cacheable;
import com.googlecode.ehcache.annotations.DecoratedCacheType;
import edu.wisc.hr.dao.person.ContactInfoDao;
import edu.wisc.hr.dm.person.Address;
import edu.wisc.hr.dm.person.HomeAddress;
import edu.wisc.hr.dm.person.Job;
import edu.wisc.hr.dm.person.OfficeAddress;
import edu.wisc.hr.dm.person.PersonInformation;
import edu.wisc.hrs.dao.BaseHrsSoapDao;
import edu.wisc.hrs.dao.HrsUtils;
import edu.wisc.hrs.xdm.person.req.EmplidTypeShape;
import edu.wisc.hrs.xdm.person.req.GetCompIntfcUWPORTAL1PERSON;
import edu.wisc.hrs.xdm.person.res.GetCompIntfcUWPORTAL1PERSONResponse;
import edu.wisc.hrs.xdm.person.res.UwAddress4VwTypeShape;
import edu.wisc.hrs.xdm.person.res.UwHrPhoneVwTypeShape;
import edu.wisc.hrs.xdm.person.res.UwHrSecDptVwTypeShape;
/**
* Spring {@link WebServiceOperations} backed implementation of {@link BaseHrsSoapDao}.
*
* Requires a Spring {@link WebServiceOperations} be set.
*
* @version $Id: SoapContactInfoDao.java,v 1.4 2012/08/14 21:18:04 dalquist Exp $
*/
@Repository("soapContactInfoDao")
public class SoapContactInfoDao extends BaseHrsSoapDao implements ContactInfoDao {
private WebServiceOperations webServiceOperations;
@Autowired
public void setWebServiceOperations(@Qualifier("personWebServiceTemplate") WebServiceOperations webServiceOperations) {
this.webServiceOperations = webServiceOperations;
}
@Override
protected WebServiceOperations getWebServiceOperations() {
return this.webServiceOperations;
}
/* (non-Javadoc)
* @see edu.wisc.ws.client.support.PeraonalDataDao#getPersonalData(java.lang.String)
*/
@Override
@Cacheable(cacheName="contactInformation", decoratedCacheType=DecoratedCacheType.SELF_POPULATING_CACHE, selfPopulatingTimeout=20000, exceptionCacheName="hrsUnknownExceptionCache")
public PersonInformation getPersonalData(String emplId) {
final GetCompIntfcUWPORTAL1PERSON request = this.createRequest(emplId);
GetCompIntfcUWPORTAL1PERSONResponse response = this.internalInvoke(request);
return this.mapPerson(response);
}
protected GetCompIntfcUWPORTAL1PERSON createRequest(String emplId) {
final EmplidTypeShape value = HrsUtils.createValue(EmplidTypeShape.class, emplId);
GetCompIntfcUWPORTAL1PERSON request = new GetCompIntfcUWPORTAL1PERSON();
request.setEmplid(value);
return request;
}
protected PersonInformation mapPerson(GetCompIntfcUWPORTAL1PERSONResponse psPersonalData) {
if (psPersonalData == null) {
return null;
}
final PersonInformation personalData = new PersonInformation();
//Copy name
personalData.setName((String)HrsUtils.getValue(psPersonalData.getName()));
//Copy email
personalData.setEmail((String)HrsUtils.getValue(psPersonalData.getEmailAddr()));
//Copy Visa/Campus info
personalData.setOnVisa("Y".equals(HrsUtils.getValue(psPersonalData.getVisaPermitClass())));
personalData.setMadisonEmpl("Y".equals(HrsUtils.getValue(psPersonalData.getDeptLocBtn())));
//Setup Jobs list
final List<UwHrSecDptVwTypeShape> additionalJobs = psPersonalData.getUwHrSecDptVws();
final List<Job> jobs = personalData.getJobs();
//load primary department
final Job primaryJob = new Job();
primaryJob.setDepartmentName((String)HrsUtils.getValue(psPersonalData.getDeptDescr()));
primaryJob.setTitle((String)HrsUtils.getValue(psPersonalData.getUwWorkingTitle()));
//load other departments
getJobs(additionalJobs, jobs, primaryJob);
personalData.setPrimaryJob(primaryJob);
//Populate address data
this.populateAddresses(psPersonalData, personalData);
//Populate phone data
populatePhones(psPersonalData, personalData);
return personalData;
}
protected void populatePhones(GetCompIntfcUWPORTAL1PERSONResponse psPersonalData,
final PersonInformation personalData) {
final List<UwHrPhoneVwTypeShape> uwHrPhoneVws = psPersonalData.getUwHrPhoneVws();
for (final UwHrPhoneVwTypeShape uwHrPhoneVwTypeShape : uwHrPhoneVws) {
final String phoneType = HrsUtils.getValue(uwHrPhoneVwTypeShape.getPhoneType());
if ("HOME".equals(phoneType)) {
HomeAddress homeAddress = personalData.getHomeAddress();
if (homeAddress == null) {
homeAddress = new HomeAddress();
personalData.setHomeAddress(homeAddress);
}
final String phone = HrsUtils.getValue(uwHrPhoneVwTypeShape.getPhone());
homeAddress.setPrimaryPhone(phone);
}
else if ("BUSN".equals(phoneType)) {
OfficeAddress officeAddress = personalData.getOfficeAddress();
if (officeAddress == null) {
officeAddress = new OfficeAddress();
personalData.setOfficeAddress(officeAddress);
}
final String phone = HrsUtils.getValue(uwHrPhoneVwTypeShape.getPhone());
officeAddress.setPrimaryPhone(phone);
}
else if ("BSNO".equals(phoneType)) {
OfficeAddress officeAddress = personalData.getOfficeAddress();
if (officeAddress == null) {
officeAddress = new OfficeAddress();
personalData.setOfficeAddress(officeAddress);
}
final String phone = HrsUtils.getValue(uwHrPhoneVwTypeShape.getPhone());
officeAddress.setOtherPhone(phone);
}
else {
logger.warn("Encountered unsupported phone type: '" + phoneType + "'\n" + psPersonalData);
}
}
}
protected void populateAddresses(GetCompIntfcUWPORTAL1PERSONResponse psPersonalData,
final PersonInformation personalData) {
final List<UwAddress4VwTypeShape> uwAddress4Vws = psPersonalData.getUwAddress4Vws();
for (final UwAddress4VwTypeShape uwAddress4VwTypeShape : uwAddress4Vws) {
final String addressType = HrsUtils.getValue(uwAddress4VwTypeShape.getAddressType());
if ("HOME".equals(addressType)) {
final HomeAddress homeAddress = new HomeAddress();
final String releaseHomeInfo = HrsUtils.getValue(psPersonalData.getUwRelHomeInfSw());
homeAddress.setReleaseHomeAddress("Y".equals(releaseHomeInfo));
this.populateAddress(homeAddress, uwAddress4VwTypeShape);
personalData.setHomeAddress(homeAddress);
}
else if ("BUSN".equals(addressType)) {
final OfficeAddress officeAddress = new OfficeAddress();
this.populateAddress(officeAddress, uwAddress4VwTypeShape);
personalData.setOfficeAddress(officeAddress);
}
else {
logger.warn("Encountered unsupported address type: '" + addressType + "'\n" + psPersonalData);
}
}
}
protected void getJobs(final List<UwHrSecDptVwTypeShape> uwHrSecDptVws, List<Job> jobs, Job primaryJob) {
for (final UwHrSecDptVwTypeShape uwHrSecDptVwTypeShape : uwHrSecDptVws) {
final Job job = new Job();
job.setId((Integer)HrsUtils.getValue(uwHrSecDptVwTypeShape.getEmplRcd()));
job.setTitle((String)HrsUtils.getValue(uwHrSecDptVwTypeShape.getUwWorkingTitle1()));
job.setDepartmentName((String)HrsUtils.getValue(uwHrSecDptVwTypeShape.getDescr()));
//Set the jobId of the primary job
if (StringUtils.equals(primaryJob.getTitle(), job.getTitle()) &&
StringUtils.equals(primaryJob.getDepartmentName(), job.getDepartmentName())) {
primaryJob.setId(job.getId());
}
jobs.add(job);
}
}
protected void populateAddress(Address address, UwAddress4VwTypeShape psAddress) {
address.setRoomNumber((String)HrsUtils.getValue(psAddress.getUwRoomNbr()));
address.setMailDrop((String)HrsUtils.getValue(psAddress.getUwMailDropId()));
address.setLocation((String)HrsUtils.getValue(psAddress.getLocation()));
address.setAddress1((String)HrsUtils.getValue(psAddress.getAddress1()));
address.setAddress2((String)HrsUtils.getValue(psAddress.getAddress2()));
address.setAddress3((String)HrsUtils.getValue(psAddress.getAddress3()));
address.setCity((String)HrsUtils.getValue(psAddress.getCity()));
address.setState((String)HrsUtils.getValue(psAddress.getState()));
address.setZip((String)HrsUtils.getValue(psAddress.getPostal()));
}
}