View Javadoc
1   package com.germinus.merlin.manager;
2   
3   import java.text.DateFormat;
4   import java.util.ArrayList;
5   import java.util.Collections;
6   import java.util.Date;
7   import java.util.HashMap;
8   import java.util.Iterator;
9   import java.util.List;
10  import java.util.Locale;
11  import java.util.Map;
12  import java.util.ResourceBundle;
13  import java.util.Set;
14  
15  import javax.portlet.ActionRequest;
16  import javax.portlet.ActionResponse;
17  import javax.portlet.PortletURL;
18  import javax.portlet.RenderRequest;
19  import javax.portlet.RenderResponse;
20  import javax.servlet.ServletContext;
21  import javax.servlet.http.HttpServletRequest;
22  import javax.servlet.http.HttpServletResponse;
23  
24  import com.germinus.liferay.util.ILiferayUtil;
25  import com.germinus.liferay.util.IUserUtil;
26  import com.germinus.liferay.util.UserUtil;
27  import com.germinus.merlin.model.Course;
28  import com.germinus.merlin.model.Student;
29  import com.germinus.merlin.model.Teacher;
30  import com.germinus.merlin.model.TeachersId;
31  import com.germinus.merlin.model.assignment.Assignment;
32  import com.germinus.merlin.model.assignment.AssignmentResult;
33  import com.germinus.merlin.util.IMerlinUtil;
34  import com.germinus.merlin.util.comparator.NameAssignmentResultComparator;
35  import com.liferay.portal.PortalException;
36  import com.liferay.portal.SystemException;
37  import com.liferay.portal.kernel.dao.search.ResultRow;
38  import com.liferay.portal.kernel.dao.search.SearchContainer;
39  /** Class used for AssignmentResults actions.
40   * @author Jesús Rodríguez, Germinus XXI
41   * @version 
42   * @since 1.0
43   */
44  public class AssignmentResultManager {
45  	
46  	private AssignmentManager assignmentManager;
47  	private CourseManager courseManager;
48  	private List<String> headerNames;
49  	private ILiferayUtil liferayUtil;
50  	private IMerlinUtil merlinUtil;
51  	private SearchContainer searchContainer;
52  	private IUserUtil userUtil;
53  	/**
54  	 * This method add an AssignmentResult to the model data. 
55  	 * @param request
56  	 * @param response
57  	 * @param course
58  	 * @author Jesús Rodríguez, Germinus XXI
59  	 * @since 1.0
60  	 */
61  	public void addAssignmentResult(ActionRequest request, ActionResponse response, Course course) {
62  
63  		String username = userUtil.getUserName(request, response);
64  		Long iduser = Long.parseLong(username);
65  		AssignmentResult result = new AssignmentResult();
66  
67  		// get the assignment id from parameter
68  		Long assignmentId = new Long(request.getParameter("assignmentId"));
69  		// get a set of assignments in the course
70  		Set<Assignment> assignmentSet = course.getAssignments();
71  		// get a set of students in the course
72  		Set<Student> studentsSet = course.getStudents();
73  		
74  		// return the assignment with specify id
75  		Assignment assignment = assignmentManager.searchAssignment(assignmentSet, assignmentId);
76  		// return the student with specify id
77  		Student student = assignmentManager.getAssignmentStudent(studentsSet, iduser);
78  
79  		result.setAssignments(assignment);
80  		result.setData(request.getParameter("content"));
81  		result.setStudents(student);
82  		result.setGrade("");
83  		Date d1 = new Date();
84  		result.setSubmissionDate(d1);
85  		
86  		assignment.getResults().add(result);
87  		course.getAssignments().add(assignment);
88  		
89  	}
90  	/**
91  	 * Generate the assignmentResult's table header.
92  	 * @return
93  	 * @author Jesús Rodríguez, Germinus XXI
94  	 * @since 1.0
95  	 */
96  	private ArrayList<String> createTableResultsListHeaderNames(RenderRequest request) {
97  		ArrayList<String> headerList= new ArrayList<String>();
98  		Locale locale = request.getLocale();
99  		ResourceBundle resourceBundle = ResourceBundle.getBundle("messages",locale);
100 		headerList.add(resourceBundle.getString("table.header.results.user"));
101 		headerList.add(resourceBundle.getString("table.header.results.submissionDate"));
102 		headerList.add(resourceBundle.getString("table.header.results.grade"));
103 		headerList.add(resourceBundle.getString("table.header.results.comments"));
104 		headerList.add(resourceBundle.getString("table.header.results.gradeDate"));
105 		headerList.add("");
106 		return headerList;
107 	}
108 	/**
109 	 * Find the AssignmentResult newer from a List
110 	 * @param userAssignmentResultsList
111 	 * @return
112 	 * @author Jesús Rodríguez, Germinus XXI
113 	 * @since 1.0
114 	 */
115 /*	private AssignmentResult findLastUserAssignmentResultGraded(ArrayList<AssignmentResult> userAssignmentResultsList) {
116 		
117 		int pos=0;
118 		AssignmentResult assignmentResult= userAssignmentResultsList.get(pos);
119 		//find the first AssignmentResult graded:
120 		while (assignmentResult.getDate()==null && pos<userAssignmentResultsList.size()){
121 			pos++;
122 			assignmentResult= userAssignmentResultsList.get(pos);
123 		}
124 		//compare the other AssignmentResults graded with the first:
125 		for (int i=pos+1;i<userAssignmentResultsList.size();i++){
126 			
127 			if (userAssignmentResultsList.get(i).getDate()!=null &&
128 					assignmentResult.getDate().before(userAssignmentResultsList.get(i).getDate())){
129 				assignmentResult = userAssignmentResultsList.get(i);
130 			}
131 		}
132 		return assignmentResult;
133 	}*/
134 	/**
135 	 * Find the AssignmentResult newer from a List
136 	 * @param userAssignmentResultsList
137 	 * @return
138 	 * @author Jesús Rodríguez, Germinus XXI
139 	 * @since 1.0
140 	 */
141 	private AssignmentResult findLastUserAssignmentResultSubmited(ArrayList<AssignmentResult> userAssignmentResultsList) {
142 		
143 		AssignmentResult assignmentResult= userAssignmentResultsList.get(0);
144 		//compare the other AssignmentResults graded with the first:
145 		for (int i=1;i<userAssignmentResultsList.size();i++){
146 			
147 			if (assignmentResult.getSubmissionDate().before(userAssignmentResultsList.get(i).getSubmissionDate())){
148 				assignmentResult = userAssignmentResultsList.get(i);
149 			}
150 		}
151 		return assignmentResult;
152 	}
153 	/**
154 	 * Fill the rows with the data of assignmentsresults
155 	 * @param assignmentResultList
156 	 * @param request
157 	 * @param response
158 	 * @param usertype
159 	 * @param merlinContext
160 	 * @param httpReq
161 	 * @param httpRes
162 	 * @param resultRows
163 	 * @return
164 	 */
165 	private void  generateAssignmentResultsRows(List<AssignmentResult> assignmentResultList,RenderRequest request,RenderResponse response,String usertype,
166 			ServletContext merlinContext,HttpServletRequest httpReq,HttpServletResponse httpRes,
167 			List<ResultRow> resultRows){
168 		Locale locale = request.getLocale();
169 		if (assignmentResultList.size()==0){
170 			searchContainer.setEmptyResultsMessage(ResourceBundle.getBundle("messages",locale).getString("table.results.empty"));
171 		} else {
172 			for (int i = 0; i < assignmentResultList.size(); i++) {
173 					AssignmentResult assignmentResult = assignmentResultList.get(i);
174 					ResultRow row = new ResultRow(assignmentResult, assignmentResult.getStudents().getClass().getName(), i);
175 					IUserUtil userUtil = new UserUtil();
176 					row.addText(userUtil.getUserName(assignmentResult.getStudents().getId().getUserid()));
177 					
178 					Date date =assignmentResult.getSubmissionDate();
179 					row.addText(DateFormat.getDateInstance().format(date));
180 					
181 					row.addText(assignmentResult.getGrade().toString());
182 					row.addText(assignmentResult.getComments());
183 					
184 					//if the assignment isn't graded, the date is null.
185 					if (assignmentResult.getDate()!=null){
186 						date =assignmentResult.getDate();
187 						row.addText(DateFormat.getInstance().format(date));
188 					}
189 					else { 
190 						PortletURL rowURL = response.createRenderURL();
191 						rowURL.setParameter("action", "resultGrade");
192 						rowURL.setParameter("result", String.valueOf(assignmentResult.getResultid()));
193 						rowURL.setParameter("assignmentId", String.valueOf(assignmentResult.getAssignments().getAssignmentid()));
194 						row.addText(ResourceBundle.getBundle("messages",locale).getString("table.results.notGraded"),rowURL);
195 					}
196 					row.addJSP("/WEB-INF/jsp/assignments/results/resultsaction.jsp",merlinContext,httpReq,httpRes);
197 					resultRows.add(row);	
198 			}
199 		 }
200 	}
201 	/**
202 	 * @return the assignmentManager
203 	 */
204 	public AssignmentManager getAssignmentManager() {
205 		return assignmentManager;
206 	}
207 	public CourseManager getCourseManager() {
208 		return courseManager;
209 	}
210 	public ILiferayUtil getLiferayUtil() {
211 		return liferayUtil;
212 	}
213 	public IMerlinUtil getMerlinUtil() {
214 		return merlinUtil;
215 	}
216 	/**
217 	 * @return the userUtil
218 	 */
219 	public IUserUtil getUserUtil() {
220 		return userUtil;
221 	}
222 
223     public Course gradeAssignmentResult(ActionRequest request, ActionResponse response) {
224 		long courseId = liferayUtil.getComunityGroupId(request, response); 
225 		Course course = courseManager.getCourse(courseId);
226 		gradeAssignmentResult(request,response,course);
227 		return course;
228 	}
229 	/**
230 	 * This method grade an existing assignment result in the model data.
231 	 * @param request
232 	 * @param response
233 	 * @param course
234 	 * @author Jesús Rodríguez, Germinus XXI
235 	 * @since 1.0
236 	 */
237 	public void gradeAssignmentResult(ActionRequest request, ActionResponse response, Course course) {
238 		
239 		Long resultId= new Long(request.getParameter("resultId"));
240 		Long assignmentId = new Long(request.getParameter("assignmentId"));
241 		AssignmentResult assignmentResult; //= new AssignmentResult();
242 		   
243 	    Assignment assignment;
244 	  
245 	    //get a set of assignments in the course
246 	    Set<Assignment> assignmentsSet= course.getAssignments();
247 	    
248 	    //return the assignment with specify id
249 	    assignment = assignmentManager.searchAssignment(assignmentsSet, assignmentId); 
250 	    Set<AssignmentResult> assignmentResultsSet = assignment.getResults();
251     	
252     	//return the assignmentResult with specify id if exists
253     	assignmentResult = searchAssignmentResult(assignmentResultsSet, resultId);
254 	   
255     	if (assignmentResult==null) assignmentResult = new AssignmentResult();
256     	
257     	Date d1 = new Date();
258 	    
259 	    assignmentResult.setResultid(resultId);
260 	    assignmentResult.setDate(d1);
261 	    assignmentResult.setData(assignmentResult.getData());
262 	    assignmentResult.setComments(request.getParameter("content"));
263 	    assignmentResult.setGrade(request.getParameter("grade"));
264 	    assignmentResult.setStudents(assignmentResult.getStudents());
265 	    //put the teacher in the assignmentResult:
266 	    String username = userUtil.getUserName(request, response);
267 		Long idUser = Long.parseLong(username);
268 	    assignmentResult.setTeachers(new Teacher(new TeachersId(idUser,course.getGroupId()),course));
269 	    
270 	    assignmentResult.setAssignments(assignmentResult.getAssignments());
271 	    
272 	    assignment.getResults().add(assignmentResult);
273 
274 	    course.getAssignments().add(assignment); 
275 		
276 	}
277 	/**
278 	 * Process the list of assignments results for fill the SearchContainer.
279 	 * @param request
280 	 * @param response
281 	 * @param course
282 	 * @param assignmentResultsList
283 	 * @param usertype
284 	 * @return
285 	 * @throws SystemException 
286 	 * @throws PortalException 
287 	 */
288     @SuppressWarnings("unchecked")
289 	private Map<String, SearchContainer> listAssignmentResults(RenderRequest request,RenderResponse response,
290 			Course course, List<AssignmentResult> assignmentResultsList,String usertype ) throws PortalException, SystemException{
291 		
292     	ServletContext merlinContext = merlinUtil.getServletContext(request,response);	
293 		HttpServletRequest httpReq = merlinUtil.getHttpServletRequest(request,response);	
294 		HttpServletResponse httpRes = merlinUtil.getHttpServletResponse(request,response);
295 
296 		// Set header table				
297 		headerNames = createTableResultsListHeaderNames(request);
298 
299 		PortletURL portletURL = response.createRenderURL();
300 
301 		searchContainer = new SearchContainer(request, null, null, SearchContainer.DEFAULT_CUR_PARAM,
302 										SearchContainer.DEFAULT_DELTA, portletURL,headerNames, null);
303 		
304 		int assignmentResultsTotal = assignmentResultsList.size();
305 		searchContainer.setTotal(assignmentResultsTotal);
306 		
307 		//Sort the AssginmentsResult list:
308     	Collections.sort(assignmentResultsList,new NameAssignmentResultComparator());
309     	
310 		searchContainer.setResults(assignmentResultsList);
311 
312 		List<ResultRow> resultRows =  searchContainer.getResultRows();
313 		
314 	  	//Making the information for each line in the table
315 		generateAssignmentResultsRows(assignmentResultsList,request,response,usertype,merlinContext,httpReq,httpRes,resultRows);
316 		
317 		Map<String, SearchContainer> model = new HashMap<String, SearchContainer>();
318 		model.put("searchContainer", searchContainer);
319 		
320 		return model;
321 	}
322 	/**
323 	 * 
324 	 * @param request
325 	 * @param response
326 	 * @param assignment
327 	 * @return
328 	 * @throws PortalException
329 	 * @throws SystemException
330 	 * @author Jesús Rodríguez, Germinus XXI
331 	 * @since 1.0
332 	 */
333     public Map<String, SearchContainer> listResults(RenderRequest request,RenderResponse response,
334 				Assignment assignment) throws PortalException, SystemException{
335 		
336 		long courseId = liferayUtil.getComunityGroupId(request, response);
337 		Course course = courseManager.getCourse(courseId);
338 		String usertype= merlinUtil.getUserType(request, response, courseId);
339 		
340 		Set<AssignmentResult> resultsSet = assignment.getResults();
341     	List<AssignmentResult> resultsList = new ArrayList<AssignmentResult>(resultsSet);
342     	return listAssignmentResults(request, response, course, resultsList, usertype);
343 	}
344 	/**
345      * @param request
346      * @param response
347      * @param course
348      * @author Jesús Rodríguez, Germinus XXI
349      * @since 1.0
350      */
351     public void removeAssignmentResult(ActionRequest request,
352 							ActionResponse response, Course course) {
353 		Long resultId= new Long(request.getParameter("resultId"));
354 		Long assignmentId = new Long(request.getParameter("assignmentId"));
355 		Assignment assignment = assignmentManager.getAssignment(assignmentId, course);
356 		Set<AssignmentResult> assignmentResultsSet = assignment.getResults();
357 		Iterator<AssignmentResult> assignmentResultIterator = assignmentResultsSet.iterator();
358 		boolean notFound=true;
359 		AssignmentResult assignmentResult=null;
360 		while (assignmentResultIterator.hasNext() && notFound){
361 			assignmentResult = assignmentResultIterator.next();
362 			if (assignmentResult.getResultid()==resultId){
363 				notFound=false;
364 			}
365 		}
366 		assignmentResultsSet.remove(assignmentResult);
367 	}
368 	/**
369 	 * 
370 	 * @param request
371 	 * @param response
372 	 * @param course
373 	 * @return
374 	 * @author Jesús Rodríguez, Germinus XXI
375 	 * @since 1.0
376 	 */
377     public AssignmentResult removeAssignmentResult(RenderRequest request,
378     								RenderResponse response, Course course) {
379 		Long resultId= new Long(request.getParameter("resultId"));
380 		Long assignmentId = new Long(request.getParameter("assignmentId"));
381 		Assignment assignment = assignmentManager.getAssignment(assignmentId, course);
382 		Set<AssignmentResult> assignmentResultsSet = assignment.getResults();
383 		Iterator<AssignmentResult> assignmentResultIterator = assignmentResultsSet.iterator();
384 		boolean notFound=true;
385 		AssignmentResult assignmentResult=null;
386 		while (assignmentResultIterator.hasNext() && notFound){
387 			assignmentResult = assignmentResultIterator.next();
388 			if (assignmentResult.getResultid()==resultId){
389 				notFound=false;
390 			}
391 		}
392 		assignmentResultsSet.remove(assignmentResult);
393 		return assignmentResult;
394 	}
395 	public AssignmentResult searchAssignmentResult(RenderRequest request, RenderResponse response, Assignment assignment) {
396 		String username = userUtil.getUserName(request, response);
397 		Long idUser = Long.parseLong(username);
398 		Set<AssignmentResult> assignmentResultsSet = assignment.getResults();
399 		//return the assignment with specify id
400 		return searchAssignmentResultByUserId(assignmentResultsSet, idUser);
401 	}
402 	/**
403 	 * @param request
404 	 * @param response
405 	 * @param course
406 	 * @return
407 	 * @author Jesús Rodríguez, Germinus XXI
408 	 * @since 1.0
409 	 */
410 	public AssignmentResult searchAssignmentResult(RenderRequest request,RenderResponse response) {
411 		String username = userUtil.getUserName(request, response);
412 		Long iduser = Long.parseLong(username);
413 		Assignment assignment;
414 		//return the assignment with specify id
415 		assignment = assignmentManager.searchAssignment(request, response);
416 		Set<AssignmentResult> assignmentResultsSet= assignment.getResults();	    
417 		
418 		return searchAssignmentResultByUserId(assignmentResultsSet,iduser);
419 	}
420 	/**
421 	 * 
422 	 * @param assignmentResultSet
423 	 * @param resultId
424 	 * @return
425 	 */
426 	public AssignmentResult searchAssignmentResult(Set<AssignmentResult> assignmentResultSet,
427 				Long resultId){
428 		AssignmentResult assignmentResult= null;
429 		Iterator<AssignmentResult> i = assignmentResultSet.iterator();
430 		boolean notFound=true;
431 		while (i.hasNext() && notFound){
432 			assignmentResult= i.next();
433 	    	if(assignmentResult.getResultid() == resultId){
434 	    		 notFound=false;
435 	    	}
436 		}
437 		return assignmentResult;
438 	}
439 	/**
440 	 * 
441 	 * @param assignmentResultsSet
442 	 * @param idUser
443 	 * @return
444 	 * @author Jesús Rodríguez, Germinus XXI
445 	 * @since 1.0
446 	 */
447 	private AssignmentResult searchAssignmentResultByUserId(
448 			Set<AssignmentResult> assignmentResultsSet, Long idUser) {
449 		ArrayList<AssignmentResult> assignmentResultsList= new ArrayList<AssignmentResult>();
450 		Iterator<AssignmentResult> assignmentResultsIterator = assignmentResultsSet.iterator();
451 		AssignmentResult assignmentResult= null;
452 		while (assignmentResultsIterator.hasNext()) {
453 	    	assignmentResult= assignmentResultsIterator.next();
454 	    	if(assignmentResult.getStudents().getId().getUserid() == idUser){
455 	    		 assignmentResultsList.add(assignmentResult);
456 	    	}
457 	    }
458 		if (assignmentResultsList.size()==0){
459 			return null;
460 		} else
461 			if (assignmentResultsList.size()==1){
462 				return assignmentResultsList.get(0);
463 			}
464 			else
465 				return findLastUserAssignmentResultSubmited(assignmentResultsList);
466 	}
467 	/**
468 	 * @param assignmentManager the assignmentManager to set
469 	 */
470 	public void setAssignmentManager(AssignmentManager assignmentManager) {
471 		this.assignmentManager = assignmentManager;
472 	}
473 	public void setCourseManager(CourseManager courseManager) {
474 		this.courseManager = courseManager;
475 	}
476 	public void setLiferayUtil(ILiferayUtil liferayUtil) {
477 		this.liferayUtil = liferayUtil;
478 	}
479 	public void setMerlinUtil(IMerlinUtil merlinUtil) {
480 		this.merlinUtil = merlinUtil;
481 	}
482 	/**
483 	 * @param userUtil the userUtil to set
484 	 */
485 	public void setUserUtil(IUserUtil userUtil) {
486 		this.userUtil = userUtil;
487 	}
488 }