package org.sakaiproject.warehouse.sakai.assignment;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.assignment.api.Assignment;
import org.sakaiproject.assignment.api.AssignmentService;
import org.sakaiproject.assignment.api.AssignmentSubmission;
import org.sakaiproject.javax.PagingPosition;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.site.api.SiteService.SelectionType;
import org.sakaiproject.site.api.SiteService.SortType;
import org.sakaiproject.user.api.User;
import org.sakaiproject.user.api.UserNotDefinedException;
import org.sakaiproject.user.cover.UserDirectoryService;
import org.sakaiproject.entity.api.ResourceProperties;
public class AssignmentWarehouseService {
private SiteService siteService;
private List siteTypes;
private AssignmentService assService;
private List roles;
private final Log logger = LogFactory
.getLog(AssignmentWarehouseService.class);
public List getDWAssignmentStatusAll() {
List assignmentStatus = new ArrayList();
List sites_list = getAllCourseSites();
logger.info("Gathering " + sites_list.size()
+ " course sites to set....");
Iterator sites = sites_list.iterator();
while (sites.hasNext()) {
// here we want to loop through each
Site site = (Site) sites.next();
//Set siteMembers = site.getUsersHasRole("Student");
Set siteMembers = getUsersByRole(site, getRoles());
Iterator assignments = assService.getAssignmentsForContext(site
.getId());
while (assignments.hasNext()) {
Assignment as = (Assignment) assignments.next();
Iterator members = siteMembers.iterator();
// for each member in the site, get this assignments status
// if non exists then we need to persist that as well
while (members.hasNext()) {
try {
User student = UserDirectoryService.getUser((String)members.next());
AssignmentStatus aStats = new AssignmentStatus();
AssignmentSubmission asub = assService.getSubmission(as.getId(), student);
setAssignmentStats(aStats, as, asub, site, student);
//setGoalRatings(as,student,aStats);
assignmentStatus.add(aStats);
} catch (UserNotDefinedException e) {
e.printStackTrace();
}
}
}
}
return assignmentStatus;
}
private void setAssignmentStats(AssignmentStatus aStats, Assignment as,
AssignmentSubmission asub, Site site, User student) {
if (asub == null) {
aStats.setAssignment_grade("n/a");
aStats.setAssignment_status("Not submitted");
} else {
aStats.setAssignment_grade(asub.getGrade());
aStats.setAssignment_status(asub.getStatus());
}
aStats.setAssignment_id(as.getId());
aStats.setStudent_first_name(student.getFirstName());
aStats.setStudent_last_name(student.getLastName());
aStats.setUser_id(student.getId());
aStats.setCourse_title(site.getTitle());
aStats.setAssignment_title(as.getTitle());
ResourceProperties srp = student.getProperties();
/*aStats.setAdvisor(srp.getProperty(UserProperties.ADVISOR));
aStats.setClass_year(srp.getProperty(UserProperties.CLASS_YEAR));
aStats.setDistrict(srp.getProperty(UserProperties.DISTRICT));
aStats.setSchool(srp.getProperty(UserProperties.SCHOOL_NUMBER)); */
ResourceProperties siteRP = site.getProperties();
/* aStats.setCourse_code(siteRP.getProperty(RINETCourse.COURSE_NUMBER));
aStats.setCourse_section(siteRP.getProperty(RINETCourse.COURSE_SECTION));
aStats.setCourse_term(siteRP.getProperty(RINETCourse.COURSE_TERM));
aStats.setCourse_start_date(siteRP.getProperty(RINETCourse.COURSE_START_DATE)); */
String maintainRole = site.getMaintainRole();
Set instructors = site.getUsersHasRole(maintainRole);
String instructorsNames = getInstructors(instructors);
aStats.setInstructor(instructorsNames);
}
private String getInstructors(Set instructors) {
String result = "";
Iterator it = instructors.iterator();
while (it.hasNext()) {
try{
User inst = UserDirectoryService.getUser((String)it.next());
if(inst==null || inst.getDisplayId().equalsIgnoreCase("admin"))
continue;
if (result.length() > 0) {
result = result.concat(", ");
}
result = result.concat(inst.getFirstName() + " " + inst.getLastName());
}catch(UserNotDefinedException unde){unde.printStackTrace();}
}
return result;
}
public List getAllCourseSites() {
// List getSites(SelectionType type, Object ofType, String criteria, Map
// propertyCriteria, SortType sort, PagingPosition page);
PagingPosition pp = new PagingPosition();
pp.setPaging(true);
return siteService.getSites(SelectionType.ANY, getSiteTypes(), null, null,
SortType.NONE, null);
}
protected Set getUsersByRole(Site site, List roles){
Set users = new HashSet();
if(site==null || roles==null || roles.size()<1)
return users;
int rolesSize = roles.size();
for(int r = 0; r < rolesSize; r++){
users.addAll(site.getUsersHasRole((String)roles.get(r)));
}
return users;
}
public AssignmentService getAssService() {
return assService;
}
public void setAssService(AssignmentService assService) {
this.assService = assService;
}
public SiteService getSiteService() {
return siteService;
}
public void setSiteService(SiteService siteService) {
this.siteService = siteService;
}
public List getSiteTypes() {
return siteTypes;
}
public void setSiteTypes(List siteTypes) {
this.siteTypes = siteTypes;
}
public List getRoles() {
return roles;
}
public void setRoles(List roles) {
this.roles = roles;
}
}