/**
* ESUP-Portail Helpdesk - Copyright (c) 2004-2009 ESUP-Portail consortium.
*/
package org.esupportail.helpdesk.web.controllers;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
import org.esupportail.commons.aop.cache.RequestCache;
import org.esupportail.commons.services.authentication.AuthUtils;
import org.esupportail.commons.utils.Assert;
import org.esupportail.commons.utils.strings.StringUtils;
import org.esupportail.commons.web.beans.Paginator;
import org.esupportail.helpdesk.domain.ControlPanel;
import org.esupportail.helpdesk.domain.beans.ArchivedTicket;
import org.esupportail.helpdesk.domain.beans.Bookmark;
import org.esupportail.helpdesk.domain.beans.Category;
import org.esupportail.helpdesk.domain.beans.Department;
import org.esupportail.helpdesk.domain.beans.DepartmentManager;
import org.esupportail.helpdesk.domain.beans.Ticket;
import org.esupportail.helpdesk.domain.beans.User;
import org.esupportail.helpdesk.exceptions.ArchivedTicketNotFoundException;
import org.esupportail.helpdesk.exceptions.TicketNotFoundException;
import org.esupportail.helpdesk.web.beans.ControlPanelColumnOrderer;
import org.esupportail.helpdesk.web.beans.ControlPanelEntry;
/**
* The control panel controller.
*/
public class ControlPanelController extends AbstractContextAwareController {
/**
* The serialization id.
*/
private static final long serialVersionUID = -2407103812813627023L;
/**
* The paginator.
*/
private Paginator<ControlPanelEntry> paginator;
/**
* The ticket to view.
*/
private Ticket ticketToView;
/**
* The ticket to view.
*/
private Ticket ticketToMarkReadUnread;
/**
* The ticket to bookmark.
*/
private Ticket ticketToBookmark;
/**
* The ticket Controller.
*/
private TicketController ticketController;
/**
* The archived ticket Controller.
*/
private ArchivedTicketController archivedTicketController;
/**
* The columns orderer.
*/
private ControlPanelColumnOrderer columnsOrderer;
/**
* True for the column edit mode.
*/
private boolean editColumns;
/**
* The items for missing columns.
*/
private List<SelectItem> addColumnItems;
/**
* The name of the column to add.
*/
private String columnToAdd;
/**
* The string of the searched ticket.
*/
private String ticketNumberString;
/**
* Bean constructor.
*/
public ControlPanelController() {
super();
}
/**
* @see org.esupportail.helpdesk.web.controllers.AbstractContextAwareController#afterPropertiesSetInternal()
*/
@Override
public void afterPropertiesSetInternal() {
super.afterPropertiesSetInternal();
Assert.notNull(paginator,
"property paginator of class " + getClass().getName()
+ " can not be null");
Assert.notNull(ticketController,
"property ticketController of class " + getClass().getName()
+ " can not be null");
Assert.notNull(archivedTicketController,
"property archivedTicketController of class " + getClass().getName()
+ " can not be null");
}
/**
* @see org.esupportail.helpdesk.web.controllers.AbstractContextAwareController#reset()
*/
@Override
public void reset() {
super.reset();
ticketToView = null;
editColumns = false;
columnToAdd = null;
ticketNumberString = null;
ticketToMarkReadUnread = null;
ticketToBookmark = null;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return getClass().getSimpleName() + "#" + hashCode() + "[paginator=" + paginator
+ "]";
}
/**
* @return true if the current user is allowed to access the view.
*/
public boolean isPageAuthorized() {
return getCurrentUser() != null;
}
/**
* JSF callback.
* @return A String.
*/
public String enter() {
if (!isPageAuthorized()) {
return null;
}
User currentUser = getCurrentUser();
if (currentUser.getControlPanelPageSize() <= 0) {
currentUser.setControlPanelPageSize(paginator.getDefaultPageSize());
}
if (currentUser.getControlPanelUserInterface()) {
if (currentUser.getControlPanelUserDepartmentFilter() != null) {
if (!getDomainService().isDepartmentVisibleForTicketView(
currentUser, currentUser.getControlPanelUserDepartmentFilter(),
getSessionController().getClient())) {
currentUser.setControlPanelUserDepartmentFilter(null);
}
}
} else {
if (currentUser.getControlPanelManagerDepartmentFilter() != null) {
if (!getDomainService().isDepartmentManager(
currentUser.getControlPanelManagerDepartmentFilter(), currentUser)) {
currentUser.setControlPanelManagerDepartmentFilter(null);
}
}
}
getDomainService().updateUser(getCurrentUser());
paginator.setPageSize(getCurrentUser().getControlPanelPageSize());
refreshColumnOrderer();
paginator.forceReload();
return "navigationControlPanel";
}
/**
* JSF callback.
* @return A String.
*/
public String viewTicket() {
ticketToView = getDomainService().reloadTicket(ticketToView);
if (getDomainService().hasTicketChangedSince(ticketToView, paginator.getLoadTime())) {
addWarnMessage(
null, "CONTROL_PANEL.MESSAGE.TICKET_HAS_CHANGED",
String.valueOf(ticketToView.getId()));
return null;
}
if (!getDomainService().userCanViewTicket(getCurrentUser(), getClient(), ticketToView)) {
addUnauthorizedActionMessage();
return null;
}
ticketController.setTicket(ticketToView);
ticketController.setBackPage("controlPanel");
return "view";
}
/**
* JSF callback.
*/
public void markAllRead() {
Timestamp now = new Timestamp(System.currentTimeMillis());
for (ControlPanelEntry cpe : paginator.getVisibleItems()) {
getDomainService().setTicketLastView(getCurrentUser(), cpe.getTicket(), now);
}
paginator.forceReload();
}
/**
* JSF callback.
*/
public void markTicketRead() {
getDomainService().setTicketLastView(
getCurrentUser(), ticketToMarkReadUnread,
new Timestamp(System.currentTimeMillis()));
paginator.forceReload();
}
/**
* JSF callback.
*/
public void markTicketUnread() {
getDomainService().setTicketLastView(getCurrentUser(), ticketToMarkReadUnread, null);
paginator.forceReload();
}
/**
* JSF callback.
*/
public void bookmarkTicket() {
getDomainService().addBookmark(getCurrentUser(), ticketToBookmark);
paginator.forceReload();
}
/**
* JSF callback.
*/
public void unbookmarkTicket() {
Bookmark bookmark = getDomainService().getBookmark(getCurrentUser(), ticketToBookmark);
if (bookmark != null) {
getDomainService().deleteBookmark(bookmark);
}
paginator.forceReload();
}
/**
* JSF callback.
* @return A String.
*/
public String gotoTicket() {
if (!org.springframework.util.StringUtils.hasText(ticketNumberString)) {
addErrorMessage(null, "CONTROL_PANEL.MESSAGE.ENTER_TICKET_NUMBER");
ticketNumberString = null;
return null;
}
long ticketNumber;
try {
ticketNumberString = ticketNumberString.trim();
ticketNumber = Long.parseLong(ticketNumberString);
} catch (NumberFormatException e) {
addErrorMessage(null, "CONTROL_PANEL.MESSAGE.INVALID_TICKET_NUMBER", ticketNumberString);
return null;
}
Ticket ticket = null;
ArchivedTicket archivedTicket = null;
try {
ticket = getDomainService().getTicket(ticketNumber);
} catch (TicketNotFoundException e) {
try {
archivedTicket = getDomainService().getArchivedTicketByOriginalId(ticketNumber);
} catch (ArchivedTicketNotFoundException e2) {
addErrorMessage(null, "CONTROL_PANEL.MESSAGE.TICKET_NOT_FOUND",
String.valueOf(ticketNumber));
return null;
}
}
if (ticket != null) {
if (!getDomainService().userCanViewTicket(getCurrentUser(), getClient(), ticket)) {
addErrorMessage(null, "CONTROL_PANEL.MESSAGE.TICKET_NOT_VISIBLE",
String.valueOf(ticketNumber));
return null;
}
ticketController.setTicket(ticket);
return "gotoTicket";
}
if (!getDomainService().userCanViewArchivedTicket(getCurrentUser(), getClient(), archivedTicket)) {
addErrorMessage(null, "CONTROL_PANEL.MESSAGE.TICKET_NOT_VISIBLE", String.valueOf(ticketNumber));
return null;
}
archivedTicketController.setArchivedTicket(archivedTicket);
return "gotoArchivedTicket";
}
/**
* @return true if the current user is a department manager.
*/
@RequestCache
public boolean isCurrentUserDepartmentManager() {
return getDomainService().isDepartmentManager(getCurrentUser());
}
/**
* @return the paginator.
*/
public Paginator<ControlPanelEntry> getPaginator() {
return paginator;
}
/**
* @return the current user.
*/
@Override
public User getCurrentUser() {
return super.getCurrentUser();
}
/**
* @return the managerInvolvementItems
*/
@RequestCache
public List<SelectItem> getManagerInvolvementItems() {
List<SelectItem> managerInvolvementItems = new ArrayList<SelectItem>();
managerInvolvementItems.add(new SelectItem(
ControlPanel.MANAGER_INVOLVEMENT_FILTER_ANY,
getString("CONTROL_PANEL.INVOLVEMENT_FILTER.ANY")));
managerInvolvementItems.add(new SelectItem(
ControlPanel.MANAGER_INVOLVEMENT_FILTER_FREE,
getString("CONTROL_PANEL.INVOLVEMENT_FILTER.MANAGER.FREE")));
managerInvolvementItems.add(new SelectItem(
ControlPanel.MANAGER_INVOLVEMENT_FILTER_MANAGED,
getString("CONTROL_PANEL.INVOLVEMENT_FILTER.MANAGER.MANAGED")));
managerInvolvementItems.add(new SelectItem(
ControlPanel.MANAGER_INVOLVEMENT_FILTER_MANAGED_OR_FREE,
getString("CONTROL_PANEL.INVOLVEMENT_FILTER.MANAGER.MANAGED_OR_FREE")));
return managerInvolvementItems;
}
/**
* @return the managerManagerItems
*/
@RequestCache
public List<SelectItem> getManagerManagerItems() {
List<SelectItem> managerInvolvementItems = new ArrayList<SelectItem>();
Department department = getCurrentUser().getControlPanelManagerDepartmentFilter();
if (department != null) {
managerInvolvementItems.add(
new SelectItem("", getString("CONTROL_PANEL.MANAGER_FILTER.ANY")));
for (DepartmentManager manager : getDomainService().getDepartmentManagers(department)) {
managerInvolvementItems.add(
new SelectItem(manager.getUser(), manager.getUser().getDisplayName()));
}
}
return managerInvolvementItems;
}
/**
* @return the userInvolvementItems
*/
@RequestCache
public List<SelectItem> getUserInvolvementItems() {
List<SelectItem> userInvolvementItems = new ArrayList<SelectItem>();
userInvolvementItems.add(new SelectItem(
ControlPanel.USER_INVOLVEMENT_FILTER_ANY,
getString("CONTROL_PANEL.INVOLVEMENT_FILTER.ANY")));
userInvolvementItems.add(new SelectItem(
ControlPanel.USER_INVOLVEMENT_FILTER_OWNER,
getString("CONTROL_PANEL.INVOLVEMENT_FILTER.USER.OWNER")));
userInvolvementItems.add(new SelectItem(
ControlPanel.USER_INVOLVEMENT_FILTER_OWNER_OR_INVITED,
getString("CONTROL_PANEL.INVOLVEMENT_FILTER.USER.OWNER_OR_INVITED")));
userInvolvementItems.add(new SelectItem(
ControlPanel.USER_INVOLVEMENT_FILTER_INVITED,
getString("CONTROL_PANEL.INVOLVEMENT_FILTER.USER.INVITED")));
userInvolvementItems.add(new SelectItem(
ControlPanel.USER_INVOLVEMENT_FILTER_MONITORING,
getString("CONTROL_PANEL.INVOLVEMENT_FILTER.USER.MONITORING")));
return userInvolvementItems;
}
/**
* @return the interfaceItems
*/
@RequestCache
public List<SelectItem> getInterfaceItems() {
List<SelectItem> interfaceItems = new ArrayList<SelectItem>();
interfaceItems.add(new SelectItem(
Boolean.TRUE,
getString("CONTROL_PANEL.INTERFACE.USER")));
interfaceItems.add(new SelectItem(
Boolean.FALSE,
getString("CONTROL_PANEL.INTERFACE.MANAGER")));
return interfaceItems;
}
/**
* @return the statusItems
*/
@RequestCache
public List<SelectItem> getStatusItems() {
List<SelectItem> statusItems = new ArrayList<SelectItem>();
statusItems.add(new SelectItem(
ControlPanel.STATUS_FILTER_ANY,
getString("CONTROL_PANEL.STATUS_FILTER.ANY")));
statusItems.add(new SelectItem(
ControlPanel.STATUS_FILTER_OPENED,
getString("CONTROL_PANEL.STATUS_FILTER.OPENED")));
statusItems.add(new SelectItem(
ControlPanel.STATUS_FILTER_CLOSED,
getString("CONTROL_PANEL.STATUS_FILTER.CLOSED")));
return statusItems;
}
/**
* @return the managerDepartmentItems
*/
@RequestCache
public List<SelectItem> getManagerDepartmentItems() {
List<SelectItem> managerDepartmentItems = new ArrayList<SelectItem>();
managerDepartmentItems.add(
new SelectItem("", getString("CONTROL_PANEL.DEPARTMENT_FILTER.ANY")));
for (Department dep : getDomainService().getManagedDepartments(getCurrentUser())) {
managerDepartmentItems.add(new SelectItem(dep, dep.getLabel()));
}
return managerDepartmentItems;
}
/**
* Add category items recursively.
* @param items
* @param category
* @param prefix
*/
protected void addCategoryItems(
final List<SelectItem> items,
final Category category,
final String prefix) {
items.add(new SelectItem(
String.valueOf(category.getId()),
prefix + getString("CONTROL_PANEL.CATEGORY_FILTER.CATEGORY", category.getLabel())));
for (Category subCategory : getDomainService().getSubCategories(category)) {
addCategoryItems(items, subCategory, prefix + "- ");
}
}
/**
* @return the managerDepartmentItems
*/
@RequestCache
public List<SelectItem> getManagerCategorySpecItems() {
if (getCurrentUser().getControlPanelManagerDepartmentFilter() == null) {
return null;
}
List<SelectItem> items = new ArrayList<SelectItem>();
items.add(new SelectItem("*", getString("CONTROL_PANEL.CATEGORY_FILTER.ANY")));
items.add(new SelectItem("member", getString("CONTROL_PANEL.CATEGORY_FILTER.MEMBER")));
for (Category category : getDomainService().getRootCategories(
getCurrentUser().getControlPanelManagerDepartmentFilter())) {
addCategoryItems(items, category, "");
}
return items;
}
/**
* @return the managerCategoryFilterSpec
*/
@RequestCache
public String getManagerCategoryFilterSpec() {
User user = getCurrentUser();
String spec = null;
if (user.getControlPanelCategoryMemberFilter()) {
spec = "member";
} else if (user.getControlPanelCategoryFilter() == null) {
spec = "*";
} else {
spec = String.valueOf(user.getControlPanelCategoryFilter().getId());
}
return spec;
}
/**
* Set the managerCategoryFilterSpec.
* @param managerCategorySpec
*/
public void setManagerCategoryFilterSpec(final String managerCategorySpec) {
User user = getCurrentUser();
if ("member".equals(managerCategorySpec)) {
user.setControlPanelCategoryMemberFilter(true);
user.setControlPanelCategoryFilter(null);
} else {
user.setControlPanelCategoryMemberFilter(false);
if ("*".equals(managerCategorySpec)) {
user.setControlPanelCategoryFilter(null);
} else {
user.setControlPanelCategoryFilter(
getDomainService().getCategory(Long.valueOf(managerCategorySpec)));
}
}
}
/**
* @return the userDepartmentItems
*/
@RequestCache
public List<SelectItem> getUserDepartmentItems() {
List<SelectItem> userDepartmentItems = new ArrayList<SelectItem>();
userDepartmentItems.add(
new SelectItem("", getString("CONTROL_PANEL.DEPARTMENT_FILTER.ANY")));
for (Department dep : getDomainService().getTicketViewDepartments(
getCurrentUser(), getClient())) {
userDepartmentItems.add(new SelectItem(dep, dep.getLabel()));
}
return userDepartmentItems;
}
/**
* JSF callback.
*/
public void refreshColumnOrderer() {
columnsOrderer = new ControlPanelColumnOrderer(getCurrentUser());
addColumnItems = new ArrayList<SelectItem>();
List<String> missingColumnNames = columnsOrderer.getMissingColumnNames();
if (!missingColumnNames.isEmpty()) {
addColumnItems.add(new SelectItem("", getString("CONTROL_PANEL.COLUMNS.CHOOSE")));
for (String missingColumnName : missingColumnNames) {
addColumnItems.add(new SelectItem(
missingColumnName,
getString("CONTROL_PANEL.COLUMNS." + missingColumnName)));
}
}
}
/**
* @return the userDepartmentItems
*/
public List<SelectItem> getAddColumnItems() {
return addColumnItems;
}
/**
* @return the number of columns
*/
public int getColumnsNumber() {
return columnsOrderer.getColumnsNumber();
}
/**
* Move a column right.
* @param index the index of the column to move
*/
public void setColumnToMoveRight(final Long index) {
columnsOrderer.moveColumnRight(index.intValue());
}
/**
* Move a column left.
* @param index the index of the column to move
*/
public void setColumnToMoveLeft(final Long index) {
columnsOrderer.moveColumnLeft(index.intValue());
}
/**
* Remove a column.
* @param index the index of the column to remove
*/
public void setColumnToRemove(final Long index) {
columnsOrderer.removeColumn(index.intValue());
}
/**
* JSF callback.
*/
public void addColumn() {
if (columnToAdd != null) {
columnsOrderer.addColumn(columnToAdd);
}
columnToAdd = null;
updateColumns();
}
/**
* JSF callback.
*/
public void resetColumns() {
getCurrentUser().setControlPanelColumns(null);
getDomainService().updateUser(getCurrentUser());
refreshColumnOrderer();
}
/**
* JSF callback.
*/
public void updateColumns() {
getCurrentUser().setControlPanelColumns(columnsOrderer.asString());
getDomainService().updateUser(getCurrentUser());
refreshColumnOrderer();
}
/**
* @return the first part of the sort order.
*/
public String getFirstOrderPartSpec() {
return getCurrentUser().getControlPanelOrder().getFirstOrderPart().toString();
}
/**
* JSF callback.
* @param partSpec
*/
public void setFirstOrderPartSpec(final String partSpec) {
getCurrentUser().getControlPanelOrder().setFirstOrderPart(partSpec);
getDomainService().updateUser(getCurrentUser());
paginator.forceReload();
}
/**
* @return a permanent link to the page for application users.
*/
public String getApplicationPermLink() {
return getUrlBuilder().getControlPanelUrl(AuthUtils.APPLICATION);
}
/**
* @return a permanent link to the page for CAS users.
*/
public String getCasPermLink() {
return getUrlBuilder().getControlPanelUrl(AuthUtils.CAS);
}
/**
* @return a permanent link to the page for Shibboleth users.
*/
public String getShibbolethPermLink() {
return getUrlBuilder().getControlPanelUrl(AuthUtils.SHIBBOLETH);
}
/**
* @return a permanent link to the page for specific users.
*/
public String getSpecificPermLink() {
return getUrlBuilder().getControlPanelUrl(AuthUtils.SPECIFIC);
}
/**
* @param paginator the paginator to set
*/
public void setPaginator(final Paginator<ControlPanelEntry> paginator) {
this.paginator = paginator;
}
/**
* @param ticketToView the ticketToView to set
*/
public void setTicketToView(final Ticket ticketToView) {
this.ticketToView = ticketToView;
}
/**
* @param ticketController the ticketController to set
*/
public void setTicketController(final TicketController ticketController) {
this.ticketController = ticketController;
}
/**
* @return the column orderer
*/
public ControlPanelColumnOrderer getColumnsOrderer() {
return columnsOrderer;
}
/**
* @return the editColumns
*/
public boolean isEditColumns() {
return editColumns;
}
/**
* Toggle the edit column mode.
*/
public void toggleEditColumns() {
editColumns = !editColumns;
}
/**
* @return the columnToAdd
*/
public String getColumnToAdd() {
return columnToAdd;
}
/**
* @param columnToAdd the columnToAdd to set
*/
public void setColumnToAdd(final String columnToAdd) {
this.columnToAdd = StringUtils.nullIfEmpty(columnToAdd);
}
/**
* @return the ticketNumberString
*/
public String getTicketNumberString() {
return ticketNumberString;
}
/**
* @param ticketNumberString the ticketNumberString to set
*/
public void setTicketNumberString(final String ticketNumberString) {
this.ticketNumberString = ticketNumberString;
}
/**
* @return the archivedTicketController
*/
public ArchivedTicketController getArchivedTicketController() {
return archivedTicketController;
}
/**
* @param archivedTicketController the archivedTicketController to set
*/
public void setArchivedTicketController(
final ArchivedTicketController archivedTicketController) {
this.archivedTicketController = archivedTicketController;
}
/**
* @param ticketToMarkReadUnread the ticketToMarkReadUnread to set
*/
public void setTicketToMarkReadUnread(final Ticket ticketToMarkReadUnread) {
this.ticketToMarkReadUnread = ticketToMarkReadUnread;
}
/**
* @return the ticketToBookmark
*/
protected Ticket getTicketToBookmark() {
return ticketToBookmark;
}
/**
* @param ticketToBookmark the ticketToBookmark to set
*/
public void setTicketToBookmark(final Ticket ticketToBookmark) {
this.ticketToBookmark = ticketToBookmark;
}
}