package org.argeo.jcr.fs; import java.nio.file.Path; import javax.jcr.Node; import javax.jcr.RepositoryException; import org.argeo.api.acr.fs.AbstractFsPath; /** A {@link Path} which contains a reference to a JCR {@link Node}. */ public class JcrPath extends AbstractFsPath { final static String separator = "/"; final static char separatorChar = '/'; // private final JcrFileSystem fs; // /** null for non absolute paths */ // private final WorkspaceFileStore fileStore; // private final String[] path;// null means root // private final boolean absolute; // // // optim // private final int hashCode; public JcrPath(JcrFileSystem filesSystem, String path) { super(filesSystem, path); // this.fs = filesSystem; // if (path == null) // throw new JcrFsException("Path cannot be null"); // if (path.equals(separator)) {// root // this.path = null; // this.absolute = true; // this.hashCode = 0; // this.fileStore = fs.getBaseFileStore(); // return; // } else if (path.equals("")) {// empty path // this.path = new String[] { "" }; // this.absolute = false; // this.fileStore = null; // 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) == separatorChar ? true : false; // // this.fileStore = absolute ? fs.getFileStore(path) : null; // // String trimmedPath = path.substring(absolute ? 1 : 0, // path.charAt(path.length() - 1) == separatorChar ? path.length() - 1 : path.length()); // this.path = trimmedPath.split(separator); // 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(); // assert !(absolute && fileStore == null); } public JcrPath(JcrFileSystem filesSystem, Node node) throws RepositoryException { this(filesSystem, filesSystem.getFileStore(node).toFsPath(node)); } /** Internal optimisation */ private JcrPath(JcrFileSystem filesSystem, WorkspaceFileStore fileStore, String[] path, boolean absolute) { super(filesSystem, fileStore, path, absolute); // this.fs = filesSystem; // this.path = path; // this.absolute = path == null ? true : absolute; // if (this.absolute && fileStore == null) // throw new IllegalArgumentException("Absolute path requires a file store"); // if (!this.absolute && fileStore != null) // throw new IllegalArgumentException("A file store should not be provided for a relative path"); // this.fileStore = fileStore; // this.hashCode = path == null ? 0 : path[path.length - 1].hashCode(); // assert !(absolute && fileStore == null); } protected String cleanUpSegment(String segment) { return Text.unescapeIllegalJcrChars(segment); } @Override protected JcrPath newInstance(String path) { return new JcrPath(getFileSystem(), path); } @Override protected JcrPath newInstance(String[] segments, boolean absolute) { return new JcrPath(getFileSystem(), getFileStore(), segments, absolute); } // @Override // public FileSystem getFileSystem() { // return fs; // } // // @Override // public boolean isAbsolute() { // return absolute; // } // // @Override // public Path getRoot() { // if (path == null) // return this; // return new JcrPath(fs, separator); // } // // @Override // public String toString() { // return toFsPath(path); // } // // private String toFsPath(String[] path) { // 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(path[i]); // } // return sb.toString(); // } // @Deprecated // private String toJcrPath() { // return toJcrPath(path); // } // // @Deprecated // private String toJcrPath(String[] path) { // 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) // return null; // return new JcrPath(fs, path[path.length - 1]); // } // // @Override // public Path getParent() { // if (path == null) // return null; // if (path.length == 1)// root // return new JcrPath(fs, separator); // String[] parentPath = Arrays.copyOfRange(path, 0, path.length - 1); // if (!absolute) // return new JcrPath(fs, null, parentPath, absolute); // else // return new JcrPath(fs, toFsPath(parentPath)); // } // // @Override // public int getNameCount() { // if (path == null) // return 0; // return path.length; // } // // @Override // public Path getName(int index) { // if (path == null) // return null; // return new JcrPath(fs, path[index]); // } // // @Override // public Path subpath(int beginIndex, int endIndex) { // if (path == null) // return null; // String[] parentPath = Arrays.copyOfRange(path, beginIndex, endIndex); // return new JcrPath(fs, null, parentPath, false); // } // // @Override // public boolean startsWith(Path other) { // return toString().startsWith(other.toString()); // } // // @Override // public boolean startsWith(String other) { // return toString().startsWith(other); // } // // @Override // public boolean endsWith(Path other) { // return toString().endsWith(other.toString()); // } // // @Override // public boolean endsWith(String other) { // return toString().endsWith(other); // } // @Override // public Path normalize() { // // always normalized // return this; // } // @Override // public Path resolve(Path other) { // JcrPath otherPath = (JcrPath) other; // if (otherPath.isAbsolute()) // return other; // String[] newPath; // if (path == null) { // newPath = new String[otherPath.path.length]; // System.arraycopy(otherPath.path, 0, newPath, 0, otherPath.path.length); // } else { // newPath = new String[path.length + otherPath.path.length]; // System.arraycopy(path, 0, newPath, 0, path.length); // System.arraycopy(otherPath.path, 0, newPath, path.length, otherPath.path.length); // } // if (!absolute) // return new JcrPath(fs, null, newPath, absolute); // else { // return new JcrPath(fs, toFsPath(newPath)); // } // } // // @Override // public final Path resolve(String other) { // return resolve(getFileSystem().getPath(other)); // } // // @Override // public final Path resolveSibling(Path other) { // if (other == null) // throw new NullPointerException(); // Path parent = getParent(); // return (parent == null) ? other : parent.resolve(other); // } // // @Override // public final Path resolveSibling(String other) { // return resolveSibling(getFileSystem().getPath(other)); // } // // @Override // public final Iterator iterator() { // return new Iterator() { // private int i = 0; // // @Override // public boolean hasNext() { // return (i < getNameCount()); // } // // @Override // public Path next() { // if (i < getNameCount()) { // Path result = getName(i); // i++; // return result; // } else { // throw new NoSuchElementException(); // } // } // // @Override // public void remove() { // throw new UnsupportedOperationException(); // } // }; // } // // @Override // public Path relativize(Path other) { // if (equals(other)) // return new JcrPath(fs, ""); // if (other.startsWith(this)) { // String p1 = toString(); // String p2 = other.toString(); // String relative = p2.substring(p1.length(), p2.length()); // if (relative.charAt(0) == '/') // relative = relative.substring(1); // return new JcrPath(fs, relative); // } // throw new IllegalArgumentException(other + " cannot be relativized against " + this); // } // @Override // public URI toUri() { // try { // return new URI(fs.provider().getScheme(), toString(), null); // } catch (URISyntaxException e) { // throw new JcrFsException("Cannot create URI for " + toString(), e); // } // } // // @Override // public Path toAbsolutePath() { // if (isAbsolute()) // return this; // return new JcrPath(fs, fileStore, path, true); // } // // @Override // public Path toRealPath(LinkOption... options) throws IOException { // return this; // } // // @Override // public File toFile() { // throw new UnsupportedOperationException(); // } public Node getNode() throws RepositoryException { if (!isAbsolute())// TODO default dir throw new JcrFsException("Cannot get a JCR node from a relative path"); assert getFileStore() != null; return getFileStore().toNode(getSegments()); // String pathStr = toJcrPath(); // Session session = fs.getSession(); // // TODO synchronize on the session ? // if (!session.itemExists(pathStr)) // return null; // return session.getNode(pathStr); } // // @Override // public boolean equals(Object obj) { // 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++) { // if (!path[i].equals(other.path[i])) // return false; // } // return true; // } // @Override // public int hashCode() { // return hashCode; // } // @Override // protected Object clone() throws CloneNotSupportedException { // return new JcrPath(fs, toString()); // } // @Override // protected void finalize() throws Throwable { // Arrays.fill(path, null); // } }