Class JavaScriptJobManagerImpl

java.lang.Object
org.htmlunit.javascript.background.JavaScriptJobManagerImpl
All Implemented Interfaces:
Serializable, JavaScriptJobManager

class JavaScriptJobManagerImpl extends Object implements JavaScriptJobManager

Default implementation of JavaScriptJobManager.

This job manager class is guaranteed not to keep old windows in memory (no window memory leaks).

This job manager is serializable, but any running jobs are transient and are not serialized.

  • Field Details

    • window_

      private final transient WeakReference<WebWindow> window_
      The window to which this job manager belongs (weakly referenced, so as not to leak memory).
    • scheduledJobsQ_

      private transient PriorityQueue<JavaScriptJob> scheduledJobsQ_
      Queue of jobs that are scheduled to run. This is a priority queue, sorted by closest target execution time.
    • cancelledJobs_

      private transient ArrayList<Integer> cancelledJobs_
    • currentlyRunningJob_

      private transient JavaScriptJob currentlyRunningJob_
    • NEXT_JOB_ID_

      private static final AtomicInteger NEXT_JOB_ID_
      A counter used to generate the IDs assigned to JavaScriptJobs.
    • LOG

      private static final org.apache.commons.logging.Log LOG
      Logging support.
  • Constructor Details

    • JavaScriptJobManagerImpl

      JavaScriptJobManagerImpl(WebWindow window)
      Creates a new instance.
      Parameters:
      window - the window associated with the new job manager
  • Method Details

    • getJobCount

      public int getJobCount()
      Returns the number of active jobs, including jobs that are currently executing and jobs that are waiting to execute.
      Specified by:
      getJobCount in interface JavaScriptJobManager
      Returns:
      the number of active jobs
    • getJobCount

      public int getJobCount(JavaScriptJobManager.JavaScriptJobFilter filter)
      Returns the number of active jobs, including jobs that are currently executing and jobs that are waiting to execute. Only jobs passing the filter are counted.
      Specified by:
      getJobCount in interface JavaScriptJobManager
      Parameters:
      filter - the JavaScriptJobFilter
      Returns:
      the number of active jobs
    • addJob

      public int addJob(JavaScriptJob job, Page page)
      Adds the specified job to this job manager, assigning it an ID. If the specified page is not currently loaded in the window which owns this job manager, the operation fails and this method returns 0.
      Specified by:
      addJob in interface JavaScriptJobManager
      Parameters:
      job - the job to add to the job manager
      page - the page which is trying to add the job
      Returns:
      the ID assigned to the job
    • removeJob

      public void removeJob(int id)
      Removes the specified job from the execution queue. This doesn't interrupt the job if it is currently running.
      Specified by:
      removeJob in interface JavaScriptJobManager
      Parameters:
      id - the ID of the job to be removed from the execution queue
    • stopJob

      public void stopJob(int id)
      Stops the specified job and removes it from the execution queue, not even allowing the job to finish if it is currently executing.
      Specified by:
      stopJob in interface JavaScriptJobManager
      Parameters:
      id - the ID of the job to be stopped
    • removeAllJobs

      public void removeAllJobs()
      Removes all jobs from the execution queue. This doesn't interrupt any jobs that may be currently running.
      Specified by:
      removeAllJobs in interface JavaScriptJobManager
    • waitForJobs

      public int waitForJobs(long timeoutMillis)
      Blocks until all active jobs have finished executing. If a job is scheduled to begin executing after (now + timeoutMillis), this method will wait for timeoutMillis milliseconds and then return false.
      Specified by:
      waitForJobs in interface JavaScriptJobManager
      Parameters:
      timeoutMillis - the maximum amount of time to wait (in milliseconds); may be negative, in which case this method returns immediately
      Returns:
      the number of background JavaScript jobs still executing or waiting to be executed when this method returns; will be 0 if there are no jobs left to execute
    • waitForJobsStartingBefore

      public int waitForJobsStartingBefore(long delayMillis)
      Blocks until all jobs scheduled to start executing before (now + delayMillis) have finished executing. If there is no background JavaScript task currently executing, and there is no background JavaScript task scheduled to start executing within the specified time, this method returns immediately -- even if there are tasks scheduled to be executed after (now + delayMillis).
      Specified by:
      waitForJobsStartingBefore in interface JavaScriptJobManager
      Parameters:
      delayMillis - the delay which determines the background tasks to wait for (in milliseconds); may be negative, as it is relative to the current time
      Returns:
      the number of background JavaScript jobs still executing or waiting to be executed when this method returns; will be 0 if there are no jobs left to execute
    • waitForJobsStartingBefore

      public int waitForJobsStartingBefore(long delayMillis, JavaScriptJobManager.JavaScriptJobFilter filter)
      Blocks until all jobs scheduled to start executing before (now + delayMillis) have finished executing. If there is no background JavaScript task currently executing, and there is no background JavaScript task scheduled to start executing within the specified time, this method returns immediately -- even if there are tasks scheduled to be executed after (now + delayMillis).
      Specified by:
      waitForJobsStartingBefore in interface JavaScriptJobManager
      Parameters:
      delayMillis - the delay which determines the background tasks to wait for (in milliseconds); may be negative, as it is relative to the current time
      filter - the JavaScriptJobFilter
      Returns:
      the number of background JavaScript jobs still executing or waiting to be executed when this method returns; will be 0 if there are no jobs left to execute
    • shutdown

      public void shutdown()
      Shuts down this job manager and stops all of its jobs.
      Specified by:
      shutdown in interface JavaScriptJobManager
    • getWindow

      private WebWindow getWindow()
      Returns the window to which this job manager belongs, or null if it has been garbage collected.
      Returns:
      the window to which this job manager belongs, or null if it has been garbage collected
    • printQueue

      private void printQueue()
      Utility method to print current queue.
    • jobStatusDump

      public String jobStatusDump(JavaScriptJobManager.JavaScriptJobFilter filter)
      INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
      Specified by:
      jobStatusDump in interface JavaScriptJobManager
      Parameters:
      filter - the JavaScriptJobFilter
      Returns:
      the job status report as string
    • getEarliestJob

      public JavaScriptJob getEarliestJob()
      Gets the earliest job for this manager.
      Specified by:
      getEarliestJob in interface JavaScriptJobManager
      Returns:
      null if none
    • getEarliestJob

      Gets the earliest job for this manager.
      Specified by:
      getEarliestJob in interface JavaScriptJobManager
      Parameters:
      filter - the JavaScriptJobFilter
      Returns:
      null if none
    • runSingleJob

      public boolean runSingleJob(JavaScriptJob givenJob)
      Runs the provided job if it is the right time for it.
      Specified by:
      runSingleJob in interface JavaScriptJobManager
      Parameters:
      givenJob - the job to run
      Returns:
      returns true if the job was run.
    • readObject

      private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
      Our own serialization (to handle the weak reference)
      Parameters:
      in - the stream to read form
      Throws:
      IOException - in case of error
      ClassNotFoundException - in case of error