Class NaiveUserAgent

java.lang.Object
org.xhtmlrenderer.swing.NaiveUserAgent
All Implemented Interfaces:
DocumentListener, UserAgentCallback
Direct Known Subclasses:
ITextUserAgent, ShowDocBookPage.ResourceLoadingUserAgent

@ParametersAreNonnullByDefault public class NaiveUserAgent extends Object implements UserAgentCallback, DocumentListener

NaiveUserAgent is a simple implementation of UserAgentCallback which places no restrictions on what XML, CSS or images are loaded, and reports visited links without any filtering. The most straightforward process available in the JDK is used to load the resources in question--either using java.io or java.net classes.

The NaiveUserAgent has a small cache for images, the size of which (number of images) can be passed as a constructor argument. There is no automatic cleaning of the cache; call shrinkImageCache() to remove the least-accessed elements--for example, you might do this when a new document is about to be loaded. The NaiveUserAgent is also a DocumentListener; if registered with a source of document events (like the panel hierarchy), it will respond to the DocumentListener.documentStarted() call and attempt to shrink its cache.

This class is meant as a starting point--it will work out of the box, but you should really implement your own, tuned to your application's needs.

  • Field Details

    • DEFAULT_IMAGE_CACHE_SIZE

      private static final int DEFAULT_IMAGE_CACHE_SIZE
      See Also:
    • _imageCache

      protected final Map<String,ImageResource> _imageCache
      a (simple) LRU cache
    • _imageCacheCapacity

      private final int _imageCacheCapacity
    • _baseURL

      private String _baseURL
  • Constructor Details

    • NaiveUserAgent

      public NaiveUserAgent()
      Creates a new instance of NaiveUserAgent with a max image cache of 16 images.
    • NaiveUserAgent

      public NaiveUserAgent(int imgCacheSize)
      Creates a new NaiveUserAgent with a cache of a specific size.
      Parameters:
      imgCacheSize - Number of images to hold in cache before LRU images are released.
  • Method Details

    • shrinkImageCache

      public void shrinkImageCache()
      If the image cache has more items than the limit specified for this class, the least-recently used will be dropped from cache until it reaches the desired size.
    • clearImageCache

      public void clearImageCache()
      Empties the image cache entirely.
    • resolveAndOpenStream

      protected InputStream resolveAndOpenStream(String uri)
      Gets a Reader for the resource identified
    • openStream

      protected InputStream openStream(String uri) throws IOException
      Throws:
      IOException
    • openConnection

      protected URLConnection openConnection(String uri) throws IOException
      Opens a connections to uri. This can be overwritten to customize handling of connections by type.
      Parameters:
      uri - the uri to connect to
      Returns:
      URLConnection opened connection to uri
      Throws:
      IOException - if an I/O exception occurs.
    • onHttpConnection

      protected URLConnection onHttpConnection(HttpURLConnection origin) throws MalformedURLException, IOException
      Customized handling of URLConnection.
      Parameters:
      origin - the original connection
      Returns:
      URLConnection
      Throws:
      MalformedURLException - if an unknown protocol is specified.
      IOException - if an I/O exception occurs.
    • needsRedirect

      protected final boolean needsRedirect(int status)
      Verify that return code of connection represents a redirection. But it is final because redirection processing is determined.
      Parameters:
      status - return code of connection
      Returns:
      boolean true if return code is a 3xx
    • getCSSResource

      public CSSResource getCSSResource(String uri)
      Retrieves the CSS located at the given URI. It's assumed the URI does point to a CSS file--the URI will be accessed (using java.io or java.net), opened, read and then passed into the CSS parser. The result is packed up into an CSSResource for later consumption.
      Specified by:
      getCSSResource in interface UserAgentCallback
      Parameters:
      uri - Location of the CSS source.
      Returns:
      A CSSResource containing the parsed CSS.
    • getImageResource

      public ImageResource getImageResource(String uri)
      Retrieves the image located at the given URI. It's assumed the URI does point to an image--the URI will be accessed (using java.io or java.net), opened, read and then passed into the JDK image-parsing routines. The result is packed up into an ImageResource for later consumption.
      Specified by:
      getImageResource in interface UserAgentCallback
      Parameters:
      uri - Location of the image source.
      Returns:
      An ImageResource containing the image.
    • createImageResource

      protected ImageResource createImageResource(String uri, @Nullable Image img)
      Factory method to generate ImageResources from a given Image. May be overridden in subclass.
      Parameters:
      uri - The URI for the image, resolved to an absolute URI.
      img - The image to package; may be null (for example, if image could not be loaded).
      Returns:
      An ImageResource containing the image.
    • getXMLResource

      public XMLResource getXMLResource(String uri)
      Retrieves the XML located at the given URI. It's assumed the URI does point to an XML--the URI will be accessed (using java.io or java.net), opened, read and then passed into the XML parser (XMLReader) configured for Flying Saucer. The result is packed up into an XMLResource for later consumption.
      Specified by:
      getXMLResource in interface UserAgentCallback
      Parameters:
      uri - Location of the XML source.
      Returns:
      An XMLResource containing the image.
    • getBinaryResource

      @Nullable @CheckReturnValue public byte[] getBinaryResource(String uri)
      Description copied from interface: UserAgentCallback
      Retrieves a binary resource located at a given URI and returns its contents as a byte array or null if the resource could not be loaded.
      Specified by:
      getBinaryResource in interface UserAgentCallback
    • isVisited

      public boolean isVisited(String uri)
      Returns true if the given URI was visited, meaning it was requested at some point since initialization.
      Specified by:
      isVisited in interface UserAgentCallback
      Parameters:
      uri - A URI which might have been visited.
      Returns:
      Always false; visits are not tracked in the NaiveUserAgent.
    • setBaseURL

      public void setBaseURL(String url)
      URL relative to which URIs are resolved.
      Specified by:
      setBaseURL in interface UserAgentCallback
      Parameters:
      url - A URI which anchors other, possibly relative URIs.
    • resolveURI

      @Nullable @CheckReturnValue public String resolveURI(@Nullable String uri)
      Resolves the URI; if absolute, leaves as is, if relative, returns an absolute URI based on the baseUrl for the agent.
      Specified by:
      resolveURI in interface UserAgentCallback
      Parameters:
      uri - A URI, possibly relative.
      Returns:
      A URI as String, resolved, or null if there was an exception (for example if the URI is malformed).
    • getBaseURL

      public String getBaseURL()
      Returns the current baseUrl for this class.
      Specified by:
      getBaseURL in interface UserAgentCallback
      Returns:
      the base uri, possibly in the implementations private uri-space
    • documentStarted

      public void documentStarted()
      Description copied from interface: DocumentListener
      Indicates document has been requested (e.g. a new document is going to be loaded). This will be called before any activity takes place for the document.
      Specified by:
      documentStarted in interface DocumentListener
    • documentLoaded

      public void documentLoaded()
      Description copied from interface: DocumentListener
      Indicates document layout has complete, e.g. document is fully "loaded" for display; this is not a callback for the document source (e.g. XML) being loaded. This method will be called on every layout run (including, for example, after panel resizes).
      Specified by:
      documentLoaded in interface DocumentListener
    • onLayoutException

      public void onLayoutException(Throwable t)
      Description copied from interface: DocumentListener
      Called when document layout failed with an exception. All Throwable objects thrown (except for ThreadDeath) during layout and not otherwise handled will be provided to this method. If a DocumentListener has been defined an XHTML panel, the listener is entirely responsible for handling the exception. No other action will be taken.
      Specified by:
      onLayoutException in interface DocumentListener
    • onRenderException

      public void onRenderException(Throwable t)
      Description copied from interface: DocumentListener
      Called when document render failed with an exception. All Throwable objects thrown (except for ThreadDeath) during render and not otherwise handled will be provided to this method. If a DocumentListener has been defined an XHTML panel, the listener is entirely responsible for handling the exception. No other action will be taken.
      Specified by:
      onRenderException in interface DocumentListener