/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.tem.batch.service.impl;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.io.StringWriter;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.tem.TemConstants;
import org.kuali.kfs.module.tem.batch.TemProfileExportStep;
import org.kuali.kfs.module.tem.batch.service.TemProfileExportService;
import org.kuali.kfs.module.tem.businessobject.TemProfile;
import org.kuali.kfs.module.tem.service.TemProfileService;
import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kim.api.identity.PersonService;
import org.kuali.rice.krad.util.ObjectUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
public class TemProfileExportServiceImpl implements TemProfileExportService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TemProfileExportServiceImpl.class);
protected TemProfileService temProfileService;
protected PersonService personService;
protected ParameterService parameterService;
protected DateTimeService dateTimeService;
private String fileDirectoryName;
private String fileName;
public void exportProfile() {
List<TemProfile> profiles = temProfileService.getAllActiveTemProfile();
//Accessing EXPORT_FILE_FORMAT sys param for export file extension
LOG.info("Accessing EXPORT_FILE_FORMAT system parameter for file extension");
String extension = parameterService.getParameterValueAsString(TemProfileExportStep.class, TemConstants.TemProfileParameters.EXPORT_FILE_FORMAT);
//Creating export file name
String exportFile = fileDirectoryName + File.separator + fileName + "." + extension;
//Initializing the output stream
PrintStream OUTPUT_GLE_FILE_ps = null;
try {
OUTPUT_GLE_FILE_ps = new PrintStream(exportFile);
} catch (FileNotFoundException ex) {
throw new RuntimeException(ex.toString(), ex);
}
//Create file based on extension
if(extension.equalsIgnoreCase("xml")) {
try {
OUTPUT_GLE_FILE_ps.printf("%s\n", generateXMLDoc(profiles));
} catch (ParserConfigurationException ex) {
throw new RuntimeException(ex.toString(), ex);
} catch (TransformerException ex) {
throw new RuntimeException(ex.toString(), ex);
}
} else {
OUTPUT_GLE_FILE_ps.printf("%s\n", dateTimeService.toDateTimeString(dateTimeService.getCurrentDate()) + "," + parameterService.getParameterValueAsString(KfsParameterConstants.FINANCIAL_SYSTEM_ALL.class, KfsParameterConstants.INSTITUTION_NAME));
for(TemProfile profile : profiles) {
try {
OUTPUT_GLE_FILE_ps.printf("%s\n", generateCSVEntry(profile));
}
catch (Exception e) {
throw new RuntimeException(e.toString(), e);
}
}
}
OUTPUT_GLE_FILE_ps.close();
}
protected String generateXMLDoc(List<TemProfile> profiles) throws ParserConfigurationException, TransformerException {
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.newDocument();
//Create the Profile Header
Element profileHeader = doc.createElement("profileHeader");
profileHeader.appendChild(createElement(doc, "dateOfExport", dateTimeService.toDateTimeString(dateTimeService.getCurrentDate())));
profileHeader.appendChild(createElement(doc, "universityName", parameterService.getParameterValueAsString(KfsParameterConstants.FINANCIAL_SYSTEM_ALL.class, KfsParameterConstants.INSTITUTION_NAME)));
//Create the Profile Detail section
Element profileDetailList = doc.createElement("profiles");
for(TemProfile profile : profiles) {
profileDetailList.appendChild(generateProfileDetailElement(doc, profile));
}
//Create the Root Element, add the Profile Header and Detail sections, add to document
Element rootElement = doc.createElement("temProfileExport");
rootElement.appendChild(profileHeader);
rootElement.appendChild(profileDetailList);
doc.appendChild(rootElement);
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
trans.setOutputProperty(OutputKeys.INDENT, "yes");
//create string from xml tree
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
trans.transform(source, result);
return sw.toString();
}
protected Element generateProfileDetailElement(Document doc, TemProfile profile) {
Element profileDetail = doc.createElement("profileDetail");
profileDetail.appendChild(createElement(doc, "travelerProfileID", profile.getProfileId().toString()));
profileDetail.appendChild(createElement(doc, "travelerType", StringUtils.defaultIfEmpty(profile.getTravelerTypeCode(), "")));
profileDetail.appendChild(createElement(doc, "travelerEmployeeID", StringUtils.defaultIfEmpty(profile.getEmployeeId(), "")));
profileDetail.appendChild(createElement(doc, "principalName", getPrincipalName(profile.getPrincipalId())));
profileDetail.appendChild(createElement(doc, "firstName", StringUtils.defaultIfEmpty(profile.getFirstName(), "")));
profileDetail.appendChild(createElement(doc, "middleName", StringUtils.defaultIfEmpty(profile.getMiddleName(), "")));
profileDetail.appendChild(createElement(doc, "lastName", StringUtils.defaultIfEmpty(profile.getLastName(), "")));
profileDetail.appendChild(createElement(doc, "fullName", StringUtils.defaultIfEmpty(profile.getName(), "")));
profileDetail.appendChild(createElement(doc, "dateOfBirth", ObjectUtils.isNotNull(profile.getDateOfBirth()) ? dateTimeService.toDateString(profile.getDateOfBirth()) : ""));
profileDetail.appendChild(createElement(doc, "gender", StringUtils.defaultIfEmpty(profile.getGender(), "")));
if(ObjectUtils.isNotNull(profile.getTemProfileAddress())) {
profileDetail.appendChild(createElement(doc, "streetAddress1", StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getStreetAddressLine1(), "")));
profileDetail.appendChild(createElement(doc, "streetAddress2", StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getStreetAddressLine2(), "")));
profileDetail.appendChild(createElement(doc, "city", StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getCityName(), "")));
profileDetail.appendChild(createElement(doc, "state", StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getStateCode(), "")));
profileDetail.appendChild(createElement(doc, "zipCode", StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getZipCode(), "")));
profileDetail.appendChild(createElement(doc, "country", StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getCountryCode(), "")));
} else {
//No address for this profile
profileDetail.appendChild(createElement(doc, "streetAddress1", ""));
profileDetail.appendChild(createElement(doc, "streetAddress2", ""));
profileDetail.appendChild(createElement(doc, "city", ""));
profileDetail.appendChild(createElement(doc, "state", ""));
profileDetail.appendChild(createElement(doc, "zipCode", ""));
profileDetail.appendChild(createElement(doc, "country", ""));
}
profileDetail.appendChild(createElement(doc, "phoneNumber", StringUtils.defaultIfEmpty(profile.getPhoneNumber(), "")));
profileDetail.appendChild(createElement(doc, "emailAddress", StringUtils.defaultIfEmpty(profile.getEmailAddress(), "")));
profileDetail.appendChild(createElement(doc, "primaryDepartment", StringUtils.defaultIfEmpty(profile.getHomeDepartment(), "")));
return profileDetail;
}
protected Element createElement(Document doc, String elementName, String elementValue) {
//create element
Element element = doc.createElement(elementName);
//add a text element to the child
Text text = doc.createTextNode(elementValue);
element.appendChild(text);
return element;
}
protected String generateCSVEntry(TemProfile profile) {
StringBuffer line = new StringBuffer();
line.append(profile.getProfileId().toString()).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getTravelerTypeCode(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getEmployeeId(), "")).append(",");
line.append(getPrincipalName(profile.getPrincipalId())).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getFirstName(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getMiddleName(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getLastName(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getName(), "")).append(",");
line.append(ObjectUtils.isNotNull(profile.getDateOfBirth()) ? dateTimeService.toDateString(profile.getDateOfBirth()) : "").append(",");
line.append(StringUtils.defaultIfEmpty(profile.getGender(), "")).append(",");
if(ObjectUtils.isNotNull(profile.getTemProfileAddress())) {
line.append(StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getStreetAddressLine1(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getStreetAddressLine2(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getCityName(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getStateCode(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getZipCode(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getTemProfileAddress().getCountryCode(), "")).append(",");
} else {
//No address for this profile
line.append("").append(",");
line.append("").append(",");
line.append("").append(",");
line.append("").append(",");
line.append("").append(",");
line.append("").append(",");
}
line.append(StringUtils.defaultIfEmpty(profile.getPhoneNumber(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getEmailAddress(), "")).append(",");
line.append(StringUtils.defaultIfEmpty(profile.getHomeDepartment(), ""));
return line.toString();
}
protected String getPrincipalName(String principalId) {
String principalName = "";
if(StringUtils.isNotEmpty(principalId)) {
Person person = personService.getPerson(principalId);
principalName = person != null ? person.getPrincipalName() : "";
}
return principalName;
}
/**
* Sets the temProfileService attribute value.
* @param temProfileService The temProfileService to set.
*/
public void setTemProfileService(TemProfileService temProfileService) {
this.temProfileService = temProfileService;
}
/**
* Gets the fileDirectoryName attribute.
* @return Returns the fileDirectoryName.
*/
public String getFileDirectoryName() {
return fileDirectoryName;
}
/**
* Sets the fileDirectoryName attribute value.
* @param fileDirectoryName The fileDirectoryName to set.
*/
public void setFileDirectoryName(String fileDirectoryName) {
this.fileDirectoryName = fileDirectoryName;
}
/**
* Gets the fileName attribute.
* @return Returns the fileName.
*/
public String getFileName() {
return fileName;
}
/**
* Sets the fileName attribute value.
* @param fileName The fileName to set.
*/
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
public void setDateTimeService(DateTimeService dateTimeService) {
this.dateTimeService = dateTimeService;
}
/**
* Sets the personService attribute value.
* @param personService The personService to set.
*/
public void setPersonService(PersonService personService) {
this.personService = personService;
}
}