All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.java.truevfs.kernel.impl.ControllerModule Maven / Gradle / Ivy

/*
 * Copyright © 2005 - 2021 Schlichtherle IT Services.
 * All rights reserved. Use is subject to license terms.
 */
package net.java.truevfs.kernel.impl;

import bali.Cache;
import bali.Lookup;
import bali.Make;
import bali.Module;
import net.java.truecommons.cio.IoBufferPool;
import net.java.truevfs.kernel.spec.FsArchiveDriver;
import net.java.truevfs.kernel.spec.FsArchiveEntry;
import net.java.truevfs.kernel.spec.FsController;
import net.java.truevfs.kernel.spec.FsModel;

import static bali.CachingStrategy.NOT_THREAD_SAFE;

@Module
interface ControllerModule {

    @Lookup(param = "driver")
    FsArchiveDriver getDriver();

    default FsController driverDecorate(FsController controller) {
        return getDriver().decorate(controller);
    }

    @Cache(NOT_THREAD_SAFE)
    default IoBufferPool getPool() {
        return getDriver().getPool();
    }

    @Make(ArchiveControllerAdapter.class)
    FsController newArchiveControllerAdapter(ArchiveController controller);

    @Make(CacheController.class)
    ArchiveController newCacheController(ArchiveController controller);

    default FsController newControllerChain(FsModel model, FsController parent) {
        assert null != parent;
        assert model.getParent() == parent.getModel();
        assert !(model instanceof ArchiveModel);
        // HC SVNT DRACONES!
        // The FalsePositiveArchiveController decorates the FinalizeController so that it does not need to resolve
        // operations on false positive archive files.
        // The FinalizeController decorates the LockController so that any streams or channels referencing archive files
        // eligible for garbage collection get automatically closed.
        // The LockController decorates the SyncController so that the extended controller (chain) doesn't need to be thread
        // safe.
        // The SyncController decorates the CacheController because the selective entry cache needs to get flushed on a
        // NeedsSyncException.
        // The CacheController decorates the ResourceController because the cache entries terminate streams and channels and
        // shall not stop the extended controller (chain) from getting synced.
        // The ResourceController decorates the TargetArchiveController so that trying to sync the file system while any
        // stream or channel to the latter is open gets detected and properly dealt with.
        return newFalsePositiveArchiveController(
                newFinalizeController(
                        driverDecorate(
                                newArchiveControllerAdapter(
                                        newLockController(
                                                newSyncController(
                                                        newCacheController(
                                                                newResourceController(
                                                                        newTargetArchiveController(model, parent)))))))));
    }

    @Make(FalsePositiveArchiveController.class)
    FsController newFalsePositiveArchiveController(FsController controller);

    @Make(FinalizeController.class)
    FsController newFinalizeController(FsController controller);

    @Make(LockController.class)
    ArchiveController newLockController(ArchiveController controller);

    @Make(ResourceController.class)
    ArchiveController newResourceController(ArchiveController controller);

    @Make(SyncController.class)
    ArchiveController newSyncController(ArchiveController controller);

    @Make(TargetArchiveController.class)
    ArchiveController newTargetArchiveController(FsModel model, FsController parent);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy