--- /dev/null
+/*****************************************************************************
+ * Copyright Igor Barma, Eric Brun, Alexandre Desoubeaux, Christian Martel,
+ * (2 décembre 2008)
+ *
+ * Ce logiciel est un programme informatique servant à l'évaluation des
+ * compétences.
+ *
+ * Ce logiciel est régi par la licence CeCILL soumise au droit français et
+ * respectant les principes de diffusion des logiciels libres. Vous pouvez
+ * utiliser, modifier et/ou redistribuer ce programme sous les conditions
+ * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
+ * sur le site "http://www.cecill.info".
+ *
+ * En contrepartie de l'accessibilité au code source et des droits de copie,
+ * de modification et de redistribution accordés par cette licence, il n'est
+ * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
+ * seule une responsabilité restreinte pèse sur l'auteur du programme, le
+ * titulaire des droits patrimoniaux et les concédants successifs.
+ *
+ * A cet égard l'attention de l'utilisateur est attirée sur les risques
+ * associés au chargement, à l'utilisation, à la modification et/ou au
+ * développement et à la reproduction du logiciel par l'utilisateur étant
+ * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
+ * manipuler et qui le réserve donc à des développeurs et des professionnels
+ * avertis possédant des connaissances informatiques approfondies. Les
+ * utilisateurs sont donc invités à charger et tester l'adéquation du
+ * logiciel à leurs besoins dans des conditions permettant d'assurer la
+ * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
+ * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
+ *
+ * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
+ * pris connaissance de la licence CeCILL, et que vous en avez accepté les
+ * termes.
+ *******************************************************************************/
+package com.pentila.evalcomp.manager;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import com.pentila.evalcomp.dao.IEventDAO;
+import com.pentila.evalcomp.dao.IMessageDAO;
+import com.pentila.evalcomp.dao.IMessageRecipientDAO;
+import com.pentila.evalcomp.domain.EObject;
+import com.pentila.evalcomp.domain.Entity;
+import com.pentila.evalcomp.domain.Event;
+import com.pentila.evalcomp.domain.Message;
+import com.pentila.evalcomp.domain.MessageRecipient;
+import com.pentila.evalcomp.domain.User;
+import com.pentila.evalcomp.domain.certification.ScenarioDefCert;
+import com.pentila.evalcomp.domain.certification.ScenarioInstCert;
+import com.pentila.evalcomp.domain.certification.UserCertInstance;
+import com.pentila.evalcomp.domain.instance.EvaluationSubjectInstance;
+import com.pentila.evalcomp.domain.plan.PlanRef;
+import com.pentila.evalcomp.domain.transit.TListEObject;
+import com.pentila.evalcomp.manager.interfacedef.IEntityBase;
+import com.pentila.evalcomp.manager.interfacedef.IEvaluationSubjectInstanceBase;
+import com.pentila.evalcomp.manager.interfacedef.IMessageBase;
+import com.pentila.evalcomp.utilities.Utils;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The Class MessageManager.
+ */
+public class MessageManager implements IMessageBase {
+
+
+ /** The logger. */
+ org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MessageManager.class);
+
+ /** The event dao. */
+ IEventDAO eventDAO;
+
+ /** The evaluation subject instance manager. */
+ IEvaluationSubjectInstanceBase evaluationSubjectInstanceManager;
+
+ /** The message dao. */
+ IMessageDAO messageDAO;
+
+ /** The message recipient dao. */
+ IMessageRecipientDAO messageRecipientDAO;
+
+ IEntityBase entityManager;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.manager.interfacedef.IMessage#addMessage(com.pentila
+ * .evalcomp.domain.Message)
+ */
+ public Message addMessage(Message msg) {
+
+ msg.setCreationDate(new Date());
+
+ messageDAO.saveOrUpdate(msg);
+
+ for (Entity e : msg.getRecipients()) {
+
+ e = Beans.getEntityManagerBean().getEntity(e.getId());
+
+ for (User u : e.getUsers()) {
+ MessageRecipient mr = new MessageRecipient();
+ mr.setReaded(false);
+ mr.setState(MessageRecipient.VALID);
+ mr.setMessage(msg);
+
+ mr.setRecipient(u);
+ messageRecipientDAO.saveOrUpdate(mr);
+ msg.getMessageRecipients().add(mr);
+ }
+ }
+
+ return msg;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.manager.interfacedef.IMessage#addMessage(com.pentila
+ * .evalcomp.domain.Message, java.lang.Long)
+ */
+ public Message addMessage(Message msg, Long evaluationSubjectId) {
+
+ String login = msg.getAuthor().getUid();
+
+ Set<EvaluationSubjectInstance> ESIs = evaluationSubjectInstanceManager
+ .getESIs(evaluationSubjectId, login);
+
+ for (EvaluationSubjectInstance ESI : ESIs) {
+
+ Message M = new Message();
+
+ M.setCreationDate(new Date());
+ M.setAuthor(msg.getAuthor());
+ M.setBody(msg.getBody());
+ M.setSubject(msg.getSubject());
+ M.setRecipients(msg.getRecipients());
+
+ if (!ESI.getMessages().isEmpty()) {
+
+ return reply(ESI.getMessages().iterator().next().getId(), M);
+
+ } else {
+ M.setEsi(ESI);
+
+ messageDAO.saveOrUpdate(M);
+
+ for (Entity e : M.getRecipients()) {
+
+ e = Beans.getEntityManagerBean().getEntity(e.getId());
+
+ for (User u : e.getUsers()) {
+ MessageRecipient mr = new MessageRecipient();
+ mr.setReaded(false);
+ mr.setState(MessageRecipient.VALID);
+ mr.setMessage(M);
+ mr.setRecipient(u);
+ messageRecipientDAO.saveOrUpdate(mr);
+ M.getMessageRecipients().add(mr);
+ }
+ }
+ return M;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Gets the evaluation subject instance manager.
+ *
+ * @return the evaluation subject instance manager
+ */
+ public IEvaluationSubjectInstanceBase getEvaluationSubjectInstanceManager() {
+ return evaluationSubjectInstanceManager;
+ }
+
+ /**
+ * Gets the message dao.
+ *
+ * @return the message dao
+ */
+ public IMessageDAO getMessageDAO() {
+ return messageDAO;
+ }
+
+ /**
+ * Gets the message recipient dao.
+ *
+ * @return the message recipient dao
+ */
+ public IMessageRecipientDAO getMessageRecipientDAO() {
+ return messageRecipientDAO;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.manager.interfacedef.IMessage#getMessagesList(java
+ * .lang.String)
+ */
+ public Set<Message> getMessagesList(String login) {
+ Set<Message> sm = messageDAO.getLastMessagesList(login, null);
+
+ return sm;
+ }
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.manager.interfacedef.IMessageBase#getMessagesList(java.lang.String, int, int)
+ */
+ public TListEObject getMessagesList(String login, int start, int limit, String searchFilter) {
+
+
+
+ Set<Message> sm = messageDAO.getLastMessagesList(login, searchFilter);
+
+ int total = sm.size();
+
+
+
+ List<Message> lm = new ArrayList<Message>(sm);
+
+ Collections.sort(lm, new Comparator<Message>() {
+ public int compare(Message msg1, Message msg2) {
+
+ return msg2.getCreationDate().compareTo(
+ msg1.getCreationDate());
+ }
+ });
+ int a = 0;
+ if (start > 0){
+ a =start;
+ }
+
+ limit = start + limit;
+
+ if (limit > sm.size()){
+ limit = sm.size();
+ }
+
+
+
+ TListEObject tlm = new TListEObject();
+ tlm.setTotal(total);
+
+
+ List<EObject> res = new ArrayList<EObject>();
+
+ for (int i=a; i<limit; i++){
+ res.add(lm.get(i));
+ }
+
+ tlm.setListOfEObjects(res);
+
+
+ return tlm;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.manager.interfacedef.IMessage#getNbMessages(java
+ * .lang.String, int, boolean)
+ */
+ public int getNbMessages(String login, int state, boolean readed) {
+ // TODO Auto-generated method stub
+ return messageRecipientDAO.getNbMessages(login, state, readed);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.manager.interfacedef.IMessageBase#notifyByMessage
+ * (com.pentila.evalcomp.domain.User, java.lang.String, java.lang.String,
+ * java.util.Set)
+ */
+ public Message notifyByMessage(User sender, String subject, String body,
+ Set<User> recipients) {
+
+ Message m = new Message();
+ m.setAuthor(sender);
+ m.setSubject(subject);
+ m.setBody(body);
+ m.setCreationDate(new Date());
+
+ Set<Entity> se = new HashSet<Entity>();
+ se.addAll(recipients);
+ m.setRecipients(se);
+ m = addMessage(m);
+
+ return m;
+ }
+
+
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.manager.interfacedef.IMessage#readMessage(java.lang
+ * .String, java.lang.Long)
+ */
+ public Message readMessage(String login, Long id) {
+ Message m = messageDAO.get(id);
+
+ Message top = m.getTopMessage();
+ Set<Long> ids = new HashSet<Long>();
+ for (Message mm : top.getAllMessages()) {
+ ids.add(mm.getId());
+ }
+
+ messageRecipientDAO.setReaded(ids, login);
+
+ return top;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.manager.interfacedef.IMessage#reply(java.lang.Long,
+ * com.pentila.evalcomp.domain.Message)
+ */
+ public Message reply(Long idMessage, Message msg) {
+ // TODO Auto-generated method stub
+ Message parent = messageDAO.get(idMessage);
+
+ parent = parent.getLastMessage();
+
+ msg.setSubject(parent.getSubject());
+ msg.setCreationDate(new Date());
+ msg.setParent(parent);
+
+ messageDAO.saveOrUpdate(msg);
+
+ Set<User> rr = new HashSet<User>();
+
+ for (MessageRecipient mr : parent.getMessageRecipients()) {
+ if (!mr.getRecipient().getId().equals(msg.getAuthor().getId())) {
+ rr.add(mr.getRecipient());
+ }
+ }
+ rr.add(parent.getAuthor());
+
+ for (User u : rr) {
+ MessageRecipient mr = new MessageRecipient();
+ mr.setReaded(false);
+ mr.setState(MessageRecipient.VALID);
+ mr.setMessage(msg);
+ mr.setRecipient(u);
+ messageRecipientDAO.saveOrUpdate(mr);
+ msg.getMessageRecipients().add(mr);
+ }
+
+ return msg;
+
+ }
+
+ /**
+ * Sets the evaluation subject instance manager.
+ *
+ * @param evaluationSubjectInstanceManager
+ * the new evaluation subject instance manager
+ */
+ public void setEvaluationSubjectInstanceManager(
+ IEvaluationSubjectInstanceBase evaluationSubjectInstanceManager) {
+ this.evaluationSubjectInstanceManager = evaluationSubjectInstanceManager;
+ }
+
+ /**
+ * Sets the message dao.
+ *
+ * @param messageDAO
+ * the new message dao
+ */
+ public void setMessageDAO(IMessageDAO messageDAO) {
+ this.messageDAO = messageDAO;
+ }
+
+ /**
+ * Sets the message recipient dao.
+ *
+ * @param messageRecipientDAO
+ * the new message recipient dao
+ */
+ public void setMessageRecipientDAO(IMessageRecipientDAO messageRecipientDAO) {
+ this.messageRecipientDAO = messageRecipientDAO;
+ }
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.manager.interfacedef.IMessageBase#addEvaluationSubjectInstanceMessage(com.pentila.evalcomp.domain.Message, java.lang.Long)
+ */
+ public Message addEvaluationSubjectInstanceMessage(Message msg, Long ESIId, Set<Long> userIds) {
+
+ EvaluationSubjectInstance ESI = evaluationSubjectInstanceManager
+ .getESIById(ESIId);
+
+ if (!ESI.getMessages().isEmpty()) {
+
+ return reply(ESI.getMessages().iterator().next().getId(), msg);
+
+ } else {
+
+ msg.setEsi(ESI);
+
+ msg.setCreationDate(new Date());
+
+
+
+
+ Set<User> su = entityManager.getUsersByIds(userIds);
+
+
+ messageDAO.saveOrUpdate(msg);
+
+
+ for (User u : su) {
+ MessageRecipient mr = new MessageRecipient();
+ mr.setReaded(false);
+ mr.setState(MessageRecipient.VALID);
+ mr.setMessage(msg);
+ mr.setRecipient(u);
+ messageRecipientDAO.saveOrUpdate(mr);
+ msg.getMessageRecipients().add(mr);
+ }
+
+ return msg;
+
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.manager.interfacedef.IMessageBase#addEvent(com.pentila.evalcomp.domain.Event)
+ */
+ public Event addEvent(Event e){
+ eventDAO.saveOrUpdate(e);
+ return e;
+ }
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.manager.interfacedef.IMessageBase#getEvents(java.lang.String)
+ */
+ public List<Event> getEvents(String login){
+ return eventDAO.getEvents(login);
+ }
+
+ /**
+ * Gets the event dao.
+ *
+ * @return the event dao
+ */
+ public IEventDAO getEventDAO() {
+ return eventDAO;
+ }
+
+ /**
+ * Sets the event dao.
+ *
+ * @param eventDAO the new event dao
+ */
+ public void setEventDAO(IEventDAO eventDAO) {
+ this.eventDAO = eventDAO;
+ }
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.manager.interfacedef.IMessageBase#deleteMessages(com.pentila.evalcomp.domain.User, java.util.Set)
+ */
+ public void deleteMessages(User u, Set<Message> sm) {
+
+
+
+ for (Message m : sm){
+
+ m = messageDAO.get(m.getId());
+
+ m = m.getTopMessage();
+ if (m.getAuthor() == null || m.getAuthor().getId().equals(u.getId())){
+ // Suppression du Fil
+ messageDAO.delete(m);
+ }else{
+ // Déabonnement au fil
+ Set<Long> msgIds = new HashSet<Long>();
+ Set<Message> smm = m.getAllMessages();
+ for (Message mm : smm){
+ msgIds.add(mm.getId());
+ }
+
+ messageRecipientDAO.deleteFromMessages(u, msgIds);
+
+ }
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.manager.interfacedef.IMessageBase#deleteEvents(java.util.Set)
+ */
+ public void deleteEvents(Set<Event> evts) {
+
+ for (Event e : evts){
+ e = eventDAO.get(e.getId());
+ eventDAO.delete(e);
+ }
+
+ }
+
+ public IEntityBase getEntityManager() {
+ return entityManager;
+ }
+
+ public void setEntityManager(IEntityBase entityManager) {
+ this.entityManager = entityManager;
+ }
+
+
+}