package org.jblooming.messaging;
import org.jblooming.oql.OqlQuery;
import org.jblooming.persistence.hibernate.PersistenceContext;
import org.jblooming.scheduler.ExecutableSupport;
import org.jblooming.scheduler.JobLogData;
import org.jblooming.tracer.Tracer;
import org.jblooming.utilities.DateUtilities;
import org.jblooming.utilities.JSP;
import org.jblooming.waf.settings.ApplicationState;
import org.jblooming.waf.settings.Application;
import org.jblooming.waf.settings.I18n;
import org.jblooming.waf.constants.Fields;
import org.jblooming.operator.Operator;
import org.jblooming.agenda.CompanyCalendar;
import java.util.*;
public class DigestMessageDispatcher extends ExecutableSupport {
public JobLogData run(JobLogData jobLogData) throws Exception {
PersistenceContext pc = null;
try {
pc = PersistenceContext.getDefaultPersistenceContext();
// get all messages in DIGEST channel
String hql = "from " + Message.class.getName() + " as mess where mess.media = :media order by mess.toOperator, mess.received";
OqlQuery query = new OqlQuery(hql);
query.getQuery().setString("media", MessagingSystem.Media.DIGEST.toString());
List<Message> messages = query.list();
// loop for all messages in order to spread them in a map<Operator,map<Date,List<Messages>>>
Map<Operator, Map<Date,List<Message>>> digests= new HashMap<Operator, Map<Date,List<Message>>>();
for (Message message : messages) {
//test already have an entry
Map<Date,List<Message>> digestsForOperator=digests.get(message.getToOperator());
if (digestsForOperator==null){
digestsForOperator= new HashMap<Date,List<Message>>();
digests.put(message.getToOperator(),digestsForOperator);
}
// get the day bagin for the message in order to group by date
Date dayNormalized= new CompanyCalendar(message.getReceived()).setAndGetTimeToDayStart();
List<Message> massagesOfDay=digestsForOperator.get(dayNormalized);
if (massagesOfDay==null){
massagesOfDay= new ArrayList<Message>();
digestsForOperator.put(dayNormalized,massagesOfDay);
}
//add message to the day list
massagesOfDay.add(message);
}
Operator systemOperator = Operator.getSystemOperator();
// lop for all operators in digests
for (Operator operator:digests.keySet()){
String language = operator.getLanguage();
String digested="";
Map<Date, List<Message>> userMessages = digests.get(operator);
for (Date aDay: userMessages.keySet()){
digested+= JSP.makeTag("div","style=\"background-color:gold;\"",JSP.makeTag("font","size=5",DateUtilities.dateToFullString(aDay)));
//loop for messages
for (Message message:userMessages.get(aDay)){
digested+=JSP.makeTag("font","size=4",message.getSubject())+"<br>";
digested+=JSP.w(message.getMessageBody());
if (JSP.ex(message.getLink())){
digested+="<br>"+JSP.w(message.getLink());
}
digested+="<hr>";
//remove the message
message.remove();
}
digested+="<br><br>";
}
if (Fields.TRUE.equals(operator.getOption("MESSAGE_DIGESTER_BY_EMAIL"))){
//Creates a new message for email/rss channels depending on user options
Message digestedMessage= new Message();
digestedMessage.setExpires(new Date(System.currentTimeMillis()+ CompanyCalendar.MILLIS_IN_3_MONTH));
digestedMessage.setFromOperator(systemOperator);
digestedMessage.setMedia(MessagingSystem.Media.EMAIL+"");
digestedMessage.setMessageBody(digested);
digestedMessage.setReceived(new Date());
//digestedMessage.setStatus();
Application app = ApplicationState.platformConfiguration.defaultApplication;
String subject = I18n.getLabel("DIGEST_MESSAGE_SUBJECT", app.getName(), language);
digestedMessage.setSubject(subject);
digestedMessage.setToOperator(operator);
digestedMessage.store();
}
if (Fields.TRUE.equals(operator.getOption("MESSAGE_DIGESTER_BY_RSS"))){
//Creates a new message for email/rss channels depending on user options
Message digestedMessage= new Message();
digestedMessage.setExpires(new Date(System.currentTimeMillis()+ CompanyCalendar.MILLIS_IN_3_MONTH));
digestedMessage.setFromOperator(systemOperator);
digestedMessage.setMedia(MessagingSystem.Media.RSS+"");
digestedMessage.setMessageBody(digested);
digestedMessage.setReceived(new Date());
//digestedMessage.setStatus();
Application app = ApplicationState.platformConfiguration.defaultApplication;
String subject = I18n.getLabel("DIGEST_MESSAGE_SUBJECT", app.getName(), language);
digestedMessage.setSubject(subject);
digestedMessage.setToOperator(operator);
digestedMessage.store();
}
}
pc.commitAndClose();
jobLogData.notes = jobLogData.notes + "DigestMessageDispatcher executed on " + DateUtilities.dateAndHourToString(new Date());
} catch (Throwable e) {
Tracer.platformLogger.error("DigestMessageDispatcher error",e);
Tracer.emailLogger.error("DigestMessageDispatcher error",e);
jobLogData.successfull = false;
if (pc!=null)
pc.rollbackAndClose();
}
return jobLogData;
}
}