/* * Copyright (C) 2011 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 org.exoplatform.portal.mop.SiteKey; 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> */ public class TestNavigationServiceRebase extends AbstractTestNavigationService { public void testRebase1() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase1"); Navigation def = portal.getRootNavigation().addChild("default"); def.addChild("a"); def.addChild("d"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase1")); Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; Node a = root1.getChild("a"); Node d = root1.getChild("d"); Node b = root1.addChild(1, "b"); // Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; Node c2 = root2.addChild(1, "c"); service.saveNode(root2.context, null); sync(true); // service.rebaseNode(root1.context, null, null); assertEquals(4, root1.getNodeCount()); assertSame(a, root1.getChild(0)); assertSame(b, root1.getChild(1)); Node c1 = root1.getChild(2); assertEquals("c", c1.getName()); assertEquals(c2.getId(), c1.getId()); assertSame(d, root1.getChild(3)); } public void testRebase2() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase2"); Navigation def = portal.getRootNavigation().addChild("default"); def.addChild("a"); def.addChild("b"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase2")); Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; Node a = root1.getChild("a"); Node b = root1.getChild("b"); Node c = a.addChild("c"); // Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root2.getChild("b").addChild(root2.getChild("a")); service.saveNode(root2.context, null); sync(true); // service.rebaseNode(root1.context, null, null); assertEquals(null, root1.getChild("a")); assertSame(b, root1.getChild("b")); assertEquals(root1, b.getParent()); assertSame(a, b.getChild("a")); assertEquals(b, a.getParent()); assertSame(c, a.getChild("c")); assertEquals(a, c.getParent()); } public void testRebase3() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase3"); Navigation def = portal.getRootNavigation().addChild("default"); def.addChild("a"); def.addChild("b"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase3")); Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root.getChild("a").addChild("foo"); // Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root2.removeChild("a"); service.saveNode(root2.context, null); sync(true); // try { service.rebaseNode(root.context, null, null); fail(); } catch (NavigationServiceException e) { assertEquals(NavigationError.ADD_CONCURRENTLY_REMOVED_PARENT_NODE, e.getError()); } } /** * This test is quite important as it ensures that the copy tree during the rebase operation is rebuild from the initial * state. Indeed the move / destroy operations would fail otherwise as the move operation would not find its source. */ public void testRebase4() { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase4"); Navigation def = portal.getRootNavigation().addChild("default"); def.addChild("a").addChild("b"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase4")); Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root.addChild(root.getChild("a").getChild("b")); root.removeChild("a"); // service.rebaseNode(root.context, null, null); } public void testRebaseAddDuplicate() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_add_duplicate"); Navigation def = portal.getRootNavigation().addChild("default"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_add_duplicate")); Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root.addChild("a"); // Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root2.addChild("a"); service.saveNode(root2.context, null); sync(true); // try { service.rebaseNode(root.context, null, null); fail(); } catch (NavigationServiceException e) { assertEquals(NavigationError.ADD_CONCURRENTLY_ADDED_NODE, e.getError()); } } public void testRebaseMoveDuplicate() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_move_duplicate"); Navigation def = portal.getRootNavigation().addChild("default"); def.addChild("a").addChild("b"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_move_duplicate")); Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root.addChild(root.getChild("a").getChild("b")); // Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root2.addChild("b"); service.saveNode(root2.context, null); sync(true); // try { service.rebaseNode(root.context, null, null); fail(); } catch (NavigationServiceException e) { assertEquals(NavigationError.MOVE_CONCURRENTLY_DUPLICATE_NAME, e.getError()); } } public void testRebaseRenameDuplicate() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_rename_duplicate"); Navigation def = portal.getRootNavigation().addChild("default"); def.addChild("a"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_rename_duplicate")); Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root.getChild("a").setName("b"); // Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root2.addChild("b"); service.saveNode(root2.context, null); sync(true); // try { service.rebaseNode(root.context, null, null); fail(); } catch (NavigationServiceException e) { assertEquals(NavigationError.RENAME_CONCURRENTLY_DUPLICATE_NAME, e.getError()); } } public void testFederation() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_federation"); Navigation def = portal.getRootNavigation().addChild("default"); def.addChild("a").addChild("b"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_federation")); Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).node; final Node a = root1.getChild("a"); final Node c = root1.addChild("c"); // Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; root2.addChild("d").addChild("e"); service.saveNode(root2.context, null); sync(true); // Iterator<NodeChange<Node>> changes = a.rebase(service, Scope.CHILDREN); Iterator<Node> children = root1.getChildren().iterator(); assertSame(a, children.next()); assertSame(c, children.next()); Node d = children.next(); assertEquals("d", d.getName()); assertFalse(children.hasNext()); assertFalse(d.context.isExpanded()); children = a.getChildren().iterator(); Node b = children.next(); assertEquals("b", b.getName()); assertFalse(children.hasNext()); assertFalse(b.context.isExpanded()); NodeChange.Added<Node> added1 = (NodeChange.Added<Node>) changes.next(); assertSame(b, added1.getTarget()); assertSame(null, added1.getPrevious()); assertSame(a, added1.getParent()); NodeChange.Added<Node> added2 = (NodeChange.Added<Node>) changes.next(); assertSame(d, added2.getTarget()); assertSame(c, added2.getPrevious()); assertSame(root1, added2.getParent()); assertFalse(changes.hasNext()); } public void testTransientParent() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_transient_parent"); portal.getRootNavigation().addChild("default"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_transient_parent")); Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).node; Node a = root.addChild("a"); Node b = root.addChild("b"); // It is only failed if we add more than one transient node // service.rebaseNode(a.context, Scope.CHILDREN, null); } public void testRemovedNavigation() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_removed_navigation"); portal.getRootNavigation().addChild("default"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_removed_navigation")); Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode(); service.destroyNavigation(navigation); // sync(true); // try { service.rebaseNode(root.context, null, null); } catch (NavigationServiceException e) { assertSame(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError()); } } public void testStateRebase() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_state"); Navigation def = portal.getRootNavigation().addChild("default"); def.addChild("a"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_state")); Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; NodeState state = new NodeState.Builder().label("foo").build(); root.getChild("a").setState(state); assertSame(state, root.getChild("a").getState()); // sync(true); // Iterator<NodeChange<Node>> changes = root.rebase(service, null); assertFalse(changes.hasNext()); assertSame(state, root.getChild("a").getState()); } public void testNameRebase() throws Exception { MOPService mop = mgr.getPOMService(); Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_name"); Navigation def = portal.getRootNavigation().addChild("default"); def.addChild("a"); // sync(true); // NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_name")); Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node; Node a = root.getChild("a"); a.setName("b"); assertSame("b", a.getName()); // sync(true); // Iterator<NodeChange<Node>> changes = root.rebase(service, null); assertFalse(changes.hasNext()); assertSame("b", a.getName()); } }