/* * 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.user; import java.util.Collection; import java.util.Collections; import java.util.Locale; import java.util.ResourceBundle; import org.exoplatform.commons.utils.ExpressionUtil; import org.exoplatform.commons.utils.HTMLEntityEncoder; import org.exoplatform.portal.mop.Described; import org.exoplatform.portal.mop.Visibility; import org.exoplatform.portal.mop.description.DescriptionService; import org.exoplatform.portal.mop.navigation.NodeContext; import org.exoplatform.portal.mop.navigation.NodeState; import org.exoplatform.portal.mop.page.PageKey; /** * A navigation node as seen by a user. * * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> * @version $Revision$ */ public class UserNode { /** . */ final UserNodeContext owner; /** . */ final NodeContext<UserNode> context; /** . */ String uri; UserNode(UserNodeContext owner, NodeContext<UserNode> context) { this.owner = owner; this.context = context; this.uri = null; } public UserNavigation getNavigation() { return owner.navigation; } public String getId() { return context.getId(); } UserNode filter() { owner.filter(this); return this; } public String getName() { return context.getName(); } public void setName(String name) { context.setName(name); // this.uri = null; } public String getURI() { if (uri == null) { uri = buildURI().toString(); } return uri; } private StringBuilder buildURI() { UserNode parent = context.getParentNode(); if (parent != null) { StringBuilder builder = parent.buildURI(); if (builder.length() > 0) { builder.append('/'); } return builder.append(context.getName()); } else { return new StringBuilder(); } } public String getLabel() { return context.getState().getLabel(); } public void setLabel(String label) { context.setState(new NodeState.Builder(context.getState()).label(label).build()); } public String getIcon() { return context.getState().getIcon(); } public void setIcon(String icon) { context.setState(new NodeState.Builder(context.getState()).icon(icon).build()); } public long getStartPublicationTime() { return context.getState().getStartPublicationTime(); } public void setStartPublicationTime(long startPublicationTime) { context.setState(new NodeState.Builder(context.getState()).startPublicationTime(startPublicationTime).build()); } public boolean isRestrictOutsidePublicationWindow() { return context.getState().isRestrictOutsidePublicationWindow(); } public void setRestrictOutsidePublicationWindow(boolean restrictOutsidePublicationWindow) { context.setState( new NodeState.Builder(context.getState()) .restrictOutsidePublicationWindow(restrictOutsidePublicationWindow) .build() ); } public long getEndPublicationTime() { return context.getState().getEndPublicationTime(); } public void setEndPublicationTime(long endPublicationTime) { context.setState(new NodeState.Builder(context.getState()).endPublicationTime(endPublicationTime).build()); } public Visibility getVisibility() { return context.getState().getVisibility(); } public void setVisibility(Visibility visibility) { context.setState(new NodeState.Builder(context.getState()).visibility(visibility).build()); } public PageKey getPageRef() { return context.getState().getPageRef(); } public void setPageRef(PageKey pageRef) { context.setState(new NodeState.Builder(context.getState()).pageRef(pageRef).build()); } public String getResolvedLabel() { String resolvedLabel = null; // String id = context.getId(); // if (context.getState().getLabel() != null) { ResourceBundle bundle = owner.navigation.getBundle(); resolvedLabel = ExpressionUtil.getExpressionValue(bundle, context.getState().getLabel()); } else if (id != null) { Locale userLocale = owner.navigation.portal.context.getUserLocale(); Locale portalLocale = owner.navigation.portal.getLocale(); DescriptionService descriptionService = owner.navigation.portal.service.getDescriptionService(); Described.State description = descriptionService.resolveDescription(id, portalLocale, userLocale); if (description != null) { resolvedLabel = description.getName(); } } // if (resolvedLabel == null) { resolvedLabel = getName(); } // return resolvedLabel; } public void setResolvedLabel(String label) { String id = context.getId(); Locale userLocale = owner.navigation.portal.context.getUserLocale(); DescriptionService descriptionService = owner.navigation.portal.service.getDescriptionService(); Described.State description = new Described.State(label, null); descriptionService.setDescription(id, userLocale, description); } public String getEncodedResolvedLabel() { return HTMLEntityEncoder.getInstance().encode(getResolvedLabel()); } public UserNode getParent() { return context.getParentNode(); } /** * Returns true if the children relationship determined. * * @return ture if node has children */ public boolean hasChildrenRelationship() { return context.isExpanded(); } /** * Returns the number of children. * * @return the number of children */ public int getChildrenCount() { return context.getNodeCount(); } public int getChildrenSize() { return context.getNodeSize(); } public Collection<UserNode> getChildren() { return context.isExpanded() ? context.getNodes() : Collections.<UserNode> emptyList(); } /** * Returns a child by its name or null if the child does not exist or the children relationship has not been loaded. * * @param childName the child name * @return the corresponding user node * @throws NullPointerException if the child name is null */ public UserNode getChild(String childName) throws NullPointerException { if (context.isExpanded()) { return context.getNode(childName); } else { return null; } } /** * Returns a child by its index or null if the children relationship has not been loaded. * * @param childIndex the child index * @return the corresponding user node * @throws IndexOutOfBoundsException if the children relationship is loaded and the index is outside of its bounds */ public UserNode getChild(int childIndex) throws IndexOutOfBoundsException { if (context.isExpanded()) { return context.getNode(childIndex); } else { return null; } } public void addChild(UserNode child) { context.add(null, child.context); child.uri = null; } public void addChild(int index, UserNode child) { context.add(index, child.context); child.uri = null; } public UserNode addChild(String childName) { return context.add(null, childName).getNode(); } public boolean removeChild(String childName) { return context.removeNode(childName); } // Keep this internal for now UserNode find(String nodeId) { return context.getDescendantNode(nodeId); } public String toString() { return toString(1); } public String toString(int depth) { return context.toString(depth, new StringBuilder("UserNode[")).append("]").toString(); } }