/* * Copyright (C) 2010 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.mop.navigation; import java.util.Iterator; import java.util.List; import javax.jcr.NodeIterator; import javax.jcr.Session; import org.exoplatform.portal.mop.Described; import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.mop.Visibility; import org.exoplatform.portal.pom.data.MappedAttributes; import org.gatein.mop.api.workspace.Navigation; import org.gatein.mop.api.workspace.ObjectType; import org.gatein.mop.api.workspace.Site; import org.gatein.mop.core.api.MOPService; /** * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> * @version $Revision$ */ public class TestNavigationService extends AbstractTestNavigationService { public void testNonExistingSite() throws Exception { assertNull(service.loadNavigation(SiteKey.portal("non_existing"))); } // Do not execute this test case for the moment as it depends on // execution order of test cases, that explains failure in JDK 1.7 public void _testLoadNavigations() { List<NavigationContext> navCtxs = service.loadNavigations(SiteType.PORTAL); assertEquals(3, navCtxs.size()); } public void testLoadSingleScope() throws Exception { NavigationContext nav = service.loadNavigation(SiteKey.portal("classic")); Node root = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); assertNull(root.getChildren()); assertEquals("default", root.getName()); try { root.getChild(0); fail(); } catch (IllegalStateException ignore) { } try { root.addChild("a"); fail(); } catch (IllegalStateException e) { } try { root.addChild(0, "a"); fail(); } catch (IllegalStateException e) { } try { root.removeChild("a"); fail(); } catch (IllegalStateException e) { } } public void testLoadChildrenScope() throws Exception { NavigationContext nav = service.loadNavigation(SiteKey.portal("classic")); Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); assertEquals("default", root.getName()); Iterator<? extends Node> i = root.getChildren().iterator(); assertTrue(i.hasNext()); Node home = i.next(); assertSame(home, root.getChild(0)); assertNull(home.getChildren()); assertEquals("home", home.getName()); assertTrue(i.hasNext()); Node webexplorer = i.next(); assertNull(webexplorer.getChildren()); assertSame(webexplorer, root.getChild(1)); assertEquals("webexplorer", webexplorer.getName()); assertFalse(i.hasNext()); } public void testLoadCustomScope() throws Exception { NavigationContext nav = service.loadNavigation(SiteKey.portal("large")); Node root = service.loadNode(Node.MODEL, nav, new Scope() { public Visitor get() { return new Visitor() { public VisitMode enter(int depth, String id, String name, NodeState state) { boolean use = false; switch (depth) { case 0: use = "default".equals(name); break; case 1: use = "b".equals(name); break; case 2: use = "d".equals(name); break; } return use ? VisitMode.ALL_CHILDREN : VisitMode.NO_CHILDREN; } public void leave(int depth, String id, String name, NodeState state) { } }; } }, null).getNode(); assertNull(root.getChild("a").getChildren()); Node b = root.getChild("b"); Node d = b.getChild("d"); assertNull(d.getChild("e").getChildren()); } public void testUpdateNode() throws Exception { NavigationContext nav = service.loadNavigation(SiteKey.portal("large")); Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); Node a = root.getChild("a"); assertNotNull(a); assertNull(a.getChildren()); a.update(service, Scope.CHILDREN); assertNotNull(a.getChildren()); assertEquals(1, a.getChildren().size()); Node c = a.getChild("c"); assertEquals("c", c.getName()); assertSame(a, c.getParent()); service.updateNode(a.context, Scope.SINGLE, null); assertNotNull(a.getChildren()); assertEquals(1, a.getChildren().size()); assertSame(c, a.getChild("c")); assertNotNull(c.getParent()); } public void testState() throws Exception { NavigationContext nav = service.loadNavigation(SiteKey.portal("test")); Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode(); assertEquals(5, root.getNodeCount()); Node child1 = root.getChild("node_name"); Node child2 = root.getChild("node_name4"); assertEquals("node_name", child1.getName()); assertEquals("node_label", child1.getContext().getState().getLabel()); assertEquals(SiteKey.portal("test").page("test1"), child1.getContext().getState().getPageRef()); assertEquals(Visibility.TEMPORAL, child1.getContext().getState().getVisibility()); assertEquals(953602380000L, child1.getContext().getState().getStartPublicationTime()); assertEquals(1237599180000L, child1.getContext().getState().getEndPublicationTime()); assertEquals("node_name4", child2.getName()); assertEquals("node_label4", child2.getContext().getState().getLabel()); assertEquals(SiteKey.portal("test").page("test1"), child2.getContext().getState().getPageRef()); assertEquals(Visibility.DISPLAYED, child2.getContext().getState().getVisibility()); } public void testDepth() throws Exception { NavigationContext nav = service.loadNavigation(SiteKey.portal("test")); Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode(); Node child1 = root.getChild("node_name"); assertEquals(0, child1.context.getDepth(child1.context)); assertEquals(1, child1.context.getDepth(root.context)); try { root.context.getDepth(child1.context); fail(); } catch (IllegalArgumentException e) { } } public void testHiddenNode() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_node"); Navigation defaultNav = portal.getRootNavigation().addChild("default"); defaultNav.addChild("a"); defaultNav.addChild("b"); defaultNav.addChild("c"); // sync(true); // NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_node")); // Node root; Node a; Node b; Node c; // root = service.loadNode(Node.MODEL, nav, Scope.GRANDCHILDREN, null).getNode(); a = root.getChild("a"); b = root.getChild("b"); a.setHidden(true); assertEquals(2, root.getChildren().size()); assertNull(root.getChild("a")); assertEquals("b", root.getChild(0).getName()); try { root.getChild(2); fail(); } catch (IndexOutOfBoundsException ignore) { } assertFalse(root.removeChild("a")); try { b.setName("a"); fail(); } catch (IllegalArgumentException ignore) { } // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); a = root.getChild("a"); b = root.getChild("b"); c = root.getChild("c"); b.setHidden(true); assertSame(a, root.getChild(0)); assertSame(c, root.getChild(1)); try { root.getChild(2); fail(); } catch (IndexOutOfBoundsException e) { } // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); a = root.getChild("a"); b = root.getChild("b"); c = root.getChild("c"); a.setHidden(true); c.setHidden(true); assertSame(b, root.getChild(0)); try { root.getChild(1); fail(); } catch (IndexOutOfBoundsException e) { } } public void testHiddenInsert1() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_insert_1"); Navigation defaultNav = portal.getRootNavigation().addChild("default"); defaultNav.addChild("a"); // sync(true); // NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_insert_1")); // Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); Node a = root.getChild("a"); a.setHidden(true); Node b = root.addChild("b"); assertEquals(1, root.getChildren().size()); assertSame(b, root.getChildren().iterator().next()); a.setHidden(false); assertEquals(2, root.getChildren().size()); Iterator<Node> it = root.getChildren().iterator(); assertSame(b, it.next()); assertSame(a, it.next()); // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); a = root.getChild("a"); a.setHidden(true); b = root.addChild(0, "b"); assertEquals(1, root.getChildren().size()); assertSame(b, root.getChildren().iterator().next()); a.setHidden(false); assertEquals(2, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(b, it.next()); assertSame(a, it.next()); } public void testHiddenInsert2() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_insert_2"); Navigation defaultNav = portal.getRootNavigation().addChild("default"); defaultNav.addChild("a"); defaultNav.addChild("b"); // sync(true); // NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_insert_2")); // Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); Node a = root.getChild("a"); Node b = root.getChild("b"); b.setHidden(true); Node c = root.addChild(0, "c"); assertEquals(2, root.getChildren().size()); Iterator<Node> it = root.getChildren().iterator(); assertSame(c, it.next()); assertSame(a, it.next()); b.setHidden(false); assertEquals(3, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(c, it.next()); assertSame(a, it.next()); assertSame(b, it.next()); // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); a = root.getChild("a"); b = root.getChild("b"); b.setHidden(true); c = root.addChild(1, "c"); assertEquals(2, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(c, it.next()); b.setHidden(false); assertEquals(3, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(c, it.next()); assertSame(b, it.next()); // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); a = root.getChild("a"); b = root.getChild("b"); b.setHidden(true); c = root.addChild("c"); assertEquals(2, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(c, it.next()); b.setHidden(false); assertEquals(3, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(c, it.next()); assertSame(b, it.next()); } public void testHiddenInsert3() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_insert_3"); Navigation defaultNav = portal.getRootNavigation().addChild("default"); defaultNav.addChild("a"); defaultNav.addChild("b"); defaultNav.addChild("c"); // sync(true); // NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_insert_3")); // Node root, a, b, c, d; Iterator<Node> it; // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); a = root.getChild("a"); b = root.getChild("b"); c = root.getChild("c"); b.setHidden(true); d = root.addChild(0, "d"); assertEquals(3, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(d, it.next()); assertSame(a, it.next()); assertSame(c, it.next()); b.setHidden(false); assertEquals(4, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(d, it.next()); assertSame(a, it.next()); assertSame(b, it.next()); assertSame(c, it.next()); // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); a = root.getChild("a"); b = root.getChild("b"); c = root.getChild("c"); b.setHidden(true); d = root.addChild(1, "d"); assertEquals(3, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(d, it.next()); assertSame(c, it.next()); b.setHidden(false); assertEquals(4, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(d, it.next()); assertSame(b, it.next()); assertSame(c, it.next()); // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); a = root.getChild("a"); b = root.getChild("b"); c = root.getChild("c"); b.setHidden(true); d = root.addChild(2, "d"); assertEquals(3, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(c, it.next()); assertSame(d, it.next()); b.setHidden(false); assertEquals(4, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(b, it.next()); assertSame(c, it.next()); assertSame(d, it.next()); // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); a = root.getChild("a"); b = root.getChild("b"); c = root.getChild("c"); b.setHidden(true); d = root.addChild("d"); assertEquals(3, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(c, it.next()); assertSame(d, it.next()); b.setHidden(false); assertEquals(4, root.getChildren().size()); it = root.getChildren().iterator(); assertSame(a, it.next()); assertSame(b, it.next()); assertSame(c, it.next()); assertSame(d, it.next()); } public void _testNodeInvalidationByRemoval() { // MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_removal"); portal.getRootNavigation().addChild("default"); // sync(true); // NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_removal")); Node root = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); assertNotNull(root); // sync(); // mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_removal").getRootNavigation() .getChild("default").destroy(); // sync(true); // NodeContext<Node> rootCtx = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null); assertNull(rootCtx); } public void _testNodeInvalidationByChild() { // Create a navigation MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_child"); portal.getRootNavigation().addChild("default"); // sync(true); // Put the navigation in the cache NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_child")); Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); Iterator<? extends Node> iterator = root.getChildren().iterator(); assertFalse(iterator.hasNext()); // sync(); // mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_child").getRootNavigation() .getChild("default").addChild("new"); // sync(true); // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); iterator = root.getChildren().iterator(); iterator.next(); assertFalse(iterator.hasNext()); // sync(); // mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_child").getRootNavigation() .getChild("default").getChild("new").destroy(); // sync(true); // root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode(); iterator = root.getChildren().iterator(); assertFalse(iterator.hasNext()); } public void _testNodeInvalidationByProperty() { // Create a navigation MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange"); portal.getRootNavigation().addChild("default"); // sync(true); // NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_propertychange")); Node defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); assertNull(defaultNode.getContext().getState().getLabel()); // sync(); // Described defaultDescribed = mop.getModel().getWorkspace() .getSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange").getRootNavigation().getChild("default") .adapt(Described.class); defaultDescribed.setName("bilto"); // sync(true); // defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); assertEquals("bilto", defaultNode.getContext().getState().getLabel()); // sync(); // defaultDescribed = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange") .getRootNavigation().getChild("default").adapt(Described.class); defaultDescribed.setName("bilta"); // sync(true); // defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); assertEquals("bilta", defaultNode.getContext().getState().getLabel()); // sync(); // defaultDescribed = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange") .getRootNavigation().getChild("default").adapt(Described.class); defaultDescribed.setName(null); // sync(true); // defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); assertNull(defaultNode.getContext().getState().getLabel()); } public void _testNodeInvalidationByAttribute() { // MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute"); portal.getRootNavigation().addChild("default"); // sync(true); // NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_attribute")); Node defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); // sync(); // mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute").getRootNavigation() .getChild("default").getAttributes().setValue(MappedAttributes.URI, "foo_uri"); // sync(true); // defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); // sync(); // mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute").getRootNavigation() .getChild("default").getAttributes().setValue(MappedAttributes.URI, "bar_uri"); // sync(true); // defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); // sync(); // mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute").getRootNavigation() .getChild("default").getAttributes().setValue(MappedAttributes.URI, null); // sync(true); // defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode(); } public void _testWeirdBug() { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "reorder_child_2"); Navigation rootNavigation = portal.getRootNavigation().addChild("default"); rootNavigation.addChild("foo"); rootNavigation.addChild("bar"); rootNavigation.addChild("juu"); // sync(true); // portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2"); rootNavigation = portal.getRootNavigation().getChild("default"); rootNavigation.getChild("bar").destroy(); // sync(true); // portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2"); rootNavigation = portal.getRootNavigation().getChild("default"); rootNavigation.addChild("daa"); // sync(true); // portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2"); rootNavigation = portal.getRootNavigation().getChild("default"); Navigation daa = rootNavigation.getChildren().get(2); assertEquals("daa", daa.getName()); } public void _testWeirdBug2() throws Exception { MOPService mop = mgr.getPOMService(); Session session = mop.getModel().getSession().getJCRSession(); javax.jcr.Node container = session.getRootNode().getNode("mop:workspace/mop:portalsites") .addNode("mop:reorder_child_2").getNode("mop:rootnavigation/mop:children").addNode("mop:default") .getNode("mop:children"); container.addNode("mop:foo"); container.addNode("mop:bar"); container.addNode("mop:juu"); // sync(true); // session = mop.getModel().getSession().getJCRSession(); container = session.getRootNode().getNode( "mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children"); container.getNode("mop:bar").remove(); // sync(true); // session = mop.getModel().getSession().getJCRSession(); container = session.getRootNode().getNode( "mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children"); container.addNode("mop:daa"); container.orderBefore("mop:daa", null); // sync(true); // container = session.getRootNode().getNode( "mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children"); NodeIterator it = container.getNodes(); assertEquals("mop:foo", it.nextNode().getName()); assertEquals("mop:juu", it.nextNode().getName()); assertEquals("mop:daa", it.nextNode().getName()); assertFalse(it.hasNext()); } public void testCount() { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "count"); portal.getRootNavigation().addChild("default"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("count")); Node root; // root = service.loadNode(Node.MODEL, navigation, Scope.SINGLE, null).getNode(); assertEquals(0, root.getNodeCount()); // assertEquals(-1, root.getSize()); // root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode(); assertEquals(0, root.getNodeCount()); assertEquals(0, root.getSize()); Node a = root.addChild("a"); assertEquals(1, root.getNodeCount()); assertEquals(1, root.getSize()); a.setHidden(true); assertEquals(0, root.getNodeCount()); assertEquals(1, root.getSize()); } public void testInsertDuplicate() { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "insert_duplicate"); portal.getRootNavigation().addChild("default").addChild("a"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("insert_duplicate")); Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode(); try { root.addChild("a"); fail(); } catch (IllegalArgumentException e) { } } }