/* * 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.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import junit.framework.Assert; /** * Represents a navigation node. * * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> * @version $Revision$ */ public class Node { /** . */ public static final NodeModel<Node> MODEL = new NodeModel<Node>() { public NodeContext<Node> getContext(Node node) { return node.context; } public Node create(NodeContext<Node> context) { return new Node(context); } }; /** . */ final NodeContext<Node> context; Node(NodeContext<Node> context) { this.context = context; } public String getId() { return context.getId(); } public String getHandle() { return context.handle; } public String getName() { return context.getName(); } public void setName(String name) { context.setName(name); } public NodeContext getContext() { return context; } public NodeState getState() { return context.getState(); } public void setState(NodeState state) { context.setState(state); } public Node getParent() { return context.getParentNode(); } public Collection<Node> getChildren() { return context.getNodes(); } public Node getChild(String childName) { return context.getNode(childName); } public Node getChild(int childIndex) { return context.getNode(childIndex); } public void addChild(Node child) { context.add(null, child.context); } public void addChild(int index, Node child) { context.add(index, child.context); } public Node addChild(String childName) { return context.add(null, childName).node; } public Node addChild(int index, String childName) { return context.add(index, childName).node; } public boolean removeChild(String childName) { return context.removeNode(childName); } public int getNodeCount() { return context.getNodeCount(); } public int getSize() { return context.getSize(); } public void setHidden(boolean hidden) { context.setHidden(hidden); } public boolean isHidden() { return context.isHidden(); } public void filter(NodeFilter filter) { context.filter(filter); } public void assertConsistent() { if (context.isExpanded()) { List<String> a = new ArrayList<String>(); for (NodeContext<Node> b = context.getFirst(); b != null; b = b.getNext()) { Assert.assertNotNull(b.data); a.add(b.data.getId()); } List<String> b = Arrays.asList(context.data.children); Assert.assertEquals(a, b); for (NodeContext<Node> c = context.getFirst(); c != null; c = c.getNext()) { c.getNode().assertConsistent(); } } } public void assertEquals(Node node) { // First check state if (context.data != null) { Assert.assertNotNull(node.context.data); Assert.assertEquals(context.data.id, node.context.data.id); Assert.assertEquals(context.data.name, node.context.data.name); Assert.assertEquals(context.data.state, node.context.data.state); Assert.assertEquals(context.state, node.context.state); } else { Assert.assertNull(node.context.data); Assert.assertEquals(context.getName(), node.context.getName()); Assert.assertEquals(context.state, node.context.state); } // List<Node> nodes1 = new ArrayList<Node>(); for (NodeContext<Node> current = context.getFirst(); current != null; current = current.getNext()) { nodes1.add(current.getNode()); } // List<Node> nodes2 = new ArrayList<Node>(); for (NodeContext<Node> current = node.context.getFirst(); current != null; current = current.getNext()) { nodes2.add(current.getNode()); } // Assert.assertEquals("Was expecting to have the same children for node " + toString(1) + " " + node.toString(1), nodes1.size(), nodes2.size()); // for (int i = 0; i < nodes1.size(); i++) { nodes1.get(i).assertEquals(nodes2.get(i)); } } public Iterator<NodeChange<Node>> update(NavigationService service, Scope scope) throws NavigationServiceException { NodeChangeQueue<Node> queue = new NodeChangeQueue<Node>(); service.updateNode(context, scope, new NodeContextChangeAdapter<Node>(queue)); return queue.iterator(); } public Iterator<NodeChange<Node>> rebase(NavigationService service, Scope scope) throws NavigationServiceException { NodeChangeQueue<Node> queue = new NodeChangeQueue<Node>(); service.rebaseNode(context, scope, new NodeContextChangeAdapter<Node>(queue)); return queue.iterator(); } public Iterator<NodeChange<Node>> save(NavigationService service) throws NavigationServiceException { NodeChangeQueue<Node> queue = new NodeChangeQueue<Node>(); service.saveNode(context, new NodeContextChangeAdapter<Node>(queue)); return queue.iterator(); } @Override public String toString() { return toString(1); } public String toString(int depth) { return context.toString(depth, new StringBuilder("Node[")).append("]").toString(); } }