/**
* ESUP-Portail Helpdesk - Copyright (c) 2004-2009 ESUP-Portail consortium.
*/
package org.esupportail.helpdesk.web.beans;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import org.esupportail.commons.dao.AbstractHibernatePaginator;
import org.esupportail.commons.services.logging.Logger;
import org.esupportail.commons.services.logging.LoggerImpl;
import org.esupportail.commons.utils.Assert;
import org.esupportail.helpdesk.domain.DomainService;
import org.esupportail.helpdesk.domain.TicketExtractor;
import org.esupportail.helpdesk.domain.beans.Department;
import org.esupportail.helpdesk.domain.beans.Ticket;
import org.esupportail.helpdesk.domain.beans.User;
import org.esupportail.helpdesk.web.controllers.SessionController;
import org.hibernate.Query;
import org.hibernate.ScrollableResults;
/**
* A paginator for the control panel.
*/
public class ControlPanelPaginator
extends AbstractHibernatePaginator<ControlPanelEntry> {
/**
* The serialization id.
*/
private static final long serialVersionUID = 1442322276601816512L;
/**
* A logger.
*/
private final Logger logger = new LoggerImpl(getClass());
/**
* The domain service.
*/
private DomainService domainService;
/**
* The ticket extractor.
*/
private TicketExtractor ticketExtractor;
/**
* The session controller.
*/
private SessionController sessionController;
/**
* The selected manager.
*/
private User selectedManager;
/**
* Constructor.
*/
public ControlPanelPaginator() {
super();
}
/**
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
Assert.notNull(this.domainService,
"property domainService of class " + this.getClass().getName() + " can not be null");
Assert.notNull(this.ticketExtractor,
"property ticketExtractor of class " + this.getClass().getName() + " can not be null");
Assert.notNull(this.sessionController,
"property sessionController of class " + this.getClass().getName()
+ " can not be null");
}
/**
* @see org.esupportail.commons.web.beans.AbstractPaginator#loadItemsInternal()
*/
@Override
@SuppressWarnings("unchecked")
protected void loadItemsInternal() {
List<ControlPanelEntry> controlPanelEntries = new ArrayList<ControlPanelEntry>();
List<Department> visibleDepartments =
getDomainService().getTicketViewDepartments(getCurrentUser(), getClient());
String queryString = ticketExtractor.getControlPanelQueryString(
getCurrentUser(), selectedManager, visibleDepartments);
if (queryString == null) {
setVisibleItems(controlPanelEntries);
setCurrentPageInternal(0);
setTotalItemsCount(0);
return;
}
Query query = getDaoService().getQuery(queryString);
ScrollableResults scrollableResults = query.scroll();
/*
* We set the max results to one more than the specified pageSize to
* determine if any more results exist (i.e. if there is a next page
* to display). The result set is trimmed down to just the pageSize
* before being displayed later (in getList()).
*/
if (logger.isDebugEnabled()) {
logger.debug("executing " + query.getQueryString() + "...");
}
query.setFirstResult(getCurrentPage() * getPageSize());
query.setMaxResults(getPageSize());
List<Ticket> tickets = query.list();
for (Ticket ticket : tickets) {
controlPanelEntries.add(new ControlPanelEntry(
ticket,
!domainService.hasTicketChangedSinceLastView(ticket, getCurrentUser()),
domainService.userCanViewTicket(
getCurrentUser(), ticket, visibleDepartments),
domainService.getBookmark(getCurrentUser(), ticket) != null));
}
setVisibleItems(controlPanelEntries);
// the total number of results is computed here since scrolling is not allowed when rendering
scrollableResults.last();
setTotalItemsCount(scrollableResults.getRowNumber() + 1);
if (logger.isDebugEnabled()) {
logger.debug("done.");
}
if (getVisibleItemsCountInternal() == 0 && getTotalItemsCountInternal() != 0) {
setCurrentPageInternal((getTotalItemsCountInternal() - 1) / getPageSize());
loadItemsInternal();
}
updateLoadTime();
}
/**
* @see org.esupportail.commons.web.beans.AbstractPaginator#getPageSizeInternal()
*/
@Override
public int getPageSizeInternal() {
return sessionController.getCurrentUser().getControlPanelPageSize();
}
/**
* @see org.esupportail.commons.web.beans.AbstractPaginator#setPageSizeInternal(int)
*/
@Override
protected void setPageSizeInternal(final int pageSize) {
sessionController.getCurrentUser().setControlPanelPageSize(pageSize);
domainService.updateUser(sessionController.getCurrentUser());
}
/**
* @return the current user.
*/
public User getCurrentUser() {
return sessionController.getCurrentUser();
}
/**
* @return the current user.
*/
public InetAddress getClient() {
return sessionController.getClient();
}
/**
* @param sessionController the sessionController to set
*/
public void setSessionController(final SessionController sessionController) {
this.sessionController = sessionController;
}
/**
* @param ticketExtractor the ticketExtractor to set
*/
public void setTicketExtractor(final TicketExtractor ticketExtractor) {
this.ticketExtractor = ticketExtractor;
}
/**
* @param domainService the domainService to set
*/
public void setDomainService(final DomainService domainService) {
this.domainService = domainService;
}
/**
* @return the ticketExtractor
*/
protected TicketExtractor getTicketExtractor() {
return ticketExtractor;
}
/**
* @return the selectedManager
*/
public User getSelectedManager() {
if (selectedManager != null) {
Department department = getCurrentUser().getControlPanelManagerDepartmentFilter();
if (!domainService.isDepartmentManager(department, selectedManager)) {
selectedManager = null;
}
}
return selectedManager;
}
/**
* @param selectedManager the selectedManager to set
*/
public void setSelectedManager(final User selectedManager) {
this.selectedManager = selectedManager;
}
/**
* @return the domainService
*/
protected DomainService getDomainService() {
return domainService;
}
}