/*
* 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.io.Serializable;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import org.exoplatform.portal.mop.Described;
import org.exoplatform.portal.mop.RestrictAccess;
import org.exoplatform.portal.mop.Utils;
import org.exoplatform.portal.mop.Visibility;
import org.exoplatform.portal.mop.Visible;
import org.exoplatform.portal.mop.page.PageKey;
import org.exoplatform.portal.pom.data.MappedAttributes;
import org.gatein.mop.api.Attributes;
import org.gatein.mop.api.workspace.Navigation;
import org.gatein.mop.api.workspace.Site;
import org.gatein.mop.api.workspace.link.Link;
import org.gatein.mop.api.workspace.link.PageLink;
/**
* An immutable node data class.
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
class NodeData implements Serializable {
/** . */
final String parentId;
/** . */
final String id;
/** . */
final String name;
/** . */
final NodeState state;
/** . */
final String[] children;
NodeData(Navigation navigation) {
String[] children;
List<Navigation> _children = navigation.getChildren();
if (_children == null) {
children = Utils.EMPTY_STRING_ARRAY;
} else {
children = new String[_children.size()];
int index = 0;
for (Navigation child : _children) {
children[index++] = child.getObjectId();
}
}
//
String label = null;
if (navigation.isAdapted(Described.class)) {
Described described = navigation.adapt(Described.class);
label = described.getName();
}
//
Visibility visibility = Visibility.DISPLAYED;
Date startPublicationDate = null;
Date endPublicationDate = null;
boolean restrictOutsidePublicationWindow = false;
if (navigation.isAdapted(RestrictAccess.class)) {
RestrictAccess restrictAccess = navigation.adapt(RestrictAccess.class);
restrictOutsidePublicationWindow = restrictAccess.isRestrictOutsidePublicationWindow();
visibility = restrictAccess.getVisibility();
startPublicationDate = restrictAccess.getStartPublicationDate();
endPublicationDate = restrictAccess.getEndPublicationDate();
}
//
PageKey pageRef = null;
Link link = navigation.getLink();
if (link instanceof PageLink) {
PageLink pageLink = (PageLink) link;
org.gatein.mop.api.workspace.Page target = pageLink.getPage();
if (target != null) {
Site site = target.getSite();
pageRef = Utils.siteType(site.getObjectType()).key(site.getName()).page(target.getName());
}
}
//
Attributes attrs = navigation.getAttributes();
AttributesState attributesState = new AttributesState.Builder()
.attributes(NavigationServiceImpl.CUSTOM_NODE_ATTRIBUTE_PREFIX, attrs)
.build();
//
NodeState state = new NodeState(label, attrs.getValue(MappedAttributes.ICON),
startPublicationDate != null ? startPublicationDate.getTime() : -1,
endPublicationDate != null ? endPublicationDate.getTime() : -1, visibility, pageRef,
restrictOutsidePublicationWindow,
attributesState);
//
String parentId;
Navigation parent = navigation.getParent();
if (parent != null) {
parentId = parent.getObjectId();
} else {
parentId = null;
}
//
this.parentId = parentId;
this.id = navigation.getObjectId();
this.name = navigation.getName();
this.state = state;
this.children = children;
}
NodeData(NodeContext<?> context) {
int size = 0;
for (NodeContext<?> current = context.getFirst(); current != null; current = current.getNext()) {
size++;
}
String[] children = new String[size];
for (NodeContext<?> current = context.getFirst(); current != null; current = current.getNext()) {
children[children.length - size--] = current.handle;
}
String parentId = context.getParent() != null ? context.getParent().handle : null;
String id = context.handle;
String name = context.getName();
NodeState state = context.getState();
//
this.parentId = parentId;
this.id = id;
this.name = name;
this.state = state;
this.children = children;
}
NodeData(String parentId, String id, String name, NodeState state, String[] children) {
this.parentId = parentId;
this.id = id;
this.name = name;
this.state = state;
this.children = children;
}
public Iterator<String> iterator(boolean reverse) {
if (reverse) {
return new Iterator<String>() {
int index = children.length;
public boolean hasNext() {
return index > 0;
}
public String next() {
if (index > 0) {
return children[--index];
} else {
throw new NoSuchElementException();
}
}
public void remove() {
throw new UnsupportedOperationException();
}
};
} else {
return new Iterator<String>() {
int index = 0;
public boolean hasNext() {
return index < children.length;
}
public String next() {
if (index < children.length) {
return children[index++];
} else {
throw new NoSuchElementException();
}
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public NodeState getState() {
return state;
}
@Override
public String toString() {
return "NodeData[id=" + id + ",name=" + name + ",state=" + state + ",children=" + Arrays.asList(children) + "]";
}
}