/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
* <p>
* Initial code contributed and copyrighted by<br>
* 2012 by frentix GmbH, http://www.frentix.com
*/
package org.olat.user;
import java.util.ArrayList;
import java.util.List;
import org.olat.commons.calendar.CalendarManager;
import org.olat.commons.calendar.CalendarModule;
import org.olat.commons.calendar.model.CalendarUserConfiguration;
import org.olat.commons.calendar.ui.WeeklyCalendarController;
import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
import org.olat.core.CoreSpringFactory;
import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
import org.olat.core.commons.modules.bc.FolderConfig;
import org.olat.core.commons.modules.bc.FolderRunController;
import org.olat.core.commons.modules.bc.vfs.OlatNamedContainerImpl;
import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.panel.Panel;
import org.olat.core.gui.components.stack.TooledStackedPanel;
import org.olat.core.gui.components.tree.GenericTreeModel;
import org.olat.core.gui.components.tree.GenericTreeNode;
import org.olat.core.gui.components.tree.MenuTree;
import org.olat.core.gui.components.tree.TreeNode;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.MainLayoutBasicController;
import org.olat.core.gui.control.generic.dtabs.Activateable2;
import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.context.ContextEntry;
import org.olat.core.id.context.HistoryPoint;
import org.olat.core.id.context.StateEntry;
import org.olat.core.util.StringHelper;
import org.olat.core.util.UserSession;
import org.olat.core.util.mail.ContactList;
import org.olat.core.util.mail.ContactMessage;
import org.olat.core.util.resource.OresHelper;
import org.olat.core.util.tree.TreeHelper;
import org.olat.core.util.vfs.callbacks.ReadOnlyCallback;
import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
import org.olat.modules.co.ContactFormController;
import org.olat.portfolio.PortfolioModule;
import org.olat.portfolio.manager.InvitationDAO;
import org.olat.portfolio.ui.EPMapRunController;
import org.olat.portfolio.ui.EPMapRunViewOption;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Initial Date: July 26, 2005
*
* @author Alexander Schneider
* @author Florian Gnägi
*
* Comment: Controller creates a main layout controller that represents
* the users visiting card. It has access to the users homepage, public
* folder, public calendar items, published eportfolios and an email
* form.
*
*/
public class UserInfoMainController extends MainLayoutBasicController implements Activateable2 {
private static final String CMD_HOMEPAGE = "homepage";
private static final String CMD_CALENDAR = "calendar";
private static final String CMD_FOLDER = "userfolder";
private static final String CMD_CONTACT = "contact";
private static final String CMD_PORTFOLIO = "portfolio";
private MenuTree menuTree;
private Panel main;
private TooledStackedPanel toolbarPanel;
public static final OLATResourceable BUSINESS_CONTROL_TYPE_FOLDER = OresHelper.createOLATResourceableTypeWithoutCheck(FolderRunController.class
.getSimpleName());
private EPMapRunController portfolioController;
private FolderRunController folderRunController;
private WeeklyCalendarController calendarController;
private ContactFormController contactFormController;
private HomePageDisplayController homePageDisplayController;
private final Identity chosenIdentity;
private final String firstLastName;
private HistoryPoint launchedFromPoint;
@Autowired
private UserManager userManager;
@Autowired
private InvitationDAO invitationDao;
@Autowired
private CalendarModule calendarModule;
@Autowired
private CalendarManager calendarManager;
/**
* @param ureq
* @param wControl
* @param chosenIdentity
*/
public UserInfoMainController(UserRequest ureq, WindowControl wControl, Identity chosenIdentity,
boolean showRootNode, boolean showToolbar) {
super(ureq, wControl);
this.chosenIdentity = chosenIdentity;
UserSession session = ureq.getUserSession();
if(showToolbar && session != null && session.getHistoryStack() != null && session.getHistoryStack().size() >= 2) {
// Set previous business path as back link for this course - brings user back to place from which he launched the course
List<HistoryPoint> stack = session.getHistoryStack();
for(int i=stack.size() - 2; i-->0; ) {
HistoryPoint point = stack.get(stack.size() - 2);
if(point.getEntries().size() > 0) {
OLATResourceable ores = point.getEntries().get(0).getOLATResourceable();
if(!chosenIdentity.getKey().equals(ores.getResourceableId())) {
launchedFromPoint = point;
break;
}
}
}
}
main = new Panel("userinfomain");
Controller homeCtrl = createComponent(ureq, CMD_HOMEPAGE);
main.setContent(homeCtrl.getInitialComponent());
firstLastName = userManager.getUserDisplayName(chosenIdentity);
// Navigation menu
menuTree = new MenuTree("menuTree");
GenericTreeModel tm = buildTreeModel(firstLastName);
menuTree.setTreeModel(tm);
menuTree.setSelectedNodeId(tm.getRootNode().getChildAt(0).getIdent());
menuTree.addListener(this);
menuTree.setRootVisible(showRootNode);
// override if user is guest, don't show anything
if (ureq.getUserSession().getRoles().isGuestOnly()) {
main = new Panel("empty");
menuTree = null;
}
LayoutMain3ColsController columnLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), menuTree, main, "userinfomain");
listenTo(columnLayoutCtr);
if(showToolbar) {
toolbarPanel = new TooledStackedPanel("courseStackPanel", getTranslator(), this);
toolbarPanel.setInvisibleCrumb(0); // show root level
toolbarPanel.setToolbarEnabled(false);
toolbarPanel.setShowCloseLink(true, true);
toolbarPanel.pushController(firstLastName, columnLayoutCtr);
putInitialPanel(toolbarPanel);
} else {
putInitialPanel(columnLayoutCtr.getInitialComponent());
}
}
@Override
protected void doDispose() {
//
}
@Override
public void event(UserRequest ureq, Component source, Event event) {
if (source == menuTree) {
if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) { // goto
TreeNode selTreeNode = menuTree.getSelectedNode();
String cmd = (String)selTreeNode.getUserObject();
Controller controller = createComponent(ureq, cmd);
if(controller != null) {
main.setContent(controller.getInitialComponent());
}
}
} else if(source == toolbarPanel) {
if (event == Event.CLOSE_EVENT) {
doClose(ureq);
}
}
}
@Override
public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
if(entries == null || entries.isEmpty()) return;
String type = entries.get(0).getOLATResourceable().getResourceableTypeName();
if(StringHelper.containsNonWhitespace(type)) {
Controller controller = createComponent(ureq, type);
if(controller != null) {
if(controller instanceof Activateable2) {
List<ContextEntry> subEntries = entries.subList(1, entries.size());
((Activateable2)controller).activate(ureq, subEntries, entries.get(0).getTransientState());
}
main.setContent(controller.getInitialComponent());
TreeNode selectedNode = TreeHelper.findNodeByUserObject(type, menuTree.getTreeModel().getRootNode());
if(selectedNode != null) {
menuTree.setSelectedNode(selectedNode);
}
}
}
}
/**
* Generates the archiver menu
*
* @return The generated menu tree model
* @param firstLastName
*/
private GenericTreeModel buildTreeModel(String name) {
GenericTreeNode root, gtn;
GenericTreeModel gtm = new GenericTreeModel();
root = new GenericTreeNode();
root.setTitle(name);
root.setAltText(name);
root.setAccessible(false);
gtm.setRootNode(root);
gtn = new GenericTreeNode();
gtn.setTitle(translate("menu.homepage"));
gtn.setUserObject(CMD_HOMEPAGE);
gtn.setAltText(translate("menu.homepage.alt"));
root.addChild(gtn);
// following user info elements are only shown for undeleted and real
// users (not invited
// eportfolio users)
boolean isInvitee = invitationDao.isInvitee(chosenIdentity);
boolean isDeleted = chosenIdentity.getStatus().equals(Identity.STATUS_DELETED);
if ( !isDeleted && ! isInvitee) {
if(calendarModule.isEnablePersonalCalendar()) {
gtn = new GenericTreeNode();
gtn.setTitle(translate("menu.calendar"));
gtn.setUserObject(CMD_CALENDAR);
gtn.setAltText(translate("menu.calendar.alt"));
gtn.setCssClass("o_visiting_card_calendar");
root.addChild(gtn);
}
gtn = new GenericTreeNode();
gtn.setTitle(translate("menu.folder"));
gtn.setUserObject(CMD_FOLDER);
gtn.setAltText(translate("menu.folder.alt"));
gtn.setCssClass("o_visiting_card_folder");
root.addChild(gtn);
}
if ( !isDeleted) {
gtn = new GenericTreeNode();
gtn.setTitle(translate("menu.contact"));
gtn.setUserObject(CMD_CONTACT);
gtn.setAltText(translate("menu.contact.alt"));
gtn.setCssClass("o_visiting_card_contact");
root.addChild(gtn);
}
if ( !isDeleted && ! isInvitee) {
PortfolioModule portfolioModule = (PortfolioModule) CoreSpringFactory.getBean("portfolioModule");
if (portfolioModule.isEnabled()) {
gtn = new GenericTreeNode();
gtn.setTitle(translate("menu.portfolio"));
gtn.setUserObject(CMD_PORTFOLIO);
gtn.setAltText(translate("menu.portfolio.alt"));
gtn.setCssClass("o_visiting_card_portfolio");
root.addChild(gtn);
}
}
return gtm;
}
private Controller createComponent(UserRequest ureq, String menuCommand) {
Controller controller = null;
if (menuCommand.equalsIgnoreCase(CMD_HOMEPAGE)) {
controller = doOpenHomepage(ureq);
} else if (menuCommand.equalsIgnoreCase(CMD_CALENDAR)) {
controller = doOpenCalendar(ureq);
} else if (menuCommand.equalsIgnoreCase(CMD_FOLDER)) {
controller = doOpenFolder(ureq);
} else if (menuCommand.equalsIgnoreCase(CMD_CONTACT)) {
controller = doOpenContact(ureq);
} else if (menuCommand.equalsIgnoreCase(CMD_PORTFOLIO)) {
controller = doOpenPortfolio(ureq);
}
return controller;
}
private HomePageDisplayController doOpenHomepage(UserRequest ureq) {
removeAsListenerAndDispose(homePageDisplayController);
HomePageConfigManager hpcm = HomePageConfigManagerImpl.getInstance();
HomePageConfig homePageConfig = hpcm.loadConfigFor(chosenIdentity.getName());
removeAsListenerAndDispose(homePageDisplayController);
homePageDisplayController = new HomePageDisplayController(ureq, getWindowControl(), chosenIdentity, homePageConfig);
listenTo(homePageDisplayController);
return homePageDisplayController;
}
private WeeklyCalendarController doOpenCalendar(UserRequest ureq) {
removeAsListenerAndDispose(calendarController);
KalendarRenderWrapper calendarWrapper = calendarManager.getPersonalCalendar(chosenIdentity);
CalendarUserConfiguration config = calendarManager.findCalendarConfigForIdentity(calendarWrapper.getKalendar(), getIdentity());
if (config != null) {
calendarWrapper.setConfiguration(config);
}
calendarWrapper.setPrivateEventsVisible(chosenIdentity.equals(ureq.getIdentity()));
if (ureq.getUserSession().getRoles().isOLATAdmin() || chosenIdentity.equals(ureq.getIdentity())) {
calendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
} else {
calendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_ONLY);
}
List<KalendarRenderWrapper> calendars = new ArrayList<KalendarRenderWrapper>();
calendars.add(calendarWrapper);
OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_CALENDAR);
WindowControl bwControl = addToHistory(ureq, ores, null);
calendarController = new WeeklyCalendarController(ureq, bwControl, calendars,
WeeklyCalendarController.CALLER_PROFILE, false);
listenTo(calendarController);
return calendarController;
}
private FolderRunController doOpenFolder(UserRequest ureq) {
removeAsListenerAndDispose(folderRunController);
String chosenUserFolderRelPath = FolderConfig.getUserHome(chosenIdentity.getName()) + "/public";
OlatRootFolderImpl rootFolder = new OlatRootFolderImpl(chosenUserFolderRelPath, null);
String rootFolderName = StringHelper.escapeHtml(firstLastName);
OlatNamedContainerImpl namedFolder = new OlatNamedContainerImpl(rootFolderName, rootFolder);
//decided in plenum to have read only view in the personal visiting card, even for admin
VFSSecurityCallback secCallback = new ReadOnlyCallback();
namedFolder.setLocalSecurityCallback(secCallback);
OLATResourceable ores = OresHelper.createOLATResourceableType("userfolder");
WindowControl bwControl = addToHistory(ureq, ores, null);
folderRunController = new FolderRunController(namedFolder, false, true, false, ureq, bwControl);
folderRunController.setResourceURL("[Identity:" + chosenIdentity.getKey() + "][userfolder:0]");
listenTo(folderRunController);
return folderRunController;
}
private ContactFormController doOpenContact(UserRequest ureq) {
removeAsListenerAndDispose(contactFormController);
ContactMessage cmsg = new ContactMessage(ureq.getIdentity());
ContactList emailList = new ContactList(firstLastName);
emailList.add(chosenIdentity);
cmsg.addEmailTo(emailList);
OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_CONTACT);
WindowControl bwControl = addToHistory(ureq, ores, null);
contactFormController = new ContactFormController(ureq, bwControl, true, false, false, cmsg);
listenTo(contactFormController);
return contactFormController;
}
private EPMapRunController doOpenPortfolio(UserRequest ureq) {
removeAsListenerAndDispose(portfolioController);
OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_PORTFOLIO);
WindowControl bwControl = addToHistory(ureq, ores, null);
portfolioController = new EPMapRunController(ureq, bwControl, false, EPMapRunViewOption.OTHER_MAPS, chosenIdentity);
listenTo(portfolioController);
return portfolioController;
}
protected final void doClose(UserRequest ureq) {
OLATResourceable ores = OresHelper.createOLATResourceableInstance("HomeSite", chosenIdentity.getKey());
getWindowControl().getWindowBackOffice().getWindow().getDTabs().closeDTab(ureq, ores, launchedFromPoint);
}
}