/* * WPCleaner: A tool to help on Wikipedia maintenance tasks. * Copyright (C) 2013 Nicolas Vervelle * * See README.txt file for licensing information. */ package org.wikipediacleaner.api.impl; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.wikipediacleaner.api.API; import org.wikipediacleaner.api.RecentChangesListener; import org.wikipediacleaner.api.constants.EnumWikipedia; import org.wikipediacleaner.api.data.RecentChange; /** * Utility class to manage Recent changes. */ class RecentChangesManager { /** * Wiki. */ private final EnumWikipedia wiki; /** * API. */ private final API api; /** * Listeners. */ private final List<RecentChangesListener> listeners = new ArrayList<RecentChangesListener>(); /** * Runnabel for querying recent changes. */ private RecentChangesRunnable runnable; /** * @param wiki Wiki. * @param api API. */ public RecentChangesManager(EnumWikipedia wiki, API api) { this.wiki = wiki; this.api = api; } /** * Adds a <code>RecentChangesListener</code> to the API. * * @param listener Recent changes listener. */ public void addRecentChangesListener( RecentChangesListener listener) { listeners.add(listener); listenersChanged(); } /** * Removes a <code>RecentChangesListener</code> from the API. * * @param listener Recent changes listener. */ public void removeRecentChangesListener( RecentChangesListener listener) { listeners.remove(listener); listenersChanged(); } /** * Invoked when Recent changes occured. * * @param rc Recent changes. * @param currentTime Current time. */ public void fireRecentChanges(List<RecentChange> rc, Date currentTime) { for (RecentChangesListener listener : listeners) { listener.recentChanges(rc, currentTime); } } /** * Event fired when the list of listeners has changed. */ private void listenersChanged() { if (listeners.isEmpty()) { if (runnable != null) { runnable.shouldStop(); } } else { if (runnable == null) { runnable = new RecentChangesRunnable(this, wiki, api); new Thread(runnable, "RecentChanges-" + wiki.getSettings().getCode()).start(); } } } }