Author: imario Date: Thu Mar 30 11:16:24 2006 New Revision: 390219 URL: http://svn.apache.org/viewcvs?rev=390219&view=rev Log: added cacheStrategy to fileSystemManager
Added: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/CacheStrategy.java (with props) jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/OnCallRefreshFileObject.java (with props) jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DecoratedFileObject.java (with props) jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/util/FileObjectUtils.java (with props) jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderCacheStrategyTests.java (with props) Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileObject.java jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileSystemManager.java jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/LRUFilesCache.java jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractProviderTestCase.java jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractTestSuite.java jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderTestSuite.java Added: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/CacheStrategy.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/CacheStrategy.java?rev=390219&view=auto ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/CacheStrategy.java (added) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/CacheStrategy.java Thu Mar 30 11:16:24 2006 @@ -0,0 +1,64 @@ +/* + * Copyright 2002-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.vfs; + +/** + * An enumerated type to deal with the various cache strategies. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Mario Ivankovits</a> + * @version $Revision$ $Date$ + */ +public final class CacheStrategy +{ + /** + * Deal with cached data manually. Call [EMAIL PROTECTED] FileObject#refresh()} to refresh the object data. + */ + public static final CacheStrategy MANUAL = new CacheStrategy("manual"); + + /** + * Refresh the data every time you request a file from [EMAIL PROTECTED] FileSystemManager#resolveFile} + */ + public static final CacheStrategy ON_RESOLVE = new CacheStrategy("onresolve"); + + /** + * Refresh the data every time you call a method on the fileObject. + * You'll use this only if you really need the latest info as this setting is a major performance loss. + */ + public static final CacheStrategy ON_CALL = new CacheStrategy("oncall"); + + private final String name; + + private CacheStrategy(final String name) + { + this.name = name; + } + + /** + * Returns the name of the scope. + */ + public String toString() + { + return name; + } + + /** + * Returns the name of the scope. + */ + public String getName() + { + return name; + } +} Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/CacheStrategy.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/CacheStrategy.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/CacheStrategy.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileObject.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileObject.java?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileObject.java (original) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileObject.java Thu Mar 30 11:16:24 2006 @@ -308,4 +308,19 @@ * @see FileContent#close */ public void close() throws FileSystemException; + + /** + * This will prepare the fileObject to get resynchronized with the underlaying filesystem if required + */ + public void refresh() throws FileSystemException; + + /** + * check if the fileObject is attaced + */ + public boolean isAttached(); + + /** + * check if someone reads/write to this file + */ + public boolean isContentOpen(); } Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileSystemManager.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileSystemManager.java?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileSystemManager.java (original) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileSystemManager.java Thu Mar 30 11:16:24 2006 @@ -70,7 +70,7 @@ /** * Returns the base file used to resolve relative paths. */ - FileObject getBaseFile() throws FileSystemException; + public FileObject getBaseFile() throws FileSystemException; /** * Locates a file by name. Equivalent to calling @@ -80,7 +80,7 @@ * @return The file. Never returns null. * @throws FileSystemException On error parsing the file name. */ - FileObject resolveFile(String name) + public FileObject resolveFile(String name) throws FileSystemException; /** @@ -92,7 +92,7 @@ * @return The file. Never returns null. * @throws FileSystemException On error parsing the file name. */ - FileObject resolveFile(String name, FileSystemOptions fileSystemOptions) + public FileObject resolveFile(String name, FileSystemOptions fileSystemOptions) throws FileSystemException; /** @@ -109,7 +109,7 @@ * @return The file. Never returns null. * @throws FileSystemException On error parsing the file name. */ - FileObject resolveFile(FileObject baseFile, String name) + public FileObject resolveFile(FileObject baseFile, String name) throws FileSystemException; /** @@ -122,7 +122,7 @@ * @return The file. Never returns null. * @throws FileSystemException On error parsing the file name. */ - FileObject resolveFile(File baseFile, String name) + public FileObject resolveFile(File baseFile, String name) throws FileSystemException; /** @@ -134,7 +134,7 @@ * @return A [EMAIL PROTECTED] FileName} object representing the resolved file name. * @throws FileSystemException If the name is invalid. */ - FileName resolveName(final FileName root, final String name) throws FileSystemException; + public FileName resolveName(final FileName root, final String name) throws FileSystemException; /** * Resolves a name, relative to the "root" file name. Refer to [EMAIL PROTECTED] NameScope} @@ -146,7 +146,7 @@ * @return A [EMAIL PROTECTED] FileName} object representing the resolved file name. * @throws FileSystemException If the name is invalid. */ - FileName resolveName(final FileName root, String name, NameScope scope) + public FileName resolveName(final FileName root, String name, NameScope scope) throws FileSystemException; /** @@ -157,7 +157,7 @@ * returns null. * @throws FileSystemException On error converting the file. */ - FileObject toFileObject(File file) + public FileObject toFileObject(File file) throws FileSystemException; /** @@ -170,7 +170,7 @@ * @return The root file of the new file system. * @throws FileSystemException On error creating the file system. */ - FileObject createFileSystem(String provider, FileObject file) + public FileObject createFileSystem(String provider, FileObject file) throws FileSystemException; /** @@ -181,7 +181,7 @@ * @return The root file of the new file system. * @throws FileSystemException On error creating the file system. */ - FileObject createFileSystem(FileObject file) + public FileObject createFileSystem(FileObject file) throws FileSystemException; /** @@ -191,7 +191,7 @@ * @param rootUri The root URI to use for the new file system. Can be null. * @return The root file of the new file system. */ - FileObject createVirtualFileSystem(String rootUri) + public FileObject createVirtualFileSystem(String rootUri) throws FileSystemException; /** @@ -201,31 +201,36 @@ * @param rootFile The root file to backs the file system. * @return The root of the new file system. */ - FileObject createVirtualFileSystem(FileObject rootFile) + public FileObject createVirtualFileSystem(FileObject rootFile) throws FileSystemException; /** * Returns a streamhandler factory to enable URL lookup using this * FileSystemManager. */ - URLStreamHandlerFactory getURLStreamHandlerFactory(); + public URLStreamHandlerFactory getURLStreamHandlerFactory(); /** * Determines if a layered file system can be created for a given file. * * @param file The file to check for. */ - boolean canCreateFileSystem(FileObject file) throws FileSystemException; + public boolean canCreateFileSystem(FileObject file) throws FileSystemException; /** * Get the cache used to cache fileobjects. */ - FilesCache getFilesCache(); + public FilesCache getFilesCache(); + + /** + * Get the cache strategy used + */ + public CacheStrategy getCacheStrategy(); /** * The class to use to determine the content-type (mime-type) */ - FileContentInfoFactory getFileContentInfoFactory(); + public FileContentInfoFactory getFileContentInfoFactory(); /** * Get the schemes currently available. Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties (original) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties Thu Mar 30 11:16:24 2006 @@ -40,6 +40,7 @@ vfs.provider/check-is-writeable.error=Could not determine if file "{0}" is writeable. vfs.provider/check-is-readable.error=Could not determine if file "{0}" is readable. vfs.provider/get-url.error=Could not create URL for "{0}". +vfs.provider/resync.error=Could not resync "{0}". vfs.provider/close.error=Could not close "{0}". vfs.provider/read.error=Could not read file "{0}". vfs.provider/random-access.error=Could not read/write file "{0}". @@ -245,4 +246,7 @@ vfs.tasks/mkdir.create-folder.info=Creating directory "{0}". # Selectors -vfs.selectors/filefilter.missing.error=Configure a fileFilter or override accept(); \ No newline at end of file +vfs.selectors/filefilter.missing.error=Configure a fileFilter or override accept(); + +# Utils +vfs.util/find-abstract-file-object.error=Object didnt extend from AbstractFileObject. Object "{0}" \ No newline at end of file Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/LRUFilesCache.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/LRUFilesCache.java?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/LRUFilesCache.java (original) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/LRUFilesCache.java Thu Mar 30 11:16:24 2006 @@ -15,6 +15,9 @@ */ package org.apache.commons.vfs.cache; +import java.util.HashMap; +import java.util.Map; + import org.apache.commons.collections.map.AbstractLinkedMap; import org.apache.commons.collections.map.LRUMap; import org.apache.commons.logging.Log; @@ -24,12 +27,8 @@ import org.apache.commons.vfs.FileSystem; import org.apache.commons.vfs.FileSystemException; import org.apache.commons.vfs.VfsLog; -import org.apache.commons.vfs.provider.AbstractFileObject; import org.apache.commons.vfs.util.Messages; -import java.util.HashMap; -import java.util.Map; - /** * This implementation caches every file using [EMAIL PROTECTED] LRUMap}.<br> * The default constructor uses a LRU size of 100 per filesystem. @@ -61,7 +60,8 @@ { synchronized (LRUFilesCache.this) { - AbstractFileObject file = (AbstractFileObject) linkEntry.getValue(); + FileObject file = (FileObject) linkEntry.getValue(); + // System.err.println(">>> " + size() + " check removeLRU:" + linkEntry.getKey().toString()); if (file.isAttached() || file.isContentOpen()) Added: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/OnCallRefreshFileObject.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/OnCallRefreshFileObject.java?rev=390219&view=auto ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/OnCallRefreshFileObject.java (added) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/OnCallRefreshFileObject.java Thu Mar 30 11:16:24 2006 @@ -0,0 +1,154 @@ +/* + * Copyright 2002-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.vfs.cache; + +import java.util.List; + +import org.apache.commons.vfs.FileContent; +import org.apache.commons.vfs.FileObject; +import org.apache.commons.vfs.FileSelector; +import org.apache.commons.vfs.FileSystemException; +import org.apache.commons.vfs.FileType; +import org.apache.commons.vfs.NameScope; +import org.apache.commons.vfs.impl.DecoratedFileObject; + +/** + * This decorator refreshes the fileObject data on every call + * + * @author <a href="mailto:[EMAIL PROTECTED]">Mario Ivankovits</a> + * @version $Revision$ $Date$ + */ +public class OnCallRefreshFileObject extends DecoratedFileObject +{ + public OnCallRefreshFileObject(FileObject fileObject) + { + super(fileObject); + } + + public void close() throws FileSystemException + { + refresh(); + super.close(); + } + + public void copyFrom(FileObject srcFile, FileSelector selector) throws FileSystemException + { + refresh(); + super.copyFrom(srcFile, selector); + } + + public void createFile() throws FileSystemException + { + refresh(); + super.createFile(); + } + + public void createFolder() throws FileSystemException + { + refresh(); + super.createFolder(); + } + + public boolean delete() throws FileSystemException + { + refresh(); + return super.delete(); + } + + public int delete(FileSelector selector) throws FileSystemException + { + refresh(); + return super.delete(selector); + } + + public boolean exists() throws FileSystemException + { + refresh(); + return super.exists(); + } + + public void findFiles(FileSelector selector, boolean depthwise, List selected) throws FileSystemException + { + refresh(); + super.findFiles(selector, depthwise, selected); + } + + public FileObject[] findFiles(FileSelector selector) throws FileSystemException + { + refresh(); + return super.findFiles(selector); + } + + public FileObject getChild(String name) throws FileSystemException + { + refresh(); + return super.getChild(name); + } + + public FileObject[] getChildren() throws FileSystemException + { + refresh(); + return super.getChildren(); + } + + public FileContent getContent() throws FileSystemException + { + refresh(); + return super.getContent(); + } + + public FileType getType() throws FileSystemException + { + refresh(); + return super.getType(); + } + + public boolean isHidden() throws FileSystemException + { + refresh(); + return super.isHidden(); + } + + public boolean isReadable() throws FileSystemException + { + refresh(); + return super.isReadable(); + } + + public boolean isWriteable() throws FileSystemException + { + refresh(); + return super.isWriteable(); + } + + public void moveTo(FileObject destFile) throws FileSystemException + { + refresh(); + super.moveTo(destFile); + } + + public FileObject resolveFile(String name, NameScope scope) throws FileSystemException + { + refresh(); + return super.resolveFile(name, scope); + } + + public FileObject resolveFile(String path) throws FileSystemException + { + refresh(); + return super.resolveFile(path); + } +} Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/OnCallRefreshFileObject.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/OnCallRefreshFileObject.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/cache/OnCallRefreshFileObject.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DecoratedFileObject.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DecoratedFileObject.java?rev=390219&view=auto ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DecoratedFileObject.java (added) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DecoratedFileObject.java Thu Mar 30 11:16:24 2006 @@ -0,0 +1,190 @@ +/* + * Copyright 2002-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.vfs.impl; + +import java.net.URL; +import java.util.List; + +import org.apache.commons.vfs.FileContent; +import org.apache.commons.vfs.FileName; +import org.apache.commons.vfs.FileObject; +import org.apache.commons.vfs.FileSelector; +import org.apache.commons.vfs.FileSystem; +import org.apache.commons.vfs.FileSystemException; +import org.apache.commons.vfs.FileType; +import org.apache.commons.vfs.NameScope; + +/** + * Base class to build a fileObject decoration + * + * @author <a href="mailto:[EMAIL PROTECTED]">Mario Ivankovits</a> + * @version $Revision$ $Date$ + */ +public class DecoratedFileObject implements FileObject +{ + final FileObject decoratedFileObject; + + public DecoratedFileObject(FileObject decoratedFileObject) + { + super(); + this.decoratedFileObject = decoratedFileObject; + } + + public boolean canRenameTo(FileObject newfile) + { + return decoratedFileObject.canRenameTo(newfile); + } + + public void close() throws FileSystemException + { + decoratedFileObject.close(); + } + + public void copyFrom(FileObject srcFile, FileSelector selector) throws FileSystemException + { + decoratedFileObject.copyFrom(srcFile, selector); + } + + public void createFile() throws FileSystemException + { + decoratedFileObject.createFile(); + } + + public void createFolder() throws FileSystemException + { + decoratedFileObject.createFolder(); + } + + public boolean delete() throws FileSystemException + { + return decoratedFileObject.delete(); + } + + public int delete(FileSelector selector) throws FileSystemException + { + return decoratedFileObject.delete(selector); + } + + public boolean exists() throws FileSystemException + { + return decoratedFileObject.exists(); + } + + public void findFiles(FileSelector selector, boolean depthwise, List selected) throws FileSystemException + { + decoratedFileObject.findFiles(selector, depthwise, selected); + } + + public FileObject[] findFiles(FileSelector selector) throws FileSystemException + { + return decoratedFileObject.findFiles(selector); + } + + public FileObject getChild(String name) throws FileSystemException + { + return decoratedFileObject.getChild(name); + } + + public FileObject[] getChildren() throws FileSystemException + { + return decoratedFileObject.getChildren(); + } + + public FileContent getContent() throws FileSystemException + { + return decoratedFileObject.getContent(); + } + + public FileSystem getFileSystem() + { + return decoratedFileObject.getFileSystem(); + } + + public FileName getName() + { + return decoratedFileObject.getName(); + } + + public FileObject getParent() throws FileSystemException + { + return decoratedFileObject.getParent(); + } + + public FileType getType() throws FileSystemException + { + return decoratedFileObject.getType(); + } + + public URL getURL() throws FileSystemException + { + return decoratedFileObject.getURL(); + } + + public boolean isHidden() throws FileSystemException + { + return decoratedFileObject.isHidden(); + } + + public boolean isReadable() throws FileSystemException + { + return decoratedFileObject.isReadable(); + } + + public boolean isWriteable() throws FileSystemException + { + return decoratedFileObject.isWriteable(); + } + + public void moveTo(FileObject destFile) throws FileSystemException + { + decoratedFileObject.moveTo(destFile); + } + + public FileObject resolveFile(String name, NameScope scope) throws FileSystemException + { + return decoratedFileObject.resolveFile(name, scope); + } + + public FileObject resolveFile(String path) throws FileSystemException + { + return decoratedFileObject.resolveFile(path); + } + + public void refresh() throws FileSystemException + { + decoratedFileObject.refresh(); + } + + public FileObject getDecoratedFileObject() + { + return decoratedFileObject; + } + + public boolean isAttached() + { + return decoratedFileObject.isAttached(); + } + + public boolean isContentOpen() + { + return decoratedFileObject.isContentOpen(); + } + + public String toString() + { + return decoratedFileObject.toString(); + } +} \ No newline at end of file Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DecoratedFileObject.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DecoratedFileObject.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DecoratedFileObject.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java (original) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java Thu Mar 30 11:16:24 2006 @@ -16,6 +16,7 @@ package org.apache.commons.vfs.impl; import org.apache.commons.logging.Log; +import org.apache.commons.vfs.CacheStrategy; import org.apache.commons.vfs.FileContentInfoFactory; import org.apache.commons.vfs.FileName; import org.apache.commons.vfs.FileObject; @@ -93,6 +94,11 @@ private FilesCache filesCache; /** + * The cache strategy + */ + private CacheStrategy fileCacheStrategy; + + /** * The class to use to determine the content-type (mime-type) */ private FileContentInfoFactory fileContentInfoFactory; @@ -225,7 +231,7 @@ /** * Sets the filesCache implementation used to cache files */ - public void setFilesCache(FilesCache filesCache) throws FileSystemException + public void setFilesCache(final FilesCache filesCache) throws FileSystemException { if (init) { @@ -236,6 +242,35 @@ } /** + * <p> + * Set the cache strategy to use when dealing with file object data. + * You can set it only once before the FileSystemManager is initialized. + * <p /> + * <p> + * The default is [EMAIL PROTECTED] CacheStrategy#ON_RESOLVE} + * </p> + * + * @throws FileSystemException if this is not possible. e.g. it is already set. + */ + public void setCacheStrategy(final CacheStrategy fileCacheStrategy) throws FileSystemException + { + if (init) + { + throw new FileSystemException("vfs.impl/already-inited.error"); + } + + this.fileCacheStrategy = fileCacheStrategy; + } + + /** + * Get the cache strategy used + */ + public CacheStrategy getCacheStrategy() + { + return fileCacheStrategy; + } + + /** * get the fileContentInfoFactory used to determine the infos of a file content. */ public FileContentInfoFactory getFileContentInfoFactory() @@ -364,6 +399,11 @@ if (fileContentInfoFactory == null) { fileContentInfoFactory = new FileContentInfoFilenameFactory(); + } + + if (fileCacheStrategy == null) + { + fileCacheStrategy = CacheStrategy.ON_RESOLVE; } setupComponent(filesCache); Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java (original) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java Thu Mar 30 11:16:24 2006 @@ -28,6 +28,7 @@ import org.apache.commons.vfs.NameScope; import org.apache.commons.vfs.RandomAccessContent; import org.apache.commons.vfs.Selectors; +import org.apache.commons.vfs.util.FileObjectUtils; import org.apache.commons.vfs.util.RandomAccessMode; import java.io.IOException; @@ -69,7 +70,7 @@ // Cached info private boolean attached; private FileType type; - private AbstractFileObject parent; + private FileObject parent; // Changed to hold only the name of the children and let the object // go into the global files cache @@ -500,7 +501,7 @@ // Locate the parent of this file if (parent == null) { - parent = (AbstractFileObject) fs.resolveFile(name.getParent()); + parent = (FileObject) fs.resolveFile(name.getParent()); } } return parent; @@ -996,6 +997,22 @@ } /** + * This will prepare the fileObject to get resynchronized with the underlaying filesystem if required + */ + public void refresh() throws FileSystemException + { + // Detach from the file + try + { + detach(); + } + catch (final Exception e) + { + throw new FileSystemException("vfs.provider/resync.error", name, e); + } + } + + /** * Closes this file, and its content. */ public void close() throws FileSystemException @@ -1383,7 +1400,7 @@ if (parent != null) { - parent.childrenChanged(childName, newType); + FileObjectUtils.getAbstractFileObject(parent).childrenChanged(childName, newType); } } Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java (original) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java Thu Mar 30 11:16:24 2006 @@ -17,6 +17,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.commons.vfs.CacheStrategy; import org.apache.commons.vfs.Capability; import org.apache.commons.vfs.FileListener; import org.apache.commons.vfs.FileName; @@ -28,6 +29,7 @@ import org.apache.commons.vfs.FileSystemOptions; import org.apache.commons.vfs.FilesCache; import org.apache.commons.vfs.VfsLog; +import org.apache.commons.vfs.cache.OnCallRefreshFileObject; import org.apache.commons.vfs.events.AbstractFileChangeEvent; import org.apache.commons.vfs.events.ChangedEvent; import org.apache.commons.vfs.events.CreateEvent; @@ -295,6 +297,8 @@ { throw new FileSystemException("vfs.provider/resolve-file.error", name, e); } + + file = decorateFileObject(file); // [EMAIL PROTECTED] ==> use putFileToCache if (useCache) @@ -303,10 +307,28 @@ } // files.put(name, file); } + + /** + * resync the file information if requested + */ + if (getFileSystemManager().getCacheStrategy().equals(CacheStrategy.ON_RESOLVE)) + { + file.refresh(); + } return file; } - /** + protected FileObject decorateFileObject(FileObject file) + { + if (getFileSystemManager().getCacheStrategy().equals(CacheStrategy.ON_CALL)) + { + return new OnCallRefreshFileObject(file); + } + + return file; + } + + /** * Creates a temporary local copy of a file and its descendents. */ public File replicateFile(final FileObject file, Added: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/util/FileObjectUtils.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/util/FileObjectUtils.java?rev=390219&view=auto ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/util/FileObjectUtils.java (added) +++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/util/FileObjectUtils.java Thu Mar 30 11:16:24 2006 @@ -0,0 +1,76 @@ +/* + * Copyright 2002-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.vfs.util; + +import org.apache.commons.vfs.FileObject; +import org.apache.commons.vfs.FileSystemException; +import org.apache.commons.vfs.impl.DecoratedFileObject; +import org.apache.commons.vfs.provider.AbstractFileObject; + +/** + * Stuff to get some strange things from an FileObject + * + * @author <a href="mailto:[EMAIL PROTECTED]">Mario Ivankovits</a> + * @version $Revision$ $Date$ + */ +public class FileObjectUtils +{ + private FileObjectUtils() + { + } + + /** + * get access to the base object even if decorated + */ + public static AbstractFileObject getAbstractFileObject(final FileObject fileObject) throws FileSystemException + { + Object searchObject = fileObject; + while (searchObject instanceof DecoratedFileObject) + { + searchObject = ((DecoratedFileObject) searchObject).getDecoratedFileObject(); + } + if (searchObject instanceof AbstractFileObject) + { + return (AbstractFileObject) searchObject; + } + + throw new FileSystemException("vfs.util/find-abstract-file-object.error"); + } + + /** + * check if the given FileObject is instance of given class argument + */ + public static boolean isInstanceOf(final FileObject fileObject, final Class wantedClass) throws FileSystemException + { + Object searchObject = fileObject; + while (searchObject instanceof DecoratedFileObject) + { + if (wantedClass.isInstance(searchObject)) + { + return true; + } + + searchObject = ((DecoratedFileObject) searchObject).getDecoratedFileObject(); + } + + if (wantedClass.isInstance(searchObject)) + { + return true; + } + + return false; + } +} Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/util/FileObjectUtils.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/util/FileObjectUtils.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/util/FileObjectUtils.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractProviderTestCase.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractProviderTestCase.java?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractProviderTestCase.java (original) +++ jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractProviderTestCase.java Thu Mar 30 11:16:24 2006 @@ -16,6 +16,7 @@ package org.apache.commons.vfs.test; import org.apache.commons.AbstractVfsTestCase; +import org.apache.commons.vfs.CacheStrategy; import org.apache.commons.vfs.Capability; import org.apache.commons.vfs.FileContent; import org.apache.commons.vfs.FileObject; @@ -23,6 +24,7 @@ import org.apache.commons.vfs.FileType; import org.apache.commons.vfs.impl.DefaultFileSystemManager; import org.apache.commons.vfs.provider.AbstractFileSystem; +import org.apache.commons.vfs.provider.local.DefaultLocalFileProvider; import java.io.ByteArrayOutputStream; import java.io.InputStream; @@ -48,6 +50,7 @@ private FileObject readFolder; private FileObject writeFolder; private DefaultFileSystemManager manager; + private ProviderTestConfig providerConfig; private Method method; // Expected contents of "file1.txt" @@ -68,11 +71,13 @@ * Configures this test. */ public void setConfig(final DefaultFileSystemManager manager, + final ProviderTestConfig providerConfig, final FileObject baseFolder, final FileObject readFolder, final FileObject writeFolder) { this.manager = manager; + this.providerConfig = providerConfig; this.baseFolder = baseFolder; this.readFolder = readFolder; this.writeFolder = writeFolder; @@ -87,6 +92,22 @@ } /** + * creates a new uninitialized file system manager + * @throws Exception + */ + protected DefaultFileSystemManager createManager() throws Exception + { + DefaultFileSystemManager fs = new DefaultFileSystemManager(); + fs.setFilesCache(getProviderConfig().getFilesCache()); + getProviderConfig().prepare(fs); + if (!fs.hasProvider("file")) + { + fs.addProvider("file", new DefaultLocalFileProvider()); + } + return fs; + } + + /** * Returns the base test folder. This is the parent of both the read * test and write test folders. */ @@ -94,8 +115,16 @@ { return baseFolder; } - + /** + * get the provider configuration + */ + public ProviderTestConfig getProviderConfig() + { + return providerConfig; + } + + /** * Returns the read test folder. */ protected FileObject getReadFolder() Modified: jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractTestSuite.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractTestSuite.java?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractTestSuite.java (original) +++ jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractTestSuite.java Thu Mar 30 11:16:24 2006 @@ -168,7 +168,7 @@ if (test instanceof AbstractProviderTestCase) { final AbstractProviderTestCase providerTestCase = (AbstractProviderTestCase) test; - providerTestCase.setConfig(manager, baseFolder, readFolder, writeFolder); + providerTestCase.setConfig(manager, providerConfig, baseFolder, readFolder, writeFolder); } } } Added: jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderCacheStrategyTests.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderCacheStrategyTests.java?rev=390219&view=auto ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderCacheStrategyTests.java (added) +++ jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderCacheStrategyTests.java Thu Mar 30 11:16:24 2006 @@ -0,0 +1,145 @@ +/* + * Copyright 2002-20056 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.vfs.test; + +import org.apache.commons.vfs.CacheStrategy; +import org.apache.commons.vfs.Capability; +import org.apache.commons.vfs.FileObject; +import org.apache.commons.vfs.Selectors; +import org.apache.commons.vfs.impl.DefaultFileSystemManager; + +/** + * Test the cache stragey + * + * @author <a href="mailto:[EMAIL PROTECTED]">Mario Ivankovits</a> + */ +public class ProviderCacheStrategyTests + extends AbstractProviderTestCase +{ + /** + * Returns the capabilities required by the tests of this test case. + */ + protected Capability[] getRequiredCaps() + { + return new Capability[] + { + Capability.CREATE, + Capability.GET_TYPE, + Capability.LIST_CHILDREN, + }; + } + + /** + * Test the manual cache strategy + */ + public void testManualCache() throws Exception + { + FileObject scratchFolder = getWriteFolder(); + scratchFolder.delete(Selectors.EXCLUDE_SELF); + + DefaultFileSystemManager fs = createManager(); + fs.setCacheStrategy(CacheStrategy.MANUAL); + fs.init(); + + FileObject cachedFolder = fs.resolveFile(scratchFolder.getName().getURI()); + + FileObject[] fos = cachedFolder.getChildren(); + assertContainsNot(fos, "file1.txt"); + + scratchFolder.resolveFile("file1.txt").createFile(); + + fos = cachedFolder.getChildren(); + assertContainsNot(fos, "file1.txt"); + + cachedFolder.refresh(); + fos = cachedFolder.getChildren(); + assertContains(fos, "file1.txt"); + } + + /** + * Test the on_resolve strategy + */ + public void testOnResolveCache() throws Exception + { + FileObject scratchFolder = getWriteFolder(); + scratchFolder.delete(Selectors.EXCLUDE_SELF); + + DefaultFileSystemManager fs = createManager(); + fs.setCacheStrategy(CacheStrategy.ON_RESOLVE); + fs.init(); + + FileObject cachedFolder = fs.resolveFile(scratchFolder.getName().getURI()); + + FileObject[] fos = cachedFolder.getChildren(); + assertContainsNot(fos, "file1.txt"); + + scratchFolder.resolveFile("file1.txt").createFile(); + + fos = cachedFolder.getChildren(); + assertContainsNot(fos, "file1.txt"); + + cachedFolder = fs.resolveFile(scratchFolder.getName().getURI()); + fos = cachedFolder.getChildren(); + assertContains(fos, "file1.txt"); + } + + /** + * Test the on_call strategy + */ + public void testOnCallCache() throws Exception + { + FileObject scratchFolder = getWriteFolder(); + scratchFolder.delete(Selectors.EXCLUDE_SELF); + + DefaultFileSystemManager fs = createManager(); + fs.setCacheStrategy(CacheStrategy.ON_CALL); + fs.init(); + + FileObject cachedFolder = fs.resolveFile(scratchFolder.getName().getURI()); + + FileObject[] fos = cachedFolder.getChildren(); + assertContainsNot(fos, "file1.txt"); + + scratchFolder.resolveFile("file1.txt").createFile(); + + fos = cachedFolder.getChildren(); + assertContains(fos, "file1.txt"); + } + + public void assertContainsNot(FileObject[] fos, String string) + { + for (int i = 0; i<fos.length; i++) + { + if (string.equals(fos[i].getName().getBaseName())) + { + fail(string + " should not be seen"); + } + } + } + + public void assertContains(FileObject[] fos, String string) + { + for (int i = 0; i<fos.length; i++) + { + if (string.equals(fos[i].getName().getBaseName())) + { + return; + } + } + + fail(string + " should be seen"); + } +} Propchange: jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderCacheStrategyTests.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderCacheStrategyTests.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderCacheStrategyTests.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderTestSuite.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderTestSuite.java?rev=390219&r1=390218&r2=390219&view=diff ============================================================================== --- jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderTestSuite.java (original) +++ jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/ProviderTestSuite.java Thu Mar 30 11:16:24 2006 @@ -48,6 +48,7 @@ */ protected void addBaseTests() throws Exception { + addTests(ProviderCacheStrategyTests.class); addTests(UriTests.class); addTests(NamingTests.class); addTests(ContentTests.class); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]