X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FUpdateChecker.java;h=2c2f12111a423b3ca4614c6518fdf8336785d7c5;hp=3f4d2354e1caf31e15bdc836ba2e61c6645b690d;hb=179e7da4d8d8a474d0b622d60b5f5d32d6ab4052;hpb=351ac31925b0f8f6ba1a4132997e85b7175c48da diff --git a/src/main/java/net/pterodactylus/sone/core/UpdateChecker.java b/src/main/java/net/pterodactylus/sone/core/UpdateChecker.java index 3f4d235..2c2f121 100644 --- a/src/main/java/net/pterodactylus/sone/core/UpdateChecker.java +++ b/src/main/java/net/pterodactylus/sone/core/UpdateChecker.java @@ -1,5 +1,5 @@ /* - * Sone - UpdateChecker.java - Copyright © 2011–2012 David Roden + * Sone - UpdateChecker.java - Copyright © 2011–2019 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 @@ -17,6 +17,8 @@ package net.pterodactylus.sone.core; +import static java.util.logging.Logger.getLogger; + import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -26,45 +28,43 @@ import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; +import javax.inject.Singleton; + +import net.pterodactylus.sone.core.event.UpdateFoundEvent; import net.pterodactylus.sone.main.SonePlugin; -import net.pterodactylus.util.collection.Pair; import net.pterodactylus.util.io.Closer; -import net.pterodactylus.util.logging.Logging; import net.pterodactylus.util.version.Version; -import freenet.client.FetchResult; + +import com.google.common.eventbus.EventBus; +import com.google.inject.Inject; + import freenet.keys.FreenetURI; import freenet.support.api.Bucket; /** * Watches the official Sone homepage for new releases. - * - * @author David ‘Bombe’ Roden */ +@Singleton public class UpdateChecker { /** The logger. */ - private static final Logger logger = Logging.getLogger(UpdateChecker.class); - - /** The key of the Sone homepage. */ - private static final String SONE_HOMEPAGE = "USK@nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI,DuQSUZiI~agF8c-6tjsFFGuZ8eICrzWCILB60nT8KKo,AQACAAE/sone/"; + private static final Logger logger = getLogger(UpdateChecker.class.getName()); - /** The current latest known edition. */ - private static final int LATEST_EDITION = 55; + /** The event bus. */ + private final EventBus eventBus; /** The Freenet interface. */ private final FreenetInterface freenetInterface; - /** The update listener manager. */ - private final UpdateListenerManager updateListenerManager = new UpdateListenerManager(); - /** The current URI of the homepage. */ private FreenetURI currentUri; /** The latest known edition. */ - private long latestEdition; + private long latestEdition = SonePlugin.getLatestEdition(); /** The current latest known version. */ - private Version currentLatestVersion = SonePlugin.VERSION; + private Version currentLatestVersion; + private final Version currentRunningVersion; /** The release date of the latest version. */ private long latestVersionDate; @@ -72,35 +72,17 @@ public class UpdateChecker { /** * Creates a new update checker. * + * @param eventBus + * The event bus * @param freenetInterface * The freenet interface to use */ - public UpdateChecker(FreenetInterface freenetInterface) { + @Inject + public UpdateChecker(EventBus eventBus, FreenetInterface freenetInterface, Version currentVersion) { + this.eventBus = eventBus; this.freenetInterface = freenetInterface; - } - - // - // EVENT LISTENER MANAGEMENT - // - - /** - * Adds the given listener to the list of registered listeners. - * - * @param updateListener - * The listener to add - */ - public void addUpdateListener(UpdateListener updateListener) { - updateListenerManager.addListener(updateListener); - } - - /** - * Removes the given listener from the list of registered listeners. - * - * @param updateListener - * The listener to remove - */ - public void removeUpdateListener(UpdateListener updateListener) { - updateListenerManager.removeListener(updateListener); + this.currentRunningVersion = currentVersion; + this.currentLatestVersion = currentVersion; } // @@ -114,7 +96,7 @@ public class UpdateChecker { * @return {@code true} if a new version was found */ public boolean hasLatestVersion() { - return currentLatestVersion.compareTo(SonePlugin.VERSION) > 0; + return currentLatestVersion.compareTo(currentRunningVersion) > 0; } /** @@ -156,7 +138,7 @@ public class UpdateChecker { */ public void start() { try { - currentUri = new FreenetURI(SONE_HOMEPAGE + LATEST_EDITION); + currentUri = new FreenetURI(SonePlugin.getHomepage()); } catch (MalformedURLException mue1) { /* this can not really happen unless I screw up. */ logger.log(Level.SEVERE, "Sone Homepage URI invalid!", mue1); @@ -168,12 +150,12 @@ public class UpdateChecker { public void editionFound(FreenetURI uri, long edition, boolean newKnownGood, boolean newSlot) { logger.log(Level.FINEST, String.format("Found update for %s: %d, %s, %s", uri, edition, newKnownGood, newSlot)); if (newKnownGood || newSlot) { - Pair uriResult = freenetInterface.fetchUri(uri.setMetaString(new String[] { "sone.properties" })); + Fetched uriResult = freenetInterface.fetchUri(uri.setMetaString(new String[] { "sone.properties" })); if (uriResult == null) { logger.log(Level.WARNING, String.format("Could not fetch properties of latest homepage: %s", uri)); return; } - Bucket resultBucket = uriResult.getRight().asBucket(); + Bucket resultBucket = uriResult.getFetchResult().asBucket(); try { parseProperties(resultBucket.getInputStream(), edition); latestEdition = edition; @@ -202,8 +184,7 @@ public class UpdateChecker { * Parses the properties of the latest version and fires events, if * necessary. * - * @see UpdateListener#updateFound(Version, long, long) - * @see UpdateListenerManager#fireUpdateFound(Version, long, long) + * @see UpdateFoundEvent * @param propertiesInputStream * The input stream to parse * @param edition @@ -240,9 +221,22 @@ public class UpdateChecker { if (version.compareTo(currentLatestVersion) > 0) { currentLatestVersion = version; latestVersionDate = releaseTime; - logger.log(Level.INFO, String.format("Found new version: %s (%tc)", version, new Date(releaseTime))); - updateListenerManager.fireUpdateFound(version, releaseTime, edition); + boolean disruptive = disruptiveVersionBetweenCurrentAndFound(properties); + logger.log(Level.INFO, String.format("Found new version: %s (%tc%s)", version, new Date(releaseTime), disruptive ? ", disruptive" : "")); + eventBus.post(new UpdateFoundEvent(version, releaseTime, edition, disruptive)); + } + } + + private boolean disruptiveVersionBetweenCurrentAndFound(Properties properties) { + for (String key : properties.stringPropertyNames()) { + if (key.startsWith("DisruptiveVersion/")) { + Version disruptiveVersion = Version.parse(key.substring("DisruptiveVersion/".length())); + if (disruptiveVersion.compareTo(currentRunningVersion) > 0) { + return true; + } + } } + return false; } }