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
);
}
}