X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.jcr%2Fsrc%2Forg%2Fargeo%2Fjcr%2Ffs%2FJcrPath.java;h=a2080c546a8eb48f178fc133168bc98dd939cc5c;hb=503f2f9ae7bc2167a3c41d1937fc63c299c16027;hp=6a0c7adfe2d0ebbab10dd1ccf0b648df83ab464c;hpb=d8037dd6a59ff5d38d7c7182a9ef6c26c8001a4f;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.jcr/src/org/argeo/jcr/fs/JcrPath.java b/org.argeo.jcr/src/org/argeo/jcr/fs/JcrPath.java index 6a0c7adfe..a2080c546 100644 --- a/org.argeo.jcr/src/org/argeo/jcr/fs/JcrPath.java +++ b/org.argeo.jcr/src/org/argeo/jcr/fs/JcrPath.java @@ -31,8 +31,6 @@ public class JcrPath implements Path { private final int hashCode; public JcrPath(JcrFileSystem filesSystem, String path) { - // this(filesSystem, path.equals("/") ? null : path.split("/"), path == - // null ? true : path.startsWith("/")); this.fs = filesSystem; if (path == null) throw new JcrFsException("Path cannot be null"); @@ -41,11 +39,26 @@ public class JcrPath implements Path { this.absolute = true; this.hashCode = 0; return; + } else if (path.equals("")) {// empty path + this.path = new String[] { "" }; + this.absolute = false; + this.hashCode = "".hashCode(); + return; + } + + if (path.equals("~")) {// home + path = filesSystem.getUserHomePath(); + if (path == null) + throw new JcrFsException("No home directory available"); } + this.absolute = path.charAt(0) == delimChar ? true : false; String trimmedPath = path.substring(absolute ? 1 : 0, path.charAt(path.length() - 1) == delimChar ? path.length() - 1 : path.length()); this.path = trimmedPath.split(delimStr); + for (int i = 0; i < this.path.length; i++) { + this.path[i] = Text.unescapeIllegalJcrChars(this.path[i]); + } this.hashCode = this.path[this.path.length - 1].hashCode(); } @@ -97,6 +110,20 @@ public class JcrPath implements Path { return sb.toString(); } + public String toJcrPath() { + if (path == null) + return "/"; + StringBuilder sb = new StringBuilder(); + if (isAbsolute()) + sb.append('/'); + for (int i = 0; i < path.length; i++) { + if (i != 0) + sb.append('/'); + sb.append(Text.escapeIllegalJcrChars(path[i])); + } + return sb.toString(); + } + @Override public Path getFileName() { if (path == null) @@ -232,15 +259,18 @@ public class JcrPath implements Path { if (other.startsWith(this)) { String p1 = toString(); String p2 = other.toString(); - return new JcrPath(fs, p2.substring(p1.length(), p2.length())); + String relative = p2.substring(p1.length(), p2.length()); + if (relative.charAt(0) == '/') + relative = relative.substring(1); + return new JcrPath(fs, relative); } - throw new UnsupportedOperationException(); + throw new IllegalArgumentException(other + " cannot be relativized against " + this); } @Override public URI toUri() { try { - return new URI("jcr", toString(), null); + return new URI(fs.provider().getScheme(), toString(), null); } catch (URISyntaxException e) { throw new JcrFsException("Cannot create URI for " + toString(), e); } @@ -283,7 +313,7 @@ public class JcrPath implements Path { public Node getNode() throws RepositoryException { if (!isAbsolute())// TODO default dir throw new JcrFsException("Cannot get node from relative path"); - String pathStr = toString(); + String pathStr = toJcrPath(); Session session = fs.getSession(); // TODO synchronize on the session ? if (!session.itemExists(pathStr)) @@ -296,6 +326,17 @@ public class JcrPath implements Path { if (!(obj instanceof JcrPath)) return false; JcrPath other = (JcrPath) obj; + + if (path == null) {// root + if (other.path == null)// root + return true; + else + return false; + } else { + if (other.path == null)// root + return false; + } + // non root if (path.length != other.path.length) return false; for (int i = 0; i < path.length; i++) {