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

com.maxifier.mxcache.clean.CustomCleanableInstanceList Maven / Gradle / Ivy

/*
 * Copyright (c) 2008-2014 Maxifier Ltd. All Rights Reserved.
 */
package com.maxifier.mxcache.clean;

import com.maxifier.mxcache.caches.CleaningNode;

import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * CustomCleanableInstanceList
 *
 * @author Andrey Yakoushin ([email protected])
 * @author Alexander Kochurov ([email protected])
 */
final class CustomCleanableInstanceList implements CleanableInstanceList {

    private final List> list;
    private final Lock readLock;
    private final Lock writeLock;

    private volatile int version;

    public CustomCleanableInstanceList() {
        //noinspection CollectionWithoutInitialCapacity
        list = new ArrayList>();
        ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        readLock = readWriteLock.readLock();
        writeLock = readWriteLock.writeLock();
    }

    //------------------------------------------------------------------------------------------------------------------

    public  void add(ClassCleanableInstanceList classList, int[] classIds, int[] instanceIds) {
        writeLock.lock();
        try {
            version++;
            list.add(new CustomClassCleanableInstanceList(classList, classIds, instanceIds));
        } finally {
            writeLock.unlock();
        }
    }

    //------------------------------------------------------------------------------------------------------------------

    public void clearCache() {
        CleaningHelper.clear(this);
    }

    @Override
    public void getCaches(List caches) {
        readLock.lock();
        try {
            for (CustomClassCleanableInstanceList customClassCleanableInstanceList : list) {
                customClassCleanableInstanceList.getCaches(caches);
            }
        } finally {
            readLock.unlock();
        }
    }

    @Override
    public void deepUnlock() {
        readLock.unlock();
    }

    @Override
    public int deepLock() {
        readLock.lock();
        return version;
    }

    @Override
    public void getLists(List> lists) {
        for (CustomClassCleanableInstanceList customClassCleanableInstanceList : list) {
            lists.add(customClassCleanableInstanceList.classList);
        }
    }

    //------------------------------------------------------------------------------------------------------------------

    private static class CustomClassCleanableInstanceList {
        private final ClassCleanableInstanceList classList;
        private final int[] staticIds;
        private final int[] instanceIds;

        public CustomClassCleanableInstanceList(ClassCleanableInstanceList classList, int[] staticIds, int[] instanceIds) {
            this.classList = classList;
            this.staticIds = staticIds;
            this.instanceIds = instanceIds;
        }

        public void getCaches(List caches) {
            Cleanable cleanable = classList.getCleanable();
            for (int id : staticIds) {
                caches.add(cleanable.getStaticCache(id));
            }
            for (T t : classList) {
                for (int id : instanceIds) {
                    caches.add(cleanable.getInstanceCache(t, id));
                }
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy