Subversion Repositories bacoAlunos

Rev

Rev 1782 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.services.announcements;

import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.dao.impl.AnnouncementDaoImpl;
import pt.estgp.estgweb.domain.enums.LangEnum;
import pt.estgp.estgweb.domain.utils.RoleManagerDomain;
import pt.estgp.estgweb.domain.views.AnnouncementView;
import pt.estgp.estgweb.domain.views.UserView;
import pt.estgp.estgweb.services.data.ImageManager;
import pt.estgp.estgweb.services.email.EMAILJob;
import pt.estgp.estgweb.services.email.SendEmailService;
import pt.estgp.estgweb.services.jobs.JobScheduleService;
import pt.estgp.estgweb.services.sms.SMSJob;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.Email;
import pt.estgp.estgweb.utils.Globals;
import pt.utl.ist.berserk.logic.serviceManager.IService;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * @author Fabio Velez
 * @date 2/Abril/2008
 * @time 12:51:32
 * @see pt.estgp.estgweb
 */

public class CreateAnnouncementService implements IService
{



    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(CreateAnnouncementService.class);

    private static final 1.5.0/docs/api/java/lang/String.html">String ALL_ROLE = Globals.ALL_ROLE;



    public enum MessageTarget {

        all("all"),
        workers("workers"),
        students("students"),
        teachers("teachers"),
        teachersStudents("teachers.students"),
        teachersWorkers("teachers.workers")
        ;

        public boolean isWorkers()
        {
            return this == workers || this == teachersWorkers || this == all;
        }
        public boolean isTeachers()
        {
            return this == teachers || this == teachersStudents ||this == teachersWorkers || this == all;
        }
        public boolean isStudents()
        {
            return this == students || this == teachersStudents || this == all;
        }
        private 1.5.0/docs/api/java/lang/String.html">String target;

        private MessageTarget(1.5.0/docs/api/java/lang/String.html">String target)
        {
            this.target = target;
        }

        public 1.5.0/docs/api/java/lang/String.html">String getTarget() {
            return target;
        }

        public static MessageTarget parse(1.5.0/docs/api/java/lang/String.html">String target)
        {
            if(target == null)
                return all;
            for(MessageTarget value: values())
            {
                if(value.getTarget().equals(target))
                    return value;
            }
            return all;
        }
    }
    public List<UserView> sendMessageOld(HttpServletRequest request, 1.5.0/docs/api/java/lang/String.html">String from, 1.5.0/docs/api/java/lang/String.html">String year, 1.5.0/docs/api/java/lang/String.html">String department, long courseId, long courseUnitId, 1.5.0/docs/api/java/lang/String.html">String semestre, MessageTarget target, 1.5.0/docs/api/java/lang/String.html">String text,1.5.0/docs/api/java/lang/String.html">String subject, UserSession userSession)
    {
        List<User> users = DaoFactory.getAnnouncementDaoImpl().findUsers(year,department,courseId,courseUnitId,semestre,target);
        List<User> usersToConsume = new ArrayList<User>();
        for(User u: users)
            usersToConsume.add(u);
        logger.info("Scheduling mail jobs to " + usersToConsume.size() + " recipients");
        while(usersToConsume.size() > 0)
        {
            Iterator<User> iter = usersToConsume.iterator();
            List<User> usersToJob = new ArrayList<User>();
            int contador = 0;
            while(iter.hasNext() && contador < 20)
            {
                usersToJob.add(iter.next());
                iter.remove();
                contador++;
            }
            Email e =  sendEmailService.getMessageEmailOld(
                    jomm.utils.MessageResources.getMessage(request, "user.role." + from),
                    subject,
                    text,
                    LangEnum.PORTUGUESE,
                    jomm.utils.MessageResources.getMessage(request, "submit.todo.message." + target.getTarget()),
                    usersToJob,
                    userSession.getUser());
            e.setHtml(true);
            EMAILJob emailJob = new EMAILJob(e);
            JobScheduleService.getInstance().scheduleNow(emailJob,"Message Email from " + userSession.getUsername() + " as " + from + ": year:" + year + " - department:" + department + " - courseId:" + courseId + " - courseUnitId:" + courseUnitId + " - semestre:" + semestre + " - target:" + target + " - subject:" + subject  ,userSession);
        }
        List<UserView> userViews = UserView.getViews(users);
        return userViews;
    }

    public 1.5.0/docs/api/java/lang/Integer.html">Integer sendMessage(HttpServletRequest request, 1.5.0/docs/api/java/lang/String.html">String fromEmail, 1.5.0/docs/api/java/lang/String.html">String from, 1.5.0/docs/api/java/lang/String.html">String year, 1.5.0/docs/api/java/lang/String.html">String department, long courseId, long courseUnitId, 1.5.0/docs/api/java/lang/String.html">String semestre, MessageTarget target, 1.5.0/docs/api/java/lang/String.html">String text,1.5.0/docs/api/java/lang/String.html">String subject, UserSession userSession)
    {
        //List<User> users = DaoFactory.getAnnouncementDaoImpl().findUsers(year,department,courseId,courseUnitId,semestre,target);
        AnnouncementDaoImpl.FindUsersResult result = DaoFactory.getAnnouncementDaoImpl().findUsersEmails(year, department, courseId, courseUnitId, semestre, target);
        List<String> usersToConsume = result.emails;


        logger.info("Scheduling mail jobs to " + result.users + " users: " + usersToConsume.size() + " recipients");
        while(usersToConsume.size() > 0)
        {
            Iterator<String> iter = usersToConsume.iterator();
            List<String> usersToJob = new ArrayList<String>();
            int contador = 0;
            while(iter.hasNext() && contador < 20)
            {
                usersToJob.add(iter.next());
                iter.remove();
                contador++;
            }
            Email e =  sendEmailService.getMessageEmailAdulteredFromEmail(fromEmail,
                    jomm.utils.MessageResources.getMessage(request,"user.role." + from),
                    subject,
                    text,
                    LangEnum.PORTUGUESE,
                    jomm.utils.MessageResources.getMessage(request,"submit.todo.message." + target.getTarget()),
                    usersToJob,
                    userSession.getUser());
            e.setHtml(true);
            EMAILJob emailJob = new EMAILJob(e);
            JobScheduleService.getInstance().scheduleNow(emailJob,"Message Email from " + userSession.getUsername() + " as " + from + ": year:" + year + " - department:" + department + " - courseId:" + courseId + " - courseUnitId:" + courseUnitId + " - semestre:" + semestre + " - target:" + target + " - subject:" + subject  ,userSession);
        }

        return result.users;
    }

    public AnnouncementView run(AnnouncementView announcementView, 1.5.0/docs/api/java/awt/Image.html">Image imageBig, 1.5.0/docs/api/java/awt/Image.html">Image imageSmall, UserSession userSession)
    {
        Announcement a;

        if(announcementView.getId() <= 0)
        {
            if(announcementView.getCourseUnitView()!=null && announcementView.getCourseUnitView().getId() > 0)
            {
                a = DomainObjectFactory.createCourseUnitAnnouncementImpl();
            }
            else
                a = DomainObjectFactory.createAnnouncementImpl();
            announcementView.persistViewInObject(a);
            a.setOwner(userSession.getUser());
            a.setSaveDate(new 5+0%2Fdocs%2Fapi+Date">Date());

            if(imageBig != null)
            {
                DaoFactory.getImageDaoImpl().save(imageBig);
                ImageManager.store((ImageImpl) imageBig);
                ((ImageImpl)imageBig).setImage(null);
            }
            if(imageSmall != null)
            {
                DaoFactory.getImageDaoImpl().save(imageSmall);
                ImageManager.store((ImageImpl) imageSmall);
                ((ImageImpl)imageSmall).setImage(null);
            }
            a.setBigImage(imageBig);
            a.setSmallImage(imageSmall);
            if(a.getTargetRoles() == null || a.getTargetRoles().length() == 0)
                a.setTargetRoles(ALL_ROLE);
        }
        else
        {
            a = DaoFactory.getAnnouncementDaoImpl().get(announcementView.getSerializable());

            if(imageBig != null)
            {
                if(a.getBigImage() != null)
                {
//                    try
//                    {
                    DaoFactory.getImageDaoImpl().delete(a.getBigImage().getId());
//                    }
//                    catch(Exception e)
//                    {
//                        logger.info("Announcement:" + announcementView.getId() + "do not have imageBig!");
//                    }
                }
                DaoFactory.getImageDaoImpl().save(imageBig);
                ImageManager.store((ImageImpl) imageBig);
                announcementView.setBigImage(imageBig);
            }
            else
            {
                try
                {
                    imageBig = DaoFactory.getImageDaoImpl().get(a.getBigImage().getId());
                    announcementView.setBigImage(imageBig);
                }
                catch(1.5.0/docs/api/java/lang/Exception.html">Exception e)
                {
                    logger.debug("ImageBig form announcement:" + announcementView.getId() + "do not exist!");
                }
            }

            if(imageSmall!=null)
            {
                if(a.getSmallImage() != null)
                {
//                try
//                {
                    DaoFactory.getImageDaoImpl().delete(a.getSmallImage().getId());
//                }
//                catch(Exception e)
//                {
//                    logger.info("Announcement:" + announcementView.getId() + "do not have smallBig!");
//                }
                }
                DaoFactory.getImageDaoImpl().save(imageSmall);
                ImageManager.store((ImageImpl) imageSmall);
                announcementView.setSmallImage(imageSmall);
            }
            else
            {
                try
                {
                    imageSmall= DaoFactory.getImageDaoImpl().get(a.getSmallImage().getId());
                    announcementView.setSmallImage(imageSmall);
                }
                catch(1.5.0/docs/api/java/lang/Exception.html">Exception e)
                {
                    logger.info("ImageSmall form announcement:" + announcementView.getId() + "do not exist!");
                }
            }
            if(a.getOwner().getId() != userSession.getUser().getId())
                announcementView.setChoosedOwnerRole(a.getChoosedOwnerRole());
            announcementView.persistViewInObject(a);
            if(announcementView.getTargetRoles() == null || announcementView.getTargetRoles().size() == 0)
                a.setTargetRoles(ALL_ROLE);
        }



        if(RoleManagerDomain.hasRole(userSession.getUser(), Globals.AUTOMATIC_VALIDATION_ROLES))
            a.setStatus(announcementView.isStatus());
        else if(a instanceof CourseUnitAnnouncement && ((UserImpl)userSession.getUser()).checkIsTeacherOfCourseUnit(announcementView.getCourseUnitView().getId(), true))
            a.setStatus(announcementView.isStatus());
        else
        {
            1.5.0/docs/api/java/lang/String.html">String[] userRoles = a.getChoosedOwnerRole().split(",");
            1.5.0/docs/api/java/lang/Boolean.html">Boolean validation = false;

            for(1.5.0/docs/api/java/lang/String.html">String role: userRoles)
            {
                if(!role.equals("all") && !validation)
                {
                    try
                    {
                        1.5.0/docs/api/java/lang/String.html">String validationTargets=role+".auto.validation.targets";
                        1.5.0/docs/api/java/lang/String.html">String userAutoValitation=ConfigProperties.getProperty(validationTargets);
                        if(userAutoValitation != null)
                        {
                            1.5.0/docs/api/java/lang/String.html">String[] userAutoValitationRoles=userAutoValitation.split(",");
                            int validTargetRoles=0;
                            if(a.getTargetRoles().contains(","))
                            {
                                1.5.0/docs/api/java/lang/String.html">String[] targetRolesAnnouncementSplited=a.getTargetRoles().split(",");

                                //Percorre os targets todos a quem se destina
                                for(1.5.0/docs/api/java/lang/String.html">String target: targetRolesAnnouncementSplited)
                                {
                                    //Percorre todos os validation targets
                                    for(1.5.0/docs/api/java/lang/String.html">String userTargetRoles: userAutoValitationRoles)
                                    {
                                        //Se o target a quem se destina constar na lista dos validation targets entao incrementa
                                        //o validTargetRoles
                                        if(target.equals(userTargetRoles))
                                        {
                                            validTargetRoles++;
                                        }
                                    }
                                }
                                //Se o numero de roles validados for igual ao numero de targets a quem se destina
                                //Vai verificar se possui validationType para o type announcement
                                if(validTargetRoles==targetRolesAnnouncementSplited.length)
                                {
                                    1.5.0/docs/api/java/lang/String.html">String validationTypes=role +".auto.validation.types";
                                    1.5.0/docs/api/java/lang/String.html">String userAutoTypes=ConfigProperties.getProperty(validationTypes);
                                    1.5.0/docs/api/java/lang/String.html">String[] userAutoValitationTypes=userAutoTypes.split(",");
                                    for(1.5.0/docs/api/java/lang/String.html">String types: userAutoValitationTypes)
                                    {
                                        if(types.equals(a.getType()))
                                            validation=true;
                                    }
                                }
                            }
                            else
                            {
                                1.5.0/docs/api/java/lang/String.html">String targetRolesAnnouncement=a.getTargetRoles();
                                //Percorre todos os validation targets
                                for(1.5.0/docs/api/java/lang/String.html">String userTargetRoles: userAutoValitationRoles)
                                {
                                    if(targetRolesAnnouncement.equals(userTargetRoles))
                                    {
                                        validTargetRoles++;
                                    }
                                }
                                if(validTargetRoles==1)
                                {
                                    1.5.0/docs/api/java/lang/String.html">String validationTypes=role +".auto.validation.types";
                                    1.5.0/docs/api/java/lang/String.html">String userAutoTypes=ConfigProperties.getProperty(validationTypes);
                                    1.5.0/docs/api/java/lang/String.html">String[] userAutoValitationTypes=userAutoTypes.split(",");
                                    for(1.5.0/docs/api/java/lang/String.html">String types: userAutoValitationTypes)
                                    {
                                        if(types.equals(a.getType()))
                                            validation=true;
                                    }
                                }
                            }
                        }
                    }
                    catch(1.5.0/docs/api/java/lang/Exception.html">Exception e)
                    {
                        logger.error(e,e);
                    }
                }
            }
            a.setStatus(validation);

        }
        AnnouncementView aView;
        if(announcementView.getId() <= 0)
        {
            DaoFactory.getAnnouncementDaoImpl().save(a);
            logger.info("Creating announcement:" + a.getId());
            aView = new AnnouncementView(a);
        }
        else
        {
            logger.info("Updating announcement:" + a.getId());
            aView = new AnnouncementView(a);
        }
        sendSms(a,userSession);
        sendEmail(a,userSession);
        return aView;
    }
    private void sendSms(Announcement announcement, UserSession userSession)
    {
        if(userSession.getUser() != null && announcement.isStatus())
        {
            trySendAnnouncementSms(announcement,userSession);
        }
    }

    private void sendEmail(Announcement announcement, UserSession userSession)
    {
        if(userSession.getUser() != null && announcement.isStatus())
        {
            trySendAnnouncementEmail(announcement,userSession);
        }
    }

    private void trySendAnnouncementSms(Announcement announcement, UserSession userSession)
    {
        if(announcement instanceof CourseUnitAnnouncement && Globals.SMS_COURSEUNIT_ANNOUNCEMENT)
        {
            CourseUnit c = ((CourseUnitAnnouncement)announcement).getCourseUnit();
            if(!Globals.SMS_COURSEUNIT_ANNOUNCEMENT_ONLY_PROFS || (userSession.getUser() instanceof TeacherImpl && ((TeacherImpl)userSession.getUser()).hasCourseUnit(c.getId(),true)))
            {
                List<User> users = new ArrayList<User>();
                if(c.getStudents() != null)
                    users.addAll(c.getStudents());
                if(c.getTeachers() != null)
                    users.addAll(c.getTeachers());
                sendAnnouncementSms(announcement,c.getNormalizedName(), userSession,users);
            }
        }
    }

    private void trySendAnnouncementEmail(Announcement announcement, UserSession userSession)
    {
        if(announcement instanceof CourseUnitAnnouncement && Globals.EMAIL_COURSEUNIT_ANNOUNCEMENTS)
        {
            CourseUnit c = ((CourseUnitAnnouncement)announcement).getCourseUnit();

            List<User> users = new ArrayList<User>();
            if(c.getStudents() != null)
                users.addAll(c.getStudents());
            if(c.getTeachers() != null)
                users.addAll(c.getTeachers());
            sendAnnouncementEmail((CourseUnitAnnouncement) announcement,c.getNormalizedName(), userSession, users);

        }
    }




    private void sendAnnouncementSms(Announcement a, 1.5.0/docs/api/java/lang/String.html">String desc, UserSession userSession, List<User> users)
    {
        1.5.0/docs/api/java/lang/String.html">String text;
        if(a.getText() != null)
            text = a.getText();
        else
            text = "";
        1.5.0/docs/api/java/lang/String.html">String[] args =
                {
                        desc,
                        userSession.getUser().getUsername(),
                        a.getTitle(),
                        text,
                };
        SMSJob smsJob = new SMSJob(users,args,Globals.TEMPLATE_SMS_COURSEUNIT_ANNOUNCMENT);
        JobScheduleService.getInstance().scheduleNow(smsJob,"CourseUnit Announcement SMS:" + desc,userSession);
    }

    SendEmailService sendEmailService = new SendEmailService();

    private void sendAnnouncementEmail(CourseUnitAnnouncement a, 1.5.0/docs/api/java/lang/String.html">String desc, UserSession userSession, List<User> users)
    {
        Email e =  sendEmailService.getCourseUnitAnnouncementEmail(a, LangEnum.PORTUGUESE,userSession.getName(),users);
        EMAILJob emailJob = new EMAILJob(e);
        JobScheduleService.getInstance().scheduleNow(emailJob,"CourseUnit Announcement Email:" + desc,userSession);
    }
}