/**
* This file Copyright (c) 2010-2012 Magnolia International
* Ltd. (http://www.magnolia-cms.com). All rights reserved.
*
*
* This file is dual-licensed under both the Magnolia
* Network Agreement and the GNU General Public License.
* You may elect to use one or the other of these licenses.
*
* This file is distributed in the hope that it will be
* useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
* Redistribution, except as permitted by whichever of the GPL
* or MNA you select, is prohibited.
*
* 1. For the GPL license (GPL), you can redistribute and/or
* modify this file under the terms of the GNU General
* Public License, Version 3, as published by the Free Software
* Foundation. You should have received a copy of the GNU
* General Public License, Version 3 along with this program;
* if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 2. For the Magnolia Network Agreement (MNA), this file
* and the accompanying materials are made available under the
* terms of the MNA which accompanies this distribution, and
* is available at http://www.magnolia-cms.com/mna.html
*
* Any modifications to this file must keep this entire header
* intact.
*
*/
package info.magnolia.cms.util;
import static org.junit.Assert.*;
import info.magnolia.cms.core.Content;
import info.magnolia.cms.core.HierarchyManager;
import info.magnolia.cms.core.NodeData;
import info.magnolia.test.MgnlTestCase;
import info.magnolia.test.mock.MockContent;
import info.magnolia.test.mock.MockUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.jcr.RepositoryException;
import org.junit.Test;
/**
* @version $Id$
*/
public class ExtendingContentWrapperTest extends MgnlTestCase {
@Test
public void testExtendsNodeDatasIsHidden() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/base/node/nodeData1=org1\n" +
"/impl/node/extends=../../base/node\n" +
"/impl/node/nodeData2=org2");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
assertFalse(extendedContent.hasNodeData(ExtendingContentWrapper.EXTENDING_NODE_DATA));
assertFalse(extendedContent.getNodeData(ExtendingContentWrapper.EXTENDING_NODE_DATA).isExist());
for (NodeData nd : extendedContent.getNodeDataCollection()) {
if (ExtendingContentWrapper.EXTENDING_NODE_DATA.equals(nd.getName())) {
fail("Found extends node data that is supposed to be hidden.");
}
}
}
@Test
public void testThatNodeDatasAreMerged() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/base/node/nodeData1=org1\n" +
"/impl/node/extends=../../base/node\n" +
"/impl/node/nodeData2=org2");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
assertTrue(extendedContent.hasNodeData("nodeData1"));
assertTrue(extendedContent.hasNodeData("nodeData2"));
assertFalse(extendedContent.hasNodeData("nodeData3"));
assertEquals("org1", extendedContent.getNodeData("nodeData1").getString());
assertEquals("org2", extendedContent.getNodeData("nodeData2").getString());
assertEquals(2, extendedContent.getNodeDataCollection().size());
}
@Test
public void testThatNodeDatasCanBeOverriden() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/base/node/nodeData=org1\n" +
"/impl/node/extends=../../base/node\n" +
"/impl/node/nodeData=new");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
assertEquals("new", extendedContent.getNodeData("nodeData").getString());
assertEquals(1, extendedContent.getNodeDataCollection().size());
}
@Test
public void testThatSubNodesAreMerged() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/base/node/subnode1\n" +
"/impl/node/extends=../../base/node\n" +
"/impl/node/subnode2");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
assertTrue(extendedContent.hasContent("subnode1"));
assertTrue(extendedContent.hasContent("subnode2"));
assertNotNull(extendedContent.getContent("subnode1"));
assertNotNull(extendedContent.getContent("subnode2"));
assertEquals(2, extendedContent.getChildren().size());
}
@Test
public void testThatSubNodesCanBeOverwritten() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/base/node/subnode@uuid=1\n" +
"/impl/node/extends=../../base/node\n" +
"/impl/node/subnode@uuid=2");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
assertTrue(extendedContent.hasContent("subnode"));
assertEquals("2", extendedContent.getContent("subnode").getUUID());
assertEquals(1, extendedContent.getChildren().size());
}
@Test
public void testDeepMerge() throws IOException, RepositoryException{
String [][] expected = new String[][]{
{"nodeData1","org1"}, // inherited
{"nodeData2","org2.2"}, // overwritten
{"nodeData3","org3"}, // added
};
HierarchyManager hm = MockUtil.createHierarchyManager(
"/base/node/subnode/nodeData1=org1\n" +
"/base/node/subnode/nodeData2=org2.1\n" +
"/impl/node/extends=../../base/node\n" +
"/impl/node/subnode/nodeData2=org2.2\n" +
"/impl/node/subnode/nodeData3=org3");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
Content subnode = extendedContent.getContent("subnode");
for (String[] pair : expected) {
String name = pair[0];
String value = pair[1];
assertTrue(subnode.hasNodeData(name));
assertEquals(value, subnode.getNodeData(name).getString());
}
Collection<NodeData> nodeDataCollection = subnode.getNodeDataCollection();
assertEquals(3, nodeDataCollection.size());
// test content of the collection
int pos = 0;
for (NodeData nodeData : nodeDataCollection) {
assertEquals(expected[pos][1], nodeData.getString());
pos ++;
}
}
@Test
public void testThatOrderIsKeptWhileMergingSubNodes() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/base/node/subnode1@uuid=1\n" +
"/base/node/subnode2@uuid=2.1\n" +
"/base/node/subnode3@uuid=3\n" +
"/impl/node/extends=../../base/node\n" +
"/impl/node/subnode2@uuid=2.2\n" +
"/impl/node/subnode4@uuid=4");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
assertTrue(extendedContent.hasContent("subnode1"));
assertTrue(extendedContent.hasContent("subnode2"));
assertTrue(extendedContent.hasContent("subnode3"));
assertTrue(extendedContent.hasContent("subnode4"));
assertEquals("1", extendedContent.getContent("subnode1").getUUID());
assertEquals("2.2", extendedContent.getContent("subnode2").getUUID());
assertEquals("3", extendedContent.getContent("subnode3").getUUID());
assertEquals("4", extendedContent.getContent("subnode4").getUUID());
List<Content> subnodes = new ArrayList<Content>(extendedContent.getChildren());
for (int i = 0; i < 4; i++) {
assertEquals("subnode" + (i+1), subnodes.get(i).getName());
}
assertEquals(4, subnodes.size());
}
@Test
public void testBasicMultipleInheritance() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/superbase/node/nodeData1=org1\n" +
"/base/node/extends=../../superbase/node\n" +
"/base/node/nodeData2=org2\n" +
"/impl/node/extends=../../base/node\n" +
"/impl/node/nodeData3=org3");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
assertTrue(extendedContent.hasNodeData("nodeData1"));
assertTrue(extendedContent.hasNodeData("nodeData2"));
assertTrue(extendedContent.hasNodeData("nodeData3"));
assertEquals("org1", extendedContent.getNodeData("nodeData1").getString());
assertEquals("org2", extendedContent.getNodeData("nodeData2").getString());
assertEquals("org3", extendedContent.getNodeData("nodeData3").getString());
assertEquals(3, extendedContent.getNodeDataCollection().size());
}
@Test
public void testComplextMultipleInheritance1() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/superbase/nodeData1=org1\n" +
"/base/node/subnode/nodeData2=org2\n" +
"/base/node/subnode/extends=/superbase\n" +
"/impl/node/extends=/base/node\n" +
"/impl/node/subnode/nodeData3=org3");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
Content subnode = extendedContent.getContent("subnode");
assertTrue(subnode.hasNodeData("nodeData1"));
assertTrue(subnode.hasNodeData("nodeData2"));
assertTrue(subnode.hasNodeData("nodeData3"));
assertEquals("org1", subnode.getNodeData("nodeData1").getString());
assertEquals("org2", subnode.getNodeData("nodeData2").getString());
assertEquals("org3", subnode.getNodeData("nodeData3").getString());
assertEquals(3, subnode.getNodeDataCollection().size());
}
@Test
public void testComplextMultipleInheritance2() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/superbase/nodeData1=org1\n" +
"/base/node/subnode/nodeData2=org2\n" +
"/impl/node/extends=/base/node\n" +
"/impl/node/subnode/extends=/superbase\n" +
"/impl/node/subnode/nodeData3=org3");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
Content subnode = extendedContent.getContent("subnode");
assertTrue(subnode.hasNodeData("nodeData1"));
assertTrue(subnode.hasNodeData("nodeData2"));
assertTrue(subnode.hasNodeData("nodeData3"));
assertEquals("org1", subnode.getNodeData("nodeData1").getString());
assertEquals("org2", subnode.getNodeData("nodeData2").getString());
assertEquals("org3", subnode.getNodeData("nodeData3").getString());
assertEquals(3, subnode.getNodeDataCollection().size());
}
@Test
public void testComplextMultipleInheritanceWithOverride() throws IOException, RepositoryException{
HierarchyManager hm = MockUtil.createHierarchyManager(
"/superbase/nodeData1=org1\n" +
"/superbase/uglyChild/withSubChild/nodeDataX=over1\n" +
"/base/node/subnode/nodeData2=org2\n" +
"/impl/node/extends=/base/node\n" +
"/impl/node/subnode/extends=/superbase\n" +
"/impl/node/subnode/uglyChild/extends=override\n" +
"/impl/node/subnode/nodeData3=org3");
Content plainContent = hm.getContent("/impl/node");
Content extendedContent = new ExtendingContentWrapper(plainContent);
Content subnode = extendedContent.getContent("subnode");
// inherited from superbase:
assertTrue(subnode.hasNodeData("nodeData1"));
// inherited from base/node:/subnode
assertTrue(subnode.hasNodeData("nodeData2"));
// subnode's own content
assertTrue(subnode.hasNodeData("nodeData3"));
// override defining node
Content disinheritedNode = subnode.getContent("uglyChild");
// we hide extends now
assertFalse(disinheritedNode.hasNodeData(ExtendingContentWrapper.EXTENDING_NODE_DATA));
// superbase child node should not be inherited because of override
assertFalse(disinheritedNode.hasContent("withSubChild"));
assertEquals("org2", subnode.getNodeData("nodeData2").getString());
assertEquals("org3", subnode.getNodeData("nodeData3").getString());
assertEquals(3, subnode.getNodeDataCollection().size());
}
@Test
public void testExtendsNonAbsolutelyAndNodeIsNotExisting() throws IOException, RepositoryException {
// GIVEN
HierarchyManager hm =
MockUtil.createHierarchyManager("/superbase/nodeData1=org1\n"
+ "/superbase/uglyChild/nodeDataX=over1\n" + "/impl/node/extends=/superbase\n"
+ "/impl/node2/extends=../../superbase/uglyChild\n"
+ "/impl/node3/extends=../../superbase/wrongNode");
try {
Content plainContent = hm.getContent("/impl/node3");
// WHEN
new ExtendingContentWrapper(plainContent, true);
fail("Must never get here!");
// THEN
} catch (RuntimeException e) {
assertEquals("Can't find referenced node for value: testSession:/impl/node3[mgnl:contentNode]", e.getMessage());
}
}
@Test
public void testExtendsWithEmptyValue() throws Exception {
// GIVEN
HierarchyManager hm = MockUtil.createHierarchyManager("/impl/node\n");
Content plainContent = hm.getContent("/impl/node");
plainContent.setNodeData(ExtendingContentWrapper.EXTENDING_NODE_DATA, " ");
// WHEN
ExtendingContentWrapper extendedContent = new ExtendingContentWrapper(plainContent);
// THEN
assertFalse(extendedContent.isExtending());
}
@Test
public void testExtendsAbsolutelyAndNodeIsNotExisting() throws IOException, RepositoryException {
// GIVEN
HierarchyManager hm =
MockUtil.createHierarchyManager(
"/impl/node/extends=/base/node\n" +
"/impl/node/nodeData2=org2");
Content plainContent = hm.getContent("/impl/node");
// WHEN
try {
new ExtendingContentWrapper(plainContent, true);
fail("should never get here...");
// THEN
} catch (RuntimeException e) {
assertEquals("Can't find referenced node for value: testSession:/impl/node[mgnl:contentNode]", e.getMessage());
}
}
@Test
public void testGetHandle() throws IOException, RepositoryException {
// GIVEN
MockContent plainContent = new MockContent("impl");
Content nodeContent = plainContent.createContent("node");
Content extendedContent = new ExtendingContentWrapper(nodeContent);
// WHEN
final String result = extendedContent.getHandle();
// THEN
assertEquals("/impl/node", result);
}
}