/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/sam/tags/samigo-2.8.3/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/AuthorActionListener.java $
* $Id: AuthorActionListener.java 84755 2010-11-15 20:38:06Z ktsao@stanford.edu $
***********************************************************************************
*
* Copyright (c) 2004, 2005, 2006, 2008, 2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.tool.assessment.ui.listener.author;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.tool.assessment.facade.AgentFacade;
import org.sakaiproject.tool.assessment.facade.AssessmentFacade;
import org.sakaiproject.tool.assessment.facade.AssessmentFacadeQueries;
import org.sakaiproject.tool.assessment.facade.AssessmentTemplateFacade;
import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacade;
import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacadeQueries;
import org.sakaiproject.tool.assessment.services.GradingService;
import org.sakaiproject.tool.assessment.services.assessment.AssessmentService;
import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService;
import org.sakaiproject.tool.assessment.ui.bean.author.AuthorBean;
import org.sakaiproject.tool.assessment.ui.bean.authz.AuthorizationBean;
import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil;
import org.sakaiproject.util.FormattedText;
/**
* <p>Title: Samigo</p>2
* <p>Description: Sakai Assessment Manager</p>
* @author Ed Smiley
* @version $Id: AuthorActionListener.java 84755 2010-11-15 20:38:06Z ktsao@stanford.edu $
*/
public class AuthorActionListener
implements ActionListener
{
private static Log log = LogFactory.getLog(AuthorActionListener.class);
//private static ContextUtil cu;
public AuthorActionListener()
{
}
public void processAction(ActionEvent ae) throws AbortProcessingException
{
log.debug("*****Log: inside AuthorActionListener =debugging ActionEvent: " + ae);
// get service and managed bean
AssessmentService assessmentService = new AssessmentService();
PublishedAssessmentService publishedAssessmentService = new PublishedAssessmentService();
GradingService gradingService = new GradingService();
AuthorBean author = (AuthorBean) ContextUtil.lookupBean(
"author");
author.setProtocol(ContextUtil.getProtocol());
//#1 - prepare active template list. Note that we only need the title. We don't need the
// full template object - be cheap.
String showAssessmentTypes = ServerConfigurationService.getString("samigo.showAssessmentTypes");
if ("false".equalsIgnoreCase(showAssessmentTypes)) {
author.setShowTemplateList(Boolean.FALSE);
}
else {
author.setShowTemplateList(Boolean.TRUE);
}
ArrayList templateList = assessmentService.getTitleOfAllActiveAssessmentTemplates();
// get the managed bean, author and set the list
if (templateList.size()==1){ //<= only contains Default Template
author.setShowTemplateList(false);
}
else{
// remove Default Template
removeDefaultTemplate(templateList);
author.setAssessmentTemplateList(templateList);
}
author.setAssessCreationMode("1");
prepareAssessmentsList(author, assessmentService, gradingService, publishedAssessmentService);
String s = ServerConfigurationService.getString("samigo.editPubAssessment.restricted");
if (s != null && s.toLowerCase().equals("false")) {
author.setEditPubAssessmentRestricted(false);
}
else {
author.setEditPubAssessmentRestricted(true);
}
AuthorizationBean authorizationBean = (AuthorizationBean) ContextUtil.lookupBean("authorization");
author.setIsGradeable(authorizationBean.getGradeAnyAssessment() || authorizationBean.getGradeOwnAssessment());
author.setIsEditable(authorizationBean.getEditAnyAssessment() || authorizationBean.getEditOwnAssessment());
}
public void prepareAssessmentsList(AuthorBean author, AssessmentService assessmentService, GradingService gradingService, PublishedAssessmentService publishedAssessmentService) {
// #2 - prepare core assessment list
author.setCoreAssessmentOrderBy(AssessmentFacadeQueries.TITLE);
ArrayList assessmentList = assessmentService.getBasicInfoOfAllActiveAssessments(
AssessmentFacadeQueries.TITLE, author.isCoreAscending());
Iterator iter = assessmentList.iterator();
while (iter.hasNext()) {
AssessmentFacade assessmentFacade= (AssessmentFacade) iter.next();
assessmentFacade.setTitle(FormattedText.convertFormattedTextToPlaintext(assessmentFacade.getTitle()));
}
// get the managed bean, author and set the list
author.setAssessments(assessmentList);
prepareAllPublishedAssessmentsList(author, gradingService, publishedAssessmentService);
}
public void prepareAllPublishedAssessmentsList(AuthorBean author, GradingService gradingService, PublishedAssessmentService publishedAssessmentService) {
ArrayList publishedAssessmentList = publishedAssessmentService.getBasicInfoOfAllPublishedAssessments2(
PublishedAssessmentFacadeQueries.TITLE, true, AgentFacade.getCurrentSiteId());
HashMap inProgressCounts = gradingService.getInProgressCounts(AgentFacade.getCurrentSiteId());
HashMap submittedCounts = gradingService.getSubmittedCounts(AgentFacade.getCurrentSiteId());
ArrayList dividedPublishedAssessmentList = getTakeableList(publishedAssessmentList);
prepareActivePublishedAssessmentsList(author, (ArrayList) dividedPublishedAssessmentList.get(0), inProgressCounts, submittedCounts);
prepareInactivePublishedAssessmentsList(author, (ArrayList) dividedPublishedAssessmentList.get(1), inProgressCounts, submittedCounts);
}
public void prepareActivePublishedAssessmentsList(AuthorBean author, ArrayList<PublishedAssessmentFacade> activePublishedList, HashMap<Long, Integer> getInProgressCounts, HashMap<Long, Integer> submittedCounts) {
setInProgressAndSubmittedCount(activePublishedList, getInProgressCounts, submittedCounts);
author.setPublishedAssessments(activePublishedList);
}
public void prepareInactivePublishedAssessmentsList(AuthorBean author, ArrayList inactivePublishedList, HashMap<Long, Integer> getInProgressCounts, HashMap<Long, Integer> submittedCounts) {
setInProgressAndSubmittedCount(inactivePublishedList, getInProgressCounts, submittedCounts);
author.setInactivePublishedAssessments(inactivePublishedList);
boolean isAnyAssessmentRetractForEdit = false;
Iterator iter = inactivePublishedList.iterator();
while (iter.hasNext()) {
PublishedAssessmentFacade publishedAssessmentFacade = (PublishedAssessmentFacade) iter.next();
if (Integer.valueOf(3).equals(publishedAssessmentFacade.getStatus())) {
isAnyAssessmentRetractForEdit = true;
break;
}
}
if (isAnyAssessmentRetractForEdit) {
author.setIsAnyAssessmentRetractForEdit(true);
}
else {
author.setIsAnyAssessmentRetractForEdit(false);
}
}
private void setInProgressAndSubmittedCount(ArrayList<PublishedAssessmentFacade> list, HashMap<Long, Integer> inProgressCounts, HashMap<Long, Integer> submittedCounts) {
for (int i = 0; i < list.size(); i++) {
boolean hasAssessmentGradingData = true;
boolean hasInProgressCounts = true;
boolean hasSubmitted = true;
PublishedAssessmentFacade p = (PublishedAssessmentFacade) list.get(i);
Long publishedAssessmentId = p.getPublishedAssessmentId();
if (publishedAssessmentId != null) {
if (inProgressCounts.get(publishedAssessmentId) != null) {
p.setInProgressCount(((Integer) inProgressCounts.get(publishedAssessmentId)).intValue());
} else {
p.setInProgressCount(0);
hasInProgressCounts = false;
}
if (submittedCounts.get(publishedAssessmentId) != null) {
p.setSubmittedCount(((Integer) submittedCounts.get(publishedAssessmentId)).intValue());
} else {
p.setSubmittedCount(0);
hasSubmitted = false;
}
hasAssessmentGradingData = hasInProgressCounts || hasSubmitted;
}
p.setHasAssessmentGradingData(hasAssessmentGradingData);
}
}
private void removeDefaultTemplate(ArrayList templateList){
for (int i=0; i<templateList.size();i++){
AssessmentTemplateFacade a = (AssessmentTemplateFacade) templateList.get(i);
if ((a.getAssessmentBaseId()).equals(new Long("1"))){
templateList.remove(a);
return;
}
}
}
public ArrayList getTakeableList(ArrayList assessmentList) {
ArrayList list = new ArrayList();
ArrayList activeList = new ArrayList();
ArrayList inActiveList = new ArrayList();
for (int i = 0; i < assessmentList.size(); i++) {
PublishedAssessmentFacade f = (PublishedAssessmentFacade)assessmentList.get(i);
f.setTitle(FormattedText.convertFormattedTextToPlaintext(f.getTitle()));
if (isActive(f)) {
activeList.add(f);
}
else {
inActiveList.add(f);
}
}
list.add(activeList);
list.add(inActiveList);
return list;
}
public boolean isActive(PublishedAssessmentFacade f) {
//1. prepare our significant parameters
Integer status = f.getStatus();
Date currentDate = new Date();
Date startDate = f.getStartDate();
Date retractDate = f.getRetractDate();
Date dueDate = f.getDueDate();
if (!Integer.valueOf(1).equals(status)) {
return false;
}
if (startDate != null && startDate.after(currentDate)) {
return false;
}
if (dueDate != null && dueDate.before(currentDate)) {
return false;
}
if (retractDate != null && retractDate.before(currentDate)) {
return false;
}
return true;
}
}