X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=jcr%2Forg.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fjcr%2Ffs%2FJcrPath.java;fp=jcr%2Forg.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fjcr%2Ffs%2FJcrPath.java;h=7318b70962aea789b61091be99b0f8f73428dfb5;hb=8282011b0e20e80704b209ad55fa9fb132e16280;hp=0000000000000000000000000000000000000000;hpb=633a8acd189cc22f06944d278879601189be1bc8;p=lgpl%2Fargeo-commons.git diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/jcr/fs/JcrPath.java b/jcr/org.argeo.cms.jcr/src/org/argeo/jcr/fs/JcrPath.java new file mode 100644 index 000000000..7318b7096 --- /dev/null +++ b/jcr/org.argeo.cms.jcr/src/org/argeo/jcr/fs/JcrPath.java @@ -0,0 +1,384 @@ +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); +// } + + + +}