/**
* 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.portal.config;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import junit.framework.AssertionFailedError;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.component.RequestLifeCycle;
import org.exoplatform.portal.config.model.Application;
import org.exoplatform.portal.config.model.ApplicationState;
import org.exoplatform.portal.config.model.ApplicationType;
import org.exoplatform.portal.config.model.Container;
import org.exoplatform.portal.config.model.Page;
import org.exoplatform.portal.config.model.PageBody;
import org.exoplatform.portal.config.model.PortalConfig;
import org.exoplatform.portal.mop.EventType;
import org.exoplatform.portal.mop.SiteType;
import org.exoplatform.portal.mop.importer.Imported;
import org.exoplatform.portal.mop.importer.Imported.Status;
import org.exoplatform.portal.mop.page.PageKey;
import org.exoplatform.portal.mop.page.PageService;
import org.exoplatform.portal.mop.user.UserNavigation;
import org.exoplatform.portal.mop.user.UserPortal;
import org.exoplatform.portal.pom.config.POMDataStorage;
import org.exoplatform.portal.pom.config.POMSession;
import org.exoplatform.portal.pom.config.POMSessionManager;
import org.exoplatform.portal.pom.config.cache.DataCache;
import org.exoplatform.portal.pom.spi.portlet.Portlet;
import org.exoplatform.services.listener.Event;
import org.exoplatform.services.listener.Listener;
import org.exoplatform.services.listener.ListenerService;
import org.exoplatform.services.organization.Group;
import org.exoplatform.services.organization.GroupHandler;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.User;
import org.exoplatform.services.organization.UserHandler;
import org.exoplatform.services.security.Authenticator;
import org.exoplatform.services.security.ConversationState;
import org.gatein.common.util.Tools;
import org.gatein.mop.api.workspace.Workspace;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class TestUserPortalConfigService extends AbstractConfigTest {
/** . */
private UserPortalConfigService userPortalConfigSer_;
/** . */
private OrganizationService orgService_;
/** . */
private DataStorage storage_;
/** . */
private PageService pageService;
/** . */
private POMSessionManager mgr;
/** . */
private Authenticator authenticator;
/** . */
private ListenerService listenerService;
/** . */
private LinkedList<Event> events;
/** . */
private boolean registered;
/** . */
private POMDataStorage mopStorage;
public TestUserPortalConfigService(String name) {
super(name);
//
registered = false;
}
@Override
protected void setUp() throws Exception {
Listener listener = new Listener() {
@Override
public void onEvent(Event event) throws Exception {
events.add(event);
}
};
PortalContainer container = getContainer();
userPortalConfigSer_ = (UserPortalConfigService) container.getComponentInstanceOfType(UserPortalConfigService.class);
orgService_ = (OrganizationService) container.getComponentInstanceOfType(OrganizationService.class);
mgr = (POMSessionManager) container.getComponentInstanceOfType(POMSessionManager.class);
authenticator = (Authenticator) container.getComponentInstanceOfType(Authenticator.class);
listenerService = (ListenerService) container.getComponentInstanceOfType(ListenerService.class);
events = new LinkedList<Event>();
storage_ = (DataStorage) container.getComponentInstanceOfType(DataStorage.class);
pageService = (PageService) container.getComponentInstanceOfType(PageService.class);
mopStorage = (POMDataStorage) container.getComponentInstanceOfType(POMDataStorage.class);
// Register only once for all unit tests
if (!registered) {
// I'm using this due to crappy design of
// org.exoplatform.services.listener.ListenerService
listenerService.addListener(DataStorage.PAGE_CREATED, listener);
listenerService.addListener(EventType.PAGE_DESTROYED, listener);
listenerService.addListener(EventType.PAGE_UPDATED, listener);
listenerService.addListener(EventType.NAVIGATION_CREATED, listener);
listenerService.addListener(EventType.NAVIGATION_DESTROYED, listener);
listenerService.addListener(EventType.NAVIGATION_UPDATED, listener);
}
}
private static Map<String, UserNavigation> toMap(UserPortal cfg) {
return toMap(cfg.getNavigations());
}
private static Map<String, UserNavigation> toMap(List<UserNavigation> navigations) {
Map<String, UserNavigation> map = new HashMap<String, UserNavigation>();
for (UserNavigation nav : navigations) {
map.put(nav.getKey().getType().getName() + "::" + nav.getKey().getName(), nav);
}
return map;
}
public void testUpdatePortalConfig() {
new UnitTest() {
public void execute() throws Exception {
UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
assertNotNull(userPortalCfg);
PortalConfig portalCfg = userPortalCfg.getPortalConfig();
assertNotNull(portalCfg);
assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
assertEquals("classic", portalCfg.getName());
assertEquals("en", portalCfg.getLocale());
portalCfg.setLocale("fr");
storage_.save(portalCfg);
userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
portalCfg = userPortalCfg.getPortalConfig();
assertEquals("fr", portalCfg.getLocale());
}
}.execute("root");
}
public void testEnforcedReimporting() {
new UnitTest() {
public void execute() throws Exception {
UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
assertNotNull(userPortalCfg);
PortalConfig portalCfg = userPortalCfg.getPortalConfig();
assertNotNull(portalCfg);
assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
assertEquals("classic", portalCfg.getName());
assertEquals("en", portalCfg.getLocale());
portalCfg.setLocale("fr");
storage_.save(portalCfg);
userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
portalCfg = userPortalCfg.getPortalConfig();
assertEquals("fr", portalCfg.getLocale());
// Turn on the flag to trigger re-importing
RequestLifeCycle.begin(PortalContainer.getInstance());
try {
POMSession session = mgr.getSession();
Workspace workspace = session.getWorkspace();
Imported imported = workspace.adapt(Imported.class);
imported.setLastModificationDate(new Date());
imported.setStatus(Status.WANT_REIMPORT.status());
session.save();
} finally {
RequestLifeCycle.end();
}
// Re-import site config from configuration
userPortalConfigSer_.start();
userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
portalCfg = userPortalCfg.getPortalConfig();
assertEquals("en", portalCfg.getLocale());
}
}.execute("root");
}
public void testRootGetUserPortalConfig() {
new UnitTest() {
public void execute() throws Exception {
UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
assertNotNull(userPortalCfg);
PortalConfig portalCfg = userPortalCfg.getPortalConfig();
assertNotNull(portalCfg);
assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
assertEquals("classic", portalCfg.getName());
UserPortal userPortal = userPortalCfg.getUserPortal();
assertNotNull(userPortal.getNavigations());
Map<String, UserNavigation> navigations = toMap(userPortal);
assertEquals("expected to have 7 navigations instead of " + navigations, 7, navigations.size());
assertTrue(navigations.containsKey("portal::classic"));
assertTrue(navigations.containsKey("group::/platform/administrators"));
assertTrue(navigations.containsKey("group::/platform/users"));
assertTrue(navigations.containsKey("group::/organization/management/executive-board"));
assertTrue(navigations.containsKey("group::/test/normalized"));
assertTrue(navigations.containsKey("group::/test/legacy"));
assertTrue(navigations.containsKey("user::root"));
}
}.execute("root");
}
public void testJohnGetUserPortalConfig() {
new UnitTest() {
public void execute() throws Exception {
UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "john");
assertNotNull(userPortalCfg);
PortalConfig portalCfg = userPortalCfg.getPortalConfig();
assertNotNull(portalCfg);
assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
assertEquals("classic", portalCfg.getName());
UserPortal userPortal = userPortalCfg.getUserPortal();
assertNotNull(userPortal.getNavigations());
Map<String, UserNavigation> navigations = toMap(userPortal);
assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
assertTrue(navigations.containsKey("portal::classic"));
assertTrue(navigations.containsKey("group::/platform/administrators"));
assertTrue(navigations.containsKey("group::/platform/users"));
assertTrue(navigations.containsKey("user::john"));
}
}.execute("john");
}
public void testMaryGetUserPortalConfig() {
new UnitTest() {
public void execute() throws Exception {
UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "mary");
assertNotNull(userPortalCfg);
PortalConfig portalCfg = userPortalCfg.getPortalConfig();
assertNotNull(portalCfg);
assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
assertEquals("classic", portalCfg.getName());
UserPortal userPortal = userPortalCfg.getUserPortal();
assertNotNull(userPortal.getNavigations());
Map<String, UserNavigation> navigations = toMap(userPortal);
assertEquals(3, navigations.size());
assertTrue(navigations.containsKey("portal::classic"));
assertTrue(navigations.containsKey("group::/platform/users"));
assertTrue(navigations.containsKey("user::mary"));
}
}.execute("mary");
}
public void testGuestGetUserPortalConfig() {
new UnitTest() {
public void execute() throws Exception {
UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", null);
assertNotNull(userPortalCfg);
PortalConfig portalCfg = userPortalCfg.getPortalConfig();
assertNotNull(portalCfg);
assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
assertEquals("classic", portalCfg.getName());
UserPortal userPortal = userPortalCfg.getUserPortal();
assertNotNull(userPortal.getNavigations());
Map<String, UserNavigation> navigations = toMap(userPortal);
assertEquals("" + navigations, 1, navigations.size());
assertTrue(navigations.containsKey("portal::classic"));
}
}.execute(null);
}
public void testNavigationOrder() {
new UnitTest() {
public void execute() throws Exception {
UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
UserPortal userPortal = userPortalCfg.getUserPortal();
List<UserNavigation> navigations = userPortal.getNavigations();
assertEquals("expected to have 7 navigations instead of " + navigations, 7, navigations.size());
assertEquals("classic", navigations.get(0).getKey().getName()); // 1
assertEquals("/platform/administrators", navigations.get(1).getKey().getName()); // 2
assertEquals("root", navigations.get(2).getKey().getName()); // 3
assertEquals("/organization/management/executive-board", navigations.get(3).getKey().getName()); // 5
assertEquals("/platform/users", navigations.get(4).getKey().getName()); // 8
assertEquals("/test/legacy", navigations.get(5).getKey().getName());
assertEquals("/test/normalized", navigations.get(6).getKey().getName());
}
}.execute("root");
}
public void testCreateUserPortalConfig() {
new UnitTest() {
public void execute() throws Exception {
userPortalConfigSer_.createUserPortalConfig(PortalConfig.PORTAL_TYPE, "jazz", "test");
UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("jazz", "root");
assertNotNull(userPortalCfg);
PortalConfig portalCfg = userPortalCfg.getPortalConfig();
assertNotNull(portalCfg);
assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
assertEquals("jazz", portalCfg.getName());
UserPortal userPortal = userPortalCfg.getUserPortal();
assertNotNull(userPortal.getNavigations());
Map<String, UserNavigation> navigations = toMap(userPortal);
assertEquals("expected to have 7 navigations instead of " + navigations, 7, navigations.size());
assertTrue(navigations.containsKey("portal::jazz"));
assertTrue(navigations.containsKey("group::/platform/administrators"));
assertTrue(navigations.containsKey("group::/organization/management/executive-board"));
assertTrue(navigations.containsKey("group::/platform/users"));
assertTrue(navigations.containsKey("user::root"));
assertTrue(navigations.containsKey("group::/test/legacy"));
assertTrue(navigations.containsKey("group::/test/normalized"));
queryPage();
}
private void queryPage() {
try {
pageService.findPages(0, 10, SiteType.PORTAL, null, null, null);
} catch (Exception ex) {
assertTrue("Exception while querying pages with new portal", false);
}
}
}.execute("root");
}
public void testRemoveUserPortalConfig() {
new UnitTest() {
public void execute() throws Exception {
userPortalConfigSer_.createUserPortalConfig(PortalConfig.PORTAL_TYPE, "jazz", "test");
UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("jazz", "root");
assertNotNull(userPortalCfg);
saveMOP();
userPortalConfigSer_.removeUserPortalConfig("jazz");
saveMOP();
assertNull(userPortalConfigSer_.getUserPortalConfig("jazz", "root"));
}
}.execute("root");
}
public void testRootGetMakableNavigations() {
new UnitTest() {
public void execute() throws Exception {
Set<String> navigations = new HashSet<String>(userPortalConfigSer_.getMakableNavigations("root", false));
Set<String> expectedNavigations = Tools.toSet("/platform/users", "/platform", "/platform/guests",
"/platform/administrators", "/organization", "/organization/management",
"/organization/management/executive-board");
assertEquals(expectedNavigations, navigations);
}
}.execute(null);
}
public void testJohnGetMakableNavigations() {
new UnitTest() {
public void execute() throws Exception {
Set<String> navigations = new HashSet<String>(userPortalConfigSer_.getMakableNavigations("john", false));
Set<String> expectedNavigations = Tools.toSet("/organization/management/executive-board");
assertEquals(expectedNavigations, navigations);
}
}.execute(null);
}
public void testMaryGetMakableNavigations() {
new UnitTest() {
public void execute() throws Exception {
Set<String> navigations = new HashSet<String>(userPortalConfigSer_.getMakableNavigations("mary", false));
Set<String> expectedNavigations = Collections.emptySet();
assertEquals(expectedNavigations, navigations);
}
}.execute(null);
}
public void testRootGetPage() {
new UnitTest() {
public void execute() throws Exception {
assertEquals("group::/platform/administrators::newAccount",
userPortalConfigSer_.getPage(PageKey.parse("group::/platform/administrators::newAccount")).getKey()
.format());
assertEquals("group::/organization/management/executive-board::newStaff",
userPortalConfigSer_
.getPage(PageKey.parse("group::/organization/management/executive-board::newStaff")).getKey()
.format());
}
}.execute("root");
}
public void testJohnGetPage() {
new UnitTest() {
public void execute() throws Exception {
assertEquals(null, userPortalConfigSer_.getPage(PageKey.parse("group::/platform/administrators::newAccount")));
assertEquals("group::/organization/management/executive-board::newStaff",
userPortalConfigSer_
.getPage(PageKey.parse("group::/organization/management/executive-board::newStaff")).getKey()
.format());
}
}.execute("john");
}
public void testMaryGetPage() {
new UnitTest() {
public void execute() throws Exception {
assertEquals(null, userPortalConfigSer_.getPage(PageKey.parse("group::/platform/administrators::newAccount")));
assertEquals(null, userPortalConfigSer_.getPage(PageKey
.parse("group::/organization/management/executive-board::newStaff")));
}
}.execute("mary");
}
public void testAnonymousGetPage() {
new UnitTest() {
public void execute() throws Exception {
assertEquals(null, userPortalConfigSer_.getPage(PageKey.parse("group::/platform/administrators::newAccount")));
assertEquals(null, userPortalConfigSer_.getPage(PageKey
.parse("group::/organization/management/executive-board::newStaff")));
}
}.execute(null);
}
public void testCreateFromTemplate() {
new UnitTest() {
public void execute() throws Exception {
Page clone = userPortalConfigSer_.createPageTemplate("dashboard", "portal", "test");
assertNotNull(clone);
assertEquals("portal", clone.getOwnerType());
assertEquals("test", clone.getOwnerId());
//
assertEquals(1, clone.getChildren().size());
//
Application<Portlet> app = (Application<Portlet>) clone.getChildren().get(0);
assertEquals("Dashboard", app.getTitle());
assertNotNull(app.getState());
assertEquals("dashboard/DashboardPortlet", storage_.getId(app.getState()));
// assertEquals("portal", app.getInstanceState().getOwnerType());
// assertEquals("test", app.getInstanceState().getOwnerId());
Portlet prefs2 = storage_.load(app.getState(), ApplicationType.PORTLET);
assertNull(prefs2);
}
}.execute(null);
}
public void testOverwriteUserLayout() {
new UnitTest() {
public void execute() throws Exception {
mgr.clearCache();
PortalConfig cfg = storage_.getPortalConfig(PortalConfig.USER_TYPE, "overwritelayout");
assertNotNull(cfg);
Container container = cfg.getPortalLayout();
assertNotNull(container);
assertEquals(2, container.getChildren().size());
assertTrue(container.getChildren().get(0) instanceof PageBody);
assertTrue(((Application) container.getChildren().get(1)).getType() == ApplicationType.PORTLET);
Application<Portlet> pa = (Application<Portlet>) container.getChildren().get(1);
ApplicationState<Portlet> state = pa.getState();
assertEquals("overwrite_application_ref/overwrite_portlet_ref", storage_.getId(state));
}
}.execute(null);
}
public void testUserTemplate() {
new UnitTest() {
public void execute() throws Exception {
assertNull(storage_.getPortalConfig(PortalConfig.USER_TYPE, "user"));
assertNull(storage_.getPortalConfig(PortalConfig.USER_TYPE, "julien"));
//
UserHandler userHandler = orgService_.getUserHandler();
User user = userHandler.createUserInstance("julien");
user.setPassword("default");
user.setFirstName("default");
user.setLastName("default");
user.setEmail("exo@exoportal.org");
userHandler.createUser(user, true);
//
PortalConfig cfg = storage_.getPortalConfig(PortalConfig.USER_TYPE, "julien");
assertNotNull(cfg);
Container container = cfg.getPortalLayout();
assertNotNull(container);
assertEquals(2, container.getChildren().size());
assertTrue(container.getChildren().get(0) instanceof PageBody);
assertTrue(((Application) container.getChildren().get(1)).getType() == ApplicationType.PORTLET);
Application<Portlet> pa = (Application<Portlet>) container.getChildren().get(1);
ApplicationState state = pa.getState();
assertEquals("foo/bar", storage_.getId(pa.getState()));
}
}.execute(null);
}
public void testGroupTemplate() {
new UnitTest() {
public void execute() throws Exception {
String groupName = "groupTest";
assertNull(storage_.getPortalConfig(PortalConfig.GROUP_TYPE, groupName));
//
GroupHandler groupHandler = orgService_.getGroupHandler();
Group group = groupHandler.createGroupInstance();
group.setGroupName(groupName);
group.setDescription("this is a group for test");
groupHandler.addChild(null, group, true);
//
PortalConfig cfg = storage_.getPortalConfig(PortalConfig.GROUP_TYPE, "/" + groupName);
assertNotNull(cfg);
Container container = cfg.getPortalLayout();
assertNotNull(container);
assertEquals(4, container.getChildren().size());
assertTrue(container.getChildren().get(2) instanceof PageBody);
assertTrue(((Application) container.getChildren().get(1)).getType() == ApplicationType.PORTLET);
groupHandler.removeGroup(group, true);
}
}.execute(null);
}
public void testCacheUserPortalConfig() {
new UnitTest() {
public void execute() throws Exception {
mgr.clearCache();
DataCache cache = mgr.getDecorator(DataCache.class);
long readCount0 = cache.getReadCount();
userPortalConfigSer_.getUserPortalConfig("classic", null);
long readCount1 = cache.getReadCount();
assertTrue(readCount1 > readCount0);
userPortalConfigSer_.getUserPortalConfig("classic", null);
long readCount2 = cache.getReadCount();
assertEquals(readCount1, readCount2);
}
}.execute(null);
}
private abstract class UnitTest {
/** . */
private POMSession mopSession;
protected final void execute(String userId) {
Throwable failure = null;
//
begin();
//
ConversationState conversationState = null;
if (userId != null) {
try {
conversationState = new ConversationState(authenticator.createIdentity(userId));
} catch (Exception e) {
failure = e;
}
}
//
if (failure == null) {
// Clear cache for test
mgr.clearCache();
//
mopSession = mgr.openSession();
//
ConversationState.setCurrent(conversationState);
try {
execute();
} catch (Exception e) {
failure = e;
} finally {
ConversationState.setCurrent(null);
mopSession.close(false);
end();
}
}
// Report error as a junit assertion failure
if (failure != null) {
AssertionFailedError err = new AssertionFailedError();
err.initCause(failure);
throw err;
}
}
protected final void saveMOP() {
mopSession.save();
}
protected abstract void execute() throws Exception;
}
}