package eu.dnetlib.enabling.resultset.registry;

import org.springframework.beans.factory.annotation.Required;

import eu.dnetlib.enabling.resultset.listener.ResultSetListener;
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.tools.UniqueIdentifierGenerator;
import eu.dnetlib.enabling.tools.UniqueIdentifierGeneratorImpl;
import eu.dnetlib.miscutils.cache.Cache;

public class ResultSetRegistryImpl implements ResultSetRegistry {

	/**
	 * rsId -> ResultSet mappings are stored here.
	 */
	private Cache<String, ResultSetListener<?>> cache;

	/**
	 * identifier generator.
	 */
	private UniqueIdentifierGenerator idGenerator = new UniqueIdentifierGeneratorImpl("rs-");


	@Override
	public String registerResultSet(final ResultSetListener<?> listener) {
		final String newId = idGenerator.generateIdentifier();
		cache.put(newId, listener);
		return newId;
	}

	@SuppressWarnings("unchecked")
	@Override
	public <T> ResultSetListener<T> getResultSetById(final String rsId) throws ResultSetException {
		final ResultSetListener<?> rs = cache.get(rsId);
		
		if (rs != null) {
			return (ResultSetListener<T>) rs;
		} else {
			throw new ResultSetException("Missing resultset with id " + rsId);
		}
	}

	public Cache<String, ResultSetListener<?>> getCache() {
		return cache;
	}

	@Required
	public void setCache(final Cache<String, ResultSetListener<?>> cache) {
		this.cache = cache;
	}

}
