/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.platform.gadgets.services;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.UUID;
import org.exoplatform.application.gadget.Gadget;
import org.exoplatform.application.gadget.GadgetRegistryService;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.component.RequestLifeCycle;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.portal.config.DataStorage;
import org.exoplatform.portal.config.UserPortalConfig;
import org.exoplatform.portal.config.UserPortalConfigService;
import org.exoplatform.portal.config.model.Application;
import org.exoplatform.portal.config.model.Container;
import org.exoplatform.portal.config.model.Dashboard;
import org.exoplatform.portal.config.model.Page;
import org.exoplatform.portal.config.model.TransientApplicationState;
import org.exoplatform.portal.mop.SiteKey;
import org.exoplatform.portal.mop.SiteType;
import org.exoplatform.portal.mop.navigation.Scope;
import org.exoplatform.portal.mop.user.UserNavigation;
import org.exoplatform.portal.mop.user.UserNode;
import org.exoplatform.portal.mop.user.UserPortal;
import org.exoplatform.portal.mop.user.UserPortalContext;
import org.exoplatform.portal.pom.spi.portlet.Portlet;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
/**
* @author <a href="mailto:anouar.chattouna@exoplatform.com">Anouar
* Chattouna</a>
* @version $Revision$
*/
public class UserDashboardConfigurationService {
public static String DEFAULT_TAB_NAME;
public static String DEFAULT_TAB_LABEL;
private static String DASHBOARD_PAGE_TEMPLATE;
private static String INVOLVED_USERS;
private static final String SEPARATE_INVOLVED_USERS = "separate-users";
private static final String ALL_INVOLVED_USERS = "all-users";
private DataStorage dataStorageService = null;
private UserPortalConfigService userPortalConfigService = null;
private GadgetRegistryService gadgetRegistryService = null;
private List<UserDashboardConfiguration> separateUsersconfig;
private List<Gadget> allUsersConfig;
private static final Log LOG = ExoLogger.getExoLogger(UserDashboardConfigurationService.class);
public UserDashboardConfigurationService(DataStorage dataStorageService, UserPortalConfigService userPortalConfigService,
GadgetRegistryService gadgetRegistryService, InitParams initParams) {
DEFAULT_TAB_NAME = initParams.getValueParam("dashboardTabName").getValue();
DEFAULT_TAB_LABEL = initParams.getValueParam("dashboardTabLabel").getValue();
DASHBOARD_PAGE_TEMPLATE = initParams.getValueParam("dashboardPageTemplate").getValue();
INVOLVED_USERS = initParams.getValueParam("involvedUsers").getValue();
if (INVOLVED_USERS.equals(SEPARATE_INVOLVED_USERS)) {
separateUsersconfig = initParams.getObjectParamValues(UserDashboardConfiguration.class);
// separateUsersconfig should not be null
if (separateUsersconfig == null) {
throw new IllegalStateException(INVOLVED_USERS + " is used for " + initParams.getValueParam("involvedUsers").getName()
+ " init param..\nObject param values can not be null..\nPlease check your configuration");
}
} else if (INVOLVED_USERS.equals(ALL_INVOLVED_USERS)) {
allUsersConfig = initParams.getObjectParamValues(Gadget.class);
// allUsersConfig should not be null
if (allUsersConfig == null) {
throw new IllegalStateException(INVOLVED_USERS + " is used for " + initParams.getValueParam("involvedUsers").getName()
+ " init param..\nObject param values can not be null..\nPlease check your configuration");
}
} else {
// error in configuration
throw new IllegalStateException(initParams.getValueParam("involvedUsers").getName()
+ " init param is missing.. Please check your configuration");
}
this.dataStorageService = dataStorageService;
this.userPortalConfigService = userPortalConfigService;
this.gadgetRegistryService = gadgetRegistryService;
}
/**
* Gets or creates the user's dashboard page, and configures its
* dashboard.
*
* @param userId
* The user name.
* @throws Exception
*/
public void prepopulateUserDashboard(String userId) throws Exception {
RequestLifeCycle.begin(PortalContainer.getInstance());
try {
if (INVOLVED_USERS.equals(SEPARATE_INVOLVED_USERS)) {
// if separate users, check if userId exist in the list, then
// prepopulate its dashboard
for (UserDashboardConfiguration userDashboardConfig : separateUsersconfig) {
if (userId.equals(userDashboardConfig.getUserId())) {
LOG.info("Prepopulate the dashboard of user " + userId);
Page dashboardPage = getUserDashboardPage(userId);
if (dashboardPage == null) {
createUserDashboard(userId);
dashboardPage = getUserDashboardPage(userId);
configureUserDashboard(dashboardPage, userDashboardConfig.getGadgets());
}
}
}
} else {
// if all users, prepopulate all users dashboard
LOG.info("Prepopulate the dashboard of user " + userId);
Page dashboardPage = getUserDashboardPage(userId);
if (dashboardPage == null) {
createUserDashboard(userId);
dashboardPage = getUserDashboardPage(userId);
configureUserDashboard(dashboardPage, allUsersConfig);
}
}
} finally {
RequestLifeCycle.end();
}
}
private UserNavigation getUserNavigation(String userId) throws Exception {
UserPortal userPortal = getUserPortal(userId);
UserNavigation userNavigation = userPortal.getNavigation(SiteKey.user(userId));
if (userNavigation == null) {
try {
userPortalConfigService.createUserSite(userId);
userPortal = getUserPortal(userId);
userNavigation = userPortal.getNavigation(SiteKey.user(userId));
} catch (Exception e) {
LOG.error("Could not create user site for user " + userId, e);
throw e;
}
}
return userNavigation;
}
private UserPortal getUserPortal(String userId) throws Exception {
UserPortalConfig portalConfig = userPortalConfigService.getUserPortalConfig(userPortalConfigService.getDefaultPortal(),
userId, NULL_CONTEXT);
return portalConfig.getUserPortal();
}
/**
* Return the {@link Page} that have a dashbord of user that name is
* provided <br>
*
* @param userId
* The user name.
* @throws Exception
*/
private Page getUserDashboardPage(String userId) throws Exception {
return dataStorageService.getPage(SiteType.USER.getName() + "::" + userId + "::" + DEFAULT_TAB_NAME);
}
/**
* Creates a dashboard page for a given user
*
* @param userId
* The user's ID.
*/
private void createUserDashboard(String userId) {
try {
UserPortal userPortal = getUserPortal(userId);
UserNavigation userNav = getUserNavigation(userId);
if (userNav == null) {
LOG.warn("User navigation for '" + userId + "' cannot be found. Cannot prePopulate gadgets in user's dashboard.");
return;
}
SiteKey siteKey = userNav.getKey();
Page page = userPortalConfigService.createPageTemplate(DASHBOARD_PAGE_TEMPLATE, siteKey.getTypeName(), siteKey.getName());
page.setTitle(DEFAULT_TAB_NAME);
page.setName(DEFAULT_TAB_NAME);
dataStorageService.create(page);
UserNode rootNode = userPortal.getNode(userNav, Scope.ALL, null, null);
UserNode tabNode = rootNode.getChild(DEFAULT_TAB_NAME);
if (tabNode == null) {
tabNode = rootNode.addChild(DEFAULT_TAB_NAME);
tabNode.setLabel(DEFAULT_TAB_NAME);
tabNode.setPageRef(page.getPageKey());
userPortal.saveNode(rootNode, null);
}
} catch (Exception e) {
LOG.error("Error while creating the user dashboard page for: " + userId, e);
}
}
/**
* Adds provided gadgets to user's dashboard
*
* @param userDashboardPage
* The user's dashboard page.
* @param gadgets
* The list of gadgets to populate in the user dashboard.
*/
@SuppressWarnings("unchecked")
private void configureUserDashboard(Page userDashboardPage, List<Gadget> gadgets) {
try {
// gets the dashboard portlet
Application<Portlet> dashboardPortlet = (Application<Portlet>) userDashboardPage.getChildren().get(0);
String dashboardId = dashboardPortlet.getStorageId();
// loads the dashboard from dashboard portlet
Dashboard dashboard = dataStorageService.loadDashboard(dashboardId);
int colIndex = 0;
for (Gadget gadget : gadgets) {
// creates a gadget application from the gadget
Application<org.exoplatform.portal.pom.spi.gadget.Gadget> gadgetApplication = Application.createGadgetApplication();
gadgetApplication.setStorageName(UUID.randomUUID().toString());
gadgetApplication.setState(new TransientApplicationState<org.exoplatform.portal.pom.spi.gadget.Gadget>(gadget.getName()));
// check if the gadget was saved elsewhere
if (gadgetRegistryService.getGadget(gadget.getName()) == null) {
gadgetRegistryService.saveGadget(gadget);
}
Container column = (Container) dashboard.getChildren().get(colIndex);
column.getChildren().add(gadgetApplication);
colIndex = colIndex + 1 == dashboard.getChildren().size() ? 0 : colIndex + 1;
}
dataStorageService.saveDashboard(dashboard);
} catch (Exception e) {
LOG.error("Error while configuring the user dashboard for: " + userDashboardPage.getOwnerId(), e);
}
}
public static class UserDashboardConfiguration {
private String userId;
private List<Gadget> gadgets;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public List<Gadget> getGadgets() {
return gadgets;
}
public void setGadgets(List<Gadget> gadgets) {
this.gadgets = gadgets;
}
}
// Don't need a portal context because webui isn't used
private static final UserPortalContext NULL_CONTEXT = new UserPortalContext() {
public ResourceBundle getBundle(UserNavigation navigation) {
return null;
}
public Locale getUserLocale() {
return Locale.ENGLISH;
}
};
}