You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2017/09/14 19:26:44 UTC
svn commit: r1808381 [8/25] - in /commons/proper/vfs/trunk/commons-vfs2/src:
main/java/org/apache/commons/vfs2/ main/java/org/apache/commons/vfs2/auth/
main/java/org/apache/commons/vfs2/cache/
main/java/org/apache/commons/vfs2/events/ main/java/org/apa...
Modified: commons/proper/vfs/trunk/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileObject.java?rev=1808381&r1=1808380&r2=1808381&view=diff
==============================================================================
--- commons/proper/vfs/trunk/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileObject.java (original)
+++ commons/proper/vfs/trunk/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileObject.java Thu Sep 14 19:26:39 2017
@@ -16,7 +16,6 @@
*/
package org.apache.commons.vfs2.provider;
-
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
@@ -58,14 +57,13 @@ import org.apache.commons.vfs2.util.Rand
*
* @param <AFS> An AbstractFileSystem subclass
*/
-public abstract class AbstractFileObject<AFS extends AbstractFileSystem> implements FileObject
-{
+public abstract class AbstractFileObject<AFS extends AbstractFileSystem> implements FileObject {
/*
- * TODO - Chop this class up - move all the protected methods to several
- * interfaces, so that structure and content can be separately overridden.
+ * TODO - Chop this class up - move all the protected methods to several interfaces, so that structure and content
+ * can be separately overridden.
*
- * TODO - Check caps in methods like getChildren(), etc, and give better error messages
- * (eg 'this file type does not support listing children', vs 'this is not a folder')
+ * TODO - Check caps in methods like getChildren(), etc, and give better error messages (eg 'this file type does not
+ * support listing children', vs 'this is not a folder')
*/
private static final FileName[] EMPTY_FILE_ARRAY = {};
@@ -99,9 +97,7 @@ public abstract class AbstractFileObject
* @param fs the file system
* @throws ClassCastException if {@code name} is not an instance of {@link AbstractFileName}
*/
- protected AbstractFileObject(final AbstractFileName name,
- final AFS fs)
- {
+ protected AbstractFileObject(final AbstractFileName name, final AFS fs) {
this.fileName = name;
this.fs = fs;
fs.fileObjectHanded(this);
@@ -110,26 +106,20 @@ public abstract class AbstractFileObject
/**
* Traverses a file.
*/
- private static void traverse(final DefaultFileSelectorInfo fileInfo,
- final FileSelector selector,
- final boolean depthwise,
- final List<FileObject> selected)
- throws Exception
- {
+ private static void traverse(final DefaultFileSelectorInfo fileInfo, final FileSelector selector,
+ final boolean depthwise, final List<FileObject> selected) throws Exception {
// Check the file itself
final FileObject file = fileInfo.getFile();
final int index = selected.size();
// If the file is a folder, traverse it
- if (file.getType().hasChildren() && selector.traverseDescendents(fileInfo))
- {
+ if (file.getType().hasChildren() && selector.traverseDescendents(fileInfo)) {
final int curDepth = fileInfo.getDepth();
fileInfo.setDepth(curDepth + 1);
// Traverse the children
final FileObject[] children = file.getChildren();
- for (final FileObject child : children)
- {
+ for (final FileObject child : children) {
fileInfo.setFile(child);
traverse(fileInfo, selector, depthwise, selected);
}
@@ -139,15 +129,11 @@ public abstract class AbstractFileObject
}
// Add the file if doing depthwise traversal
- if (selector.includeFile(fileInfo))
- {
- if (depthwise)
- {
+ if (selector.includeFile(fileInfo)) {
+ if (depthwise) {
// Add this file after its descendants
selected.add(file);
- }
- else
- {
+ } else {
// Add this file before its descendants
selected.add(index, file);
}
@@ -156,37 +142,26 @@ public abstract class AbstractFileObject
/**
* Attaches to the file.
+ *
* @throws FileSystemException if an error occurs.
*/
- private void attach() throws FileSystemException
- {
- synchronized (fs)
- {
- if (attached)
- {
+ private void attach() throws FileSystemException {
+ synchronized (fs) {
+ if (attached) {
return;
}
- try
- {
+ try {
// Attach and determine the file type
doAttach();
attached = true;
// now the type could already be injected by doAttach (e.g from parent to child)
- /* VFS-210: determine the type when really asked fore
- if (type == null)
- {
- setFileType(doGetType());
- }
- if (type == null)
- {
- setFileType(FileType.IMAGINARY);
- }
- */
- }
- catch (final Exception exc)
- {
+ /*
+ * VFS-210: determine the type when really asked fore if (type == null) { setFileType(doGetType()); } if
+ * (type == null) { setFileType(FileType.IMAGINARY); }
+ */
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/get-type.error", exc, fileName);
}
@@ -195,38 +170,32 @@ public abstract class AbstractFileObject
}
/**
- * Queries the object if a simple rename to the filename of {@code newfile}
- * is possible.
+ * Queries the object if a simple rename to the filename of {@code newfile} is possible.
*
* @param newfile the new filename
* @return true if rename is possible
*/
@Override
- public boolean canRenameTo(final FileObject newfile)
- {
+ public boolean canRenameTo(final FileObject newfile) {
return fs == newfile.getFileSystem();
}
/**
* Notifies the file that its children have changed.
+ *
* @param childName The name of the child.
* @param newType The type of the child.
* @throws Exception if an error occurs.
*/
- protected void childrenChanged(final FileName childName, final FileType newType) throws Exception
- {
+ protected void childrenChanged(final FileName childName, final FileType newType) throws Exception {
// TODO - this may be called when not attached
- if (children != null && childName != null && newType != null)
- {
+ if (children != null && childName != null && newType != null) {
// TODO - figure out if children[] can be replaced by list
final ArrayList<FileName> list = new ArrayList<>(Arrays.asList(children));
- if (newType.equals(FileType.IMAGINARY))
- {
+ if (newType.equals(FileType.IMAGINARY)) {
list.remove(childName);
- }
- else
- {
+ } else {
list.add(childName);
}
children = new FileName[list.size()];
@@ -239,39 +208,31 @@ public abstract class AbstractFileObject
/**
* Closes this file, and its content.
+ *
* @throws FileSystemException if an error occurs.
*/
@Override
- public void close() throws FileSystemException
- {
+ public void close() throws FileSystemException {
FileSystemException exc = null;
// Close the content
- if (content != null)
- {
- try
- {
+ if (content != null) {
+ try {
content.close();
content = null;
- }
- catch (final FileSystemException e)
- {
+ } catch (final FileSystemException e) {
exc = e;
}
}
// Detach from the file
- try
- {
+ try {
detach();
- }
- catch (final Exception e)
- {
+ } catch (final Exception e) {
exc = new FileSystemException("vfs.provider/close.error", fileName, e);
}
- if (exc != null)
- {
+ if (exc != null) {
throw exc;
}
}
@@ -279,16 +240,13 @@ public abstract class AbstractFileObject
/**
* Compares two FileObjects (ignores case).
*
- * @param file
- * the object to compare.
+ * @param file the object to compare.
* @return a negative integer, zero, or a positive integer when this object is less than, equal to, or greater than
* the given object.
*/
@Override
- public int compareTo(final FileObject file)
- {
- if (file == null)
- {
+ public int compareTo(final FileObject file) {
+ if (file == null) {
return 1;
}
return this.toString().compareToIgnoreCase(file.toString());
@@ -302,11 +260,8 @@ public abstract class AbstractFileObject
* @throws FileSystemException if an error occurs.
*/
@Override
- public void copyFrom(final FileObject file, final FileSelector selector)
- throws FileSystemException
- {
- if (!file.exists())
- {
+ public void copyFrom(final FileObject file, final FileSelector selector) throws FileSystemException {
+ if (!file.exists()) {
throw new FileSystemException("vfs.provider/copy-missing-file.error", file);
}
@@ -315,15 +270,13 @@ public abstract class AbstractFileObject
file.findFiles(selector, false, files);
// Copy everything across
- for (final FileObject srcFile : files)
- {
+ for (final FileObject srcFile : files) {
// Determine the destination file
final String relPath = file.getName().getRelativeName(srcFile.getName());
final FileObject destFile = resolveFile(relPath, NameScope.DESCENDENT_OR_SELF);
// Clean up the destination file, if necessary
- if (destFile.exists() && destFile.getType() != srcFile.getType())
- {
+ if (destFile.exists() && destFile.getType() != srcFile.getType()) {
// The destination file exists, and is not of the same type,
// so delete it
// TODO - add a pluggable policy for deleting and overwriting existing files
@@ -331,19 +284,13 @@ public abstract class AbstractFileObject
}
// Copy across
- try
- {
- if (srcFile.getType().hasContent())
- {
+ try {
+ if (srcFile.getType().hasContent()) {
FileUtil.copyContent(srcFile, destFile);
- }
- else if (srcFile.getType().hasChildren())
- {
+ } else if (srcFile.getType().hasChildren()) {
destFile.createFolder();
}
- }
- catch (final IOException e)
- {
+ } catch (final IOException e) {
throw new FileSystemException("vfs.provider/copy-file.error", e, srcFile, destFile);
}
}
@@ -351,88 +298,68 @@ public abstract class AbstractFileObject
/**
* Creates this file, if it does not exist.
+ *
* @throws FileSystemException if an error occurs.
*/
@Override
- public void createFile() throws FileSystemException
- {
- synchronized (fs)
- {
- try
- {
+ public void createFile() throws FileSystemException {
+ synchronized (fs) {
+ try {
// VFS-210: We do not want to trunc any existing file, checking for its existence is
// still required
- if (exists() && !isFile())
- {
+ if (exists() && !isFile()) {
throw new FileSystemException("vfs.provider/create-file.error", fileName);
}
- if (!exists())
- {
+ if (!exists()) {
getOutputStream().close();
endOutput();
}
- }
- catch (final RuntimeException re)
- {
+ } catch (final RuntimeException re) {
throw re;
- }
- catch (final Exception e)
- {
+ } catch (final Exception e) {
throw new FileSystemException("vfs.provider/create-file.error", fileName, e);
}
}
}
/**
- * Creates this folder, if it does not exist. Also creates any ancestor
- * files which do not exist.
+ * Creates this folder, if it does not exist. Also creates any ancestor files which do not exist.
+ *
* @throws FileSystemException if an error occurs.
*/
@Override
- public void createFolder() throws FileSystemException
- {
- synchronized (fs)
- {
+ public void createFolder() throws FileSystemException {
+ synchronized (fs) {
// VFS-210: we create a folder only if it does not already exist. So this check should be safe.
- if (getType().hasChildren())
- {
+ if (getType().hasChildren()) {
// Already exists as correct type
return;
}
- if (getType() != FileType.IMAGINARY)
- {
+ if (getType() != FileType.IMAGINARY) {
throw new FileSystemException("vfs.provider/create-folder-mismatched-type.error", fileName);
}
- /* VFS-210: checking for writeable is not always possible as the security constraint might
- be more complex
- if (!isWriteable())
- {
- throw new FileSystemException("vfs.provider/create-folder-read-only.error", name);
- }
- */
+ /*
+ * VFS-210: checking for writeable is not always possible as the security constraint might be more complex
+ * if (!isWriteable()) { throw new FileSystemException("vfs.provider/create-folder-read-only.error", name);
+ * }
+ */
// Traverse up the hierarchy and make sure everything is a folder
final FileObject parent = getParent();
- if (parent != null)
- {
+ if (parent != null) {
parent.createFolder();
}
- try
- {
+ try {
// Create the folder
doCreateFolder();
// Update cached info
handleCreate(FileType.FOLDER);
- }
- catch (final RuntimeException re)
- {
+ } catch (final RuntimeException re) {
throw re;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/create-folder.error", fileName, exc);
}
}
@@ -447,8 +374,7 @@ public abstract class AbstractFileObject
* @throws FileSystemException if an error occurs.
*/
@Override
- public boolean delete() throws FileSystemException
- {
+ public boolean delete() throws FileSystemException {
return delete(Selectors.SELECT_SELF) > 0;
}
@@ -460,17 +386,12 @@ public abstract class AbstractFileObject
* @throws FileSystemException if an error occurs.
*/
@Override
- public int delete(final FileSelector selector) throws FileSystemException
- {
+ public int delete(final FileSelector selector) throws FileSystemException {
int nuofDeleted = 0;
- /* VFS-210
- if (getType() == FileType.IMAGINARY)
- {
- // File does not exist
- return nuofDeleted;
- }
- */
+ /*
+ * VFS-210 if (getType() == FileType.IMAGINARY) { // File does not exist return nuofDeleted; }
+ */
// Locate all the files to delete
final ArrayList<FileObject> files = new ArrayList<>();
@@ -478,23 +399,20 @@ public abstract class AbstractFileObject
// Delete 'em
final int count = files.size();
- for (int i = 0; i < count; i++)
- {
+ for (int i = 0; i < count; i++) {
final AbstractFileObject file = FileObjectUtils.getAbstractFileObject(files.get(i));
// file.attach();
// VFS-210: It seems impossible to me that findFiles will return a list with hidden files/directories
// in it, else it would not be hidden. Checking for the file-type seems ok in this case
// If the file is a folder, make sure all its children have been deleted
- if (file.getType().hasChildren() && file.getChildren().length != 0)
- {
+ if (file.getType().hasChildren() && file.getChildren().length != 0) {
// Skip - as the selector forced us not to delete all files
continue;
}
// Delete the file
- if (file.deleteSelf())
- {
+ if (file.deleteSelf()) {
nuofDeleted++;
}
}
@@ -511,8 +429,7 @@ public abstract class AbstractFileObject
* @see Selectors#SELECT_ALL
*/
@Override
- public int deleteAll() throws FileSystemException
- {
+ public int deleteAll() throws FileSystemException {
return this.delete(Selectors.SELECT_ALL);
}
@@ -522,34 +439,23 @@ public abstract class AbstractFileObject
* @return true if this file has been deleted
* @throws FileSystemException if an error occurs.
*/
- private boolean deleteSelf() throws FileSystemException
- {
- synchronized (fs)
- {
- //Its possible to delete a read-only file if you have write-execute access to the directory
-
- /* VFS-210
- if (getType() == FileType.IMAGINARY)
- {
- // File does not exist
- return false;
- }
- */
+ private boolean deleteSelf() throws FileSystemException {
+ synchronized (fs) {
+ // Its possible to delete a read-only file if you have write-execute access to the directory
+
+ /*
+ * VFS-210 if (getType() == FileType.IMAGINARY) { // File does not exist return false; }
+ */
- try
- {
+ try {
// Delete the file
doDelete();
// Update cached info
handleDelete();
- }
- catch (final RuntimeException re)
- {
+ } catch (final RuntimeException re) {
throw re;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/delete.error", exc, fileName);
}
@@ -558,22 +464,17 @@ public abstract class AbstractFileObject
}
/**
- * Detaches this file, invalidating all cached info. This will force
- * a call to {@link #doAttach} next time this file is used.
+ * Detaches this file, invalidating all cached info. This will force a call to {@link #doAttach} next time this file
+ * is used.
+ *
* @throws Exception if an error occurs.
*/
- private void detach() throws Exception
- {
- synchronized (fs)
- {
- if (attached)
- {
- try
- {
+ private void detach() throws Exception {
+ synchronized (fs) {
+ if (attached) {
+ try {
doDetach();
- }
- finally
- {
+ } finally {
attached = false;
setFileType(null);
parent = null;
@@ -590,116 +491,109 @@ public abstract class AbstractFileObject
/**
* Attaches this file object to its file resource.
* <p>
- * This method is called before any of the doBlah() or onBlah() methods.
- * Sub-classes can use this method to perform lazy initialisation.
+ * This method is called before any of the doBlah() or onBlah() methods. Sub-classes can use this method to perform
+ * lazy initialisation.
* <p>
* This implementation does nothing.
*
* @throws Exception if an error occurs.
*/
- protected void doAttach() throws Exception
- {
+ protected void doAttach() throws Exception {
}
/**
* Create a FileContent implementation.
+ *
* @return The FileContent.
* @throws FileSystemException if an error occurs.
* @since 2.0
*/
- protected FileContent doCreateFileContent() throws FileSystemException
- {
+ protected FileContent doCreateFileContent() throws FileSystemException {
return new DefaultFileContent(this, getFileContentInfoFactory());
}
/**
- * Creates this file as a folder. Is only called when:
+ * Creates this file as a folder. Is only called when:
* <ul>
* <li>{@link #doGetType} returns {@link FileType#IMAGINARY}.</li>
- * <li>The parent folder exists and is writeable, or this file is the
- * root of the file system.</li>
+ * <li>The parent folder exists and is writeable, or this file is the root of the file system.</li>
* </ul>
* This implementation throws an exception.
*
* @throws Exception if an error occurs.
*/
- protected void doCreateFolder() throws Exception
- {
+ protected void doCreateFolder() throws Exception {
throw new FileSystemException("vfs.provider/create-folder-not-supported.error");
}
/**
- * Deletes the file. Is only called when:
+ * Deletes the file. Is only called when:
* <ul>
* <li>{@link #doGetType} does not return {@link FileType#IMAGINARY}.</li>
* <li>{@link #doIsWriteable} returns true.</li>
* <li>This file has no children, if a folder.</li>
* </ul>
* This implementation throws an exception.
-
+ *
* @throws Exception if an error occurs.
*/
- protected void doDelete() throws Exception
- {
+ protected void doDelete() throws Exception {
throw new FileSystemException("vfs.provider/delete-not-supported.error");
}
/**
* Detaches this file object from its file resource.
* <p>
- * Called when this file is closed. Note that the file object may be
- * reused later, so should be able to be reattached.
+ * Called when this file is closed. Note that the file object may be reused later, so should be able to be
+ * reattached.
* <p>
* This implementation does nothing.
*
* @throws Exception if an error occurs.
*/
- protected void doDetach() throws Exception
- {
+ protected void doDetach() throws Exception {
}
/**
- * Returns the attributes of this file. Is only called if {@link #doGetType}
- * does not return {@link FileType#IMAGINARY}.
+ * Returns the attributes of this file. Is only called if {@link #doGetType} does not return
+ * {@link FileType#IMAGINARY}.
* <p>
* This implementation always returns an empty map.
*
* @return The attributes of the file.
* @throws Exception if an error occurs.
*/
- protected Map<String, Object> doGetAttributes() throws Exception
- {
+ protected Map<String, Object> doGetAttributes() throws Exception {
return Collections.emptyMap();
}
/**
- * Returns the certificates used to sign this file. Is only called if
- * {@link #doGetType} does not return {@link FileType#IMAGINARY}.
+ * Returns the certificates used to sign this file. Is only called if {@link #doGetType} does not return
+ * {@link FileType#IMAGINARY}.
* <p>
* This implementation always returns null.
*
* @return The certificates used to sign the file.
* @throws Exception if an error occurs.
*/
- protected Certificate[] doGetCertificates() throws Exception
- {
+ protected Certificate[] doGetCertificates() throws Exception {
return null;
}
/**
- * Returns the size of the file content (in bytes). Is only called if
- * {@link #doGetType} returns {@link FileType#FILE}.
+ * Returns the size of the file content (in bytes). Is only called if {@link #doGetType} returns
+ * {@link FileType#FILE}.
+ *
* @return The size of the file in bytes.
* @throws Exception if an error occurs.
*/
protected abstract long doGetContentSize() throws Exception;
/**
- * Creates an input stream to read the file content from. Is only called
- * if {@link #doGetType} returns {@link FileType#FILE}.
+ * Creates an input stream to read the file content from. Is only called if {@link #doGetType} returns
+ * {@link FileType#FILE}.
* <p>
- * It is guaranteed that there are no open output streams for this file
- * when this method is called.
+ * It is guaranteed that there are no open output streams for this file when this method is called.
* <p>
* The returned stream does not have to be buffered.
*
@@ -709,30 +603,26 @@ public abstract class AbstractFileObject
protected abstract InputStream doGetInputStream() throws Exception;
/**
- * Returns the last modified time of this file. Is only called if
- * {@link #doGetType} does not return {@link FileType#IMAGINARY}.
+ * Returns the last modified time of this file. Is only called if {@link #doGetType} does not return
+ * {@link FileType#IMAGINARY}.
* <p>
* This implementation throws an exception.
*
* @return The last modification time.
* @throws Exception if an error occurs.
*/
- protected long doGetLastModifiedTime() throws Exception
- {
+ protected long doGetLastModifiedTime() throws Exception {
throw new FileSystemException("vfs.provider/get-last-modified-not-supported.error");
}
/**
- * Creates an output stream to write the file content to. Is only
- * called if:
+ * Creates an output stream to write the file content to. Is only called if:
* <ul>
* <li>{@link #doIsWriteable} returns true.
- * <li>{@link #doGetType} returns {@link FileType#FILE}, or
- * {@link #doGetType} returns {@link FileType#IMAGINARY}, and the file's
- * parent exists and is a folder.
+ * <li>{@link #doGetType} returns {@link FileType#FILE}, or {@link #doGetType} returns {@link FileType#IMAGINARY},
+ * and the file's parent exists and is a folder.
* </ul>
- * It is guaranteed that there are no open stream (input or output) for
- * this file when this method is called.
+ * It is guaranteed that there are no open stream (input or output) for this file when this method is called.
* <p>
* The returned stream does not have to be buffered.
* <p>
@@ -742,111 +632,102 @@ public abstract class AbstractFileObject
* @return An OutputStream to write to the file.
* @throws Exception if an error occurs.
*/
- protected OutputStream doGetOutputStream(final boolean bAppend) throws Exception
- {
+ protected OutputStream doGetOutputStream(final boolean bAppend) throws Exception {
throw new FileSystemException("vfs.provider/write-not-supported.error");
}
/**
- * Creates access to the file for random i/o. Is only called
- * if {@link #doGetType} returns {@link FileType#FILE}.
+ * Creates access to the file for random i/o. Is only called if {@link #doGetType} returns {@link FileType#FILE}.
* <p>
- * It is guaranteed that there are no open output streams for this file
- * when this method is called.
+ * It is guaranteed that there are no open output streams for this file when this method is called.
*
* @param mode The mode to access the file.
* @return The RandomAccessContext.
* @throws Exception if an error occurs.
*/
- protected RandomAccessContent doGetRandomAccessContent(final RandomAccessMode mode) throws Exception
- {
+ protected RandomAccessContent doGetRandomAccessContent(final RandomAccessMode mode) throws Exception {
throw new FileSystemException("vfs.provider/random-access-not-supported.error");
}
/**
- * Determines the type of this file. Must not return null. The return
- * value of this method is cached, so the implementation can be expensive.
+ * Determines the type of this file. Must not return null. The return value of this method is cached, so the
+ * implementation can be expensive.
+ *
* @return the type of the file.
* @throws Exception if an error occurs.
*/
protected abstract FileType doGetType() throws Exception;
/**
- * Determines if this file is executable. Is only called if {@link #doGetType}
- * does not return {@link FileType#IMAGINARY}.
+ * Determines if this file is executable. Is only called if {@link #doGetType} does not return
+ * {@link FileType#IMAGINARY}.
* <p>
* This implementation always returns false.
*
* @return true if the file is executable, false otherwise.
* @throws Exception if an error occurs.
*/
- protected boolean doIsExecutable() throws Exception
- {
+ protected boolean doIsExecutable() throws Exception {
return false;
}
/**
- * Determines if this file is hidden. Is only called if {@link #doGetType}
- * does not return {@link FileType#IMAGINARY}.
+ * Determines if this file is hidden. Is only called if {@link #doGetType} does not return
+ * {@link FileType#IMAGINARY}.
* <p>
* This implementation always returns false.
*
* @return true if the file is hidden, false otherwise.
* @throws Exception if an error occurs.
*/
- protected boolean doIsHidden() throws Exception
- {
+ protected boolean doIsHidden() throws Exception {
return false;
}
/**
- * Determines if this file can be read. Is only called if {@link #doGetType}
- * does not return {@link FileType#IMAGINARY}.
+ * Determines if this file can be read. Is only called if {@link #doGetType} does not return
+ * {@link FileType#IMAGINARY}.
* <p>
* This implementation always returns true.
*
* @return true if the file is readable, false otherwise.
* @throws Exception if an error occurs.
*/
- protected boolean doIsReadable() throws Exception
- {
+ protected boolean doIsReadable() throws Exception {
return true;
}
/**
- * Checks if this fileObject is the same file as {@code destFile} just with a different
- * name. E.g. for case insensitive filesystems like windows.
+ * Checks if this fileObject is the same file as {@code destFile} just with a different name. E.g. for case
+ * insensitive filesystems like windows.
*
* @param destFile The file to compare to.
* @return true if the FileObjects are the same.
* @throws FileSystemException if an error occurs.
*/
- protected boolean doIsSameFile(final FileObject destFile) throws FileSystemException
- {
+ protected boolean doIsSameFile(final FileObject destFile) throws FileSystemException {
return false;
}
/**
- * Determines if this file can be written to. Is only called if
- * {@link #doGetType} does not return {@link FileType#IMAGINARY}.
+ * Determines if this file can be written to. Is only called if {@link #doGetType} does not return
+ * {@link FileType#IMAGINARY}.
* <p>
* This implementation always returns true.
*
* @return true if the file is writable.
* @throws Exception if an error occurs.
*/
- protected boolean doIsWriteable() throws Exception
- {
+ protected boolean doIsWriteable() throws Exception {
return true;
}
/**
- * Lists the children of this file. Is only called if {@link #doGetType}
- * returns {@link FileType#FOLDER}. The return value of this method
- * is cached, so the implementation can be expensive.
+ * Lists the children of this file. Is only called if {@link #doGetType} returns {@link FileType#FOLDER}. The return
+ * value of this method is cached, so the implementation can be expensive.
*
- * @return a possible empty String array if the file is a directory or null or an exception if the
- * file is not a directory or can't be read.
+ * @return a possible empty String array if the file is a directory or null or an exception if the file is not a
+ * directory or can't be read.
* @throws Exception if an error occurs.
*/
protected abstract String[] doListChildren() throws Exception;
@@ -857,16 +738,14 @@ public abstract class AbstractFileObject
* Is only called if {@link #doGetType} returns {@link FileType#FOLDER}.
* <p>
* The return value of this method is cached, so the implementation can be expensive.<br>
- * Other than {@code doListChildren} you could return FileObject's to e.g. reinitialize the
- * type of the file.
+ * Other than {@code doListChildren} you could return FileObject's to e.g. reinitialize the type of the file.
* <p>
* (Introduced for Webdav: "permission denied on resource" during getType())
*
* @return The children of this FileObject.
* @throws Exception if an error occurs.
*/
- protected FileObject[] doListChildrenResolved() throws Exception
- {
+ protected FileObject[] doListChildrenResolved() throws Exception {
return null;
}
@@ -881,8 +760,7 @@ public abstract class AbstractFileObject
* @throws Exception if an error occurs.
* @since 2.0
*/
- protected void doRemoveAttribute(final String attrName) throws Exception
- {
+ protected void doRemoveAttribute(final String attrName) throws Exception {
throw new FileSystemException("vfs.provider/remove-attribute-not-supported.error");
}
@@ -899,8 +777,7 @@ public abstract class AbstractFileObject
* @param newFile A FileObject with the new file name.
* @throws Exception if an error occurs.
*/
- protected void doRename(final FileObject newFile) throws Exception
- {
+ protected void doRename(final FileObject newFile) throws Exception {
throw new FileSystemException("vfs.provider/rename-not-supported.error");
}
@@ -915,8 +792,7 @@ public abstract class AbstractFileObject
* @param value The value to be associated with the attribute name.
* @throws Exception if an error occurs.
*/
- protected void doSetAttribute(final String attrName, final Object value) throws Exception
- {
+ protected void doSetAttribute(final String attrName, final Object value) throws Exception {
throw new FileSystemException("vfs.provider/set-attribute-not-supported.error");
}
@@ -934,8 +810,7 @@ public abstract class AbstractFileObject
* @see #setExecutable(boolean, boolean)
* @since 2.1
*/
- protected boolean doSetExecutable(final boolean executable, final boolean ownerOnly) throws Exception
- {
+ protected boolean doSetExecutable(final boolean executable, final boolean ownerOnly) throws Exception {
return false;
}
@@ -950,8 +825,7 @@ public abstract class AbstractFileObject
* @return true if the time was set.
* @throws Exception Any Exception thrown is wrapped in FileSystemException.
*/
- protected boolean doSetLastModifiedTime(final long modtime) throws Exception
- {
+ protected boolean doSetLastModifiedTime(final long modtime) throws Exception {
throw new FileSystemException("vfs.provider/set-last-modified-not-supported.error");
}
@@ -962,17 +836,14 @@ public abstract class AbstractFileObject
* <p>
* This implementation returns false.
*
- * @param readable
- * True to allow access, false to disallow
- * @param ownerOnly
- * If {@code true}, the permission applies only to the owner; otherwise, it applies to everybody.
+ * @param readable True to allow access, false to disallow
+ * @param ownerOnly If {@code true}, the permission applies only to the owner; otherwise, it applies to everybody.
* @return true if the operation succeeded
* @throws Exception Any Exception thrown is wrapped in FileSystemException.
* @see #setReadable(boolean, boolean)
* @since 2.1
*/
- protected boolean doSetReadable(final boolean readable, final boolean ownerOnly) throws Exception
- {
+ protected boolean doSetReadable(final boolean readable, final boolean ownerOnly) throws Exception {
return false;
}
@@ -988,24 +859,20 @@ public abstract class AbstractFileObject
* @see #setWritable(boolean, boolean)
* @since 2.1
*/
- protected boolean doSetWritable(final boolean writable, final boolean ownerOnly) throws Exception
- {
+ protected boolean doSetWritable(final boolean writable, final boolean ownerOnly) throws Exception {
return false;
}
/**
* Called when the output stream for this file is closed.
+ *
* @throws Exception if an error occurs.
*/
- protected void endOutput() throws Exception
- {
- if (getType() == FileType.IMAGINARY)
- {
+ protected void endOutput() throws Exception {
+ if (getType() == FileType.IMAGINARY) {
// File was created
handleCreate(FileType.FILE);
- }
- else
- {
+ } else {
// File has changed
onChange();
}
@@ -1013,25 +880,22 @@ public abstract class AbstractFileObject
/**
* Determines if the file exists.
+ *
* @return true if the file exists, false otherwise,
* @throws FileSystemException if an error occurs.
*/
@Override
- public boolean exists() throws FileSystemException
- {
+ public boolean exists() throws FileSystemException {
return getType() != FileType.IMAGINARY;
}
- private FileName[] extractNames(final FileObject[] objects)
- {
- if (objects == null)
- {
+ private FileName[] extractNames(final FileObject[] objects) {
+ if (objects == null) {
return null;
}
final FileName[] names = new FileName[objects.length];
- for (int iterObjects = 0; iterObjects < objects.length; iterObjects++)
- {
+ for (int iterObjects = 0; iterObjects < objects.length; iterObjects++) {
names[iterObjects] = objects[iterObjects].getName();
}
@@ -1039,46 +903,38 @@ public abstract class AbstractFileObject
}
@Override
- protected void finalize() throws Throwable
- {
+ protected void finalize() throws Throwable {
fs.fileObjectDestroyed(this);
super.finalize();
}
-
/**
- * Finds the set of matching descendants of this file, in depthwise
- * order.
+ * Finds the set of matching descendants of this file, in depthwise order.
*
* @param selector The FileSelector.
* @return list of files or null if the base file (this object) do not exist
* @throws FileSystemException if an error occurs.
*/
@Override
- public FileObject[] findFiles(final FileSelector selector) throws FileSystemException
- {
+ public FileObject[] findFiles(final FileSelector selector) throws FileSystemException {
final List<FileObject> list = this.listFiles(selector);
return list == null ? null : list.toArray(new FileObject[list.size()]);
}
/**
- * Traverses the descendants of this file, and builds a list of selected
- * files.
+ * Traverses the descendants of this file, and builds a list of selected files.
+ *
* @param selector The FileSelector.
* @param depthwise if true files are added after their descendants, before otherwise.
* @param selected A List of the located FileObjects.
* @throws FileSystemException if an error occurs.
*/
@Override
- public void findFiles(final FileSelector selector,
- final boolean depthwise,
- final List<FileObject> selected) throws FileSystemException
- {
- try
- {
- if (exists())
- {
+ public void findFiles(final FileSelector selector, final boolean depthwise, final List<FileObject> selected)
+ throws FileSystemException {
+ try {
+ if (exists()) {
// Traverse starting at this file
final DefaultFileSelectorInfo info = new DefaultFileSelectorInfo();
info.setBaseFolder(this);
@@ -1086,39 +942,35 @@ public abstract class AbstractFileObject
info.setFile(this);
traverse(info, selector, depthwise, selected);
}
- }
- catch (final Exception e)
- {
+ } catch (final Exception e) {
throw new FileSystemException("vfs.provider/find-files.error", fileName, e);
}
}
/**
* Returns the file system this file belongs to.
+ *
* @return The FileSystem this file is associated with.
*/
- protected AFS getAbstractFileSystem()
- {
+ protected AFS getAbstractFileSystem() {
return fs;
}
/**
* Returns a child of this file.
+ *
* @param name The name of the child to locate.
* @return The FileObject for the file or null if the child does not exist.
* @throws FileSystemException if an error occurs.
*/
@Override
- public FileObject getChild(final String name) throws FileSystemException
- {
+ public FileObject getChild(final String name) throws FileSystemException {
// TODO - use a hashtable when there are a large number of children
final FileObject[] children = getChildren();
- for (final FileObject element : children)
- {
+ for (final FileObject element : children) {
final FileName child = element.getName();
// TODO - use a comparator to compare names
- if (child.getBaseName().equals(name))
- {
+ if (child.getBaseName().equals(name)) {
return resolveFile(child);
}
}
@@ -1127,90 +979,68 @@ public abstract class AbstractFileObject
/**
* Returns the children of the file.
+ *
* @return an array of FileObjects, one per child.
* @throws FileSystemException if an error occurs.
*/
@Override
- public FileObject[] getChildren() throws FileSystemException
- {
- synchronized (fs)
- {
+ public FileObject[] getChildren() throws FileSystemException {
+ synchronized (fs) {
// VFS-210
- if (!fs.hasCapability(Capability.LIST_CHILDREN))
- {
+ if (!fs.hasCapability(Capability.LIST_CHILDREN)) {
throw new FileNotFolderException(fileName);
}
- /* VFS-210
- if (!getType().hasChildren())
- {
- throw new FileSystemException("vfs.provider/list-children-not-folder.error", name);
- }
- */
+ /*
+ * VFS-210 if (!getType().hasChildren()) { throw new
+ * FileSystemException("vfs.provider/list-children-not-folder.error", name); }
+ */
attach();
// Use cached info, if present
- if (children != null)
- {
+ if (children != null) {
return resolveFiles(children);
}
// allow the filesystem to return resolved children. e.g. prefill type for webdav
FileObject[] childrenObjects;
- try
- {
+ try {
childrenObjects = doListChildrenResolved();
children = extractNames(childrenObjects);
- }
- catch (final FileSystemException exc)
- {
+ } catch (final FileSystemException exc) {
// VFS-210
throw exc;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/list-children.error", exc, fileName);
}
- if (childrenObjects != null)
- {
+ if (childrenObjects != null) {
return childrenObjects;
}
// List the children
final String[] files;
- try
- {
+ try {
files = doListChildren();
- }
- catch (final FileSystemException exc)
- {
+ } catch (final FileSystemException exc) {
// VFS-210
throw exc;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/list-children.error", exc, fileName);
}
- if (files == null)
- {
+ if (files == null) {
// VFS-210
// honor the new doListChildren contract
// return null;
throw new FileNotFolderException(fileName);
- }
- else if (files.length == 0)
- {
+ } else if (files.length == 0) {
// No children
children = EMPTY_FILE_ARRAY;
- }
- else
- {
+ } else {
// Create file objects for the children
final FileName[] cache = new FileName[files.length];
- for (int i = 0; i < files.length; i++)
- {
+ for (int i = 0; i < files.length; i++) {
final String file = files[i];
cache[i] = fs.getFileSystemManager().resolveName(fileName, file, NameScope.CHILD);
}
@@ -1225,17 +1055,15 @@ public abstract class AbstractFileObject
/**
* Returns the file's content.
+ *
* @return the FileContent for this FileObject.
* @throws FileSystemException if an error occurs.
*/
@Override
- public FileContent getContent() throws FileSystemException
- {
- synchronized (fs)
- {
+ public FileContent getContent() throws FileSystemException {
+ synchronized (fs) {
attach();
- if (content == null)
- {
+ if (content == null) {
content = doCreateFileContent();
}
return content;
@@ -1244,23 +1072,20 @@ public abstract class AbstractFileObject
/**
* Creates the FileContentInfo factory.
+ *
* @return The FileContentInfoFactory.
*/
- protected FileContentInfoFactory getFileContentInfoFactory()
- {
+ protected FileContentInfoFactory getFileContentInfoFactory() {
return fs.getFileSystemManager().getFileContentInfoFactory();
}
/**
- * @return FileOperations interface that provides access to the operations
- * API.
+ * @return FileOperations interface that provides access to the operations API.
* @throws FileSystemException if an error occurs.
*/
@Override
- public FileOperations getFileOperations() throws FileSystemException
- {
- if (operations == null)
- {
+ public FileOperations getFileOperations() throws FileSystemException {
+ if (operations == null) {
operations = new DefaultFileOperations(this);
}
@@ -1269,51 +1094,36 @@ public abstract class AbstractFileObject
/**
* Returns the file system this file belongs to.
+ *
* @return The FileSystem this file is associated with.
*/
@Override
- public FileSystem getFileSystem()
- {
+ public FileSystem getFileSystem() {
return fs;
}
/**
* Returns an input stream to use to read the content of the file.
+ *
* @return The InputStream to access this file's content.
* @throws FileSystemException if an error occurs.
*/
- public InputStream getInputStream() throws FileSystemException
- {
- /* VFS-210
- if (!getType().hasContent())
- {
- throw new FileSystemException("vfs.provider/read-not-file.error", name);
- }
- if (!isReadable())
- {
- throw new FileSystemException("vfs.provider/read-not-readable.error", name);
- }
- */
+ public InputStream getInputStream() throws FileSystemException {
+ /*
+ * VFS-210 if (!getType().hasContent()) { throw new FileSystemException("vfs.provider/read-not-file.error",
+ * name); } if (!isReadable()) { throw new FileSystemException("vfs.provider/read-not-readable.error", name); }
+ */
// Get the raw input stream
- try
- {
+ try {
return doGetInputStream();
- }
- catch (final org.apache.commons.vfs2.FileNotFoundException exc)
- {
+ } catch (final org.apache.commons.vfs2.FileNotFoundException exc) {
throw new org.apache.commons.vfs2.FileNotFoundException(fileName, exc);
- }
- catch (final FileNotFoundException exc)
- {
+ } catch (final FileNotFoundException exc) {
throw new org.apache.commons.vfs2.FileNotFoundException(fileName, exc);
- }
- catch (final FileSystemException exc)
- {
+ } catch (final FileSystemException exc) {
throw exc;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/read.error", fileName, exc);
}
}
@@ -1324,102 +1134,81 @@ public abstract class AbstractFileObject
* @return The FileName, never {@code null}.
*/
@Override
- public FileName getName()
- {
+ public FileName getName() {
return fileName;
}
/**
- * Returns the receiver as a URI String for public display, like, without a
- * password.
+ * Returns the receiver as a URI String for public display, like, without a password.
*
* @return A URI String without a password, never {@code null}.
*/
@Override
- public String getPublicURIString()
- {
+ public String getPublicURIString() {
return fileName.getFriendlyURI();
}
/**
- * Prepares this file for writing. Makes sure it is either a file,
- * or its parent folder exists. Returns an output stream to use to
- * write the content of the file to.
+ * Prepares this file for writing. Makes sure it is either a file, or its parent folder exists. Returns an output
+ * stream to use to write the content of the file to.
+ *
* @return An OutputStream where the new contents of the file can be written.
* @throws FileSystemException if an error occurs.
*/
- public OutputStream getOutputStream() throws FileSystemException
- {
+ public OutputStream getOutputStream() throws FileSystemException {
return getOutputStream(false);
}
/**
- * Prepares this file for writing. Makes sure it is either a file,
- * or its parent folder exists. Returns an output stream to use to
- * write the content of the file to.<br>
+ * Prepares this file for writing. Makes sure it is either a file, or its parent folder exists. Returns an output
+ * stream to use to write the content of the file to.<br>
*
* @param bAppend true when append to the file.<br>
- * Note: If the underlying filesystem does not support appending,
- * a FileSystemException is thrown.
+ * Note: If the underlying filesystem does not support appending, a FileSystemException is thrown.
* @return An OutputStream where the new contents of the file can be written.
* @throws FileSystemException if an error occurs; for example:<br>
- * bAppend is true, and the underlying FileSystem does not support it
+ * bAppend is true, and the underlying FileSystem does not support it
*/
- public OutputStream getOutputStream(final boolean bAppend) throws FileSystemException
- {
- /* VFS-210
- if (getType() != FileType.IMAGINARY && !getType().hasContent())
- {
- throw new FileSystemException("vfs.provider/write-not-file.error", name);
- }
- if (!isWriteable())
- {
- throw new FileSystemException("vfs.provider/write-read-only.error", name);
- }
- */
+ public OutputStream getOutputStream(final boolean bAppend) throws FileSystemException {
+ /*
+ * VFS-210 if (getType() != FileType.IMAGINARY && !getType().hasContent()) { throw new
+ * FileSystemException("vfs.provider/write-not-file.error", name); } if (!isWriteable()) { throw new
+ * FileSystemException("vfs.provider/write-read-only.error", name); }
+ */
- if (bAppend && !fs.hasCapability(Capability.APPEND_CONTENT))
- {
+ if (bAppend && !fs.hasCapability(Capability.APPEND_CONTENT)) {
throw new FileSystemException("vfs.provider/write-append-not-supported.error", fileName);
}
- if (getType() == FileType.IMAGINARY)
- {
-// Does not exist - make sure parent does
+ if (getType() == FileType.IMAGINARY) {
+ // Does not exist - make sure parent does
final FileObject parent = getParent();
- if (parent != null)
- {
+ if (parent != null) {
parent.createFolder();
}
}
-// Get the raw output stream
- try
- {
+ // Get the raw output stream
+ try {
return doGetOutputStream(bAppend);
- }
- catch (final RuntimeException re)
- {
+ } catch (final RuntimeException re) {
throw re;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/write.error", exc, fileName);
}
}
/**
* Returns the parent of the file.
+ *
* @return the parent FileObject.
* @throws FileSystemException if an error occurs.
*/
@Override
- public FileObject getParent() throws FileSystemException
- {
+ public FileObject getParent() throws FileSystemException {
if (this.compareTo(fs.getRoot()) == 0) // equals is not implemented :-/
{
- if (fs.getParentLayer() == null)
- {
+ if (fs.getParentLayer() == null) {
// Root file has no parent
return null;
}
@@ -1427,14 +1216,11 @@ public abstract class AbstractFileObject
return fs.getParentLayer().getParent();
}
- synchronized (fs)
- {
+ synchronized (fs) {
// Locate the parent of this file
- if (parent == null)
- {
+ if (parent == null) {
final FileName name = fileName.getParent();
- if (name == null)
- {
+ if (name == null) {
return null;
}
parent = fs.resolveFile(name);
@@ -1444,82 +1230,64 @@ public abstract class AbstractFileObject
}
/**
- * Returns an input/output stream to use to read and write the content of the file in and
- * random manner.
+ * Returns an input/output stream to use to read and write the content of the file in and random manner.
+ *
* @param mode The RandomAccessMode.
* @return The RandomAccessContent.
* @throws FileSystemException if an error occurs.
*/
- public RandomAccessContent getRandomAccessContent(final RandomAccessMode mode) throws FileSystemException
- {
- /* VFS-210
- if (!getType().hasContent())
- {
- throw new FileSystemException("vfs.provider/read-not-file.error", name);
- }
- */
+ public RandomAccessContent getRandomAccessContent(final RandomAccessMode mode) throws FileSystemException {
+ /*
+ * VFS-210 if (!getType().hasContent()) { throw new FileSystemException("vfs.provider/read-not-file.error",
+ * name); }
+ */
- if (mode.requestRead())
- {
- if (!fs.hasCapability(Capability.RANDOM_ACCESS_READ))
- {
+ if (mode.requestRead()) {
+ if (!fs.hasCapability(Capability.RANDOM_ACCESS_READ)) {
throw new FileSystemException("vfs.provider/random-access-read-not-supported.error");
}
- if (!isReadable())
- {
+ if (!isReadable()) {
throw new FileSystemException("vfs.provider/read-not-readable.error", fileName);
}
}
- if (mode.requestWrite())
- {
- if (!fs.hasCapability(Capability.RANDOM_ACCESS_WRITE))
- {
+ if (mode.requestWrite()) {
+ if (!fs.hasCapability(Capability.RANDOM_ACCESS_WRITE)) {
throw new FileSystemException("vfs.provider/random-access-write-not-supported.error");
}
- if (!isWriteable())
- {
+ if (!isWriteable()) {
throw new FileSystemException("vfs.provider/write-read-only.error", fileName);
}
}
// Get the raw input stream
- try
- {
+ try {
return doGetRandomAccessContent(mode);
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/random-access.error", fileName, exc);
}
}
/**
* Returns the file's type.
+ *
* @return The FileType.
* @throws FileSystemException if an error occurs.
*/
@Override
- public FileType getType() throws FileSystemException
- {
- synchronized (fs)
- {
+ public FileType getType() throws FileSystemException {
+ synchronized (fs) {
attach();
// VFS-210: get the type only if requested for
- try
- {
- if (type == null)
- {
+ try {
+ if (type == null) {
setFileType(doGetType());
}
- if (type == null)
- {
+ if (type == null) {
setFileType(FileType.IMAGINARY);
}
- }
- catch (final Exception e)
- {
+ } catch (final Exception e) {
throw new FileSystemException("vfs.provider/get-type.error", e, fileName);
}
@@ -1529,28 +1297,23 @@ public abstract class AbstractFileObject
/**
* Returns a URL representation of the file.
+ *
* @return The URL representation of the file.
* @throws FileSystemException if an error occurs.
*/
@Override
- public URL getURL() throws FileSystemException
- {
- try
- {
- return AccessController.doPrivileged(new PrivilegedExceptionAction<URL>()
- {
+ public URL getURL() throws FileSystemException {
+ try {
+ return AccessController.doPrivileged(new PrivilegedExceptionAction<URL>() {
@Override
- public URL run() throws MalformedURLException
- {
+ public URL run() throws MalformedURLException {
final StringBuilder buf = new StringBuilder();
final String scheme = UriParser.extractScheme(fileName.getURI(), buf);
- return new URL(scheme, "", -1,
- buf.toString(), new DefaultURLStreamHandler(fs.getContext(), fs.getFileSystemOptions()));
+ return new URL(scheme, "", -1, buf.toString(),
+ new DefaultURLStreamHandler(fs.getContext(), fs.getFileSystemOptions()));
}
});
- }
- catch (final PrivilegedActionException e)
- {
+ } catch (final PrivilegedActionException e) {
throw new FileSystemException("vfs.provider/get-url.error", fileName, e.getException());
}
}
@@ -1562,25 +1325,20 @@ public abstract class AbstractFileObject
*
* @throws Exception if an error occurs.
*/
- protected void handleChanged() throws Exception
- {
+ protected void handleChanged() throws Exception {
// Notify the file system
fs.fireFileChanged(this);
}
/**
- * Called when this file is created. Updates cached info and notifies
- * the parent and file system.
+ * Called when this file is created. Updates cached info and notifies the parent and file system.
*
* @param newType The type of the file.
* @throws Exception if an error occurs.
*/
- protected void handleCreate(final FileType newType) throws Exception
- {
- synchronized (fs)
- {
- if (attached)
- {
+ protected void handleCreate(final FileType newType) throws Exception {
+ synchronized (fs) {
+ if (attached) {
// Fix up state
injectType(newType);
@@ -1599,16 +1357,13 @@ public abstract class AbstractFileObject
}
/**
- * Called when this file is deleted. Updates cached info and notifies
- * subclasses, parent and file system.
+ * Called when this file is deleted. Updates cached info and notifies subclasses, parent and file system.
+ *
* @throws Exception if an error occurs.
*/
- protected void handleDelete() throws Exception
- {
- synchronized (fs)
- {
- if (attached)
- {
+ protected void handleDelete() throws Exception {
+ synchronized (fs) {
+ if (attached) {
// Fix up state
injectType(FileType.IMAGINARY);
removeChildrenCache();
@@ -1626,24 +1381,20 @@ public abstract class AbstractFileObject
}
/**
- * This method is meant to add an object where this object holds a strong reference then.
- * E.g. a archive-filesystem creates a list of all children and they shouldn't get
- * garbage collected until the container is garbage collected
+ * This method is meant to add an object where this object holds a strong reference then. E.g. a archive-filesystem
+ * creates a list of all children and they shouldn't get garbage collected until the container is garbage collected
*
* @param strongRef The Object to add.
*/
// TODO should this be a FileObject?
- public void holdObject(final Object strongRef)
- {
- if (objects == null)
- {
+ public void holdObject(final Object strongRef) {
+ if (objects == null) {
objects = new ArrayList<>(INITIAL_LIST_SIZE);
}
objects.add(strongRef);
}
- protected void injectType(final FileType fileType)
- {
+ protected void injectType(final FileType fileType) {
setFileType(fileType);
}
@@ -1653,8 +1404,7 @@ public abstract class AbstractFileObject
* @return true if this is the case
*/
@Override
- public boolean isAttached()
- {
+ public boolean isAttached() {
return attached;
}
@@ -1664,10 +1414,8 @@ public abstract class AbstractFileObject
* @return true if this is the case
*/
@Override
- public boolean isContentOpen()
- {
- if (content == null)
- {
+ public boolean isContentOpen() {
+ if (content == null) {
return false;
}
@@ -1681,14 +1429,10 @@ public abstract class AbstractFileObject
* @throws FileSystemException On error determining if this file exists.
*/
@Override
- public boolean isExecutable() throws FileSystemException
- {
- try
- {
+ public boolean isExecutable() throws FileSystemException {
+ try {
return exists() ? doIsExecutable() : false;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/check-is-executable.error", fileName, exc);
}
}
@@ -1702,8 +1446,7 @@ public abstract class AbstractFileObject
* @see FileType#FILE
*/
@Override
- public boolean isFile() throws FileSystemException
- {
+ public boolean isFile() throws FileSystemException {
// Use equals instead of == to avoid any class loader worries.
return FileType.FILE.equals(this.getType());
}
@@ -1717,85 +1460,72 @@ public abstract class AbstractFileObject
* @see FileType#FOLDER
*/
@Override
- public boolean isFolder() throws FileSystemException
- {
+ public boolean isFolder() throws FileSystemException {
// Use equals instead of == to avoid any class loader worries.
return FileType.FOLDER.equals(this.getType());
}
/**
* Determines if this file can be read.
+ *
* @return true if the file is a hidden file, false otherwise.
* @throws FileSystemException if an error occurs.
*/
@Override
- public boolean isHidden() throws FileSystemException
- {
- try
- {
+ public boolean isHidden() throws FileSystemException {
+ try {
return exists() ? doIsHidden() : false;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/check-is-hidden.error", fileName, exc);
}
}
/**
* Determines if this file can be read.
+ *
* @return true if the file can be read, false otherwise.
* @throws FileSystemException if an error occurs.
*/
@Override
- public boolean isReadable() throws FileSystemException
- {
- try
- {
+ public boolean isReadable() throws FileSystemException {
+ try {
return exists() ? doIsReadable() : false;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/check-is-readable.error", fileName, exc);
}
}
/**
- * Checks if this fileObject is the same file as {@code destFile} just with a different
- * name. E.g. for case insensitive filesystems like windows.
+ * Checks if this fileObject is the same file as {@code destFile} just with a different name. E.g. for case
+ * insensitive filesystems like windows.
*
* @param destFile The file to compare to.
* @return true if the FileObjects are the same.
* @throws FileSystemException if an error occurs.
*/
- protected boolean isSameFile(final FileObject destFile) throws FileSystemException
- {
+ protected boolean isSameFile(final FileObject destFile) throws FileSystemException {
attach();
return doIsSameFile(destFile);
}
/**
* Determines if this file can be written to.
+ *
* @return true if the file can be written to, false otherwise.
* @throws FileSystemException if an error occurs.
*/
@Override
- public boolean isWriteable() throws FileSystemException
- {
- try
- {
- if (exists())
- {
+ public boolean isWriteable() throws FileSystemException {
+ try {
+ if (exists()) {
return doIsWriteable();
}
final FileObject parent = getParent();
- if (parent != null)
- {
+ if (parent != null) {
return parent.isWriteable();
}
return true;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/check-is-writeable.error", fileName, exc);
}
}
@@ -1806,30 +1536,23 @@ public abstract class AbstractFileObject
* @return an Iterator.
*/
@Override
- public Iterator<FileObject> iterator()
- {
- try
- {
+ public Iterator<FileObject> iterator() {
+ try {
return listFiles(Selectors.SELECT_ALL).iterator();
- }
- catch (final FileSystemException e)
- {
+ } catch (final FileSystemException e) {
throw new IllegalStateException(e);
}
}
/**
- * Lists the set of matching descendants of this file, in depthwise
- * order.
+ * Lists the set of matching descendants of this file, in depthwise order.
*
* @param selector The FileSelector.
* @return list of files or null if the base file (this object) do not exist or the {@code selector} is null
* @throws FileSystemException if an error occurs.
*/
- public List<FileObject> listFiles(final FileSelector selector) throws FileSystemException
- {
- if (!exists() || selector == null)
- {
+ public List<FileObject> listFiles(final FileSelector selector) throws FileSystemException {
+ if (!exists() || selector == null) {
return null;
}
@@ -1840,40 +1563,31 @@ public abstract class AbstractFileObject
/**
* Moves (rename) the file to another one.
+ *
* @param destFile The target FileObject.
* @throws FileSystemException if an error occurs.
*/
@Override
- public void moveTo(final FileObject destFile) throws FileSystemException
- {
- if (canRenameTo(destFile))
- {
- if (!getParent().isWriteable())
- {
- throw new FileSystemException("vfs.provider/rename-parent-read-only.error",
- getName(),
+ public void moveTo(final FileObject destFile) throws FileSystemException {
+ if (canRenameTo(destFile)) {
+ if (!getParent().isWriteable()) {
+ throw new FileSystemException("vfs.provider/rename-parent-read-only.error", getName(),
getParent().getName());
}
- }
- else
- {
- if (!isWriteable())
- {
+ } else {
+ if (!isWriteable()) {
throw new FileSystemException("vfs.provider/rename-read-only.error", getName());
}
}
- if (destFile.exists() && !isSameFile(destFile))
- {
+ if (destFile.exists() && !isSameFile(destFile)) {
destFile.deleteAll();
// throw new FileSystemException("vfs.provider/rename-dest-exists.error", destFile.getName());
}
- if (canRenameTo(destFile))
- {
+ if (canRenameTo(destFile)) {
// issue rename on same filesystem
- try
- {
+ try {
attach();
// remember type to avoid attach
final FileType srcType = getType();
@@ -1884,30 +1598,21 @@ public abstract class AbstractFileObject
destFile.close(); // now the destFile is no longer imaginary. force reattach.
handleDelete(); // fire delete-events. This file-object (src) is like deleted.
- }
- catch (final RuntimeException re)
- {
+ } catch (final RuntimeException re) {
throw re;
+ } catch (final Exception exc) {
+ throw new FileSystemException("vfs.provider/rename.error", exc, getName(), destFile.getName());
}
- catch (final Exception exc)
- {
- throw new FileSystemException("vfs.provider/rename.error", exc,
- getName(),
- destFile.getName());
- }
- }
- else
- {
+ } else {
// different fs - do the copy/delete stuff
destFile.copyFrom(this, Selectors.SELECT_SELF);
if ((destFile.getType().hasContent()
&& destFile.getFileSystem().hasCapability(Capability.SET_LAST_MODIFIED_FILE)
- || destFile.getType().hasChildren()
- && destFile.getFileSystem().hasCapability(Capability.SET_LAST_MODIFIED_FOLDER))
- && fs.hasCapability(Capability.GET_LAST_MODIFIED))
- {
+ || destFile.getType().hasChildren()
+ && destFile.getFileSystem().hasCapability(Capability.SET_LAST_MODIFIED_FOLDER))
+ && fs.hasCapability(Capability.GET_LAST_MODIFIED)) {
destFile.getContent().setLastModifiedTime(this.getContent().getLastModifiedTime());
}
@@ -1919,31 +1624,26 @@ public abstract class AbstractFileObject
/**
* will be called after this file-object closed all its streams.
*/
- protected void notifyAllStreamsClosed()
- {
+ protected void notifyAllStreamsClosed() {
}
/**
- * Notify the parent of a change to its children, when a child is created
- * or deleted.
+ * Notify the parent of a change to its children, when a child is created or deleted.
+ *
* @param childName The name of the child.
* @param newType The type of the child.
* @throws Exception if an error occurs.
*/
- private void notifyParent(final FileName childName, final FileType newType) throws Exception
- {
- if (parent == null)
- {
+ private void notifyParent(final FileName childName, final FileType newType) throws Exception {
+ if (parent == null) {
final FileName parentName = fileName.getParent();
- if (parentName != null)
- {
+ if (parentName != null) {
// Locate the parent, if it is cached
parent = fs.getFileFromCache(parentName);
}
}
- if (parent != null)
- {
+ if (parent != null) {
FileObjectUtils.getAbstractFileObject(parent).childrenChanged(childName, newType);
}
}
@@ -1955,13 +1655,12 @@ public abstract class AbstractFileObject
*
* @throws Exception if an error occurs.
*/
- protected void onChange() throws Exception
- {
+ protected void onChange() throws Exception {
}
/**
- * Called when the children of this file change. Allows subclasses to
- * refresh any cached information about the children of this file.
+ * Called when the children of this file change. Allows subclasses to refresh any cached information about the
+ * children of this file.
* <p>
* This implementation does nothing.
*
@@ -1969,80 +1668,67 @@ public abstract class AbstractFileObject
* @param newType The type of the file.
* @throws Exception if an error occurs.
*/
- protected void onChildrenChanged(final FileName child, final FileType newType) throws Exception
- {
+ protected void onChildrenChanged(final FileName child, final FileType newType) throws Exception {
}
/**
* This will prepare the fileObject to get resynchronized with the underlying filesystem if required.
+ *
* @throws FileSystemException if an error occurs.
*/
@Override
- public void refresh() throws FileSystemException
- {
+ public void refresh() throws FileSystemException {
// Detach from the file
- try
- {
+ try {
detach();
- }
- catch (final Exception e)
- {
+ } catch (final Exception e) {
throw new FileSystemException("vfs.provider/resync.error", fileName, e);
}
}
- private void removeChildrenCache()
- {
+ private void removeChildrenCache() {
children = null;
}
- private FileObject resolveFile(final FileName child) throws FileSystemException
- {
+ private FileObject resolveFile(final FileName child) throws FileSystemException {
return fs.resolveFile(child);
}
/**
* Finds a file, relative to this file.
*
- * @param path The path of the file to locate. Can either be a relative
- * path, which is resolved relative to this file, or an
- * absolute path, which is resolved relative to the file system
- * that contains this file.
+ * @param path The path of the file to locate. Can either be a relative path, which is resolved relative to this
+ * file, or an absolute path, which is resolved relative to the file system that contains this file.
* @return The FileObject.
* @throws FileSystemException if an error occurs.
*/
@Override
- public FileObject resolveFile(final String path) throws FileSystemException
- {
+ public FileObject resolveFile(final String path) throws FileSystemException {
final FileName otherName = fs.getFileSystemManager().resolveName(fileName, path);
return fs.resolveFile(otherName);
}
/**
* Returns a child by name.
+ *
* @param name The name of the child to locate.
* @param scope the NameScope.
* @return The FileObject for the file or null if the child does not exist.
* @throws FileSystemException if an error occurs.
*/
@Override
- public FileObject resolveFile(final String name, final NameScope scope)
- throws FileSystemException
- {
+ public FileObject resolveFile(final String name, final NameScope scope) throws FileSystemException {
// return fs.resolveFile(this.name.resolveName(name, scope));
return fs.resolveFile(fs.getFileSystemManager().resolveName(this.fileName, name, scope));
}
- private FileObject[] resolveFiles(final FileName[] children) throws FileSystemException
- {
- if (children == null)
- {
+ private FileObject[] resolveFiles(final FileName[] children) throws FileSystemException {
+ if (children == null) {
return null;
}
final FileObject[] objects = new FileObject[children.length];
- for (int iterChildren = 0; iterChildren < children.length; iterChildren++)
- {
+ for (int iterChildren = 0; iterChildren < children.length; iterChildren++) {
objects[iterChildren] = resolveFile(children[iterChildren]);
}
@@ -2050,28 +1736,19 @@ public abstract class AbstractFileObject
}
@Override
- public boolean setExecutable(final boolean readable, final boolean ownerOnly) throws FileSystemException
- {
- try
- {
+ public boolean setExecutable(final boolean readable, final boolean ownerOnly) throws FileSystemException {
+ try {
return exists() ? doSetExecutable(readable, ownerOnly) : false;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/set-executable.error", fileName, exc);
}
}
- private void setFileType(final FileType type)
- {
- if (type != null && type != FileType.IMAGINARY)
- {
- try
- {
+ private void setFileType(final FileType type) {
+ if (type != null && type != FileType.IMAGINARY) {
+ try {
fileName.setType(type);
- }
- catch (final FileSystemException e)
- {
+ } catch (final FileSystemException e) {
throw new RuntimeException(e.getMessage());
}
}
@@ -2079,14 +1756,10 @@ public abstract class AbstractFileObject
}
@Override
- public boolean setReadable(final boolean readable, final boolean ownerOnly) throws FileSystemException
- {
- try
- {
+ public boolean setReadable(final boolean readable, final boolean ownerOnly) throws FileSystemException {
+ try {
return exists() ? doSetReadable(readable, ownerOnly) : false;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/set-readable.error", fileName, exc);
}
}
@@ -2094,14 +1767,10 @@ public abstract class AbstractFileObject
// --- OPERATIONS ---
@Override
- public boolean setWritable(final boolean readable, final boolean ownerOnly) throws FileSystemException
- {
- try
- {
+ public boolean setWritable(final boolean readable, final boolean ownerOnly) throws FileSystemException {
+ try {
return exists() ? doSetWritable(readable, ownerOnly) : false;
- }
- catch (final Exception exc)
- {
+ } catch (final Exception exc) {
throw new FileSystemException("vfs.provider/set-writeable.error", fileName, exc);
}
}
@@ -2112,8 +1781,7 @@ public abstract class AbstractFileObject
* @return Returns the URI as a String.
*/
@Override
- public String toString()
- {
+ public String toString() {
return fileName.getURI();
}
}