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");
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();
}
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)
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);
}
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))
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++) {