package eu.dnetlib.data.resultSet;

import java.util.UUID;

import javax.annotation.PostConstruct;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Required;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalListener;
import com.google.common.cache.RemovalNotification;

import eu.dnetlib.rmi.soap.exceptions.ResultSetException;

public class ResultSetRegistry {

	private static final Log log = LogFactory.getLog(ResultSetRegistry.class);

	private CacheBuilder<String, ResultSetIterator<?>> cacheBuilder;
	private Cache<String, ResultSetIterator<?>> cache;

	@PostConstruct
	public void initCache() {
		cache = cacheBuilder.removalListener(new RemovalListener<String, ResultSetIterator<?>>() {

			@Override
			public void onRemoval(final RemovalNotification<String, ResultSetIterator<?>> notification) {
				log.info("Deleting old resultset: " + notification.getKey() + " - finished: " + notification.getValue().isFinished());
			}
		}).build();
	}

	public ResultSetIterator<?> findIterator(final String rsId) throws ResultSetException {

		final ResultSetIterator<?> iter = cache.getIfPresent(rsId);
		if (iter != null) {
			return iter;
		} else {
			log.error("Resultset not found, id = " + rsId);
			throw new ResultSetException("ResultSet not found, id = " + rsId);
		}
	}

	public String registerIterator(final ResultSetIterator<?> iter) {
		final String rsId = "rs-" + UUID.randomUUID();

		cache.put(rsId, iter);

		return rsId;
	}

	public boolean isRegistered(final String id) {
		return cache.getIfPresent(id) != null;
	}

	public CacheBuilder<String, ResultSetIterator<?>> getCacheBuilder() {
		return cacheBuilder;
	}

	@Required
	public void setCacheBuilder(final CacheBuilder<String, ResultSetIterator<?>> cacheBuilder) {
		this.cacheBuilder = cacheBuilder;
	}

}
