package eu.dnetlib.r2d2.accesstime;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.Resource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

import eu.dnetlib.r2d2.accesstime.AsyncToucher.AccessTimeDescription;
import eu.dnetlib.r2d2.neo4j.dao.AccessTimeDao;
import eu.dnetlib.r2d2.neo4j.domain.AccessTime;

/**
 * This is only needed so that spring AOP can build a proxy around it.
 * 
 * @author marko
 * 
 */
public class AccessTimeSaver {
	private static final Log log = LogFactory.getLog(AccessTimeSaver.class); // NOPMD by marko on 11/24/08 5:02 PM

	@Resource
	private AccessTimeDao accessTimeDao;

	public void save(final Iterable<? extends AsyncToucher.AsyncAction> times) {

		log.debug("access times touched (may contain duplicates): " + times);

		final Set<String> alreadySaved = new HashSet<String>();
		for (final AsyncToucher.AsyncAction action : Iterables.reverse(Lists.newArrayList(times))) {
			final AccessTimeDescription time = action.getTimeStamp();
			if (!alreadySaved.contains(time.getId())) {

				if (log.isDebugEnabled())
					log.debug("saving: " + time + ". lastAccessDate: " + new Date(time.getLastAccessDate()));

				// double dispatch
				action.save(accessTimeDao);

				alreadySaved.add(time.getId());
			}
		}
	}
}
