package org.sakaiproject.tool.assessment.ui.listener.author; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.faces.event.ActionEvent; import javax.faces.event.ActionListener; import javax.faces.event.ValueChangeEvent; import javax.faces.event.ValueChangeListener; import javax.faces.model.SelectItem; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.assessment.data.dao.assessment.EventLogData; import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAccessControl; import org.sakaiproject.tool.assessment.facade.AgentFacade; import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacade; import org.sakaiproject.tool.assessment.services.assessment.EventLogService; import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService; import org.sakaiproject.tool.assessment.ui.bean.author.EventLogBean; import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil; import org.sakaiproject.tool.assessment.util.BeanSort; public class EventLogListener implements ActionListener, ValueChangeListener { private static Log log = LogFactory.getLog(EventLogListener.class); private static BeanSort bs; private static String userFilterString = null; public EventLogListener() { userFilterString = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.EventLogMessages", "search_hint"); } public void processAction(ActionEvent ae) { log.debug("*****Log: inside EventLogListener =debugging ActionEvent: " + ae); EventLogBean eventLog = (EventLogBean) ContextUtil.lookupBean("eventLog"); String clear = ContextUtil.lookupParam("clear"); if (clear != null) { eventLog.setFilteredUser(null); } processPageLoad(eventLog); } /** * Process the ValueChangeEvent for when the Assessment filter dropdown changes */ public void processValueChange(ValueChangeEvent event) { log.debug("*****Log: inside EventLogListener =debugging ValueChangeEvent: " + event); EventLogBean eventLog = (EventLogBean) ContextUtil.lookupBean("eventLog"); eventLog.setFilteredAssessmentId((Long)event.getNewValue()); processPageLoad(eventLog); } private List<EventLogData> updateData(List<EventLogData> eventLogDataList) { List<EventLogData> updatedEventLogDataList = new ArrayList<EventLogData>(); PublishedAssessmentService assessmentService = new PublishedAssessmentService(); Map<String, PublishedAccessControl> assessmentIdSettingMap = new HashMap<String, PublishedAccessControl>(); PublishedAccessControl control = null; for(EventLogData data:eventLogDataList) { String assessmentId = data.getAssessmentIdStr(); if(assessmentIdSettingMap.containsKey(assessmentId)) { control = (PublishedAccessControl)assessmentIdSettingMap.get(assessmentId); } else { PublishedAssessmentFacade assessment = assessmentService.getSettingsOfPublishedAssessment(assessmentId); control = (PublishedAccessControl)assessment.getAssessmentAccessControl(); assessmentIdSettingMap.put(assessmentId, control); } String releaseInfo = control.getReleaseTo(); if("Anonymous Users".equals(releaseInfo)) { data.setUserDisplay("N/A"); data.setIpAddress("N/A"); updatedEventLogDataList.add(data); } else { updatedEventLogDataList.add(data); } } return updatedEventLogDataList; } /** * These things need to happen each time the page loads. * @param eventLog */ private void processPageLoad(EventLogBean eventLog) { int numPerPage = 20; EventLogService eventLogService = new EventLogService(); String siteId = AgentFacade.getCurrentSiteId(); String siteTitle = null; try { siteTitle = SiteService.getSite(siteId).getTitle(); } catch (IdUnusedException e) { log.warn("can't find title for siteId: " + siteId, e); } if (eventLog.getFilteredUser() != null && eventLog.getFilteredUser().equals(userFilterString)) { eventLog.setFilteredUser(null); } List<EventLogData> eventLogDataList = eventLogService.getEventLogData(siteId, eventLog.getFilteredAssessmentId(), eventLog.getFilteredUser()); //check anonymous users setting, update user name and ip address to N/A List<EventLogData> updateEventLogDataList = updateData(eventLogDataList); List<Object[]> titles = eventLogService.getTitlesFromEventLogBySite(siteId); eventLog.setAssessments(initAssessmentListFilter(titles)); applySort(updateEventLogDataList, eventLog); Map<Integer, List<EventLogData>> pageDataMap = createMap(updateEventLogDataList, numPerPage); eventLog.setPageDataMap(pageDataMap); eventLog.setEventLogDataList(pageDataMap.get(Integer.valueOf(1))); eventLog.setSiteId(siteId); eventLog.setSiteTitle(siteTitle); eventLog.setPageNumber(1); if(pageDataMap.size()>1) { eventLog.setHasNextPage(Boolean.TRUE); eventLog.setHasPreviousPage(Boolean.FALSE); } else { eventLog.setHasNextPage(Boolean.FALSE); eventLog.setHasPreviousPage(Boolean.FALSE); } } /** * Init the data in the Assessment filter dropdown * @param assessmentTitles List of titles * @return */ private List<SelectItem> initAssessmentListFilter(List<Object[]> assessmentTitles) { List<SelectItem> assessments = new ArrayList<SelectItem>(); String allStr = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.EventLogMessages", "filterAll"); assessments.add(new SelectItem((long)-1, allStr)); for (Object[] assessment : assessmentTitles) { Long id = (Long)assessment[0]; String title = (String)assessment[1]; assessments.add(new SelectItem(id, title)); } return assessments; } /** * Apply sorting * @param dataList * @param bean */ private void applySort(List<EventLogData> dataList, EventLogBean bean) { if (ContextUtil.lookupParam("sortBy") != null && !ContextUtil.lookupParam("sortBy").trim().equals("")){ bean.setSortType(ContextUtil.lookupParam("sortBy")); } boolean sortAscending = true; if (ContextUtil.lookupParam("sortAscending") != null && !ContextUtil.lookupParam("sortAscending").trim().equals("")){ sortAscending = Boolean.valueOf(ContextUtil.lookupParam("sortAscending")).booleanValue(); bean.setSortAscending(sortAscending); } String sortProperty = bean.getSortType(); bs = new BeanSort(dataList, sortProperty); if ((sortProperty).equals("title")) bs.toStringSort(); if ((sortProperty).equals("userDisplay")) bs.toStringSort(); if ((sortProperty).equals("errorMsg")) bs.toStringSort(); if ((sortProperty).equals("startDate")) bs.toDateSort(); if ((sortProperty).equals("endDate")) bs.toDateSort(); if ((sortProperty).equals("ipAddress")) bs.toIPAddressSort(); if (bean.isSortAscending()) { dataList = (List)bs.sort(); } else { dataList= (List)bs.sortDesc(); } bean.setEventLogDataList(dataList); } private Map<Integer, List<EventLogData>> createMap(List<EventLogData> eventLogAllDataList, int numPerPage) { Map<Integer, List<EventLogData>> pageDataMap = new HashMap<Integer, List<EventLogData>>(); List<EventLogData> dataListTempt = new ArrayList<EventLogData>(); int listLength = eventLogAllDataList.size(); Iterator<EventLogData> it= eventLogAllDataList.iterator(); int dataNumber = 0; int pageNumber = 1; List<EventLogData> dataList = new ArrayList<EventLogData>(); while(dataNumber < listLength ) { for(int i = 0; i <numPerPage; i++) { if(it.hasNext()) { dataListTempt.add(it.next()); dataNumber++; }else break; } dataList = copyData(dataListTempt); pageDataMap.put(Integer.valueOf(pageNumber), dataList); dataListTempt.removeAll(dataListTempt); pageNumber ++; } return pageDataMap; } private List<EventLogData> copyData (List<EventLogData> dataList) { List<EventLogData> list = new ArrayList<EventLogData>(); for(int i = 0; i < dataList.size(); i++) { list.add(dataList.get(i)); } return list; } }