1 package com.germinus.merlin.manager;
2
3 import java.text.DateFormat;
4 import java.text.ParseException;
5 import java.text.SimpleDateFormat;
6 import java.util.ArrayList;
7 import java.util.Collections;
8 import java.util.Date;
9 import java.util.HashMap;
10 import java.util.Iterator;
11 import java.util.List;
12 import java.util.Locale;
13 import java.util.Map;
14 import java.util.ResourceBundle;
15 import java.util.Set;
16
17 import javax.portlet.ActionRequest;
18 import javax.portlet.ActionResponse;
19 import javax.portlet.PortletURL;
20 import javax.portlet.RenderRequest;
21 import javax.portlet.RenderResponse;
22 import javax.servlet.ServletContext;
23 import javax.servlet.http.HttpServletRequest;
24 import javax.servlet.http.HttpServletResponse;
25
26 import com.germinus.liferay.util.ILiferayUtil;
27 import com.germinus.liferay.util.IUserUtil;
28 import com.germinus.merlin.dao.AssignmentDao;
29 import com.germinus.merlin.model.Course;
30 import com.germinus.merlin.model.ResourceContainer;
31 import com.germinus.merlin.model.Student;
32 import com.germinus.merlin.model.Teacher;
33 import com.germinus.merlin.model.assignment.Assignment;
34 import com.germinus.merlin.model.assignment.AssignmentInteractive;
35 import com.germinus.merlin.model.assignment.AssignmentOffline;
36 import com.germinus.merlin.model.assignment.AssignmentOnline;
37 import com.germinus.merlin.model.assignment.AssignmentResult;
38 import com.germinus.merlin.model.assignment.AssignmentUploadASingleFile;
39 import com.germinus.merlin.util.IMerlinUtil;
40 import com.germinus.merlin.util.MerlinWebKeys;
41 import com.germinus.merlin.util.comparator.NameAssignmentComparator;
42 import com.liferay.portal.PortalException;
43 import com.liferay.portal.SystemException;
44 import com.liferay.portal.kernel.dao.search.ResultRow;
45 import com.liferay.portal.kernel.dao.search.SearchContainer;
46
47
48
49
50
51
52
53
54
55
56 public class AssignmentManager {
57
58 private AssignmentDao assignmentDao;
59 private AssignmentResultManager assignmentResultManager;
60 private CourseManager courseManager;
61 private List<String> headerNames;
62 private ILiferayUtil liferayUtil;
63 private IMerlinUtil merlinUtil;
64 private SearchContainer searchContainer;
65 private IUserUtil userUtil;
66
67
68
69
70
71
72
73
74 public void addAssignment(ActionRequest request, ActionResponse response, Course course) {
75
76
77 Assignment newAssignment = null;
78 if (request.getParameter("type").equals("Online Activity")){
79 newAssignment = new AssignmentOnline();
80 } else
81 if (request.getParameter("type").equals("Upload a Single File")){
82 newAssignment = new AssignmentUploadASingleFile();
83 }
84 else
85 if (request.getParameter("type").equals("Offline Activity")) {
86 newAssignment = new AssignmentOffline();
87 }
88
89 newAssignment.setName(request.getParameter("name"));
90 newAssignment.setData(request.getParameter("content"));
91 newAssignment.setType(request.getParameter("type"));
92 newAssignment.setDescription(request.getParameter("description"));
93 newAssignment.setCourse(course);
94
95 Date date = new Date();
96 String startDateString = request.getParameter("startDate");
97 String endDateString = request.getParameter("endDate");
98 SimpleDateFormat formatoDelTexto= new SimpleDateFormat("dd/MM/yyyy");
99 try {
100 date = formatoDelTexto.parse(startDateString);
101 newAssignment.setBegintime(date);
102 date = formatoDelTexto.parse(endDateString);
103 newAssignment.setEndtime(date);
104 } catch (ParseException e) {
105 e.printStackTrace();
106 }
107 if (request.getParameter("hideDescriptionBeforeAvailable").equals("true"))
108 newAssignment.setHideDescriptionBeforeAvailable(true);
109 else
110 newAssignment.setHideDescriptionBeforeAvailable(false);
111
112 if (request.getParameter("visible").equals("true"))
113 newAssignment.setVisible(true);
114 else
115 newAssignment.setVisible(false);
116
117
118 if (request.getParameter("type").equals("Online Activity") || request.getParameter("type").equals("Upload a Single File")){
119 if (request.getParameter("resubmit").equals("true")){
120 ((AssignmentInteractive) newAssignment).setResubmit(true);
121 } else
122 ((AssignmentInteractive) newAssignment).setResubmit(false);
123 if (request.getParameter("emailsToTeacher").equals("true")){
124 ((AssignmentInteractive) newAssignment).setEmailsToTeacher(true);
125 } else
126 ((AssignmentInteractive) newAssignment).setEmailsToTeacher(false);
127 if (request.getParameter("preventLateSubmissions").equals("true")){
128 ((AssignmentInteractive) newAssignment).setPreventLateSubmissions(true);
129 } else
130 ((AssignmentInteractive) newAssignment).setPreventLateSubmissions(false);
131 }
132
133 if (request.getParameter("type").equals("Upload a Single File")){
134 ((AssignmentUploadASingleFile) newAssignment).setMaxSize(request.getParameter("maxsize"));
135 if (request.getParameter("allowNotes").equals("true")){
136 ((AssignmentUploadASingleFile) newAssignment).setAllowNotes(true);
137 } else
138 ((AssignmentUploadASingleFile) newAssignment).setAllowNotes(false);
139 }
140
141
142 List<ResourceContainer> resourceContainerList=course.getResourceContainers();
143 int i=0;
144 boolean notAssign=true;
145 while (i<resourceContainerList.size() && notAssign) {
146 if (resourceContainerList.get(i)!=null && resourceContainerList.get(i).getCourse()!=null) {
147 if (resourceContainerList.get(i).getCourse()==newAssignment.getCourse()){
148
149 newAssignment.setResourceContainer(course.getResourceContainers().get(i));
150 notAssign=false;
151 }
152 }
153 i++;
154 }
155
156
157 course.getAssignments().add(newAssignment);
158
159 courseManager.getCourseDao().save(course);
160 }
161
162 public void changePermissionsAssignment(RenderRequest request,
163 RenderResponse response) {
164 Long assignmentId = new Long(request.getParameter("assignmentId"));
165
166 long courseId = liferayUtil.getComunityGroupId(request, response);
167
168 Course course = courseManager.getCourse(courseId);
169
170 Set<Assignment> assignmentsSet= course.getAssignments();
171
172 Assignment assignment = searchAssignment(assignmentsSet, assignmentId);
173
174 assignment.setVisible(!assignment.getVisible());
175 getAssignmentDao().save(assignment);
176
177 }
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194 private void createAssignmentListRows(List<Assignment> assignmentsList,
195 RenderRequest request, RenderResponse response, String usertype, ServletContext merlinContext,
196 HttpServletRequest httpReq, HttpServletResponse httpRes, List<ResultRow> resultRows,
197 SearchContainer searchContainer2) {
198 Locale locale= request.getLocale();
199 if (assignmentsList.size()==0){
200 searchContainer.setEmptyResultsMessage(ResourceBundle.getBundle("messages",locale).getString("table.assignments.empty"));
201 }
202 else {
203 generateTable(assignmentsList, request, response, usertype,
204 merlinContext, httpReq, httpRes, resultRows, locale);
205 }
206 }
207
208
209
210
211
212
213
214
215
216
217 @SuppressWarnings("unchecked")
218 private Map<String, SearchContainer> createSearchContainer(RenderRequest request,RenderResponse response,
219 String usertype, List<Assignment> listAssignments) throws PortalException, SystemException {
220
221 Map<String, SearchContainer> model = new HashMap<String, SearchContainer>();
222 ServletContext merlinContext = merlinUtil.getServletContext(request,response);
223 HttpServletRequest httpReq = merlinUtil.getHttpServletRequest(request,response);
224 HttpServletResponse httpRes = merlinUtil.getHttpServletResponse(request,response);
225
226
227 headerNames=createTableAssignmentsListHeaderNames(request,usertype);
228
229 PortletURL portletURL = response.createRenderURL();
230 searchContainer = new SearchContainer(request, null, null,SearchContainer.DEFAULT_CUR_PARAM,
231 SearchContainer.DEFAULT_DELTA, portletURL, headerNames, null);
232
233 searchContainer.setResults(listAssignments);
234
235 List<ResultRow> resultRows = searchContainer.getResultRows();
236
237
238 if (usertype!=null)
239 createAssignmentListRows(listAssignments,request,response,usertype,merlinContext,httpReq,httpRes,resultRows,searchContainer);
240
241 model.put("searchContainer", searchContainer);
242 return model;
243 }
244
245 private List<String> createTableAssignmentsListHeaderNames(RenderRequest request, String userType) {
246 List<String> headerNames = new ArrayList<String>();
247 Locale locale = request.getLocale();
248
249 ResourceBundle resourceBundle = ResourceBundle.getBundle("messages",locale);
250 headerNames.add(resourceBundle.getString("table.header.assignment.name"));
251 headerNames.add(resourceBundle.getString("table.header.assignment.type"));
252 headerNames.add(resourceBundle.getString("table.header.assignment.beginDate"));
253 headerNames.add(resourceBundle.getString("table.header.assignment.endDate"));
254 if (userType=="teacher"){
255 headerNames.add(resourceBundle.getString("table.header.assignment.submissions"));
256 headerNames.add(resourceBundle.getString("table.header.assignment.state"));
257 }
258 else {
259 headerNames.add(resourceBundle.getString("table.header.assignment.submissionDate"));
260 headerNames.add(resourceBundle.getString("table.header.assignment.grade"));
261 }
262 headerNames.add("");
263 return headerNames;
264 }
265
266
267
268
269
270
271 public void deleteAssignment(long assignmentId,Course course) {
272
273 Set<Assignment> assignmentSet = course.getAssignments();
274
275 Assignment assignment= searchAssignment(assignmentSet, assignmentId);
276
277 course.getAssignments().remove(assignment);
278
279 assignmentDao.remove(assignmentId);
280 }
281
282
283
284
285
286
287
288
289
290 public void deleteAssignment(RenderRequest request, RenderResponse response, Course course) {
291
292 long assignmentId = Long.parseLong(request.getParameter("assignmentId"));
293 deleteAssignment(assignmentId,course);
294
295 }
296
297
298
299
300
301
302
303
304 public void editAssignment(ActionRequest request, ActionResponse response, Course course) {
305
306
307 long assignmentId = Long.parseLong(request.getParameter("assignment").trim());
308
309 Assignment newAssignment = null;
310 newAssignment = this.searchAssignment(course.getAssignments(), assignmentId);
311
312 newAssignment.setName(request.getParameter("name"));
313 newAssignment.setData(request.getParameter("content"));
314 newAssignment.setType(request.getParameter("type"));
315 newAssignment.setDescription(request.getParameter("description"));
316 newAssignment.setCourse(course);
317
318 String resourceContainerId= request.getParameter("resourceContainerId");
319 ResourceContainer resourceContainer = searchResourceContainer(resourceContainerId,course);
320
321 newAssignment.setResourceContainer(resourceContainer);
322
323 Date date = new Date();
324 String startDateString = request.getParameter("startDate");
325 String endDateString = request.getParameter("endDate");
326 SimpleDateFormat formatoDelTexto= new SimpleDateFormat("dd/MM/yyyy");
327 try {
328 date = formatoDelTexto.parse(startDateString);
329 newAssignment.setBegintime(date);
330 date = formatoDelTexto.parse(endDateString);
331 newAssignment.setEndtime(date);
332 } catch (ParseException e) {
333
334 e.printStackTrace();
335 }
336 if (request.getParameter("hideDescriptionBeforeAvailable").equals("true"))
337 newAssignment.setHideDescriptionBeforeAvailable(true);
338 else
339 newAssignment.setHideDescriptionBeforeAvailable(false);
340
341 if (request.getParameter("visible").equals("true")){
342 newAssignment.setVisible(true);
343 } else
344 newAssignment.setVisible(false);
345
346
347 if (request.getParameter("type").equals("Online Activity") || request.getParameter("type").equals("Upload a Single File")){
348 if (request.getParameter("resubmit").equals("true")){
349 ((AssignmentInteractive) newAssignment).setResubmit(true);
350 } else
351 ((AssignmentInteractive) newAssignment).setResubmit(false);
352 if (request.getParameter("emailsToTeacher").equals("true")){
353 ((AssignmentInteractive) newAssignment).setEmailsToTeacher(true);
354 } else
355 ((AssignmentInteractive) newAssignment).setEmailsToTeacher(false);
356 if (request.getParameter("preventLateSubmissions").equals("true")){
357 ((AssignmentInteractive) newAssignment).setPreventLateSubmissions(true);
358 } else
359 ((AssignmentInteractive) newAssignment).setPreventLateSubmissions(false);
360
361 }
362 if (request.getParameter("type").equals("Upload a Single File")){
363 ((AssignmentUploadASingleFile) newAssignment).setMaxSize(request.getParameter("maxsize"));
364 if (request.getParameter("allowNotes").equals("true")){
365 ((AssignmentUploadASingleFile) newAssignment).setAllowNotes(true);
366 } else
367 ((AssignmentUploadASingleFile) newAssignment).setAllowNotes(false);
368 }
369
370
371 course.getAssignments().add(newAssignment);
372 getAssignmentDao().merge(newAssignment);
373 }
374
375 private void generateCommonCols(RenderResponse response, Locale locale,
376 Assignment assignment, ResultRow row, String userType) {
377
378 Date actualDate= new Date();
379 if (userType==MerlinWebKeys.STUDENTS && assignment.getHideDescriptionBeforeAvailable()!=null &&
380 assignment.getHideDescriptionBeforeAvailable() && assignment.getBegintime().after(actualDate)){
381 row.addText(assignment.getName().toString());
382 }
383 else {
384 PortletURL rowURL = response.createRenderURL();
385 rowURL.setParameter("action", "assignmentDetails");
386 rowURL.setParameter("assignmentId", String.valueOf(assignment.getAssignmentid()));
387 rowURL.setParameter("type", String.valueOf(assignment.getType()));
388 row.addText(assignment.getName().toString(),rowURL);
389 }
390
391 String assignmentType= assignment.getType().toString();
392 if (assignmentType.equals("Online Activity")){
393 row.addText(ResourceBundle.getBundle("messages",locale).getString("portlet.assignments.type.online"));
394 } else
395 if (assignmentType.equals("Offline Activity")){
396 row.addText(ResourceBundle.getBundle("messages",locale).getString("portlet.assignments.type.offline"));
397 } else
398 if (assignmentType.equals("Upload a Single File")){
399 row.addText(ResourceBundle.getBundle("messages",locale).getString("portlet.assignments.type.upfile"));
400 }
401 Date date =assignment.getBegintime();
402 row.addText(DateFormat.getInstance().format(date));
403 date =assignment.getEndtime();
404 row.addText(DateFormat.getInstance().format(date));
405 }
406
407 private void generateStudentCols(RenderRequest request,
408 RenderResponse response, Assignment assignment, ResultRow row) {
409 Date date;
410 AssignmentResult assignmentResult = assignmentResultManager.searchAssignmentResult(request,response,assignment);
411 if (assignmentResult!=null){
412 date =assignmentResult.getSubmissionDate();
413 row.addText(date.toString());
414 row.addText(assignmentResult.getGrade());
415 } else {
416 row.addText("");
417 row.addText("");
418 }
419 row.addJSP("");
420 }
421
422 private void generateTable(List<Assignment> assignmentsList, RenderRequest request,
423 RenderResponse response, String usertype, ServletContext merlinContext, HttpServletRequest httpReq,
424 HttpServletResponse httpRes, List<ResultRow> resultRows, Locale locale) {
425
426 Integer numAssignments= new Integer(0);
427 for (int i = 0; i < assignmentsList.size(); i++) {
428 Assignment assignment = (Assignment) assignmentsList.get(i);
429 if(usertype.equals(MerlinWebKeys.TEACHER) || (usertype.equals(MerlinWebKeys.STUDENTS) && assignment.getVisible())) {
430 numAssignments++;
431 ResultRow row = new ResultRow(assignment, assignment.getName(), i);
432 generateCommonCols(response, locale, assignment, row, usertype);
433 if(usertype.equals(MerlinWebKeys.TEACHER)){
434 generateTeacherCols(response, locale, assignment, row, merlinContext,httpReq,httpRes);
435 } else {
436 generateStudentCols(request, response, assignment, row);
437
438 }
439
440
441
442
443
444
445 resultRows.add(row);
446 }
447 }
448 searchContainer.setTotal(numAssignments);
449 }
450
451 private void generateTeacherCols(RenderResponse response, Locale locale,
452 Assignment assignment, ResultRow row, ServletContext merlinContext,
453 HttpServletRequest httpReq, HttpServletResponse httpRes) {
454 PortletURL rowURL;
455 rowURL = response.createRenderURL();
456 rowURL.setParameter("action", "resultsList");
457 rowURL.setParameter("assignmentId", String.valueOf(assignment.getAssignmentid()));
458 String submissions = new String(ResourceBundle.getBundle("messages",locale).getString("portlet.assignments.submissions")+": ");
459 submissions+=String.valueOf(assignment.getResults().size());
460 row.addText(submissions,rowURL);
461 rowURL = response.createRenderURL();
462 rowURL.setParameter("action", "assigmentPermissions");
463 rowURL.setParameter("assignmentId", String.valueOf(assignment.getAssignmentid()));
464 if (assignment.getVisible()==null){
465 row.addText(ResourceBundle.getBundle("messages",locale).getString("portlet.assignments.visible"),rowURL);
466 }
467 else
468 if (assignment.getVisible()){
469 row.addText(ResourceBundle.getBundle("messages",locale).getString("portlet.assignments.visible"),rowURL);
470 }
471 else {
472 row.addText(ResourceBundle.getBundle("messages",locale).getString("portlet.assignments.hidden"),rowURL);
473 }
474 row.addJSP("/WEB-INF/jsp/assignments/listAssignment/assignmentaction.jsp",merlinContext,httpReq,httpRes);
475 }
476
477
478
479
480
481
482
483 public Assignment getAssignment(Long assignmentId, Course course){
484
485 Assignment assignment= null;
486
487 Iterator<Assignment> assignmentsIterator = course.getAssignments().iterator();
488 boolean notFound= true;
489 while (assignmentsIterator.hasNext() && notFound){
490 assignment = assignmentsIterator.next();
491 if(assignment.getAssignmentid() == assignmentId) {
492 notFound=false;
493 }
494 }
495 return assignment;
496 }
497
498
499
500
501 public AssignmentDao getAssignmentDao() {
502 return assignmentDao;
503 }
504
505 public AssignmentResultManager getAssignmentResultManager() {
506 return assignmentResultManager;
507 }
508
509
510
511
512
513
514
515 private List<Assignment> getAssignmentsByName(String assignmentName, Course course){
516 Assignment assignment;
517 List<Assignment> assignmentsList= new ArrayList<Assignment>() ;
518
519 for (Iterator<Assignment> i = course.getAssignments().iterator(); i.hasNext();){
520 assignment = i.next();
521 if(assignment.getName().equals(assignmentName)) {
522 assignmentsList.add(assignment);
523 } else {
524 if(assignment.getName().contains(assignmentName)) {
525 assignmentsList.add(assignment);
526 }
527 }
528 }
529 return assignmentsList;
530 }
531
532
533
534
535
536
537
538 public Student getAssignmentStudent(Set<Student> studentsSet, Long studentId){
539 Student student= null;
540 Iterator<Student> studentsIterator = studentsSet.iterator();
541 boolean notFound = true;
542 while (studentsIterator.hasNext() && notFound) {
543 student= studentsIterator.next();
544 if(student.getId().getUserid() == studentId){
545 notFound=false;
546 }
547 }
548 return student;
549 }
550
551
552
553
554
555
556
557 public Teacher getAssignmentTeacher(Set<Teacher> teachersSet, Long teacherId){
558 Teacher teacher= null;
559 Iterator<Teacher> teachersIterator = teachersSet.iterator();
560 boolean notFound=true;
561 while (teachersIterator.hasNext() && notFound){
562 teacher= teachersIterator.next();
563 if(teacher.getId().getUserid() == teacherId){
564 notFound=false;
565 }
566 }
567 return teacher;
568 }
569 public CourseManager getCourseManager() {
570 return courseManager;
571 }
572
573 public ILiferayUtil getLiferayUtil() {
574 return liferayUtil;
575 }
576
577
578
579
580 public IMerlinUtil getMerlinUtil() {
581 return merlinUtil;
582 }
583
584
585
586
587 public IUserUtil getUserUtil() {
588 return userUtil;
589 }
590
591
592
593
594
595
596
597
598
599
600
601 public Map<String, SearchContainer> listAssignment(RenderRequest request,RenderResponse response,Course course, String usertype)
602 throws PortalException, SystemException{
603
604 Set<Assignment> assignmentsSet= course.getAssignments();
605 List<Assignment> assignmentsList = new ArrayList<Assignment>(assignmentsSet);
606
607 Collections.sort(assignmentsList, new NameAssignmentComparator());
608
609 Map<String, SearchContainer> model;
610
611 model=createSearchContainer(request, response, usertype, assignmentsList);
612
613 return model;
614 }
615
616
617
618
619
620
621
622
623
624
625
626
627 public Map<String, SearchContainer> listAssignmentSearch(RenderRequest request, RenderResponse response, Course course) throws PortalException, SystemException {
628
629 List<Assignment> assignmentsList ;
630
631 assignmentsList=getAssignmentsByName(request.getParameter("search"), course);
632 Map<String, SearchContainer> model;
633
634 String usertype= merlinUtil.getUserType(request, response, course.getGroupId());
635 Collections.sort(assignmentsList, new NameAssignmentComparator());
636 model=createSearchContainer(request, response, usertype, assignmentsList);
637 return model;
638 }
639
640 public Assignment searchAssignment(ActionRequest request, ActionResponse response) {
641 Long assignmentId = new Long(request.getParameter("assignmentId"));
642
643 long courseId = liferayUtil.getComunityGroupId(request, response);
644
645 Course course = courseManager.getCourse(courseId);
646
647 Set<Assignment> assignmentsSet= course.getAssignments();
648 return searchAssignment(assignmentsSet, assignmentId);
649 }
650
651
652
653
654
655
656
657
658 public Assignment searchAssignment(RenderRequest request, RenderResponse response){
659
660 Long assignmentId = new Long(request.getParameter("assignmentId"));
661
662 long courseId = liferayUtil.getComunityGroupId(request, response);
663
664 Course course = courseManager.getCourse(courseId);
665
666 Set<Assignment> assignmentsSet= course.getAssignments();
667
668 return searchAssignment(assignmentsSet, assignmentId);
669 }
670
671
672
673
674
675
676 public Assignment searchAssignment(Set<Assignment> assignmentsSet, Long assignmentId){
677 Assignment assignment=null;
678
679 for (Iterator<Assignment> i = assignmentsSet.iterator(); i.hasNext();){
680 assignment= i.next();
681 if(assignment.getAssignmentid() == assignmentId){
682 return assignment;
683 }
684 }
685 return null;
686 }
687
688
689
690
691
692
693
694 private ResourceContainer searchResourceContainer(String resourceContainerId, Course course) {
695 List<ResourceContainer> resourceContainerList = course.getResourceContainers();
696 int i=1; boolean notFound=true;
697 ResourceContainer resourceContainer=null;
698 while (i<resourceContainerList.size() && notFound){
699 resourceContainer=resourceContainerList.get(i);
700 notFound=(resourceContainer.getIdResourceContainer()!=Long.parseLong(resourceContainerId));
701 i++;
702 }
703 return resourceContainer;
704 }
705
706
707
708
709 public void setAssignmentDao(AssignmentDao assignmentDao) {
710 this.assignmentDao = assignmentDao;
711 }
712
713 public void setAssignmentResultManager(
714 AssignmentResultManager assignmentResultManager) {
715 this.assignmentResultManager = assignmentResultManager;
716 }
717 public void setCourseManager(CourseManager courseManager) {
718 this.courseManager = courseManager;
719 }
720
721 public void setLiferayUtil(ILiferayUtil liferayUtil) {
722 this.liferayUtil = liferayUtil;
723 }
724
725
726
727
728 public void setMerlinUtil(IMerlinUtil merlinUtil) {
729 this.merlinUtil = merlinUtil;
730 }
731
732
733
734
735 public void setUserUtil(IUserUtil userUtil) {
736 this.userUtil = userUtil;
737 }
738
739 }