package eu.dnetlib.data.mdstore;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.google.common.collect.Lists;

/**
 * Combines several mdstore DAOs, merging the set of mdstores that they handle.
 *
 * @author marko
 *
 */
public class MDStoreDaoChain implements MDStoreDao {

	/**
	 * ordered list of mdstore daos handled by this chain.
	 */
	private List<MDStoreDao> daos;

	/**
	 * {@inheritDoc}
	 *
	 * @see eu.dnetlib.data.mdstore.MDStoreDao#getMDStore(java.lang.String)
	 */
	public MDStore getMDStore(final String mdId) {
		for (final MDStoreDao dao : daos) {
			final MDStore store = dao.getMDStore(mdId);
			if (store != null)
				return store;
		}
		return null;
	}

	/**
	 * {@inheritDoc}
	 * @see eu.dnetlib.data.mdstore.MDStoreDao#listMDStores()
	 */
	public List<String> listMDStores() {
		Set<String> stores = new HashSet<String>();
		for (final MDStoreDao dao : daos) {
			stores.addAll(dao.listMDStores());
		}
		return Lists.newArrayList(stores);
	}

	/**
	 * {@inheritDoc}
	 * @see eu.dnetlib.data.mdstore.MDStoreDao#createMDStore(java.lang.String)
	 */
	public boolean createMDStore(final String mdId) {
		for (final MDStoreDao dao : daos) {
			final boolean did = dao.createMDStore(mdId);
			if (did)
				return true;
		}
		return false;
	}

	public List<MDStoreDao> getDaos() {
		return daos;
	}

	public void setDaos(final List<MDStoreDao> daos) {
		this.daos = daos;
	}

}
