net.i2p.router.update

## Class NewsFetcher

- java.lang.Object
- - java.lang.Thread
  - - net.i2p.util.I2PThread
    - - net.i2p.util.I2PAppThread
      - - net.i2p.router.update.UpdateRunner
        - - net.i2p.router.update.NewsFetcher

- All Implemented Interfaces:
    Runnable, UpdateTask, EepGet.StatusListener

      class NewsFetcher
      extends UpdateRunner

  Task to fetch updates to the news.xml, and to keep track of whether that has an announcement for a new version.

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from class net.i2p.util.I2PThread

      `I2PThread.OOMEventListener`

    - ### Nested classes/interfaces inherited from class java.lang.Thread

      `Thread.State, Thread.UncaughtExceptionHandler`

  - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `(package private) static String` | `PROP_BLOCKLIST_TIME`

    - ### Fields inherited from class net.i2p.router.update.UpdateRunner

      `_baos, _context, _currentURI, _get, _isPartial, _isRunning, _log, _method, _mgr, _newVersion, _type, _updateFile, _urls, CONNECT_TIMEOUT, done, INACTIVITY_TIMEOUT, NOPROXY_INACTIVITY_TIMEOUT`

    - ### Fields inherited from class java.lang.Thread

      `MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `NewsFetcher(RouterContext ctx, ConsoleUpdateManager mgr, List<URI> uris)`
    `NewsFetcher(RouterContext ctx, ConsoleUpdateManager mgr, List<URI> uris, long timeout)`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `attemptFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt, int numRetries, Exception cause)` override for status update
    `void` | `bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url)` override to prevent status update
    `(package private) void` | `checkForUpdates()` Parse the installed (not the temp) news file for the latest version.
    `void` | `fetchNews()`
    `void` | `headerReceived(String url, int attemptNum, String key, String val)` Overriden to get the last-modified header
    `void` | `run()`
    `void` | `transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified)` Copies the file from temp dir to the news location, calls checkForUpdates()
    `void` | `transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt)` override for status update

    - ### Methods inherited from class net.i2p.router.update.UpdateRunner

      `_t, _t, attempting, getID, getMethod, getType, getURI, isRunning, linkify, shutdown, toString, update, updateStatus`

    - ### Methods inherited from class net.i2p.util.I2PAppThread

      `addOOMEventThreadListener, fireOOM, removeOOMEventThreadListener`

    - ### Methods inherited from class net.i2p.util.I2PThread

      `addOOMEventListener, removeOOMEventListener, start`

    - ### Methods inherited from class java.lang.Thread

      `activeCount, checkAccess, clone, countStackFrames, currentThread, destroy, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, stop, stop, suspend, yield`

    - ### Methods inherited from class java.lang.Object

      `equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

    - ### Methods inherited from interface net.i2p.update.UpdateTask

      `start`

- - ### Field Detail

    - #### PROP_BLOCKLIST_TIME

          static final String PROP_BLOCKLIST_TIME

      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### NewsFetcher

          public NewsFetcher(RouterContext ctx,
                             ConsoleUpdateManager mgr,
                             List<URI> uris)

    - #### NewsFetcher

          public NewsFetcher(RouterContext ctx,
                             ConsoleUpdateManager mgr,
                             List<URI> uris,
                             long timeout)

      Parameters:
        `timeout` - if less than 60 seconds, we assume this was manually initiated, and we will log status to the sidebar

  - ### Method Detail

    - #### attemptFailed

          public void attemptFailed(String url,
                                    long bytesTransferred,
                                    long bytesRemaining,
                                    int currentAttempt,
                                    int numRetries,
                                    Exception cause)

      override for status update
      Specified by:
        `attemptFailed` in interface `EepGet.StatusListener`
      Overrides:
        `attemptFailed` in class `UpdateRunner`
      See Also:
        `EepGet.StatusListener.bytesTransferred(long, int, long, long, java.lang.String)`

    - #### bytesTransferred

          public void bytesTransferred(long alreadyTransferred,
                                       int currentWrite,
                                       long bytesTransferred,
                                       long bytesRemaining,
                                       String url)

      override to prevent status update
      Specified by:
        `bytesTransferred` in interface `EepGet.StatusListener`
      Overrides:
        `bytesTransferred` in class `UpdateRunner`
      Parameters:
        `alreadyTransferred` - total of all attempts, not including currentWrite If nonzero on the first call, a partial file of that length was found, _and_ the server supports resume. If zero on a subsequent call after some bytes are transferred (and presumably after an attemptFailed), the server does _not_ support resume and we had to start over. To track _actual_ transfer if the output file could already exist, the listener should keep its own counter, or subtract the initial alreadyTransferred value. And watch out for alreadyTransferred resetting if a resume failed...
        `currentWrite` - since last call to the listener
        `bytesTransferred` - includes headers, retries, redirects, discarded partial downloads, ...
        `bytesRemaining` - on this attempt only, currentWrite already subtracted - or -1 if chunked encoding or server does not return a length

    - #### checkForUpdates

          void checkForUpdates()

      Parse the installed (not the temp) news file for the latest version. TODO: Real XML parsing TODO: Check minVersion, use backup URLs specified TODO: SU3

    - #### fetchNews

          public void fetchNews()

    - #### headerReceived

          public void headerReceived(String url,
                                     int attemptNum,
                                     String key,
                                     String val)

      Overriden to get the last-modified header
      Specified by:
        `headerReceived` in interface `EepGet.StatusListener`
      Overrides:
        `headerReceived` in class `UpdateRunner`

    - #### run

          public void run()

      Specified by:
        `run` in interface `Runnable`
      Overrides:
        `run` in class `UpdateRunner`

    - #### transferComplete

          public void transferComplete(long alreadyTransferred,
                                       long bytesTransferred,
                                       long bytesRemaining,
                                       String url,
                                       String outputFile,
                                       boolean notModified)

      Copies the file from temp dir to the news location, calls checkForUpdates()
      Specified by:
        `transferComplete` in interface `EepGet.StatusListener`
      Overrides:
        `transferComplete` in class `UpdateRunner`
        `outputFile` - null if unknown (output stream constructor)
      See Also:
        `EepGet.StatusListener.bytesTransferred(long, int, long, long, java.lang.String)`

    - #### transferFailed

          public void transferFailed(String url,
                                     long bytesTransferred,
                                     long bytesRemaining,
                                     int currentAttempt)

      override for status update
      Specified by:
        `transferFailed` in interface `EepGet.StatusListener`
      Overrides:
        `transferFailed` in class `UpdateRunner`
      See Also:
        `EepGet.StatusListener.bytesTransferred(long, int, long, long, java.lang.String)`