Subversion Repositories bacoAlunos

Rev

Rev 1306 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.services.courseunits;

import pt.utl.ist.berserk.logic.serviceManager.IService;
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.domain.views.CourseUnitAssignementView;
import pt.estgp.estgweb.domain.views.CourseUnitDeliverableView;
import pt.estgp.estgweb.domain.views.BlogView;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.enums.LangEnum;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.services.data.IRepositoryFile;
import pt.estgp.estgweb.services.blogs.CreateBlogService;
import pt.estgp.estgweb.services.email.SendEmailService;
import pt.estgp.estgweb.services.email.EMAILJob;
import pt.estgp.estgweb.services.jobs.JobScheduleService;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedException;
import pt.estgp.estgweb.utils.Email;
import pt.estgp.estgweb.Globals;
import org.apache.log4j.Logger;

import java.util.List;
import java.util.ArrayList;
import java.util.Date;
import java.io.InputStream;

import jomm.utils.FilesUtils;
import jomm.utils.MessageResources;

/*
 * @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
 *
 *
 * Created at 17/Out/2003 , 23:45:24
 *
 */

/**
 * @author Jorge Machado
 *
 *
 * Created at 17/Out/2003 , 23:45:24
 *
 */

public class CourseUnitWorkService implements IService
{

    RepositoryService repositoryService = new RepositoryService();
    LoadCourseUnitService loadCourseUnitService = new LoadCourseUnitService();



    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(CourseUnitWorkService.class);


    public CourseUnitView create(CourseUnitAssignementView cUV, long id, 5+0%2Fdocs%2Fapi+InputStream">InputStream file, 1.5.0/docs/api/java/lang/String.html">String name, int size, 1.5.0/docs/api/java/lang/String.html">String contentType, UserSession userSession) throws ServiceException
    {
        CourseUnit courseUnit = DaoFactory.getCourseUnitDaoImpl().get(id);
        CourseUnitAssignement assignement;
        boolean newWork = true;
        if(cUV.getId() > 0)
            newWork = false;
        if(cUV.getId() > 0)
            assignement = DaoFactory.getCourseUnitAssignementDaoImpl().get(cUV.getId());
        else
        {
            assignement = DomainObjectFactory.createCourseUnitAssignementImpl();
            assignement.setCourseUnit(courseUnit);
            DaoFactory.getCourseUnitAssignementDaoImpl().save(assignement);
        }
        cUV.persistViewInObject(assignement);

        if(name != null && name.length() > 0 && size > 0 && file != null)
        {
            1.5.0/docs/api/java/lang/String.html">String extension = FilesUtils.getExtension(name);
            if(assignement.getRepositoryStream() == null || assignement.getRepositoryStream().trim().length() == 0)
            {
                1.5.0/docs/api/java/lang/String.html">String identifier = repositoryService.storeRepositoryFile(file, contentType, extension, size, name, "courseunit.assignement.file " + courseUnit.getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDomain,userSession);
                assignement.setRepositoryStream(identifier);
            }
            else
                repositoryService.updateRepositoryFile(assignement.getRepositoryStream(), file, contentType, extension, size, name, "courseunit.assignement.file " + courseUnit.getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDomain);
        }

        if(assignement.isStatus())
            trySendWorkEmail(assignement,userSession,newWork);
        return loadCourseUnitWorks(id,userSession);
    }

    private void trySendWorkEmail(CourseUnitAssignement assignement, UserSession userSession,boolean newWork)
    {
        CourseUnit c = assignement.getCourseUnit();
        List<User> users = new ArrayList<User>();
        if(c.getStudents() != null)
            users.addAll(c.getStudents());
        if(c.getTeachers() != null)
            users.addAll(c.getTeachers());
        sendWorkEmail(assignement,c.getNormalizedName(), userSession, users,newWork);
    }

    SendEmailService sendEmailService = new SendEmailService();

    private void sendWorkEmail(CourseUnitAssignement a, 1.5.0/docs/api/java/lang/String.html">String desc, UserSession userSession, List<User> users, boolean newWork)
    {
        Email e =  sendEmailService.getCourseUnitWorkEmail(a, LangEnum.PORTUGUESE,userSession,users,newWork);
        EMAILJob emailJob = new EMAILJob(e);
        JobScheduleService.getInstance().scheduleNow(emailJob,"CourseUnit Assignement Email:" + desc,userSession);
    }

    public CourseUnitView loadCourseUnitWorks(long id, UserSession userSession) throws ServiceException
    {
        CourseUnitView cV = loadCourseUnitService.run(id,false,false,false,userSession);

        if(cV == null)
            return null;

        CourseUnit courseUnit = DaoFactory.getCourseUnitDaoImpl().get(id);

        if(courseUnit.getAssignements() != null)
        {
            boolean invalids = false;
            List<CourseUnitAssignementView> views = new ArrayList<CourseUnitAssignementView>();
            if(userSession.getUser() != null && ((CourseUnitImpl)courseUnit).isOwnedBy(userSession.getUser(),true))
            {
                invalids = true;
            }
            for(CourseUnitAssignement a: courseUnit.getAssignements())
            {
                if(invalids || a.isStatus())
                {
                    long delivers = DaoFactory.getCourseUnitDeliverableDaoImpl().countAssignements(a.getId());
                    CourseUnitAssignementView view = new CourseUnitAssignementView(a,delivers);
                    if(view.getWorkFile() != null && view.getWorkFile().length() > 0)
                    {
                        RepositoryFileImpl repositoryFile = repositoryService.loadView(a.getRepositoryStream());
                        view.setRepositoryFile(repositoryFile);
                    }
                    views.add(view);
                }
            }

            if(userSession.getUser() != null && userSession.getUser() instanceof StudentImpl && ((StudentImpl)userSession.getUser()).hasCourseUnit(id,true))
            {
                for(CourseUnitAssignementView view: views)
                {
                    CourseUnitDeliverable deliverable = DaoFactory.getCourseUnitDeliverableDaoImpl().loadDeliverable(userSession.getUser().getId(),view.getId());
                    if(deliverable != null)
                    {
                        view.setCourseUnitDeliverableView(new CourseUnitDeliverableView(deliverable, view));
                    }
                }
            }

            cV.setCourseUnitAssignements(views);
        }
        return cV;
    }

    public CourseUnitView delete(long courseUnitWorkId, UserSession userSession) throws ServiceException
    {
        CourseUnitAssignement assignement = DaoFactory.getCourseUnitAssignementDaoImpl().load(courseUnitWorkId);
        long courseUnitId = assignement.getCourseUnit().getId();
        assignement.getCourseUnit().getAssignements().remove(assignement);
        assignement.setCourseUnit(null);
        DaoFactory.getCourseUnitAssignementDaoImpl().delete(assignement);
        return loadCourseUnitWorks(courseUnitId,userSession);
    }

    public CourseUnitView validateInvalidate(long courseUnitWorkId, UserSession userSession) throws ServiceException
    {
        CourseUnitAssignement assignement = DaoFactory.getCourseUnitAssignementDaoImpl().load(courseUnitWorkId);
        long courseUnitId = assignement.getCourseUnit().getId();
        assignement.setStatus(!assignement.isStatus());
        return loadCourseUnitWorks(courseUnitId,userSession);
    }

    public CourseUnitView deliverWork(long courseUnitWorkId,5+0%2Fdocs%2Fapi+InputStream">InputStream file, 1.5.0/docs/api/java/lang/String.html">String name, 1.5.0/docs/api/java/lang/String.html">String contentType, int size, UserSession userSession) throws ServiceException
    {
        CourseUnitAssignement assignement = DaoFactory.getCourseUnitAssignementDaoImpl().load(courseUnitWorkId);
        long courseUnitId = assignement.getCourseUnit().getId();
        CourseUnitDeliverable deliverable = DaoFactory.getCourseUnitDeliverableDaoImpl().loadDeliverable(userSession.getUser().getId(),courseUnitWorkId);
        1.5.0/docs/api/java/lang/String.html">String extension = FilesUtils.getExtension(name);
        if(deliverable == null)
        {
            deliverable = DomainObjectFactory.createCourseUnitDeliverableImpl();
            1.5.0/docs/api/java/lang/String.html">String identifier = repositoryService.storeRepositoryFile(file, contentType, extension, size, name, "courseunit.assignement " + assignement.getCourseUnit().getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDeliverableDomain,userSession);
            deliverable.setDeliverableRepositoryStream(identifier);
            deliverable.setCourseUnitAssignement(assignement);
            setStudentWorkDetails(deliverable,userSession);
            DaoFactory.getCourseUnitDeliverableDaoImpl().save(deliverable);
        }
        else
        {
            setStudentWorkDetails(deliverable,userSession);
            repositoryService.updateRepositoryFile(deliverable.getDeliverableRepositoryStream(), file, contentType, extension, size, name, "courseunit.assignement " + assignement.getCourseUnit().getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDeliverableDomain);
        }
        deliverable.setDeliverDate(new 5+0%2Fdocs%2Fapi+Date">Date());
        return loadCourseUnitWorks(courseUnitId,userSession);
    }

    private void setStudentWorkDetails(CourseUnitDeliverable deliverable, UserSession userSession)
    {
        deliverable.setStudent((Student) userSession.getUser());
        deliverable.setStudentId(userSession.getUser().getId());
        deliverable.setStudentUsername(userSession.getUsername());
        deliverable.setStudentName(userSession.getUser().getName());
        if(userSession.getUser() instanceof SigesUser)
            deliverable.setStudentCode("" + ((SigesUser)userSession.getUser()).getSigesCode());
        else
            logger.error("BACO APPLICATION ERROR Student should be of type SigesUser");
    }

    //todo alterar o dominio de filtragem


    public CourseUnitAssignementView loadAssignement(long courseUnitAssignementId, UserSession userSession) throws ServiceException
    {
        CourseUnitAssignement assignement = DaoFactory.getCourseUnitAssignementDaoImpl().load(courseUnitAssignementId);
        List<CourseUnitDeliverableView> views = new ArrayList<CourseUnitDeliverableView>();
        CourseUnitAssignementView courseUnitAssignementView = new CourseUnitAssignementView(assignement,assignement.getDeliverables().size());
        for(CourseUnitDeliverable d: assignement.getDeliverables())
        {
            CourseUnitDeliverableView c =  new CourseUnitDeliverableView(d,courseUnitAssignementView);
            views.add(c);
            RepositoryFileImpl repositoryFile = repositoryService.loadView(d.getDeliverableRepositoryStream());
            c.setVersions(new ArrayList<RepositoryFileVersion>(repositoryFile.getRepositoryFileVersions()));
        }
        courseUnitAssignementView.setDeliverables(views);
        courseUnitAssignementView.setCourseUnitView(new CourseUnitView(assignement.getCourseUnit()));
        if(courseUnitAssignementView.getWorkFile() != null && courseUnitAssignementView.getWorkFile().length() > 0)
        {
            RepositoryFileImpl repositoryFile = repositoryService.loadView(assignement.getRepositoryStream());
            courseUnitAssignementView.setRepositoryFile(repositoryFile);
        }
        return courseUnitAssignementView;
    }

    public CourseUnitAssignementView updateDeliverables(long courseUnitId, long courseUnitAssignementId, List<CourseUnitDeliverableView> deliverableViews, UserSession userSession) throws ServiceException
    {
        CourseUnitAssignement assignement = DaoFactory.getCourseUnitAssignementDaoImpl().load(courseUnitAssignementId);
        if(assignement.getCourseUnit().getId() != courseUnitId)
        {
            logger.warn("Trying change deliverable of a not owned course unit:" + userSession.getUser().getId() + " " + userSession.getUser().getName());
            throw new ServiceException("Access Denied", new AccessDeniedException("Trying change deliverable of a not owned course unit"));
        }
        for(CourseUnitDeliverableView deliverable: deliverableViews)
        {
            CourseUnitDeliverable courseUnitDeliverable = DaoFactory.getCourseUnitDeliverableDaoImpl().load(deliverable.getId());
            if(courseUnitDeliverable.getCourseUnitAssignement().getId() != assignement.getId())
            {
                logger.warn("Trying change deliverable of a not owned course unit:" + userSession.getUser().getId() + " " + userSession.getUser().getName());
                throw new ServiceException("Access Denied", new AccessDeniedException("Trying change deliverable of a not owned course unit"));
            }
            deliverable.persistViewInObject(courseUnitDeliverable);
        }
        return loadAssignement(courseUnitAssignementId,userSession);
    }


}