/** * 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.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; import junit.framework.AssertionFailedError; import org.exoplatform.container.PortalContainer; 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.Dashboard; import org.exoplatform.portal.config.model.ModelObject; import org.exoplatform.portal.config.model.Page; import org.exoplatform.portal.config.model.PersistentApplicationState; import org.exoplatform.portal.config.model.PortalConfig; import org.exoplatform.portal.config.model.TransientApplicationState; import org.exoplatform.portal.mop.EventType; import org.exoplatform.portal.mop.QueryResult; import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.mop.navigation.NavigationContext; import org.exoplatform.portal.mop.navigation.NavigationService; import org.exoplatform.portal.mop.navigation.NavigationState; import org.exoplatform.portal.mop.navigation.NodeContext; import org.exoplatform.portal.mop.navigation.NodeModel; import org.exoplatform.portal.mop.navigation.Scope; import org.exoplatform.portal.mop.page.PageContext; import org.exoplatform.portal.mop.page.PageKey; import org.exoplatform.portal.mop.page.PageService; import org.exoplatform.portal.pom.config.POMSessionManager; import org.exoplatform.portal.pom.data.ModelChange; import org.exoplatform.portal.pom.spi.gadget.Gadget; import org.exoplatform.portal.pom.spi.portlet.Portlet; import org.exoplatform.portal.pom.spi.portlet.PortletBuilder; import org.exoplatform.portal.pom.spi.wsrp.WSRP; 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.gatein.common.transaction.JTAUserTransactionLifecycleService; /** * Created by The eXo Platform SARL Author : Tung Pham thanhtungty@gmail.com Nov 13, 2007 */ public class TestDataStorage extends AbstractConfigTest { /** . */ private final String testPage = "portal::classic::testPage"; /** . */ private DataStorage storage_; /** . */ private PageService pageService; /** . */ private NavigationService navService; /** . */ private POMSessionManager mgr; /** . */ private LinkedList<Event> events; /** . */ private ListenerService listenerService; /** . */ private OrganizationService org; private JTAUserTransactionLifecycleService jtaUserTransactionLifecycleService; public TestDataStorage(String name) { super(name); } public void setUp() throws Exception { Listener listener = new Listener() { @Override public void onEvent(Event event) throws Exception { events.add(event); } }; // super.setUp(); PortalContainer container = PortalContainer.getInstance(); storage_ = (DataStorage) container.getComponentInstanceOfType(DataStorage.class); pageService = (PageService) container.getComponentInstanceOfType(PageService.class); mgr = (POMSessionManager) container.getComponentInstanceOfType(POMSessionManager.class); navService = (NavigationService) container.getComponentInstanceOfType(NavigationService.class); events = new LinkedList<Event>(); listenerService = (ListenerService) container.getComponentInstanceOfType(ListenerService.class); org = (OrganizationService) container.getComponentInstanceOfType(OrganizationService.class); jtaUserTransactionLifecycleService = (JTAUserTransactionLifecycleService) container .getComponentInstanceOfType(JTAUserTransactionLifecycleService.class); // listenerService.addListener(EventType.PAGE_CREATED, listener); listenerService.addListener(EventType.PAGE_DESTROYED, listener); listenerService.addListener(DataStorage.PAGE_UPDATED, listener); listenerService.addListener(EventType.NAVIGATION_CREATED, listener); listenerService.addListener(EventType.NAVIGATION_DESTROYED, listener); listenerService.addListener(EventType.NAVIGATION_UPDATED, listener); listenerService.addListener(DataStorage.PORTAL_CONFIG_CREATED, listener); listenerService.addListener(DataStorage.PORTAL_CONFIG_UPDATED, listener); listenerService.addListener(DataStorage.PORTAL_CONFIG_REMOVED, listener); // begin(); } protected void tearDown() throws Exception { end(); super.tearDown(); } private void assertPageFound(int offset, int limit, SiteType siteType, String siteName, String pageName, String title, String expectedPage) { QueryResult<PageContext> res = pageService.findPages(offset, limit, siteType, siteName, pageName, title); assertEquals(1, res.getSize()); assertEquals(expectedPage, res.iterator().next().getKey().format()); } private void assertPageNotFound(int offset, int limit, SiteType siteType, String siteName, String pageName, String title) { QueryResult<PageContext> res = pageService.findPages(offset, limit, siteType, siteName, pageName, title); assertEquals(0, res.getSize()); } public void testCreatePortal() throws Exception { String label = "portal_foo"; String description = "This is new portal for testing"; PortalConfig portal = new PortalConfig(); portal.setType("portal"); portal.setName("foo"); portal.setLocale("en"); portal.setLabel(label); portal.setDescription(description); portal.setAccessPermissions(new String[] { UserACL.EVERYONE }); // storage_.create(portal); assertEquals(1, events.size()); portal = storage_.getPortalConfig(portal.getName()); assertNotNull(portal); assertEquals("portal", portal.getType()); assertEquals("foo", portal.getName()); assertEquals(label, portal.getLabel()); assertEquals(description, portal.getDescription()); } public void testPortalConfigSave() throws Exception { PortalConfig portal = storage_.getPortalConfig("portal", "test"); assertNotNull(portal); // portal.setLocale("vietnam"); storage_.save(portal); assertEquals(1, events.size()); // portal = storage_.getPortalConfig("portal", "test"); assertNotNull(portal); assertEquals("vietnam", portal.getLocale()); } public void testPortalConfigRemove() throws Exception { PortalConfig portal = storage_.getPortalConfig("portal", "test"); assertNotNull(portal); storage_.remove(portal); assertEquals(1, events.size()); assertNull(storage_.getPortalConfig("portal", "test")); try { // Trying to remove non existing a portal config storage_.remove(portal); fail("was expecting a NoSuchDataException"); } catch (NoSuchDataException e) { } } public void testSavePage() throws Exception { Page page = new Page(); page.setOwnerType(PortalConfig.PORTAL_TYPE); page.setOwnerId("test"); page.setName("foo"); page.setShowMaxWindow(false); // try { storage_.save(page); fail(); } catch (NoSuchDataException e) { } pageService.savePage(new PageContext(page.getPageKey(), null)); assertEquals(1, events.size()); // PageContext pageContext = pageService.loadPage(page.getPageKey()); pageContext.setState(pageContext.getState().builder().displayName("MyTitle").showMaxWindow(true).build()); pageService.savePage(pageContext); // Page page2 = storage_.getPage(page.getPageId()); page2.setTitle("MyTitle2"); page2.setShowMaxWindow(true); storage_.save(page2); assertEquals(2, events.size()); page2 = storage_.getPage(page.getPageId()); assertNotNull(page2); assertEquals("portal::test::foo", page2.getPageId()); assertEquals("portal", page2.getOwnerType()); assertEquals("test", page2.getOwnerId()); assertEquals("foo", page2.getName()); assertNull(page2.getTitle()); assertEquals(0, page2.getChildren().size()); assertEquals(false, page2.isShowMaxWindow()); pageContext = pageService.loadPage(page.getPageKey()); assertEquals("MyTitle", pageContext.getState().getDisplayName()); assertEquals(true, pageContext.getState().getShowMaxWindow()); } public void testChangingPortletThemeInPage() throws Exception { Page page; Application<?> app; page = storage_.getPage("portal::classic::homepage"); app = (Application<?>) page.getChildren().get(0); assertEquals(1, page.getChildren().size()); app.setTheme("Theme1"); storage_.save(page); page = storage_.getPage("portal::classic::homepage"); app = (Application<?>) page.getChildren().get(0); assertEquals("Theme1", app.getTheme()); app.setTheme("Theme2"); storage_.save(page); page = storage_.getPage("portal::classic::homepage"); app = (Application<?>) page.getChildren().get(0); assertEquals("Theme2", app.getTheme()); } public void testPageRemove() throws Exception { Page page = storage_.getPage("portal::test::test1"); assertNotNull(page); // try { storage_.remove(page); fail(); } catch (UnsupportedOperationException e) { } } public void testWindowMove1() throws Exception { Page page = storage_.getPage("portal::test::test4"); Application<?> a1 = (Application<?>) page.getChildren().get(0); Container a2 = (Container) page.getChildren().get(1); Application<?> a3 = (Application<?>) a2.getChildren().get(0); Application<?> a4 = (Application<?>) a2.getChildren().remove(1); page.getChildren().add(1, a4); List<ModelChange> changes = storage_.save(page); // page = storage_.getPage("portal::test::test4"); assertEquals(3, page.getChildren().size()); Application<?> c1 = (Application<?>) page.getChildren().get(0); assertEquals(a1.getStorageId(), c1.getStorageId()); Application<?> c2 = (Application<?>) page.getChildren().get(1); assertEquals(a4.getStorageId(), c2.getStorageId()); Container c3 = (Container) page.getChildren().get(2); assertEquals(a2.getStorageId(), c3.getStorageId()); assertEquals(1, c3.getChildren().size()); Application<?> c4 = (Application<?>) c3.getChildren().get(0); assertEquals(a3.getStorageId(), c4.getStorageId()); // assertEquals(6, changes.size()); ModelChange.Update ch1 = (ModelChange.Update) changes.get(0); assertEquals(page.getStorageId(), ch1.getObject().getStorageId()); ModelChange.Update ch2 = (ModelChange.Update) changes.get(1); assertEquals(a1.getStorageId(), ch2.getObject().getStorageId()); ModelChange.Move ch3 = (ModelChange.Move) changes.get(2); // assertEquals(a2.getStorageId(), ch3.getSrcId()); // assertEquals(page.getStorageId(), ch3.getDstId()); assertEquals(a4.getStorageId(), ch3.getId()); ModelChange.Update ch4 = (ModelChange.Update) changes.get(3); assertEquals(a4.getStorageId(), ch4.getObject().getStorageId()); ModelChange.Update ch5 = (ModelChange.Update) changes.get(4); assertEquals(a2.getStorageId(), ch5.getObject().getStorageId()); ModelChange.Update ch6 = (ModelChange.Update) changes.get(5); assertEquals(a3.getStorageId(), ch6.getObject().getStorageId()); } public void testWindowMove2() throws Exception { Page page = storage_.getPage("portal::test::test3"); Container container = new Container(); Application application = (Application) page.getChildren().remove(0); container.getChildren().add(application); page.getChildren().add(container); // storage_.save(page); // Page page2 = storage_.getPage("portal::test::test3"); // assertEquals(1, page2.getChildren().size()); Container container2 = (Container) page2.getChildren().get(0); assertEquals(1, page2.getChildren().size()); Application application2 = (Application) container2.getChildren().get(0); assertEquals(application2.getStorageId(), application.getStorageId()); } // Test for issue GTNPORTAL-2074 public void testWindowMove3() throws Exception { assertNull(storage_.getPage("portal::test::testWindowMove3")); Page page = new Page(); page.setOwnerType(PortalConfig.PORTAL_TYPE); page.setOwnerId("test"); page.setName("testWindowMove3"); Application app1 = new Application(ApplicationType.PORTLET); app1.setState(new TransientApplicationState<Portlet>()); Application app2 = new Application(ApplicationType.PORTLET); app2.setState(new TransientApplicationState<Portlet>()); Container parentOfApp2 = new Container(); parentOfApp2.getChildren().add(app2); page.getChildren().add(app1); page.getChildren().add(parentOfApp2); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); Page page2 = storage_.getPage("portal::test::testWindowMove3"); assertNotNull(page2); assertTrue(page2.getChildren().get(1) instanceof Container); Container container = (Container) page2.getChildren().get(1); assertTrue(container.getChildren().get(0) instanceof Application); Application persistedApp2 = (Application) container.getChildren().remove(0); Container transientContainer = new Container(); transientContainer.getChildren().add(persistedApp2); page2.getChildren().add(transientContainer); storage_.save(page2); Page page3 = storage_.getPage("portal::test::testWindowMove3"); assertEquals(container.getStorageId(), page3.getChildren().get(1).getStorageId()); assertTrue(page3.getChildren().get(2) instanceof Container); Container formerTransientCont = (Container) page3.getChildren().get(2); assertEquals(1, formerTransientCont.getChildren().size()); assertTrue(formerTransientCont.getChildren().get(0) instanceof Application); assertEquals(persistedApp2.getStorageId(), formerTransientCont.getChildren().get(0).getStorageId()); } /** * Test that setting a page reference to null will actually remove the page reference from the PageNode * * @throws Exception */ public void testNullPageReferenceDeletes() throws Exception { // create portal PortalConfig portal = new PortalConfig(); portal.setName("foo"); portal.setLocale("en"); portal.setAccessPermissions(new String[] { UserACL.EVERYONE }); storage_.create(portal); // create page Page page = new Page(); page.setOwnerType(PortalConfig.PORTAL_TYPE); page.setOwnerId("test"); page.setName("foo"); pageService.savePage(new PageContext(page.getPageKey(), null)); // create a new page navigation and add node NavigationContext nav = new NavigationContext(SiteKey.portal("foo"), new NavigationState(0)); navService.saveNavigation(nav); NodeContext<?> node = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.CHILDREN, null); NodeContext<?> test = node.add(null, "testPage"); test.setState(test.getState().builder().pageRef(page.getPageKey()).build()); navService.saveNode(node, null); // get the page reference from the created page and check that it exists NodeContext<?> pageNavigationWithPageReference = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.CHILDREN, null); assertNotNull("Expected page reference should not be null.", pageNavigationWithPageReference.get(0).getState() .getPageRef()); // set the page reference to null and save. test.setState(test.getState().builder().pageRef(null).build()); navService.saveNode(node, null); // check that setting the page reference to null actually removes the page reference NodeContext<?> pageNavigationWithoutPageReference = navService .loadNode(NodeModel.SELF_MODEL, nav, Scope.CHILDREN, null); assertNull("Expected page reference should be null.", pageNavigationWithoutPageReference.get(0).getState().getPageRef()); } public void testWindowScopedPortletPreferences() throws Exception { Page page = new Page(); page.setPageId("portal::test::foo"); TransientApplicationState<Portlet> state = new TransientApplicationState<Portlet>("web/BannerPortlet", new PortletBuilder().add("template", "bar").build()); Application<Portlet> app = Application.createPortletApplication(); app.setState(state); page.getChildren().add(app); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); page = storage_.getPage(page.getPageId()); app = (Application<Portlet>) page.getChildren().get(0); assertEquals("web/BannerPortlet", storage_.getId(app.getState())); } public void testPageMerge() throws Exception { Page page = storage_.getPage("portal::test::test4"); String app1Id = page.getChildren().get(0).getStorageId(); Container container = (Container) page.getChildren().get(1); String containerId = container.getStorageId(); String app2Id = container.getChildren().get(0).getStorageId(); String app3Id = container.getChildren().get(1).getStorageId(); // Add an application Application<Portlet> groovyApp = Application.createPortletApplication(); ApplicationState<Portlet> state = new TransientApplicationState<Portlet>("web/GroovyPortlet"); groovyApp.setState(state); ((Container) page.getChildren().get(1)).getChildren().add(1, groovyApp); // Save List<ModelChange> changes = storage_.save(page); assertEquals(6, changes.size()); ModelChange.Update c0 = (ModelChange.Update) changes.get(0); assertSame(page.getStorageId(), c0.getObject().getStorageId()); ModelChange.Update c1 = (ModelChange.Update) changes.get(1); assertSame(page.getChildren().get(0).getStorageId(), c1.getObject().getStorageId()); ModelChange.Update c2 = (ModelChange.Update) changes.get(2); assertSame(page.getChildren().get(1).getStorageId(), c2.getObject().getStorageId()); ModelChange.Update c3 = (ModelChange.Update) changes.get(3); assertSame(container.getChildren().get(0).getStorageId(), c3.getObject().getStorageId()); ModelChange.Create c4 = (ModelChange.Create) changes.get(4); assertSame(container.getChildren().get(1).getStorageId(), c4.getObject().getStorageId()); ModelChange.Update c5 = (ModelChange.Update) changes.get(5); assertSame(container.getChildren().get(2).getStorageId(), c5.getObject().getStorageId()); // Check it is existing at the correct location // and also that the ids are still the same page = storage_.getPage("portal::test::test4"); assertEquals(2, page.getChildren().size()); // assertEquals(PortletState.create("portal#test:/web/BannerPortlet/banner"), // ((Application)page.getChildren().get(0)).getInstanceState()); assertEquals(app1Id, page.getChildren().get(0).getStorageId()); container = (Container) page.getChildren().get(1); assertEquals(3, container.getChildren().size()); assertEquals(containerId, container.getStorageId()); // assertEquals(PortletState.create("portal#test:/web/BannerPortlet/banner"), // ((Application)container.getChildren().get(0)).getInstanceState()); assertEquals(app2Id, container.getChildren().get(0).getStorageId()); // assertEquals(PortletState.create("portal#test:/web/GroovyPortlet/groovyportlet"), // ((Application)container.getChildren().get(1)).getInstanceState()); assertNotNull(container.getChildren().get(0).getStorageId()); // assertEquals(PortletState.create("portal#test:/web/FooterPortlet/footer"), // ((Application)container.getChildren().get(2)).getInstanceState()); assertEquals(app3Id, container.getChildren().get(2).getStorageId()); // Now remove the element container.getChildren().remove(1); storage_.save(page); // Check it is removed // and also that the ids are still the same page = storage_.getPage("portal::test::test4"); assertEquals(2, page.getChildren().size()); // assertEquals(PortletState.create("portal#test:/web/BannerPortlet/banner"), // ((Application)page.getChildren().get(0)).getInstanceState()); assertEquals(app1Id, page.getChildren().get(0).getStorageId()); container = (Container) page.getChildren().get(1); assertEquals(2, container.getChildren().size()); assertEquals(containerId, container.getStorageId()); // assertEquals(PortletState.create("portal#test:/web/BannerPortlet/banner"), // ((Application)container.getChildren().get(0)).getInstanceState()); assertEquals(app2Id, container.getChildren().get(0).getStorageId()); // assertEquals(PortletState.create("portal#test:/web/FooterPortlet/footer"), // ((Application)container.getChildren().get(1)).getInstanceState()); assertEquals(app3Id, container.getChildren().get(1).getStorageId()); } public void testClone() throws Exception { pageService.clone(PageKey.parse("portal::test::test4"), PageKey.parse("portal::test::_test4")); // Get cloned page Page clone = storage_.getPage("portal::test::_test4"); assertEquals(2, clone.getChildren().size()); Application<Portlet> banner1 = (Application<Portlet>) clone.getChildren().get(0); ApplicationState<Portlet> instanceId = banner1.getState(); // Check instance id format assertEquals("web/BannerPortlet", storage_.getId(banner1.getState())); // Check state Portlet pagePrefs = storage_.load(instanceId, ApplicationType.PORTLET); assertEquals(new PortletBuilder().add("template", "par:/groovy/groovy/webui/component/UIBannerPortlet.gtmpl").build(), pagePrefs); // Update page prefs pagePrefs.setValue("template", "foo"); storage_.save(instanceId, pagePrefs); // Check that page prefs have changed pagePrefs = storage_.load(instanceId, ApplicationType.PORTLET); assertEquals(new PortletBuilder().add("template", "foo").build(), pagePrefs); // Now check the container Container container = (Container) clone.getChildren().get(1); assertEquals(2, container.getChildren().size()); // Page srcPage = storage_.getPage("portal::test::test4"); PageContext srcPageContext = pageService.loadPage(srcPage.getPageKey()); srcPageContext.setState(srcPageContext.getState().builder().editPermission("Administrator").build()); pageService.savePage(srcPageContext); // Application<Portlet> portlet = (Application<Portlet>) srcPage.getChildren().get(0); portlet.setDescription("NewPortlet"); ArrayList<ModelObject> modelObject = srcPage.getChildren(); modelObject.set(0, portlet); srcPage.setChildren(modelObject); storage_.save(srcPage); // PageKey dstKey = PageKey.parse(srcPage.getOwnerType() + "::" + srcPage.getOwnerId() + "::" + "_PageTest1234"); PageContext dstPageContext = pageService.clone(srcPageContext.getKey(), dstKey); Page dstPage = storage_.getPage(dstKey.format()); Application<Portlet> portlet1 = (Application<Portlet>) dstPage.getChildren().get(0); // Check src's edit permission and dst's edit permission assertNotNull(dstPageContext.getState().getEditPermission()); assertEquals(srcPageContext.getState().getEditPermission(), dstPageContext.getState().getEditPermission()); // Check src's children and dst's children assertNotNull(portlet1.getDescription()); assertEquals(portlet.getDescription(), portlet1.getDescription()); } public void testDashboard() throws Exception { Page page = new Page(); page.setPageId("portal::test::foo"); page.getChildren().add(new Dashboard()); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); // page = storage_.getPage("portal::test::foo"); assertEquals(1, page.getChildren().size()); Application<Portlet> dashboardPortlet = (Application<Portlet>) page.getChildren().get(0); String dashboardId = dashboardPortlet.getStorageId(); assertNotNull(dashboardId); assertNotNull(dashboardPortlet.getStorageName()); assertEquals("dashboard/DashboardPortlet", storage_.getId(dashboardPortlet.getState())); // Configures the dashboard Dashboard dashboard = new Dashboard(dashboardId); dashboard.setAccessPermissions(new String[] { "perm1", "perm2" }); TransientApplicationState<Portlet> state = new TransientApplicationState<Portlet>("foo/bar"); Application<Portlet> app = Application.createPortletApplication(); app.setState(state); dashboard.getChildren().add(app); // Attempt to save a dashboard with a portlet on it storage_.saveDashboard(dashboard); // Test that load page does not load the children page = storage_.getPage("portal::test::foo"); assertEquals(1, page.getChildren().size()); assertTrue(((Application) page.getChildren().get(0)).getType() == ApplicationType.PORTLET); // Now check we have the state on the dashboard dashboard = storage_.loadDashboard(dashboardId); assertEquals(Arrays.asList("perm1", "perm2"), Arrays.asList(dashboard.getAccessPermissions())); assertEquals(1, dashboard.getChildren().size()); app = (Application<Portlet>) dashboard.getChildren().get(0); assertEquals("foo/bar", storage_.getId(app.getState())); } @SuppressWarnings("unchecked") public void testInitialDashboard() throws Exception { // Add dashboard portlet to a page first time String dashboardTheme = "dashboardTheme"; String dashboardIcon = "dashboardIcon"; String dashboardTitle = "dashboardTitle"; String dashboardDesc = "dashboardDesc"; String dashboardWidth = "dashboardWidth"; String dashboardHeight = "dashboardHeight"; String normalTheme = "normalTheme"; Page page = new Page(); String pageId = "portal::test::bit"; page.setPageId(pageId); Application<Portlet> dashboardPortlet = Application.createPortletApplication(); Application<Portlet> normalPortlet = Application.createPortletApplication(); dashboardPortlet.setState(new TransientApplicationState<Portlet>("dashboard/DashboardPortlet")); dashboardPortlet.setTheme(dashboardTheme); dashboardPortlet.setIcon(dashboardIcon); dashboardPortlet.setTitle(dashboardTitle); dashboardPortlet.setDescription(dashboardDesc); dashboardPortlet.setWidth(dashboardWidth); dashboardPortlet.setHeight(dashboardHeight); normalPortlet.setState(new TransientApplicationState<Portlet>("normalPortlet")); normalPortlet.setTheme(normalTheme); page.getChildren().add(dashboardPortlet); page.getChildren().add(normalPortlet); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); // page = storage_.getPage("portal::test::bit"); assertEquals(2, page.getChildren().size()); dashboardPortlet = (Application<Portlet>) page.getChildren().get(0); normalPortlet = (Application<Portlet>) page.getChildren().get(1); assertNotNull(dashboardPortlet); assertNotNull(normalPortlet); assertEquals(normalTheme, normalPortlet.getTheme()); assertEquals(dashboardTheme, dashboardPortlet.getTheme()); assertEquals(dashboardIcon, dashboardPortlet.getIcon()); assertEquals(dashboardTitle, dashboardPortlet.getTitle()); assertEquals(dashboardDesc, dashboardPortlet.getDescription()); assertEquals(dashboardWidth, dashboardPortlet.getWidth()); assertEquals(dashboardHeight, dashboardPortlet.getHeight()); // Update the dashboard portlet and save dashboardPortlet.setTheme(dashboardTheme); page.getChildren().clear(); page.getChildren().add(dashboardPortlet); storage_.save(page); // page = storage_.getPage("portal::test::bit"); assertEquals(1, page.getChildren().size()); dashboardPortlet = (Application<Portlet>) page.getChildren().get(0); assertNotNull(dashboardPortlet); assertEquals(dashboardTheme, dashboardPortlet.getTheme()); assertEquals(dashboardIcon, dashboardPortlet.getIcon()); assertEquals(dashboardTitle, dashboardPortlet.getTitle()); assertEquals(dashboardDesc, dashboardPortlet.getDescription()); assertEquals(dashboardWidth, dashboardPortlet.getWidth()); assertEquals(dashboardHeight, dashboardPortlet.getHeight()); } public void testDashboardLayout() throws Exception { Application<Portlet> dashboardPortlet = Application.createPortletApplication(); ApplicationState<Portlet> state = new TransientApplicationState<Portlet>("dashboard/DashboardPortlet"); dashboardPortlet.setState(state); // Page page = new Page(); page.setPageId("portal::test::foo"); page.getChildren().add(dashboardPortlet); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); // page = storage_.getPage("portal::test::foo"); String dashboardId = page.getChildren().get(0).getStorageId(); // Dashboard dashboard = storage_.loadDashboard(dashboardId); assertEquals(3, dashboard.getChildren().size()); // Now save the page with the dashboard storage_.save(page); // dashboard = storage_.loadDashboard(dashboardId); assertEquals(3, dashboard.getChildren().size()); } public void testDashboardSecurity() throws Exception { Page page = new Page(); page.setPageId("portal::test::foo"); Application<Portlet> app = Application.createPortletApplication(); app.setAccessPermissions(new String[] { "perm1", "perm2" }); app.setState(new TransientApplicationState<Portlet>("dashboard/DashboardPortlet")); page.getChildren().add(app); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); page = storage_.getPage("portal::test::foo"); String id = page.getChildren().get(0).getStorageId(); // Load the dashboard itself Dashboard dashboard = storage_.loadDashboard(id); assertEquals(Arrays.asList("perm1", "perm2"), Arrays.asList(dashboard.getAccessPermissions())); // Modify the dashboard permission dashboard.setAccessPermissions(new String[] { "perm3" }); storage_.saveDashboard(dashboard); // Load application and check page = storage_.getPage("portal::test::foo"); app = (Application<Portlet>) page.getChildren().get(0); assertEquals(Arrays.asList("perm3"), Arrays.asList(app.getAccessPermissions())); } public void testDashboardMoveRight() throws Exception { Page page = new Page(); page.setPageId("portal::test::foo"); Application<Portlet> app = Application.createPortletApplication(); app.setState(new TransientApplicationState<Portlet>("dashboard/DashboardPortlet")); page.getChildren().add(app); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); page = storage_.getPage("portal::test::foo"); String id = page.getChildren().get(0).getStorageId(); // Load the dashboard itself Dashboard dashboard = storage_.loadDashboard(id); // Put a gadget in one container Container row0 = (Container) dashboard.getChildren().get(0); Application<Gadget> gadgetApp = Application.createGadgetApplication(); gadgetApp.setState(new TransientApplicationState<Gadget>("foo")); row0.getChildren().add(gadgetApp); // Save the dashboard storage_.saveDashboard(dashboard); // Load again the persisted version dashboard = storage_.loadDashboard(id); // Now move the gadget from one container to another to simulate a move row0 = (Container) dashboard.getChildren().get(0); Container row1 = (Container) dashboard.getChildren().get(1); row1.getChildren().add(row0.getChildren().remove(0)); // Save storage_.saveDashboard(dashboard); // Load again the persisted version and check the move was done in the storage dashboard = storage_.loadDashboard(id); row0 = (Container) dashboard.getChildren().get(0); row1 = (Container) dashboard.getChildren().get(1); assertEquals(0, row0.getChildren().size()); assertEquals(1, row1.getChildren().size()); gadgetApp = (Application<Gadget>) row1.getChildren().get(0); assertEquals("foo", storage_.getId(gadgetApp.getState())); } public void testDashboardMoveLeft() throws Exception { Page page = new Page(); page.setPageId("portal::test::foo"); Application<Portlet> app = Application.createPortletApplication(); app.setState(new TransientApplicationState<Portlet>("dashboard/DashboardPortlet")); page.getChildren().add(app); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); page = storage_.getPage("portal::test::foo"); String id = page.getChildren().get(0).getStorageId(); // Load the dashboard itself Dashboard dashboard = storage_.loadDashboard(id); // Put a gadget in one container Container row1 = (Container) dashboard.getChildren().get(1); Application<Gadget> gadgetApp = Application.createGadgetApplication(); gadgetApp.setState(new TransientApplicationState<Gadget>("foo")); row1.getChildren().add(gadgetApp); // Save the dashboard storage_.saveDashboard(dashboard); // Load again the persisted version dashboard = storage_.loadDashboard(id); // Now move the gadget from one container to another to simulate a move row1 = (Container) dashboard.getChildren().get(1); Container row0 = (Container) dashboard.getChildren().get(0); row0.getChildren().add(row1.getChildren().remove(0)); // Save storage_.saveDashboard(dashboard); // Load again the persisted version and check the move was done in the storage dashboard = storage_.loadDashboard(id); row0 = (Container) dashboard.getChildren().get(0); row1 = (Container) dashboard.getChildren().get(1); assertEquals(0, row1.getChildren().size()); assertEquals(1, row0.getChildren().size()); gadgetApp = (Application<Gadget>) row0.getChildren().get(0); assertEquals("foo", storage_.getId(gadgetApp.getState())); } public void testGetAllPortalNames() throws Exception { testGetAllSiteNames("portal", "getAllPortalNames"); } public void testGetAllGroupNames() throws Exception { testGetAllSiteNames("group", "getAllGroupNames"); } private void testGetAllSiteNames(String siteType, final String methodName) throws Exception { final List<String> names = (List<String>) storage_.getClass().getMethod(methodName).invoke(storage_); // Create new portal storage_.create(new PortalConfig(siteType, "testGetAllSiteNames")); // Test during tx we see the good names List<String> transientNames = (List<String>) storage_.getClass().getMethod(methodName).invoke(storage_); assertTrue("Was expecting " + transientNames + " to contain " + names, transientNames.containsAll(names)); transientNames.removeAll(names); assertEquals(Collections.singletonList("testGetAllSiteNames"), transientNames); // Test we have not seen anything yet outside of tx final CountDownLatch addSync = new CountDownLatch(1); final AtomicReference<Throwable> error = new AtomicReference<Throwable>(); new Thread() { @Override public void run() { begin(); try { List<String> isolatedNames = (List<String>) storage_.getClass().getMethod(methodName).invoke(storage_); assertEquals(new HashSet<String>(names), new HashSet<String>(isolatedNames)); } catch (Throwable t) { error.set(t); } finally { addSync.countDown(); end(); } } }.start(); // addSync.await(); if (error.get() != null) { AssertionFailedError afe = new AssertionFailedError(); afe.initCause(error.get()); throw afe; } // Now commit tx end(true); // We test we observe the change begin(); List<String> afterNames = (List<String>) storage_.getClass().getMethod(methodName).invoke(storage_); assertTrue(afterNames.containsAll(names)); afterNames.removeAll(names); assertEquals(Collections.singletonList("testGetAllSiteNames"), afterNames); // Then we remove the newly created portal storage_.remove(new PortalConfig(siteType, "testGetAllSiteNames")); // Test we are syeing the transient change transientNames.clear(); transientNames = (List<String>) storage_.getClass().getMethod(methodName).invoke(storage_); assertEquals(names, transientNames); // Test we have not seen anything yet outside of tx error.set(null); final CountDownLatch removeSync = new CountDownLatch(1); new Thread() { public void run() { begin(); try { List<String> isolatedNames = (List<String>) storage_.getClass().getMethod(methodName).invoke(storage_); assertTrue("Was expecting " + isolatedNames + " to contain " + names, isolatedNames.containsAll(names)); isolatedNames.removeAll(names); assertEquals(Collections.singletonList("testGetAllSiteNames"), isolatedNames); } catch (Throwable t) { error.set(t); } finally { removeSync.countDown(); end(); } } }.start(); // removeSync.await(); if (error.get() != null) { AssertionFailedError afe = new AssertionFailedError(); afe.initCause(error.get()); throw afe; } // end(true); // Now test it is still removed begin(); afterNames = (List<String>) storage_.getClass().getMethod(methodName).invoke(storage_); assertEquals(new HashSet<String>(names), new HashSet<String>(afterNames)); } public void testGadget() throws Exception { Gadget gadget = new Gadget(); gadget.setUserPref("user_pref"); TransientApplicationState<Gadget> state = new TransientApplicationState<Gadget>("bar", gadget); Application<Gadget> gadgetApplication = Application.createGadgetApplication(); gadgetApplication.setState(state); Page container = new Page(); container.setPageId("portal::test::gadget_page"); container.getChildren().add(gadgetApplication); pageService.savePage(new PageContext(container.getPageKey(), null)); storage_.save(container); container = storage_.getPage("portal::test::gadget_page"); gadgetApplication = (Application<Gadget>) container.getChildren().get(0); gadget = storage_.load(gadgetApplication.getState(), ApplicationType.GADGET); assertNotNull(gadget); assertEquals("user_pref", gadget.getUserPref()); } public void testSiteScopedPreferences() throws Exception { Page page = storage_.getPage("portal::test::test4"); Application<Portlet> app = (Application<Portlet>) page.getChildren().get(0); PersistentApplicationState<Portlet> state = (PersistentApplicationState) app.getState(); // Portlet prefs = storage_.load(state, ApplicationType.PORTLET); assertEquals(new PortletBuilder().add("template", "par:/groovy/groovy/webui/component/UIBannerPortlet.gtmpl").build(), prefs); // prefs.setValue("template", "someanothervalue"); storage_.save(state, prefs); // prefs = storage_.load(state, ApplicationType.PORTLET); assertNotNull(prefs); assertEquals(new PortletBuilder().add("template", "someanothervalue").build(), prefs); } public void testNullPreferenceValue() throws Exception { Page page = storage_.getPage("portal::test::test4"); Application<Portlet> app = (Application<Portlet>) page.getChildren().get(0); PersistentApplicationState<Portlet> state = (PersistentApplicationState) app.getState(); // Portlet prefs = storage_.load(state, ApplicationType.PORTLET); // prefs.setValue("template", null); storage_.save(state, prefs); // prefs = storage_.load(state, ApplicationType.PORTLET); assertNotNull(prefs); assertEquals(new PortletBuilder().add("template", "").build(), prefs); } public void testAccessMixin() throws Exception { Page page = new Page(); page.setOwnerType(PortalConfig.PORTAL_TYPE); page.setOwnerId("test"); page.setName("foo"); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); // page = storage_.getPage("portal::test::foo"); assertNotNull(page); assertEquals("test", page.getOwnerId()); assertEquals("foo", page.getName()); // SampleMixin sampleMixin = storage_.adapt(page, SampleMixin.class); // Check the default value of sampleProperty property assertEquals("SampleProperty", sampleMixin.getSampleProperty()); } public void testModifyMixin() throws Exception { Page page = new Page(); page.setOwnerType(PortalConfig.PORTAL_TYPE); page.setOwnerId("test"); page.setName("foo"); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); // page = storage_.getPage("portal::test::foo"); assertNotNull(page); assertEquals("test", page.getOwnerId()); assertEquals("foo", page.getName()); // SampleMixin sampleMixin = storage_.adapt(page, SampleMixin.class); sampleMixin.setSampleProperty("FYM!"); // page = storage_.getPage("portal::test::foo"); assertNotNull(page); SampleMixin sampleMixin2 = storage_.adapt(page, SampleMixin.class); assertEquals("FYM!", sampleMixin2.getSampleProperty()); } public void testSiteLayout() throws Exception { PortalConfig pConfig = storage_.getPortalConfig(PortalConfig.PORTAL_TYPE, "classic"); assertNotNull(pConfig); assertNotNull("The Group layout of " + pConfig.getName() + " is null", pConfig.getPortalLayout()); pConfig = storage_.getPortalConfig(PortalConfig.GROUP_TYPE, "/platform/administrators"); assertNotNull(pConfig); assertNotNull("The Group layout of " + pConfig.getName() + " is null", pConfig.getPortalLayout()); assertTrue(pConfig.getPortalLayout().getChildren() != null && pConfig.getPortalLayout().getChildren().size() > 1); pConfig.getPortalLayout().getChildren().clear(); storage_.save(pConfig); pConfig = storage_.getPortalConfig(PortalConfig.GROUP_TYPE, "/platform/administrators"); assertNotNull(pConfig); assertNotNull("The Group layout of " + pConfig.getName() + " is null", pConfig.getPortalLayout()); assertTrue(pConfig.getPortalLayout().getChildren() != null && pConfig.getPortalLayout().getChildren().size() == 0); pConfig = storage_.getPortalConfig(PortalConfig.USER_TYPE, "root"); assertNotNull(pConfig); assertNotNull("The User layout of " + pConfig.getName() + " is null", pConfig.getPortalLayout()); pConfig = storage_.getPortalConfig(PortalConfig.USER_TYPE, "mary"); assertNotNull(pConfig); assertNotNull("The User layout of " + pConfig.getName() + " is null", pConfig.getPortalLayout()); } public void testGroupLayout() throws Exception { GroupHandler groupHandler = org.getGroupHandler(); Group group = groupHandler.findGroupById("groupTest"); assertNull(group); group = groupHandler.createGroupInstance(); group.setGroupName("groupTest"); group.setLabel("group label"); groupHandler.addChild(null, group, true); group = groupHandler.findGroupById("/groupTest"); assertNotNull(group); PortalConfig pConfig = storage_.getPortalConfig(PortalConfig.GROUP_TYPE, "/groupTest"); assertNotNull("the Group's PortalConfig is not null", pConfig); assertTrue(pConfig.getPortalLayout().getChildren() == null || pConfig.getPortalLayout().getChildren().size() == 4); /** * We need to remove the /groupTest from the groupHandler as the handler is shared between the tests and can cause other * tests to fail. TODO: make the tests fully independent */ groupHandler.removeGroup(group, false); group = groupHandler.findGroupById("/groupTest"); assertNull(group); } public void testGroupNavigation() throws Exception { GroupHandler groupHandler = org.getGroupHandler(); Group group = groupHandler.createGroupInstance(); group.setGroupName("testGroupNavigation"); group.setLabel("testGroupNavigation"); groupHandler.addChild(null, group, true); SiteKey key = SiteKey.group(group.getId()); navService.saveNavigation(new NavigationContext(key, new NavigationState(0))); assertNotNull(navService.loadNavigation(key)); // Remove group groupHandler.removeGroup(group, true); // Group navigations is removed after remove group assertNull(navService.loadNavigation(key)); } public void testUserLayout() throws Exception { UserHandler userHandler = org.getUserHandler(); User user = userHandler.findUserByName("testing"); assertNull(user); user = userHandler.createUserInstance("testing"); user.setEmail("testing@gmaild.com"); user.setFirstName("test firstname"); user.setLastName("test lastname"); user.setPassword("123456"); userHandler.createUser(user, true); user = userHandler.findUserByName("testing"); assertNotNull(user); PortalConfig pConfig = storage_.getPortalConfig(PortalConfig.USER_TYPE, "testing"); assertNotNull("the User's PortalConfig is not null", pConfig); } public void testWSRP() throws Exception { WSRP wsrp = new WSRP(); String id = "portlet id"; wsrp.setPortletId(id); TransientApplicationState<WSRP> state = new TransientApplicationState<WSRP>("test", wsrp); Application<WSRP> wsrpApplication = Application.createWSRPApplication(); wsrpApplication.setState(state); Page container = new Page(); String pageId = "portal::test::wsrp_page"; container.setPageId(pageId); container.getChildren().add(wsrpApplication); pageService.savePage(new PageContext(container.getPageKey(), null)); storage_.save(container); container = storage_.getPage(pageId); wsrpApplication = (Application<WSRP>) container.getChildren().get(0); wsrp = storage_.load(wsrpApplication.getState(), ApplicationType.WSRP_PORTLET); assertNotNull(wsrp); assertEquals(id, wsrp.getPortletId()); } public void testJTA() throws Exception { jtaUserTransactionLifecycleService.beginJTATransaction(); Page page = new Page(); page.setPageId("portal::test::searchedpage2"); pageService.savePage(new PageContext(page.getPageKey(), null)); PageContext pageContext = pageService.loadPage(page.getPageKey()); pageContext.setState(pageContext.getState().builder().displayName("Juuu2 Ziii2").build()); pageService.savePage(pageContext); assertPageFound(0, 10, null, null, null, "Juuu2 Ziii2", "portal::test::searchedpage2"); jtaUserTransactionLifecycleService.finishJTATransaction(); jtaUserTransactionLifecycleService.beginJTATransaction(); pageService.destroyPage(pageContext.getKey()); assertPageNotFound(0, 10, null, null, null, "Juuu2 Ziii2"); jtaUserTransactionLifecycleService.finishJTATransaction(); } public void testGettingGadgetInDashboard() throws Exception { Page page = new Page(); page.setPageId("user::john::foo"); Application<Portlet> app = Application.createPortletApplication(); app.setState(new TransientApplicationState<Portlet>("dashboard/DashboardPortlet")); page.getChildren().add(app); pageService.savePage(new PageContext(page.getPageKey(), null)); storage_.save(page); page = storage_.getPage("user::john::foo"); String id = page.getChildren().get(0).getStorageId(); // Load the dashboard itself Dashboard dashboard = storage_.loadDashboard(id); // Put a gadget in one container Container row0 = (Container) dashboard.getChildren().get(0); Application<Gadget> gadgetApp = Application.createGadgetApplication(); gadgetApp.setState(new TransientApplicationState<Gadget>("foo")); row0.getChildren().add(gadgetApp); // Save the dashboard storage_.saveDashboard(dashboard); // Load again the persisted version dashboard = storage_.loadDashboard(id); row0 = (Container) dashboard.getChildren().get(0); Application<Gadget> gadget = (Application<Gadget>) row0.getChildren().get(0); String storageId = gadget.getStorageId(); // Now get the gadget by StorageId Application<Object> applicationModel = storage_.getApplicationModel(storageId); assertEquals(gadget.getId(), applicationModel.getId()); String[] siteInfo = storage_.getSiteInfo(storageId); assertEquals(PortalConfig.USER_TYPE, siteInfo[0]); assertEquals("john", siteInfo[1]); } }