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

org.unlaxer.util.cache.SupplierBoundCache Maven / Gradle / Ivy

package org.unlaxer.util.cache;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class SupplierBoundCache extends BoundCache implements Supplier{
	
	V value;
	
	Supplier supplier;
	
	long lastTime = 0L;
	
	final Long evictionTimeInMilli;
	
	Optional> consumerWhenClearing;
	
	boolean clear;

	
	public SupplierBoundCache(Supplier supplier) {
		this(NameAndTags.of(supplier) , supplier);
	}
	
	public SupplierBoundCache(NameAndTags nameAndTags , Supplier supplier) {
		this(nameAndTags , supplier , null);
	}
	
	public SupplierBoundCache(Supplier supplier , Consumer consumerWhenClearing) {
		this(NameAndTags.of(supplier) , supplier  , consumerWhenClearing);
	}
	
	public SupplierBoundCache(NameAndTags nameAndTags , Supplier supplier , Consumer consumerWhenClearing) {
		super(nameAndTags);
		this.supplier = supplier;
		evictionTimeInMilli = null;
		this.consumerWhenClearing = Optional.ofNullable(consumerWhenClearing);
	}
	
	public SupplierBoundCache(Supplier supplier, int evictionTimeInMilli) {
		this(NameAndTags.of(supplier) , supplier , evictionTimeInMilli);
	}
	
	public SupplierBoundCache(NameAndTags nameAndTags , Supplier supplier, int evictionTimeInMilli) {
		this(nameAndTags ,supplier , evictionTimeInMilli , null);
	}
	
	public SupplierBoundCache(Supplier supplier, int evictionTimeInMilli , Consumer consumerWhenClearing) {
		this(NameAndTags.of(supplier) , supplier , evictionTimeInMilli , consumerWhenClearing);
	}
	
	public SupplierBoundCache(NameAndTags nameAndTags ,Supplier supplier, int evictionTimeInMilli , Consumer consumerWhenClearing) {
		super(nameAndTags);
		this.supplier = supplier;
		this.evictionTimeInMilli = (long) evictionTimeInMilli;
		this.consumerWhenClearing = Optional.ofNullable(consumerWhenClearing);
	}
	
	public static SupplierBoundCache of(Supplier supplier){
		return new SupplierBoundCache<>(NameAndTags.of(supplier) , supplier);
	}
	
	public static SupplierBoundCache of(NameAndTags nameAndTags ,Supplier supplier){
		return new SupplierBoundCache<>(nameAndTags , supplier);
	}
	
	public synchronized V get(){
		
		if(evictionTimeInMilli == null){
			if(value != null){
				return value;
			}
			value = supplier.get();
			return value;
		}
		
		long now = System.currentTimeMillis();
		
		if(lastTime + evictionTimeInMilli < now || value == null){
			lastTime = now;
			value = supplier.get();
		}
		return value;
	}
	
	public synchronized void clear(){
		consumerWhenClearing.ifPresent(consumer->consumer.accept(value));
		value = null;
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy