Index: extensions/modeshape-connector-filesystem/src/main/java/org/modeshape/connector/filesystem/FileSystemI18n.java =================================================================== --- extensions/modeshape-connector-filesystem/src/main/java/org/modeshape/connector/filesystem/FileSystemI18n.java (revision 2440) +++ extensions/modeshape-connector-filesystem/src/main/java/org/modeshape/connector/filesystem/FileSystemI18n.java (working copy) @@ -90,7 +90,7 @@ public final class FileSystemI18n { public static I18n invalidPropertyNames; public static I18n couldNotReadData; public static I18n couldNotWriteData; - public static I18n couldNotUpdateData; + public static I18n couldNotCopyData; public static I18n missingRequiredProperty; public static I18n deleteFailed; public static I18n getCanonicalPathFailed; Index: extensions/modeshape-connector-filesystem/src/main/java/org/modeshape/connector/filesystem/FileSystemWorkspace.java =================================================================== --- extensions/modeshape-connector-filesystem/src/main/java/org/modeshape/connector/filesystem/FileSystemWorkspace.java (revision 2440) +++ extensions/modeshape-connector-filesystem/src/main/java/org/modeshape/connector/filesystem/FileSystemWorkspace.java (working copy) @@ -107,6 +107,26 @@ class FileSystemWorkspace extends PathWorkspace { } } + private void moveFile( File originalFileOrDirectory, + File newFileOrDirectory ) { + if (originalFileOrDirectory.renameTo(newFileOrDirectory)) return; + + /* + * This could fail if the originalFile and newFile are on different file systems. See + * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4073756. Try to do a copy and delete to + * work around this potential issue. + */ + try { + FileUtil.copy(originalFileOrDirectory, newFileOrDirectory); + FileUtil.delete(originalFileOrDirectory); + } catch (IOException ioe) { + throw new RepositorySourceException(FileSystemI18n.couldNotCopyData.text(source.getName(), + originalFileOrDirectory.getAbsolutePath(), + newFileOrDirectory.getAbsolutePath()), ioe); + } + + } + @Override public PathNode moveNode( PathNode node, PathNode newNode ) { @@ -145,7 +165,7 @@ class FileSystemWorkspace extends PathWorkspace { NO_PROPERTIES); } - originalFile.renameTo(newFile); + moveFile(originalFile, newFile); // Set the custom properties on the new location ... Location newLocation = Location.create(newPath); @@ -295,10 +315,7 @@ class FileSystemWorkspace extends PathWorkspace { throw new RepositorySourceException(source.getName(), msg.text(parentPath, getName(), source.getName())); } - if (!temp.renameTo(parentFile)) { - I18n msg = FileSystemI18n.couldNotUpdateData; - throw new RepositorySourceException(source.getName(), msg.text(parentPath, getName(), source.getName())); - } + moveFile(temp, parentFile); } catch (IOException ioe) { I18n msg = FileSystemI18n.couldNotWriteData; throw new RepositorySourceException(source.getName(), msg.text(parentPath, Index: extensions/modeshape-connector-filesystem/src/main/resources/org/modeshape/connector/filesystem/FileSystemI18n.properties =================================================================== --- extensions/modeshape-connector-filesystem/src/main/resources/org/modeshape/connector/filesystem/FileSystemI18n.properties (revision 2440) +++ extensions/modeshape-connector-filesystem/src/main/resources/org/modeshape/connector/filesystem/FileSystemI18n.properties (working copy) @@ -79,7 +79,7 @@ invalidPathForResource = Invalid parent type for node at path "{0}" in workspace invalidPropertyNames = Attempt to set or update invalid property names: {0} couldNotReadData = Error reading data from path "{2}" in workspace "{1}" in repository source "{0}" couldNotWriteData = Error writing data to path "{0}" in workspace "{1}" in {2}\: {3} -couldNotUpdateData = Error moving temporary data file to path "{0}" in workspace "{1}" in {2} +couldNotCopyData = Error copying from "{1}" to "{2}" in repository source {0} missingRequiredProperty = Missing required property "{3}" at path "{0}" in workspace "{1}" in {2} deleteFailed = Could not delete file at path "{0}" in workspace "{1}" in {2} getCanonicalPathFailed = Could not determine canonical path