package fuse; import fuse.compat.Filesystem1; import fuse.compat.Filesystem1ToFilesystem2Adapter; import fuse.compat.Filesystem2; import fuse.compat.Filesystem2ToFilesystem3Adapter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Factory object which wraps FileSystem(1,2,3) objects * inside the correct FuseFS adapters */ public class FuseFSFactory { /** * Wraps a filesystem1 object inside a FuseFS adapter. * * @param filesystem1 The filesystem to adapt. * @param log The logger that should be used by the adapter. * @return The new FuseFS adapter. */ public static FuseFS adapt(Filesystem1 filesystem1, Log log) { return adapt(new Filesystem1ToFilesystem2Adapter(filesystem1), log); } /** * Wraps a filesystem2 object inside a FuseFS adapter. * * @param filesystem2 The filesystem to adapt. * @param log The logger that should be used by the adapter. * @return The new FuseFS adapter. */ public static FuseFS adapt(Filesystem2 filesystem2, Log log) { return adapt(new Filesystem2ToFilesystem3Adapter(filesystem2), log); } /** * Wraps a filesystem3 object inside a FuseFS adapter. * * @param filesystem3 The filesystem to adapt. * @param log The logger that should be used by the adapter. * @return The new FuseFS adapter. */ public static FuseFS adapt(Filesystem3 filesystem3, Log log) { return new Filesystem3ToFuseFSAdapter(filesystem3, log); } /** * Detects the type of the filesystem and wraps it. * <p/> * This method primarily exists to support JNI code. * So that the logic of figuring out the class of a * particular filesystem can be encoded in java rather * than in C. * <p/> * This method uses a logger for the filesystem object that * was passed to it. * * @param filesystem The filsystem (1,2 or 3) object to be wrapped. * @return The new FuseFS adapter * or null if the Filesystem type is not recognized. */ public static FuseFS adapt(Object filesystem) { Log log = LogFactory.getLog(filesystem.getClass()); return adapt(filesystem, log); } /** * Detects the type of the filesystem and wraps it. * <p/> * This method primarily exists to support JNI code. * So that the logic of figuring out the class of a * particular filesystem can be encoded in java rather * than in C. * * @param filesystem The filsystem (1,2 or 3) object to be wrapped. * @param log The logger that should be used by the adapter. * @return The new FuseFS adapter * or null if the Filesystem type is not recognized. */ public static FuseFS adapt(Object filesystem, Log log) { if (filesystem instanceof Filesystem3) { return adapt((Filesystem3) filesystem, log); } if (filesystem instanceof Filesystem2) { return adapt((Filesystem2) filesystem, log); } if (filesystem instanceof Filesystem1) { return adapt((Filesystem1) filesystem, log); } return null; } }