import org.argeo.jcr.JcrUtils;
+/** Operations on a {@link JcrFileSystem}. */
public abstract class JcrFileSystemProvider extends FileSystemProvider {
@Override
fileName = Text.escapeIllegalJcrChars(fileName);
node = parent.addNode(fileName, NodeType.NT_FILE);
node.addMixin(NodeType.MIX_CREATED);
- node.addMixin(NodeType.MIX_LAST_MODIFIED);
+// node.addMixin(NodeType.MIX_LAST_MODIFIED);
}
if (!node.isNodeType(NodeType.NT_FILE))
throw new UnsupportedOperationException(node + " must be a file");
Node parent = toNode(dir.getParent());
if (parent == null)
throw new IOException("Parent of " + dir + " does not exist");
- if (parent.getPrimaryNodeType().isNodeType(NodeType.NT_FILE)
- || parent.getPrimaryNodeType().isNodeType(NodeType.NT_LINKED_FILE))
- throw new IOException(dir + " parent is a file");
- String fileName = dir.getFileName().toString();
- fileName = Text.escapeIllegalJcrChars(fileName);
- node = parent.addNode(fileName, NodeType.NT_FOLDER);
- node.addMixin(NodeType.MIX_CREATED);
- node.addMixin(NodeType.MIX_LAST_MODIFIED);
- node.getSession().save();
+ Session session = parent.getSession();
+ synchronized (session) {
+ if (parent.getPrimaryNodeType().isNodeType(NodeType.NT_FILE)
+ || parent.getPrimaryNodeType().isNodeType(NodeType.NT_LINKED_FILE))
+ throw new IOException(dir + " parent is a file");
+ String fileName = dir.getFileName().toString();
+ fileName = Text.escapeIllegalJcrChars(fileName);
+ node = parent.addNode(fileName, NodeType.NT_FOLDER);
+ node.addMixin(NodeType.MIX_CREATED);
+ node.addMixin(NodeType.MIX_LAST_MODIFIED);
+ save(session);
+ }
} else {
// if (!node.getPrimaryNodeType().isNodeType(NodeType.NT_FOLDER))
// throw new FileExistsException(dir + " exists and is not a directory");
if (node == null)
throw new NoSuchFileException(path + " does not exist");
Session session = node.getSession();
- if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FILE))
- node.remove();
- else if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FOLDER)) {
- if (node.hasNodes())// TODO check only files
- throw new DirectoryNotEmptyException(path.toString());
- node.remove();
+ synchronized (session) {
+ session.refresh(false);
+ if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FILE))
+ node.remove();
+ else if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FOLDER)) {
+ if (node.hasNodes())// TODO check only files
+ throw new DirectoryNotEmptyException(path.toString());
+ node.remove();
+ }
+ save(session);
}
- session.save();
} catch (RepositoryException e) {
discardChanges(node);
throw new IOException("Cannot delete " + path, e);
Node sourceNode = toNode(source);
Node targetNode = toNode(target);
try {
- JcrUtils.copy(sourceNode, targetNode);
- sourceNode.getSession().save();
+ Session targetSession = targetNode.getSession();
+ synchronized (targetSession) {
+ JcrUtils.copy(sourceNode, targetNode);
+ save(targetSession);
+ }
} catch (RepositoryException e) {
discardChanges(sourceNode);
discardChanges(targetNode);
Node sourceNode = toNode(source);
try {
Session session = sourceNode.getSession();
- session.move(sourceNode.getPath(), target.toString());
- session.save();
+ synchronized (session) {
+ session.move(sourceNode.getPath(), target.toString());
+ save(session);
+ }
} catch (RepositoryException e) {
discardChanges(sourceNode);
throw new IOException("Cannot move from " + source + " to " + target, e);
public void setAttribute(Path path, String attribute, Object value, LinkOption... options) throws IOException {
Node node = toNode(path);
try {
- if (value instanceof byte[]) {
- JcrUtils.setBinaryAsBytes(node, attribute, (byte[]) value);
- } else if (value instanceof Calendar) {
- node.setProperty(attribute, (Calendar) value);
- } else {
- node.setProperty(attribute, value.toString());
+ Session session = node.getSession();
+ synchronized (session) {
+ if (value instanceof byte[]) {
+ JcrUtils.setBinaryAsBytes(node, attribute, (byte[]) value);
+ } else if (value instanceof Calendar) {
+ node.setProperty(attribute, (Calendar) value);
+ } else {
+ node.setProperty(attribute, value.toString());
+ }
+ save(session);
}
- node.getSession().save();
} catch (RepositoryException e) {
discardChanges(node);
throw new IOException("Cannot set attribute " + attribute + " on " + path, e);
}
}
+ /** Make sure save is robust. */
+ protected void save(Session session) throws RepositoryException {
+ session.refresh(true);
+ session.save();
+ session.notifyAll();
+ }
+
/**
* To be overriden in order to support the ~ path, with an implementation
* specific concept of user home.