package eu.dnetlib.enabling.tools.blackboard;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;

import org.springframework.beans.factory.annotation.Required;
import org.xml.sax.SAXException;

import eu.dnetlib.enabling.tools.StringOpaqueResource;

/**
 * Common blackboard notification handler. This notification handler processes only message with ...BODY.BLACKBOARD.LAST* as topic.
 *
 * @param <T> type of blackboard handler used to extract the blackboard message (client or server)
 * @author marko
 *
 */
public abstract class AbstractBlackboardNotificationHandler<T extends BlackboardHandler> implements NotificationHandler {

	/**
	 * blackboard handler.
	 */
	private T blackboardHandler;

	/**
	 * {@inheritDoc}
	 *
	 * @see eu.dnetlib.data.mdstore.NotificationHandler#notified(java.lang.String, java.lang.String, java.lang.String,
	 *      java.lang.String)
	 */
	public void notified(final String subscrId, final String topic, final String rsId, final String profile) {
		if (!topic.contains("BODY.BLACKBOARD.LAST"))
			return;

		try {
			processJob(blackboardHandler.getJob(new StringOpaqueResource(profile)));
		} catch (final XPathExpressionException e) {
			throw new IllegalStateException(e);
		} catch (final SAXException e) {
			throw new IllegalStateException(e);
		} catch (final IOException e) {
			throw new IllegalStateException(e);
		} catch (final ParserConfigurationException e) {
			throw new IllegalStateException(e);
		}
	}

	/**
	 * Subclassess override this to process incoming blackboard jobs.
	 *
	 * @param job
	 *            blackboard job
	 */
	protected abstract void processJob(BlackboardJob job);

	public T getBlackboardHandler() {
		return blackboardHandler;
	}

	@Required
	public void setBlackboardHandler(final T blackboardHandler) {
		this.blackboardHandler = blackboardHandler;
	}

}
