X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=org.argeo.jcr%2Fsrc%2Forg%2Fargeo%2Fjcr%2Ffs%2FJcrFileSystemProvider.java;h=7dbd4e43f88116e96a127b3b305fd1fae8dfe515;hb=57fe5bf11f3ff3c7e49eeabce5c5ddb62a57ac5b;hp=5e3e8ca213041e7652fdf4c826e7b7c8d9882593;hpb=d4a5631f933282d791fb8edddc59a6f6751311e0;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.jcr/src/org/argeo/jcr/fs/JcrFileSystemProvider.java b/org.argeo.jcr/src/org/argeo/jcr/fs/JcrFileSystemProvider.java index 5e3e8ca21..7dbd4e43f 100644 --- a/org.argeo.jcr/src/org/argeo/jcr/fs/JcrFileSystemProvider.java +++ b/org.argeo.jcr/src/org/argeo/jcr/fs/JcrFileSystemProvider.java @@ -30,15 +30,15 @@ import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.PropertyDefinition; -import org.apache.commons.io.FileExistsException; import org.argeo.jcr.JcrUtils; public abstract class JcrFileSystemProvider extends FileSystemProvider { + @Override public SeekableByteChannel newByteChannel(Path path, Set options, FileAttribute... attrs) throws IOException { + Node node = toNode(path); try { - Node node = toNode(path); if (node == null) { Node parent = toNode(path.getParent()); if (parent == null) @@ -55,8 +55,9 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { } if (!node.isNodeType(NodeType.NT_FILE)) throw new UnsupportedOperationException(node + " must be a file"); - return new BinaryChannel(node); + return new BinaryChannel(node, path); } catch (RepositoryException e) { + discardChanges(node); throw new IOException("Cannot read file", e); } } @@ -65,6 +66,8 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { public DirectoryStream newDirectoryStream(Path dir, Filter filter) throws IOException { try { Node base = toNode(dir); + if (base == null) + throw new IOException(dir + " is not a JCR node"); return new NodeDirectoryStream((JcrFileSystem) dir.getFileSystem(), base.getNodes(), filter); } catch (RepositoryException e) { throw new IOException("Cannot list directory", e); @@ -73,8 +76,8 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { @Override public void createDirectory(Path dir, FileAttribute... attrs) throws IOException { + Node node = toNode(dir); try { - Node node = toNode(dir); if (node == null) { Node parent = toNode(dir.getParent()); if (parent == null) @@ -89,19 +92,19 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { node.addMixin(NodeType.MIX_LAST_MODIFIED); node.getSession().save(); } else { - if (!node.getPrimaryNodeType().isNodeType(NodeType.NT_FOLDER)) - throw new FileExistsException(dir + " exists and is not a directory"); + // if (!node.getPrimaryNodeType().isNodeType(NodeType.NT_FOLDER)) + // throw new FileExistsException(dir + " exists and is not a directory"); } } catch (RepositoryException e) { + discardChanges(node); throw new IOException("Cannot create directory " + dir, e); } - } @Override public void delete(Path path) throws IOException { + Node node = toNode(path); try { - Node node = toNode(path); if (node == null) throw new NoSuchFileException(path + " does not exist"); Session session = node.getSession(); @@ -114,6 +117,7 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { } session.save(); } catch (RepositoryException e) { + discardChanges(node); throw new IOException("Cannot delete " + path, e); } @@ -121,24 +125,27 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { @Override public void copy(Path source, Path target, CopyOption... options) throws IOException { + Node sourceNode = toNode(source); + Node targetNode = toNode(target); try { - Node sourceNode = toNode(source); - Node targetNode = toNode(target); JcrUtils.copy(sourceNode, targetNode); sourceNode.getSession().save(); } catch (RepositoryException e) { + discardChanges(sourceNode); + discardChanges(targetNode); throw new IOException("Cannot copy from " + source + " to " + target, e); } } @Override public void move(Path source, Path target, CopyOption... options) throws IOException { + Node sourceNode = toNode(source); try { - Node sourceNode = toNode(source); Session session = sourceNode.getSession(); session.move(sourceNode.getPath(), target.toString()); session.save(); } catch (RepositoryException e) { + discardChanges(sourceNode); throw new IOException("Cannot move from " + source + " to " + target, e); } } @@ -164,7 +171,7 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { @Override public boolean isHidden(Path path) throws IOException { - return false; + return path.getFileName().toString().charAt(0) == '.'; } @Override @@ -194,16 +201,12 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { @Override public A readAttributes(Path path, Class type, LinkOption... options) throws IOException { - try { - // TODO check if assignable - Node node = toNode(path); - if (node == null) { - throw new IOException("JCR node not found for " + path); - } - return (A) new JcrBasicfileAttributes(node); - } catch (RepositoryException e) { - throw new IOException("Cannot read basic attributes of " + path, e); + // TODO check if assignable + Node node = toNode(path); + if (node == null) { + throw new IOException("JCR node not found for " + path); } + return (A) new JcrBasicfileAttributes(node); } @Override @@ -248,8 +251,8 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { @Override public void setAttribute(Path path, String attribute, Object value, LinkOption... options) throws IOException { + Node node = toNode(path); try { - Node node = toNode(path); if (value instanceof byte[]) { JcrUtils.setBinaryAsBytes(node, attribute, (byte[]) value); } else if (value instanceof Calendar) { @@ -259,12 +262,31 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider { } node.getSession().save(); } catch (RepositoryException e) { + discardChanges(node); throw new IOException("Cannot set attribute " + attribute + " on " + path, e); } } - protected Node toNode(Path path) throws RepositoryException { - return ((JcrPath) path).getNode(); + protected Node toNode(Path path) { + try { + return ((JcrPath) path).getNode(); + } catch (RepositoryException e) { + throw new JcrFsException("Cannot convert path " + path + " to JCR Node", e); + } + } + + /** Discard changes in the underlying session */ + protected void discardChanges(Node node) { + if (node == null) + return; + try { + // discard changes + node.getSession().refresh(false); + } catch (RepositoryException e) { + e.printStackTrace(); + // TODO log out session? + // TODO use Commons logging? + } } /**