package Breccia.Web.imager;
import Java.Async;
import java.net.URI;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.HashSet;
import static Java.Hashing.initialCapacity;
/** A record of external imaging resources, mapping each resource to the source files
* whose images depend on it. ‘External’ here means located outside of the source file.
* The record comprises two maps, namely `{@linkplain #local local}` for the resources
* that are file-system accessible, and `{@linkplain #remote remote}` for the resources
* that are network accessible. Map entries each comprise a resource reference (key)
* mapped to the set (value) of source files whose images depend on that resource.
*
*
Each of the two maps is thread safe on condition of no concurrent structural modification,
* structural modification being defined as for `{@linkplain HashMap HashMap}`
* and `{@linkplain HashSet HashSet}`.
*/
final @Async class ExternalResources {
/** Ensures the given resource is mapped to its dependant, mapping it if necessary.
*
* @param The type of resource reference.
* @param map A resource map, either {@linkplain #local local} or {@linkplain #remote remote}.
* @param resource A resource reference.
* @param dependant A source file whose image depends on that resource.
*/
static void map( final HashMap> map, final R resource, final Path dependant ) {
HashSet dd = map.get( resource ); // Dependants of the resource.
if( dd == null ) {
dd = new HashSet();
dd.add( dependant );
map.put( resource, dd); }
else dd.add( dependant ); }
/** Map of external imaging resources that are file-system accessible.
* Each entry comprises a normalized file path to an existent resource (key)
* mapped to the set (value) of source files whose images depend on that resource. *//*
*
* Resource existence is required up front for sake of clarity of user feedback. It allows broken
* references (to non-existent resources) to be reported in the context of their source text
* while that text is still easily accessible.
*/
final HashMap> local = new HashMap<>( initialCapacity( 0x2000/*or 8192*/ ));
/** Map of external imaging resources that are network accessible. Each entry comprises
* a normalized, unfragmented and apparently probeable URI reference to the resource (key)
* mapped to the set (value) of source files whose images depend on that resource.
*
* @see RemoteChangeProbe#looksProbeable(ava.net.URI)
* @see
* URI generic syntax §4.1, URI reference *//*
*
* Apparent probeability is required up front for sake of clarity of user feedback. It allows
* improbeable references to be reported in the context of their source text while that text
* is still easily accessible.
*/
final HashMap> remote = new HashMap<>( initialCapacity( 0x2000/*or 8192*/ )); }
// Copyright © 2021-2022 Michael Allan. Licence MIT.