package eu.lod2.rsine.queryhandling;
import eu.lod2.rsine.registrationservice.NotificationQuery;
import org.openrdf.query.MalformedQueryException;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.repository.RepositoryException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
@Component
public class PostponedQueryHandler {
@Autowired
private QueryDispatcher queryDispatcher;
private final Logger logger = LoggerFactory.getLogger(QueryDispatcher.class);
private Set<NotificationQuery> postponedQueries = new HashSet<NotificationQuery>();
public synchronized void add(NotificationQuery notificationQuery) {
postponedQueries.add(notificationQuery);
logger.info("Query postponed; now " +inQueue());
}
private String inQueue() {
return getQueueSize() + " pending";
}
public synchronized int getQueueSize() {
return postponedQueries.size();
}
public synchronized void remove(NotificationQuery notificationQuery) {
postponedQueries.remove(notificationQuery);
logger.info("Postponed query processed; " +inQueue());
}
public void cleanUp() throws RepositoryException, QueryEvaluationException, MalformedQueryException {
logger.debug("Cleaning up postponed queries; " + (postponedQueries.isEmpty() ? "nothing to do" : inQueue()));
for (NotificationQuery query : new ArrayList<NotificationQuery>(postponedQueries)) {
queryDispatcher.issueQueryAndNotify(query, true);
remove(query);
}
logger.debug("Postponed query cleanup finished");
}
}