package pt.estgp.estgweb.services.announcements;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
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.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.RoleManager;
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(RoleManager.
hasRole(userSession.
getUser(),Globals.
AUTOMATIC_VALIDATION_ROLES))
a.
setStatus(announcementView.
isStatus());
else if(a
instanceof CourseUnitAnnouncement
&& ((UserImpl
)userSession.
getUser()).
isTeacherOfCourseUnit(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
);
}
}