/*
- * Sone - WebInterface.java - Copyright © 2010–2012 David Roden
+ * Sone - WebInterface.java - Copyright © 2010–2013 David Roden
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.pterodactylus.sone.core.Core;
-import net.pterodactylus.sone.core.CoreListener;
+import net.pterodactylus.sone.core.event.ImageInsertAbortedEvent;
+import net.pterodactylus.sone.core.event.ImageInsertFailedEvent;
+import net.pterodactylus.sone.core.event.ImageInsertFinishedEvent;
import net.pterodactylus.sone.core.event.ImageInsertStartedEvent;
import net.pterodactylus.sone.core.event.MarkPostKnownEvent;
import net.pterodactylus.sone.core.event.MarkPostReplyKnownEvent;
import net.pterodactylus.util.template.TemplateParser;
import net.pterodactylus.util.template.TemplateProvider;
import net.pterodactylus.util.template.XmlFilter;
-import net.pterodactylus.util.thread.Ticker;
import net.pterodactylus.util.web.RedirectPage;
import net.pterodactylus.util.web.StaticPage;
import net.pterodactylus.util.web.TemplatePage;
*
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
-public class WebInterface implements CoreListener {
+public class WebInterface {
/** The logger. */
private static final Logger logger = Logging.getLogger(WebInterface.class);
private final Map<Sone, TemplateNotification> soneInsertNotifications = new HashMap<Sone, TemplateNotification>();
/** Sone locked notification ticker objects. */
- private final Map<Sone, Object> lockedSonesTickerObjects = Collections.synchronizedMap(new HashMap<Sone, Object>());
+ private final Map<Sone, ScheduledFuture<?>> lockedSonesTickerObjects = Collections.synchronizedMap(new HashMap<Sone, ScheduledFuture<?>>());
/** The “Sone locked” notification. */
private final ListNotification<Sone> lockedSonesNotification;
/** The “image insert failed” notification. */
private final ListNotification<Image> imageInsertFailedNotification;
+ /** Scheduled executor for time-based notifications. */
+ private final ScheduledExecutorService ticker = Executors.newScheduledThreadPool(1);
+
/**
* Creates a new web interface.
*
final TemplateNotification startupNotification = new TemplateNotification("startup-notification", startupNotificationTemplate);
notificationManager.addNotification(startupNotification);
- Ticker.getInstance().registerEvent(System.currentTimeMillis() + (120 * 1000), new Runnable() {
+ ticker.schedule(new Runnable() {
@Override
public void run() {
startupNotification.dismiss();
}
- }, "Sone Startup Notification Remover");
+ }, 2, TimeUnit.MINUTES);
Template wotMissingNotificationTemplate = TemplateParser.parse(createReader("/templates/notify/wotMissingNotification.html"));
final TemplateNotification wotMissingNotification = new TemplateNotification("wot-missing-notification", wotMissingNotificationTemplate);
- Ticker.getInstance().registerEvent(System.currentTimeMillis() + (15 * 1000), new Runnable() {
+ ticker.scheduleAtFixedRate(new Runnable() {
@Override
@SuppressWarnings("synthetic-access")
} else {
notificationManager.addNotification(wotMissingNotification);
}
- Ticker.getInstance().registerEvent(System.currentTimeMillis() + (15 * 1000), this, "Sone WoT Connector Checker");
}
- }, "Sone WoT Connector Checker");
+ }, 15, 15, TimeUnit.SECONDS);
}
/**
*/
public void stop() {
unregisterToadlets();
- Ticker.getInstance().stop();
+ ticker.shutdownNow();
}
//
@Subscribe
public void soneLocked(SoneLockedEvent soneLockedEvent) {
final Sone sone = soneLockedEvent.sone();
- Object tickerObject = Ticker.getInstance().registerEvent(System.currentTimeMillis() + (5 * 60) * 1000, new Runnable() {
+ ScheduledFuture<?> tickerObject = ticker.schedule(new Runnable() {
@Override
@SuppressWarnings("synthetic-access")
lockedSonesTickerObjects.remove(sone);
notificationManager.addNotification(lockedSonesNotification);
}
- }, "Sone Locked Notification");
+ }, 5, TimeUnit.MINUTES);
lockedSonesTickerObjects.put(sone, tickerObject);
}
@Subscribe
public void soneUnlocked(SoneUnlockedEvent soneUnlockedEvent) {
lockedSonesNotification.remove(soneUnlockedEvent.sone());
- Ticker.getInstance().deregisterEvent(lockedSonesTickerObjects.remove(soneUnlockedEvent.sone()));
+ lockedSonesTickerObjects.remove(soneUnlockedEvent.sone()).cancel(false);
}
/**
notificationManager.addNotification(insertingImagesNotification);
}
- //
- // CORELISTENER METHODS
- //
-
/**
- * {@inheritDoc}
+ * Notifies the web interface that an {@link Image} insert was aborted.
+ *
+ * @param imageInsertAbortedEvent
+ * The event
*/
- @Override
- public void imageInsertAborted(Image image) {
- insertingImagesNotification.remove(image);
+ @Subscribe
+ public void imageInsertAborted(ImageInsertAbortedEvent imageInsertAbortedEvent) {
+ insertingImagesNotification.remove(imageInsertAbortedEvent.image());
}
/**
- * {@inheritDoc}
+ * Notifies the web interface that an {@link Image} insert is finished.
+ *
+ * @param imageInsertFinishedEvent
+ * The event
*/
- @Override
- public void imageInsertFinished(Image image) {
- insertingImagesNotification.remove(image);
- insertedImagesNotification.add(image);
+ @Subscribe
+ public void imageInsertFinished(ImageInsertFinishedEvent imageInsertFinishedEvent) {
+ insertingImagesNotification.remove(imageInsertFinishedEvent.image());
+ insertedImagesNotification.add(imageInsertFinishedEvent.image());
notificationManager.addNotification(insertedImagesNotification);
}
/**
- * {@inheritDoc}
+ * Notifies the web interface that an {@link Image} insert has failed.
+ *
+ * @param imageInsertFailedEvent
+ * The event
*/
- @Override
- public void imageInsertFailed(Image image, Throwable cause) {
- insertingImagesNotification.remove(image);
- imageInsertFailedNotification.add(image);
+ @Subscribe
+ public void imageInsertFailed(ImageInsertFailedEvent imageInsertFailedEvent) {
+ insertingImagesNotification.remove(imageInsertFailedEvent.image());
+ imageInsertFailedNotification.add(imageInsertFailedEvent.image());
notificationManager.addNotification(imageInsertFailedNotification);
}