/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* 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.gatein.api.navigation;
import static org.gatein.api.navigation.ApiNodeTest.assertIterator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import org.gatein.api.AbstractApiTest;
import org.gatein.api.SerializationUtils;
import org.gatein.api.common.Filter;
import org.gatein.api.navigation.Visibility.Status;
import org.gatein.api.page.PageId;
import org.gatein.api.security.User;
import org.junit.Before;
import org.junit.Test;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class ApiFilteredNodeTest extends AbstractApiTest {
private Filter<Node> filter;
private FilteredNode filtered;
private Node root;
private Navigation navigation;
@Test
public void addChild() {
filtered.addChild("child5");
assertIterator(filtered.iterator(), "child0", "child2", "child4", "child5");
assertIterator(root.iterator(), "child0", "child1", "child2", "child3", "child4", "child5");
}
@Test
public void addChild_IndexFirst() {
filtered.addChild(0, "child5");
assertIterator(filtered.iterator(), "child5", "child0", "child2", "child4");
assertIterator(root.iterator(), "child5", "child0", "child1", "child2", "child3", "child4");
}
@Test
public void addChild_IndexLast() {
filtered.addChild(3, "child5");
assertIterator(filtered.iterator(), "child0", "child2", "child4", "child5");
assertIterator(root.iterator(), "child0", "child1", "child2", "child3", "child4", "child5");
}
@Test
public void addChild_IndexMiddle() {
filtered.addChild(1, "child5");
assertIterator(filtered.iterator(), "child0", "child5", "child2", "child4");
assertIterator(root.iterator(), "child0", "child1", "child5", "child2", "child3", "child4");
}
@Test(expected = IndexOutOfBoundsException.class)
public void addChild_IndexOutOfBounds() {
filtered.addChild(4, "child5");
}
@Before
public void before() throws Exception {
super.before();
createSite(defaultSiteId);
navigation = portal.getNavigation(defaultSiteId);
root = navigation.getRootNode(Nodes.visitAll());
root.addChild("child0");
root.addChild("child1");
root.addChild("child2");
root.addChild("child3");
root.addChild("child4");
filter = new Filter<Node>() {
@Override
public boolean accept(Node object) {
return !(object.getName().equals("child1") || object.getName().equals("child3"));
}
};
filtered = root.filter().show(filter);
}
@Test
public void getChild() {
assertNotNull(filtered.getChild("child0"));
assertTrue(filtered.getChild("child0") instanceof ApiFilteredNode);
assertNull(filtered.getChild("child1"));
}
@Test
public void getChild_Index() {
assertEquals("child0", filtered.getChild(0).getName());
assertTrue(filtered.getChild(0) instanceof ApiFilteredNode);
assertEquals("child2", filtered.getChild(1).getName());
}
@Test(expected = IndexOutOfBoundsException.class)
public void getChild_IndexOutOfBounds() {
filtered.getChild(4);
}
@Test
public void getChildCount() {
assertEquals(3, filtered.getChildCount());
}
@Test
public void getDescendant() {
root.getChild("child0").addChild("child0-0");
root.getChild("child1").addChild("child1-0");
assertNotNull(filtered.getNode(NodePath.path("child0", "child0-0")));
assertTrue(filtered.getNode(NodePath.path("child0", "child0-0")) instanceof ApiFilteredNode);
assertNull(filtered.getNode(NodePath.path("child1")));
assertNull(filtered.getNode(NodePath.path("child1", "child0-0")));
}
@Test
public void hasChild() {
assertTrue(filtered.hasChild("child0"));
assertFalse(filtered.hasChild("child1"));
assertFalse(filtered.hasChild("nosuch"));
}
@Test
public void indexOf() {
assertEquals(0, filtered.indexOf("child0"));
assertEquals(1, filtered.indexOf("child2"));
}
@Test
public void iterator() {
assertIterator(filtered.iterator(), "child0", "child2", "child4");
assertTrue(filtered.iterator().next() instanceof ApiFilteredNode);
}
@Test
public void moveTo_First() {
filtered.getChild("child4").moveTo(0);
assertIterator(filtered.iterator(), "child4", "child0", "child2");
assertIterator(root.iterator(), "child4", "child0", "child1", "child2", "child3");
}
@Test
public void moveTo_Last() {
filtered.getChild("child4").moveTo(2);
assertIterator(filtered.iterator(), "child0", "child2", "child4");
assertIterator(root.iterator(), "child0", "child1", "child2", "child3", "child4");
}
@Test
public void moveTo_Middle() {
filtered.getChild("child4").moveTo(1);
assertIterator(filtered.iterator(), "child0", "child4", "child2");
assertIterator(root.iterator(), "child0", "child1", "child4", "child2", "child3");
}
@Test(expected = IndexOutOfBoundsException.class)
public void moveTo_OutOfBounds() {
filtered.getChild("child4").moveTo(3);
}
@Test
public void moveTo_Parent() {
Node parent0 = root.addChild("parent0");
parent0.addChild("child0");
parent0.addChild("child1");
parent0.addChild("child2");
filtered.addChild("parent1").addChild("child5").moveTo(1, parent0);
assertIterator(filtered.getChild("parent0").iterator(), "child0", "child5", "child2");
assertIterator(root.getChild("parent0").iterator(), "child0", "child1", "child5", "child2");
}
@Test(expected = IllegalArgumentException.class)
public void show_NullFilter() {
root.filter().show(null);
}
@Test
public void showAll() {
assertIterator(filtered.iterator(), "child0", "child2", "child4");
filtered = filtered.showAll();
assertIterator(filtered.iterator(), "child0", "child1", "child2", "child3", "child4");
}
@Test
public void showDefault() {
createPage(defaultSiteId, "page1");
setPermission(new PageId(defaultSiteId, "page1"), "Everyone", "*:/platform/administrators");
root.getChild("child1").setVisibility(false);
root.getChild("child2").setPageId(new PageId(defaultSiteId, "page1"));
assertIterator(root.filter().showDefault().iterator(), "child0", "child3", "child4");
}
@Test
public void showVisible() {
root.getChild("child1").setVisibility(false);
root.getChild("child2").setVisibility(new Visibility(Status.SYSTEM));
root.getChild("child3").setVisibility(PublicationDate.endingOn(new Date(System.currentTimeMillis() - 1000)));
filtered = root.filter().showVisible();
assertIterator(filtered.iterator(), "child0", "child4");
}
@Test
public void showHasAccess() {
createPage(defaultSiteId, "page1");
setPermission(new PageId(defaultSiteId, "page1"), "Everyone", "*:/platform/administrators");
createPage(defaultSiteId, "page2");
setPermission(new PageId(defaultSiteId, "page2"), "Everyone", "Everyone");
root.getChild("child1").setPageId(new PageId(defaultSiteId, "page1"));
root.getChild("child2").setPageId(new PageId(defaultSiteId, "page2"));
assertIterator(root.filter().showHasAccess(new User("a")).iterator(), "child0", "child2", "child3", "child4");
assertIterator(root.filter().showHasAccess(new User("root")).iterator(), "child0", "child1", "child2", "child3",
"child4");
}
@Test
public void serialization() throws Exception {
createPage(defaultSiteId, "page1");
setPermission(new PageId(defaultSiteId, "page1"), "Everyone", "*:/platform/administrators");
createPage(defaultSiteId, "page2");
setPermission(new PageId(defaultSiteId, "page2"), "Everyone", "Everyone");
root.getChild("child1").setPageId(new PageId(defaultSiteId, "page1"));
root.getChild("child2").setPageId(new PageId(defaultSiteId, "page2"));
root.getChild("child3").setVisibility(false);
navigation.saveNode(root);
FilteredNode filter = root.filter().showVisible().showHasAccess(new User("a")).show(new SerilizationFilter("child4"));
assertIterator(filter.iterator(), "child0", "child2");
FilteredNode rootNode = SerializationUtils.serializeDeserialize(filter);
assertIterator(rootNode.showAll().iterator(), "child0", "child1", "child2", "child3", "child4");
assertIterator(rootNode.iterator(), "child0", "child2");
}
@Test
public void showHasEdit() {
createPage(defaultSiteId, "page1");
setPermission(new PageId(defaultSiteId, "page1"), "*:/platform/administrators", "Everyone");
createPage(defaultSiteId, "page2");
setPermission(new PageId(defaultSiteId, "page2"), "Everyone", "Everyone");
root.getChild("child1").setPageId(new PageId(defaultSiteId, "page1"));
root.getChild("child2").setPageId(new PageId(defaultSiteId, "page2"));
assertIterator(root.filter().showHasEdit(new User("a")).iterator(), "child0", "child2", "child3", "child4");
assertIterator(root.filter().showHasEdit(new User("root")).iterator(), "child0", "child1", "child2", "child3",
"child4");
}
@Test
public void sourceNotChanged() {
root.filter().show(filter);
assertEquals(5, root.getChildCount());
assertNotNull(root.getChild("child1"));
}
public static class SerilizationFilter implements Filter<Node> {
private String[] hide;
public SerilizationFilter(String... hide) {
this.hide = hide;
}
@Override
public boolean accept(Node n) {
return Arrays.binarySearch(hide, n.getName()) < 0;
}
}
}