/* * Copyright (C) 2003-2007 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.services.ecm.dms.link; import org.exoplatform.services.cms.link.LinkManager; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.BaseWCMTestCase; import org.exoplatform.services.wcm.core.NodetypeConstant; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.Session; import java.util.Calendar; import java.util.GregorianCalendar; /** * Created by The eXo Platform SARL * Author : Ly Dinh Quang * quang.ly@exoplatform.com * xxx5669@gmail.com * Jun 9, 2009 */ public class TestLinkManager extends BaseWCMTestCase { private LinkManager linkManager; private Session session; private Node rootNode; private final static String WORKSPACE = "exo:workspace"; private final static String UUID = "exo:uuid"; private final static String PRIMARY_TYPE = "exo:primaryType"; private static final Log LOG = ExoLogger.getLogger(TestLinkManager.class.getName()); /** * Set up for testing * * In Collaboration workspace * * /---TestTreeNode * | * |_____A1 * | |___A1_1 * | |___A1_1_1 * | |___A1_2 * | |___A1_3 * | |___A1_4 * | * |_____B1 * |___B1_1 * */ public void setUp() throws Exception { super.setUp(); linkManager = (LinkManager) container.getComponentInstanceOfType(LinkManager.class); applyUserSession("john", "gtn", COLLABORATION_WS); createTree(); } public void createTree() throws Exception { session = sessionProviderService_.getSystemSessionProvider(null).getSession(COLLABORATION_WS, repository); rootNode = session.getRootNode(); Node testNode = rootNode.addNode("TestTreeNode"); Node nodeA1 = testNode.addNode("A1"); nodeA1.addNode("A1_1").addNode("A1_1_1"); nodeA1.addNode("A1_2"); nodeA1.addNode("A1_3"); nodeA1.addNode("A1_4"); testNode.addNode("B1").addNode("B1_1"); session.save(); assertNotNull(nodeA1); } /** * Creates a new link * Input: * parent = nodeA1(TestTreeNode/A1), target = nodeB1_1(TestTreeNode/B1/B1_1) * Expect: * node: name = B1_1, primaryNodeType = "exo:symlink", parent = nodeA1, * value property of this node * exo:workspace = COLLABORATION_WS, exo:uuid = uuid of nodeB1_1, * exo:primaryType = primaryType of node B1_1 * * Input: * parent = nodeA1_1(TestTreeNode/A1/A1_1), linkType = exo:taxonomyLink, * target = nodeB1_1(TestTreeNode/B1/B1_1) * Expect: * node: name = "B1_1", primaryNodeType = "exo:taxonomyLink", parent = nodeA1_1, * value property of this node * exo:workspace = COLLABORATION_WS, exo:uuid = uuid of nodeB1_1, * exo:primaryType = primaryType of node B1_1 * * Input: * parent = nodeA1_2(TestTreeNode/A1/A1_2), linkType = null, * target = nodeB1_1(TestTreeNode/B1/B1_1) * Expect: * node: name = "B1_1", primaryNodeType = "exo:symlink", parent = nodeA1_1, * value property of this node * exo:workspace = COLLABORATION_WS, exo:uuid = uuid of nodeB1_1, * exo:primaryType = primaryType of node B1_1 * * Input: * parent = nodeA1_3(TestTreeNode/A1/A1_3), linkType = "exo:taxonomyLink", linkName = null, * target = nodeB1_1(TestTreeNode/B1/B1_1) * Expect: * node: name = "B1_1", primaryNodeType = "exo:taxonomyLink", parent = nodeA1_1, * value property of this node * exo:workspace = COLLABORATION_WS, exo:uuid = uuid of nodeB1_1, * exo:primaryType = primaryType of node B1_1 * * Input: * parent = nodeA1_4(TestTreeNode/A1/A1_4), linkType = "exo:taxonomyLink", * linkName = "A1_3_To_B1_1", target = nodeB1_1(TestTreeNode/B1/B1_1) * Expect: * node: name = "A1_3_To_B1_1", primaryNodeType = "exo:taxonomyLink", parent = nodeA1_1, * value property of this node * exo:workspace = COLLABORATION_WS, exo:uuid = uuid of nodeB1_1, * exo:primaryType = primaryType of node B1_1 * @throws Exception */ public void testCreateLink() throws Exception { System.out.println("================== Test Create Link =================="); // Test method createLink(Node parent, Node target) Node nodeA1 = rootNode.getNode("TestTreeNode/A1"); Node nodeB1_1 = rootNode.getNode("TestTreeNode/B1/B1_1"); Node symlinkNodeA1 = linkManager.createLink(nodeA1, nodeB1_1); assertNotNull(symlinkNodeA1); assertEquals(symlinkNodeA1.getName(), nodeB1_1.getName()); assertEquals(symlinkNodeA1.getProperty(WORKSPACE).getString(), COLLABORATION_WS); assertEquals(symlinkNodeA1.getProperty(UUID).getString(), nodeB1_1.getUUID()); assertEquals(symlinkNodeA1.getProperty(PRIMARY_TYPE).getString(), nodeB1_1.getPrimaryNodeType().getName()); assertEquals(symlinkNodeA1.getPrimaryNodeType().getName(), "exo:symlink"); // Test method createLink(Node parent, String linkType, Node target) // linkType = "exo:taxonomyLink" Node nodeA1_1 = rootNode.getNode("TestTreeNode/A1/A1_1"); Node symlinkNodeA1_1 = linkManager.createLink(nodeA1_1, "exo:taxonomyLink", nodeB1_1); assertNotNull(symlinkNodeA1_1); assertEquals(symlinkNodeA1_1.getName(), nodeB1_1.getName()); assertEquals(symlinkNodeA1_1.getProperty(WORKSPACE).getString(), COLLABORATION_WS); assertEquals(symlinkNodeA1_1.getProperty(UUID).getString(), nodeB1_1.getUUID()); assertEquals(symlinkNodeA1_1.getProperty(PRIMARY_TYPE).getString(), nodeB1_1.getPrimaryNodeType().getName()); assertEquals(symlinkNodeA1_1.getPrimaryNodeType().getName(), "exo:taxonomyLink"); // Test method createLink(Node parent, String linkType, Node target) // linkType = null Node nodeA1_2 = rootNode.getNode("TestTreeNode/A1/A1_2"); Node symlinkNodeA1_2 = linkManager.createLink(nodeA1_2, null, nodeB1_1); assertNotNull(symlinkNodeA1_2); assertEquals(symlinkNodeA1_2.getName(), nodeB1_1.getName()); assertEquals(symlinkNodeA1_2.getProperty(WORKSPACE).getString(), COLLABORATION_WS); assertEquals(symlinkNodeA1_2.getProperty(UUID).getString(), nodeB1_1.getUUID()); assertEquals(symlinkNodeA1_2.getProperty(PRIMARY_TYPE).getString(), nodeB1_1.getPrimaryNodeType().getName()); assertEquals(symlinkNodeA1_2.getPrimaryNodeType().getName(), "exo:symlink"); // Test method createLink(Node parent, String linkType, Node target, String linkName) // linkType = "exo:taxonomyLink"; linkName = null Node nodeA1_3 = rootNode.getNode("TestTreeNode/A1/A1_3"); Node symlinkNodeA1_3 = linkManager.createLink(nodeA1_3, "exo:taxonomyLink", nodeB1_1, null); assertNotNull(symlinkNodeA1_3); assertEquals(symlinkNodeA1_3.getName(), nodeB1_1.getName()); assertEquals(symlinkNodeA1_3.getProperty(WORKSPACE).getString(), COLLABORATION_WS); assertEquals(symlinkNodeA1_3.getProperty(UUID).getString(), nodeB1_1.getUUID()); assertEquals(symlinkNodeA1_3.getProperty(PRIMARY_TYPE).getString(), nodeB1_1.getPrimaryNodeType().getName()); assertEquals(symlinkNodeA1_3.getPrimaryNodeType().getName(), "exo:taxonomyLink"); // Test method createLink(Node parent, String linkType, Node target, String linkName) // linkType = "exo:taxonomyLink"; linkName = "A1_3_To_B1_1" Node nodeA1_4 = rootNode.getNode("TestTreeNode/A1/A1_4"); Node symlinkNodeA1_4 = linkManager.createLink(nodeA1_4, "exo:taxonomyLink", nodeB1_1, "A1_3_To_B1_1"); assertNotNull(symlinkNodeA1_4); assertEquals(symlinkNodeA1_4.getName(), "A1_3_To_B1_1"); assertEquals(symlinkNodeA1_4.getProperty(WORKSPACE).getString(), COLLABORATION_WS); assertEquals(symlinkNodeA1_4.getProperty(UUID).getString(), nodeB1_1.getUUID()); assertEquals(symlinkNodeA1_4.getProperty(PRIMARY_TYPE).getString(), nodeB1_1.getPrimaryNodeType().getName()); assertEquals(symlinkNodeA1_4.getPrimaryNodeType().getName(), "exo:taxonomyLink"); } /** * Indicates whether the given item is a link * Input: Create a new link * parent = nodeA1(TestTreeNode/A1), nodeB1_1(TestTreeNode/B1/B1_1) * Input: * item = symlinkNodeA1 * Expect: * result: true * Input * item = nodeA1 * Expect: * result: false * @throws Exception */ public void testIsLink() throws Exception { System.out.println("================== Test Is Link =================="); Node nodeA1 = rootNode.getNode("TestTreeNode/A1"); Node nodeB1_1 = rootNode.getNode("TestTreeNode/B1/B1_1"); Node symlinkNodeA1 = linkManager.createLink(nodeA1, nodeB1_1); assertNotNull(symlinkNodeA1); assertTrue(linkManager.isLink(symlinkNodeA1)); assertFalse(linkManager.isLink(nodeA1)); } /** * Gets the target node of the given link * Input: Create a new link (symlinkNodeA1) * parent = nodeA1(TestTreeNode/A1), nodeB1_1(TestTreeNode/B1/B1_1) * Input: * link = nodeA1 * Expect: * exception: NodeA1 is not a symlink * * Input: * link = symlinkNodeA1 * Expect: * node target: name = "B1_1" is not null, * * Input: * link = symlinkNodeA1, system = true * Expect: * node target: name = "B1_1" is not null, * @throws Exception */ public void testGetTarget() throws Exception { System.out.println("================== Test Get Target =================="); Node nodeA1 = rootNode.getNode("TestTreeNode/A1"); Node nodeB1_1 = rootNode.getNode("TestTreeNode/B1/B1_1"); Node symlinkNodeA1 = linkManager.createLink(nodeA1, nodeB1_1); assertNotNull(symlinkNodeA1); try { linkManager.getTarget(nodeA1); fail("\nNode: " + nodeA1.getName() + " is not a symlink"); } catch (Exception e) { } assertNotNull(linkManager.getTarget(symlinkNodeA1)); assertEquals(linkManager.getTarget(symlinkNodeA1).getName(), nodeB1_1.getName()); assertNotNull(linkManager.getTarget(symlinkNodeA1, true)); assertEquals(linkManager.getTarget(symlinkNodeA1, true).getName(), nodeB1_1.getName()); } /** * Checks if the target node of the given link can be reached using the user session * Input: Create a new link (symlinkNodeA1) * parent = nodeA1(TestTreeNode/A1), nodeB1_1(TestTreeNode/B1/B1_1) * Input: * link = nodeA1 * Expect: * exception: NodeA1 is not a symlink node * * Input: * link = symlinkNodeA1 * Expect: * result: true * @throws Exception */ public void testIsTargetReachable() throws Exception { System.out.println("================== Test IsTargetReachable =================="); Node nodeA1 = rootNode.getNode("TestTreeNode/A1"); Node nodeB1_1 = rootNode.getNode("TestTreeNode/B1/B1_1"); Node symlinkNodeA1 = linkManager.createLink(nodeA1, nodeB1_1); assertNotNull(symlinkNodeA1); try { boolean isReachable = linkManager.isTargetReachable(nodeA1); assertFalse(isReachable); fail("\nNode: " + nodeA1.getName() + " is not a symlink node"); } catch (Exception e) { } assertTrue(linkManager.isTargetReachable(symlinkNodeA1)); } /** * Gives the primary node type of the target * Input: Create a new link (symlinkNodeA1) * parent = nodeA1(TestTreeNode/A1), nodeB1_1(TestTreeNode/B1/B1_1) * Input: * link = symlinkNodeA1 * Expect: * property exo:primaryType = primaryNodeType of nodeB1_1 * @throws Exception */ public void testGetTargetPrimaryNodeType() throws Exception { System.out.println("================== Test GetTargetPrimaryNodeType =================="); Node nodeA1 = rootNode.getNode("TestTreeNode/A1"); Node nodeB1_1 = rootNode.getNode("TestTreeNode/B1/B1_1"); Node symlinkNodeA1 = linkManager.createLink(nodeA1, nodeB1_1); assertNotNull(symlinkNodeA1); assertEquals(linkManager.getTargetPrimaryNodeType(symlinkNodeA1), nodeB1_1.getPrimaryNodeType().getName()); } /** * Updates the target node of the given link * Input: Create a new link (symlinkNodeA1) * parent = nodeA1(TestTreeNode/A1), nodeB1_1(TestTreeNode/B1/B1_1) * Input: * link = symlinkNodeA1, target = nodeB1 * Expect: * node update is not null * value property of this node * exo:workspace = workspace of node B1, exo:uuid = uuid of nodeB1, * exo:primaryType = primaryType of node B1 * @throws Exception */ public void testUpdateLink() throws Exception { System.out.println("================== Test Update Link =================="); Node nodeA1 = rootNode.getNode("TestTreeNode/A1"); Node nodeB1 = rootNode.getNode("TestTreeNode/B1"); Node nodeB1_1 = rootNode.getNode("TestTreeNode/B1/B1_1"); Node symlinkNodeA1 = linkManager.createLink(nodeA1, nodeB1_1); assertNotNull(symlinkNodeA1); Node symlinkNodeUpdate = linkManager.updateLink(symlinkNodeA1, nodeB1); assertNotNull(symlinkNodeUpdate); assertEquals(symlinkNodeUpdate.getName(), symlinkNodeA1.getName()); assertEquals(symlinkNodeUpdate.getProperty(WORKSPACE).getString(), nodeB1.getSession().getWorkspace().getName()); assertEquals(symlinkNodeUpdate.getProperty(UUID).getString(), nodeB1.getUUID()); assertEquals(symlinkNodeUpdate.getProperty(PRIMARY_TYPE).getString(), nodeB1.getPrimaryNodeType().getName()); assertEquals(symlinkNodeUpdate.getPrimaryNodeType().getName(), symlinkNodeA1.getPrimaryNodeType().getName()); } /** * Updates the given symlink * Input: Create a new link (symlinkNodeA1) * parent = nodeA1(TestTreeNode/A1), nodeB1_1(TestTreeNode/B1/B1_1) * set nodeB1_1.exo:title = tileB1; * nodeB1_1.exo:dateCreated = current Date; * nodeB1_1.exo:dateModified = current Date + 1 day; * nodeB1_1.publication:liveDate = current Date + 2 days; * nodeB1_1.exo:startEvent = = current Date + 3 days * nodeB1_1.exo:index = 100; * Input: * link = symlinkNodeA1, target = nodeB1 * * Expect: * node update is not null * value property of this node * symlink.exo:title = nodeB1_1.exo:title * symlink.exo:dateCreated = nodeB1_1.exo:dateCreated * symlink.exo:dateModified = nodeB1_1.exo:dateModified * symlink.publication:liveDate = nodeB1_1.exo:title * symlink.exo:index = nodeB1_1.exo:index * @throws Exception */ public void testUpdateSymlink() throws Exception { LOG.info("==============Test update symlink================"); Node nodeA1 = rootNode.getNode("TestTreeNode/A1"); Node nodeB1_1 = rootNode.getNode("TestTreeNode/B1/B1_1"); Node symlinkNode = linkManager.createLink(nodeA1, nodeB1_1); assertNotNull(symlinkNode); symlinkNode.addMixin("exo:modify"); symlinkNode.save(); nodeB1_1.setProperty(NodetypeConstant.EXO_TITLE, "titleB1"); nodeB1_1.setProperty(NodetypeConstant.EXO_DATE_CREATED, new GregorianCalendar()); Calendar d = new GregorianCalendar(); d.add(Calendar.DATE, 1); nodeB1_1.setProperty(NodetypeConstant.EXO_DATE_MODIFIED, d); nodeB1_1.setProperty(NodetypeConstant.EXO_LAST_MODIFIED_DATE, d); d = new GregorianCalendar(); d.add(Calendar.DATE, 2); nodeB1_1.setProperty(NodetypeConstant.PUBLICATION_LIVE_DATE, d); nodeB1_1.setProperty(NodetypeConstant.EXO_INDEX, 100); session.save(); linkManager.updateSymlink(symlinkNode); assertEquals(symlinkNode.getProperty(NodetypeConstant.EXO_DATE_CREATED).getDate().getTime(), nodeB1_1.getProperty(NodetypeConstant.EXO_DATE_CREATED).getDate().getTime()); assertEquals(symlinkNode.getProperty(NodetypeConstant.EXO_LAST_MODIFIED_DATE).getDate().getTime(), nodeB1_1.getProperty(NodetypeConstant.EXO_LAST_MODIFIED_DATE).getDate().getTime()); assertEquals(symlinkNode.getProperty(NodetypeConstant.PUBLICATION_LIVE_DATE).getDate().getTime(), nodeB1_1.getProperty(NodetypeConstant.PUBLICATION_LIVE_DATE).getDate().getTime()); assertEquals(symlinkNode.getProperty(NodetypeConstant.EXO_INDEX).getLong(), nodeB1_1.getProperty(NodetypeConstant.EXO_INDEX).getLong()); } public void tearDown() throws Exception { try { Node root = session.getRootNode(); root.getNode("TestTreeNode").remove(); root.save(); session.save(); } catch (PathNotFoundException e) { } super.tearDown(); } }