NodeLocation.java
/*
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.services.wcm.core;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.Item;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import org.exoplatform.services.cms.link.ItemLinkAware;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
/**
* Created by The eXo Platform SAS.
*
* @author : Hoa.Pham
* hoa.pham@exoplatform.com
* Jun 20, 2008
*/
public class NodeLocation extends ItemLocation {
/** The log. */
private static final Log LOG = ExoLogger.getLogger(NodeLocation.class.getName());
private List<NodeLocation> children_;
public List<NodeLocation> getChildren() {
return children_;
}
public void setChildren(List<NodeLocation> children) {
children_ = children;
}
public boolean hasChildren() {
return children_ != null && children_.size() > 0;
}
/**
* Instantiates a new node location.
*/
public NodeLocation() {
super();
}
/**
* Instantiates a new node location.
*
* @param repository the repository
* @param workspace the workspace
* @param path the path
* @param uuid the uuid
* @param isSystem if the node session is system
*/
public NodeLocation(final String repository, final String workspace, final String path, final String uuid,
final boolean isSystem) {
super(repository, workspace, path, uuid, isSystem);
}
/**
* Instantiates a new node location.
*
* @param repository the repository
* @param workspace the workspace
* @param path the path
* @param uuid the uuid
*/
public NodeLocation(final String repository, final String workspace, final String path, final String uuid ) {
super(repository, workspace, path, uuid, false);
}
/**
* Instantiates a new node location.
*
* @param repository the repository
* @param workspace the workspace
* @param path the path
*/
public NodeLocation(final String repository, final String workspace, final String path) {
super(repository, workspace, path, null, false);
}
/**
* Instantiates a new node location.
*
*/
public NodeLocation(ItemLocation location) {
super(location);
}
/**
* Get an NodeLocation object by an expression.
*
* @param exp the expression with pattern repository:workspace:path
*
* @return a NodeLocation object
*/
public static final NodeLocation getNodeLocationByExpression(final String exp) {
String[] temp = split(exp, ":");
if (temp.length >= 3 && temp[2].indexOf("/") == 0) {
String repository = temp[0];
String workspace = temp[1];
String nodepath = exp.substring(repository.length() + workspace.length() + 2);
return new NodeLocation(repository, workspace, nodepath);
}
throw new IllegalArgumentException("Invalid expression: " + exp
+ ". An valid expression has pattern repository:workspace:path");
}
/**
* Get an NodeLocation object by a node.
*
* @param node the node
*
* @return a NodeLocation object
*/
public static final NodeLocation getNodeLocationByNode(final Node node) {
try {
ItemLocation itemLocation = ItemLocation.getItemLocationByItem(node);
return new NodeLocation(itemLocation);
} catch (Exception e) {
return null;
}
}
/**
* Get a node by a NodeLocation object.
*
* @param nodeLocation the NodeLocation object
*
* @return a node
*/
public static final Node getNodeByLocation(final NodeLocation nodeLocation) {
try {
Item item = ItemLocation.getItemByLocation(nodeLocation);
return (Node)item;
} catch (Exception e) {
return null;
}
}
/**
* gets a Node list from a NodeLocation list
* @param locationList NodeLocation list
* @return the Node list
*/
@SuppressWarnings("unchecked")
public static final List getNodeListByLocationList(final List locationList) {
List ret = new ArrayList();
try {
ManageableRepository repository = WCMCoreUtils.getRepository();
SessionProvider systemSessionProvider = WCMCoreUtils.getSystemSessionProvider();
SessionProvider sessionProvider = WCMCoreUtils.getUserSessionProvider();
String systemWorkspace = repository.getConfiguration().getSystemWorkspaceName();
Session session = null;
Node node;
for (Object obj : locationList)
if (obj instanceof NodeLocation) {
node = null;
try {
NodeLocation location = (NodeLocation)obj;
session = (systemWorkspace.equals(location.getWorkspace()) || location.isSystemSession)?
systemSessionProvider.getSession(location.getWorkspace(), repository) :
sessionProvider.getSession(location.getWorkspace(), repository);
node = location.getUUID() != null ? session.getNodeByUUID(location.getUUID()) :
(Node)session.getItem(location.getPath());
ret.add(node);
} catch (Exception e) {
if (LOG.isDebugEnabled()) {
LOG.debug(e.getMessage(), e);
}
}
} else {
ret.add(obj);
}
} catch (Exception e) {
return ret;
}
return ret;
}
/**
* returns the list of node location from the node list
* @param nodeList the node list
* @return node location list
*/
@SuppressWarnings("unchecked")
public static final List getLocationsByNodeList(final List nodeList) {
List ret = new ArrayList();
for(Object obj : nodeList)
if (obj instanceof ItemLinkAware) {
ret.add(obj);
} else if (obj instanceof Node) {
NodeLocation location = getNodeLocationByNode((Node)obj);
if (location != null)
ret.add(location);
} else {
ret.add(obj);
}
return ret;
}
/**
* returns the list of node location from the node iterator
* @param nodeIterator the Node iterator
* @return node location list
*/
public static final List<NodeLocation> getLocationsByIterator(final NodeIterator nodeIterator) {
List<NodeLocation> ret = new ArrayList<NodeLocation>();
while (nodeIterator.hasNext()) {
NodeLocation location = getNodeLocationByNode(nodeIterator.nextNode());
if (location != null)
ret.add(location);
}
return ret;
}
/**
* Get a node by an expression.
*
* @param expression the expression
* @return a node
*/
public static final Node getNodeByExpression(final String expression) {
return getNodeByLocation(getNodeLocationByExpression(expression));
}
/**
* Get node's expression by a node.
*
* @param node the node to get expression
* @return The node's expression
*/
public static final String getExpressionByNode(final Node node) {
NodeLocation location = NodeLocation.getNodeLocationByNode(node);
return mergeString(location.getRepository(), location.getWorkspace(), location.getPath());
}
/**
* Get node's expression by a NodeLocation.
*
* @param location location
* @return The node's expression
*/
public static final String getExpressionByNodeLocation(final NodeLocation location) {
return mergeString(location.getRepository(), location.getWorkspace(), location.getPath());
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return mergeString(repository, workspace, path);
}
/**
* Get the merged string
*
* @param repository: The node's repository
* @param workspace: The node's workspace
* @param path: The node's path
* @return A merged string of the parameters
*/
private static String mergeString(String repository, String workspace, String path) {
StringBuffer buffer = new StringBuffer();
buffer.append(repository)
.append(":")
.append(workspace)
.append(":")
.append(path);
return buffer.toString();
}
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof NodeLocation)) return false;
NodeLocation location2 = (NodeLocation)obj;
return equalsString(this.repository, location2.getRepository()) &&
equalsString(this.getWorkspace(), location2.getWorkspace()) &&
(equalsString(this.getPath(), location2.getPath()) ||
equalsString(this.getUUID(), location2.getUUID()));
}
public boolean equalsString(String st1, String st2) {
if (st1 == null && st2 == null) return true;
if (st1 == null || st2 == null) return false;
return st1.equals(st2);
}
public int hashCode() {
return (repository == null ? 0 : repository.hashCode()) +
(workspace == null ? 0 : workspace.hashCode()) +
(uuid == null ? 0 : uuid.hashCode()) +
(path == null ? 0 : path.hashCode());
}
private static final String[] split(String s, String ch) {
int maxLength = 3;
String[] ss = new String[maxLength];
int prev = 0;
int i=0;
while(true) {
int next = s.indexOf(ch, prev);
if (next == -1 || i == maxLength - 1) {
ss[i] = s.substring(prev);
break;
}
ss[i++] = s.substring(prev, next);
prev = next+1;
}
return ss;
}
}