/**
* ESUP-Portail Helpdesk - Copyright (c) 2004-2009 ESUP-Portail consortium.
*/
package org.esupportail.helpdesk.domain.reporting;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.esupportail.commons.services.authentication.AuthUtils;
import org.esupportail.commons.utils.strings.StringUtils;
import org.esupportail.helpdesk.domain.beans.Department;
import org.esupportail.helpdesk.domain.beans.DepartmentManager;
import org.esupportail.helpdesk.domain.beans.Faq;
import org.esupportail.helpdesk.domain.beans.FaqEvent;
import org.esupportail.helpdesk.domain.beans.User;
import org.esupportail.helpdesk.exceptions.FaqNotFoundException;
/**
* The basic implementation of FaqReporter.
*/
public class FaqReporterImpl extends AbstractSenderFormatter implements FaqReporter {
/**
* Bean constructor.
*/
public FaqReporterImpl() {
super();
}
/**
* @param events
* @return a map that contains all the FAQ events to print on reports sorted by department.
*/
protected Map<Department, List<FaqEvent>> getEventsByDepartment(final List<FaqEvent> events) {
Map<Department, List<FaqEvent>> result = new HashMap<Department, List<FaqEvent>>();
for (FaqEvent event : events) {
Department department = event.getDepartment();
if (department != null) {
List<FaqEvent> departmentEvents = result.get(department);
if (departmentEvents == null) {
departmentEvents = new ArrayList<FaqEvent>();
result.put(department, departmentEvents);
}
boolean found = false;
long faqId = event.getFaqId();
for (FaqEvent e : departmentEvents) {
if (faqId == e.getFaqId()) {
found = true;
break;
}
}
if (!found) {
departmentEvents.add(event);
}
}
}
return result;
}
/**
* @param events
* @return the events to print on reports.
*/
protected List<FaqEvent> getRootEvents(final List<FaqEvent> events) {
List<FaqEvent> result = new ArrayList<FaqEvent>();
for (FaqEvent event : events) {
Department department = event.getDepartment();
if (department == null) {
boolean found = false;
long faqId = event.getFaqId();
for (FaqEvent e : result) {
if (faqId == e.getFaqId()) {
found = true;
break;
}
}
if (!found) {
result.add(event);
}
}
}
return result;
}
/**
* @return a map that contains all the managers.
*/
protected Map<User, List<Department>> getUserMap() {
Map<User, List<Department>> map = new HashMap<User, List<Department>>();
for (User user : getDomainService().getAdmins()) {
if (user.getReceiveFaqReports()) {
List<Department> departments = new ArrayList<Department>();
map.put(user, departments);
departments.add(null);
}
}
for (Department department : getDomainService().getEnabledDepartments()) {
for (DepartmentManager departmentManager
: getDomainService().getDepartmentManagers(department)) {
User user = departmentManager.getUser();
if (user.getReceiveFaqReports()) {
List<Department> departments = map.get(user);
if (departments == null) {
departments = new ArrayList<Department>();
map.put(user, departments);
}
departments.add(departmentManager.getDepartment());
}
}
}
return map;
}
/**
* @param user
* @param department
* @param departmentEvents
* @return the report content that corresponds to a department.
*/
protected String getDepartmentReportContent(
final User user,
final Department department,
final List<FaqEvent> departmentEvents) {
Locale locale = getDomainService().getUserStore().getUserLocale(user);
String content;
if (department == null) {
content = getI18nService().getString(
"EMAIL.FAQ_REPORT.ROOT_HEADER", locale);
} else {
content = getI18nService().getString(
"EMAIL.FAQ_REPORT.DEPARTMENT_HEADER", locale, department.getLabel());
}
for (FaqEvent event : departmentEvents) {
Faq faq = null;
String faqLabel = null;
try {
faq = getDomainService().getFaq(event.getFaqId());
faqLabel = faq.getLabel();
} catch (FaqNotFoundException e) {
faqLabel = event.getLabel();
}
String i18nKey = "EMAIL.FAQ_REPORT." + event.getAction();
String departmentLabel = null;
if (FaqEvent.MOVE_FROM.equals(event.getAction())) {
if (event.getFromDepartment() == null) {
i18nKey += "_NULL";
} else {
departmentLabel = event.getFromDepartment().getLabel();
}
} else if (FaqEvent.MOVE_TO.equals(event.getAction())) {
if (event.getToDepartment() == null) {
i18nKey += "_ROOT";
} else {
departmentLabel = event.getToDepartment().getLabel();
}
}
if (faq == null) {
i18nKey += "_NO_LINK";
}
String author = null;
if (event.getAuthor() != null) {
author = getUserFormattingService().format(event.getAuthor(), locale);
}
content += "<li>" + getI18nService().getString(
i18nKey, locale,
getUrlBuilder().getFaqsUrl(user.getAuthType(), faq),
StringUtils.escapeHtml(faqLabel),
StringUtils.escapeHtml(author),
StringUtils.escapeHtml(departmentLabel)) + "</li>";
}
return content;
}
/**
* Send a FAQ report to a user.
* @param user
* @param reportContent
*/
protected void sendFaqReport(
final User user,
final String reportContent) {
Locale locale = getDomainService().getUserStore().getUserLocale(user);
String subject = getI18nService().getString(
"EMAIL.FAQ_REPORT.SUBJECT", locale);
String htmlContent = getI18nService().getString(
"EMAIL.FAQ_REPORT.TITLE", locale);
htmlContent += "<table width=\"100%\"><tr><td valign=\"top\">";
htmlContent += reportContent;
htmlContent += "</td><td valign=\"top\">";
htmlContent += getEmailQuickLinks(AuthUtils.NONE, user, null);
htmlContent += "</td></tr></table>";
htmlContent += getI18nService().getString(
"EMAIL.FAQ_REPORT.FOOTER", locale,
getUrlBuilder().getManagerPreferencesUrl(user.getAuthType()),
getUrlBuilder().getToggleFaqReportsUrl(user.getAuthType()));
send(user, genMessageId(), subject, htmlContent);
}
/**
* @see org.esupportail.helpdesk.domain.reporting.FaqReporter#sendFaqReports()
*/
@Override
public void sendFaqReports() {
List<FaqEvent> events = getDomainService().getFaqEvents();
List<FaqEvent> rootEvents = getRootEvents(events);
Map<Department, List<FaqEvent>> eventsByDepartment = getEventsByDepartment(events);
Map<User, List<Department>> userMap = getUserMap();
for (User user : userMap.keySet()) {
String reportContent = "";
boolean send = false;
for (Department department : userMap.get(user)) {
List<FaqEvent> departmentEvents;
if (department == null) {
departmentEvents = rootEvents;
} else {
departmentEvents = eventsByDepartment.get(department);
}
if (departmentEvents != null && !departmentEvents.isEmpty()) {
send = true;
reportContent += getDepartmentReportContent(
user, department, departmentEvents);
}
}
if (send) {
sendFaqReport(user, reportContent);
}
}
for (FaqEvent event : events) {
getDomainService().deleteFaqEvent(event);
}
}
}