Class AbstractAssetManager<K,V>

java.lang.Object
com.inductiveautomation.ignition.common.lifecycle.AbstractLifecycle
com.inductiveautomation.perspective.gateway.assets.AbstractAssetManager<K,V>
Type Parameters:
K - The type of key for the asset cache
V - The type of value for the asset cache
Direct Known Subclasses:
FontManagerImpl, IconManagerImpl, ThemeManagerImpl

public abstract class AbstractAssetManager<K,V> extends AbstractLifecycle
Base class for managing static assets. During setup() files from the injected asset's defaults will be moved to the respective assets directory in the system home directory even if they do exist. Uses a FileWatcher to react to changes to the injected asset directory under the perspective modules directory of the system home directory. Changes in the watched asset directory will cause the in memory cache to be updated. Extensions of this class must override generateKey(Path) and parseValue(Path) so that this class may update its cache with the appropriate entry.
  • Field Details

    • perspectiveContext

      protected final PerspectiveContext perspectiveContext
    • assetPath

      protected final Path assetPath
    • cacheLock

      protected final Object cacheLock
  • Constructor Details

  • Method Details

    • getCache

      protected Map<K,V> getCache()
      Fetch a copy of the cache
      Returns:
      A copy of the cache
    • getCachedValue

      protected Optional<V> getCachedValue(K key)
      Fetch the cached value associated with a key
      Parameters:
      key - The cache key
      Returns:
      An Optional containing the cached value associated with the given key, or an empty Optional of there is no such cached value associated with the given key
    • copyInputStreamToPath

      protected void copyInputStreamToPath(@Nonnull InputStream is, @Nonnull Path pathTo) throws IOException
      Throws:
      IOException
    • copyOptions

      protected CopyOption[] copyOptions(@Nonnull byte[] existingAssetDigest, @Nonnull byte[] currentExistingAssetDigest)
    • copyInputStreamToPath

      protected void copyInputStreamToPath(@Nonnull String name, @Nonnull byte[] defaultAssetData, @Nonnull byte[] defaultAssetDigest, @Nullable byte[] existingAssetDigest) throws IOException
      Throws:
      IOException
    • getDigestCopy

      public Optional<com.inductiveautomation.ignition.common.gson.JsonObject> getDigestCopy()
      Returns:
      a copy of the digests object, if present, otherwise empty optional
    • getDigestFor

      protected Optional<String> getDigestFor(@Nullable K assetKey)
      If the assetKey exists in the cache and it's been hashed, the digest may be retrieved for the asset name
      Parameters:
      assetKey - the name of the asset being cached, generally the filename of the asset
      Returns:
      optional containing the digest for the named asset
    • setup

      public void setup()
      Setup the Asset Manager. Copies any defaults into the asset home directory. Should be run before AbstractLifecycle.startup()
    • onStartup

      protected void onStartup()
      Specified by:
      onStartup in class AbstractLifecycle
    • onShutdown

      protected void onShutdown()
      Specified by:
      onShutdown in class AbstractLifecycle
    • generateKey

      @Nonnull protected abstract Optional<K> generateKey(@Nonnull Path path)
      Generate a cache key for the given Path
      Parameters:
      path - The Path for which we want to generate a cache key
      Returns:
      An Optional containing the cache key or an empty Optional if the cache key could not be generated
    • parseValue

      @Nonnull protected abstract Optional<V> parseValue(@Nonnull Path path)
      Parse the cache value for the given Path
      Parameters:
      path - The Path for which we want to generate a cache value
      Returns:
      An Optional containing the cache value or an empty Optional if the cache value could not be generated
    • onCacheChanged

      protected void onCacheChanged()
      Invoked within a synchronized block, that holds onto the cache lock, when there is a create, modify, or delete watch event. Invoked immediately following modification of the cache, the cache values and digest will be updated prior to being called. Override this method to update any cache local to the subclass.