package eu.dnetlib.stat;

import java.util.concurrent.atomic.AtomicLong;

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

import eu.dnetlib.stat.StatEmitter;

/**
 * Simple stat emitter.
 * 
 * @author marko
 * 
 */
public class StatEmitterImpl implements StatEmitter {
	private static final Log log = LogFactory.getLog(StatEmitterImpl.class); // NOPMD by marko on 11/24/08 5:02 PM

	private StatEmitterBackend backend;
	private String module;
	private String instance;

	private AtomicLong emitted = new AtomicLong(0);
	private AtomicLong skipped = new AtomicLong(0);

	@Override
	public void emit(String key, String value) {
		long em = emitted.incrementAndGet();
		try {
			backend.emit(module, instance, key, value);
		} catch (Throwable e) {
			long sk = skipped.incrementAndGet();

			log.info("skipping emit, " + skippedReport(em, sk));
			log.debug("got exception while emitting stat", e);
		}
	}

	protected String skippedReport(long em, long sk) {
		return "skipped " + sk + " times so far out of " + em + " (" + Math.round(1000.0 * sk / em) / 10.0 + "%)";
	}
	
	public String skippedReport() {
		return skippedReport(emitted.get(), skipped.get());
	}
	
	public StatEmitterBackend getBackend() {
		return backend;
	}

	public void setBackend(StatEmitterBackend backend) {
		this.backend = backend;
	}

	public String getModule() {
		return module;
	}

	public void setModule(String module) {
		this.module = module;
	}

	public String getInstance() {
		return instance;
	}

	public void setInstance(String instance) {
		this.instance = instance;
	}

}
