diff --git a/src/helma/objectmodel/INode.java b/src/helma/objectmodel/INode.java index e80ea8a4..3f499a28 100644 --- a/src/helma/objectmodel/INode.java +++ b/src/helma/objectmodel/INode.java @@ -100,9 +100,7 @@ public interface INode { public void setContent (String content); public byte[] getContent (); public String getText (); - public String getUrl (INode root, INode userroot, String tmpname); - public String getHref (INode root, INode userroot, String tmpname, String prefix); - + public String getUrl (INode root, INode users, String tmpname, String rootproto); } diff --git a/src/helma/objectmodel/Node.java b/src/helma/objectmodel/Node.java index 995be3b6..9b6a0d68 100644 --- a/src/helma/objectmodel/Node.java +++ b/src/helma/objectmodel/Node.java @@ -736,11 +736,7 @@ public class Node implements INode, Serializable { } - public String getHref (INode root, INode userroot, String tmpname, String prefix) { - return prefix + getUrl (root, userroot, tmpname); - } - - public String getUrl (INode root, INode userroot, String tmpname) { + public String getUrl (INode root, INode users, String tmpname, String rootproto) { throw new RuntimeException ("HREFs on transient (non-db based) Nodes not supported"); } diff --git a/src/helma/objectmodel/db/Node.java b/src/helma/objectmodel/db/Node.java index 1fff6aa3..a019b389 100644 --- a/src/helma/objectmodel/db/Node.java +++ b/src/helma/objectmodel/db/Node.java @@ -1796,34 +1796,43 @@ public class Node implements INode, Serializable { } - public String getHref (INode root, INode userroot, String tmpname, String prefix) { - return prefix + getUrl (root, userroot, tmpname); - } - - /** * Get the path to eiter the general data-root or the user root, depending on * where this node is located. */ - public String getUrl (INode root, INode userroot, String tmpname) { - // String fullname = ""; + public String getUrl (INode root, INode users, String tmpname, String rootproto) { + String divider = "/"; StringBuffer b = new StringBuffer (); INode p = this; int loopWatch = 0; - while (p != null && p.getParent () != null && p != root && p != userroot) { + + while (p != null && p.getParent () != null && p != root) { + + if (rootproto != null && rootproto.equals (p.getPrototype ())) + break; + b.insert (0, divider); - b.insert (0, UrlEncoder.encode (p.getNameOrID ())); - + + // users always have a canonical URL like /users/username if ("user".equals (p.getPrototype ())) { - b.insert (0, "users"+divider); + b.insert (0, UrlEncoder.encode (p.getName ())); + p = users; break; } + + b.insert (0, UrlEncoder.encode (p.getNameOrID ())); + p = p.getParent (); - if (loopWatch++ > 10) + if (loopWatch++ > 20) break; } + + if (p == users) { + b.insert (0, divider); + b.insert (0, "users"); + } return b.toString()+UrlEncoder.encode (tmpname); }