package eu.dnetlib.r2d2.accesstime;

import javax.annotation.Resource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

import eu.dnetlib.r2d2.neo4j.Neo4jBean;
import eu.dnetlib.r2d2.neo4j.dao.ReadingListDao;
import eu.dnetlib.r2d2.neo4j.domain.Neo4jRLEntry;
import eu.dnetlib.r2d2.neo4j.domain.Neo4jReadingList;

@Aspect
public class ScholarlynkAccessTimeAspect {
	private static final Log log = LogFactory.getLog(ScholarlynkAccessTimeAspect.class); // NOPMD by marko on 11/24/08 5:02 PM

	@Resource
	private ReadingListDao readingListDao;

	@Resource
	private Toucher toucher;

	@AfterReturning("touching() && args(id,..)")
	public void success(String id) {
		toucher.touch(id);
	}

	@AfterReturning("tags() && args(id,..)")
	public void tagsModified(String id) {
		log.debug("tags modified: " + id);
		toucher.touch(id);
	}

//	@AfterReturning("saveBean() && args(bean,..)")
	public void saveBeanAspect(Neo4jBean bean) {
		log.info("XXXXXXXXXXXXXXXX: modified: " + bean);
		
		if (bean instanceof Neo4jRLEntry) {
			// should be touch entries?
			//	toucher.modified(bean);

			// we should definitly touch the object being pointed at.
			// TODO: when antonis fixes the low level stuff, we need to get the correct target
			// in a typesafe way.
			Neo4jRLEntry entry = (Neo4jRLEntry) bean;

			Neo4jReadingList rl = readingListDao.getReadingListForEntry(entry.getId());
			toucher.modified(rl);
		}
	}

	@Pointcut("execution(* eu.dnetlib.r2d2.ScholarlynkImpl.getEntries(..))"
			+ "|| execution(* eu.dnetlib.r2d2.ScholarlynkImpl.getReadingList(..))"
			+ "|| execution(* eu.dnetlib.r2d2.ScholarlynkImpl.rateInformationObject(..))")
	public void touching() {
	}

	@Pointcut("execution(* eu.dnetlib.r2d2.neo4j.dao.Neo4JDao+.saveBean(..))")
	public void saveBean() {
	}

	@Pointcut("execution(* eu.dnetlib.r2d2.ScholarlynkImpl.*Tag(..))")
	public void tags() {
	}

}
