diff --git a/ng-appserver/src/main/java/ng/appserver/resources/NGResourceLoader.java b/ng-appserver/src/main/java/ng/appserver/resources/NGResourceLoader.java index 666e1820..227ba465 100644 --- a/ng-appserver/src/main/java/ng/appserver/resources/NGResourceLoader.java +++ b/ng-appserver/src/main/java/ng/appserver/resources/NGResourceLoader.java @@ -39,30 +39,31 @@ public String identifier() { } } - private Map> _resourceSources = new ConcurrentHashMap<>(); + private Map>> _allResourceSources = new ConcurrentHashMap<>(); public void addResourceSource( final String namespace, final ResourceType type, final ResourceSource source ) { - List sources = _resourceSources.get( type ); - - if( sources == null ) { - sources = new ArrayList<>(); - _resourceSources.put( type, sources ); - } - - sources.add( source ); - _resourceSources.put( type, sources ); + _allResourceSources + .computeIfAbsent( namespace, _unused -> new ConcurrentHashMap<>() ) + .computeIfAbsent( type, _unused -> new ArrayList<>() ) + .add( source ); } /** * @return The named resource if it exists, an empty optional if not found */ - private Optional readResource( final ResourceType type, String resourcePath ) { - Objects.requireNonNull( type ); + private Optional readResource( final String namespace, final ResourceType resourceType, String resourcePath ) { + Objects.requireNonNull( resourceType ); Objects.requireNonNull( resourcePath ); - final List list = _resourceSources.get( type ); + final Map> sourceMapForNamespace = _allResourceSources.get( namespace ); + + if( sourceMapForNamespace == null ) { + return Optional.empty(); + } + + final List sourceListForType = sourceMapForNamespace.get( resourceType ); - if( list == null ) { + if( sourceListForType == null ) { return Optional.empty(); } @@ -73,7 +74,7 @@ private Optional readResource( final ResourceType type, String resourceP resourcePath = resourcePath.substring( 1 ); } - for( ResourceSource source : list ) { + for( ResourceSource source : sourceListForType ) { final Optional result = source.bytesForResourceWithPath( resourcePath ); // FIXME: We should (optionally?) allow iterating through all registered sources to check for duplicates // Hugi 2024-06-14 @@ -88,8 +89,8 @@ private Optional readResource( final ResourceType type, String resourceP /** * @return The named resource if it exists, an empty optional if not found */ - public Optional bytesForResource( final ResourceType type, String resourcePath ) { - return readResource( type, resourcePath ); + public Optional bytesForResource( final String namespace, final ResourceType type, String resourcePath ) { + return readResource( namespace, type, resourcePath ); } /** diff --git a/ng-appserver/src/main/java/ng/appserver/resources/NGResourceManager.java b/ng-appserver/src/main/java/ng/appserver/resources/NGResourceManager.java index d93df9c0..ee799b5b 100644 --- a/ng-appserver/src/main/java/ng/appserver/resources/NGResourceManager.java +++ b/ng-appserver/src/main/java/ng/appserver/resources/NGResourceManager.java @@ -54,22 +54,22 @@ private NGResourceLoader resourceLoader() { } public Optional bytesForAppResourceNamed( final String resourceName ) { - return bytesForAnyResource( resourceName, StandardResourceType.App ); + return bytesForAnyResource( "app", resourceName, StandardResourceType.App ); } public Optional bytesForWebserverResourceNamed( final String resourceName ) { - return bytesForAnyResource( resourceName, StandardResourceType.WebServer ); + return bytesForAnyResource( "app", resourceName, StandardResourceType.WebServer ); } public Optional bytesForComponentResourceNamed( final String resourceName ) { - return bytesForAnyResource( resourceName, StandardResourceType.ComponentTemplate ); + return bytesForAnyResource( "app", resourceName, StandardResourceType.ComponentTemplate ); } public Optional bytesForPublicResourceNamed( final String resourceName ) { - return bytesForAnyResource( resourceName, StandardResourceType.Public ); + return bytesForAnyResource( "app", resourceName, StandardResourceType.Public ); } - private Optional bytesForAnyResource( final String resourceName, ResourceType resourceType ) { + private Optional bytesForAnyResource( final String namespace, final String resourceName, ResourceType resourceType ) { Objects.requireNonNull( resourceName ); Objects.requireNonNull( resourceType ); @@ -84,12 +84,12 @@ private Optional bytesForAnyResource( final String resourceName, Resourc // FIXME: Applies to both non-existing and un-cached resources. Add an "I already checked this, it doesn't exist" resource cache entry if( resource == null ) { - resource = resourceLoader().bytesForResource( resourceType, resourceName ); + resource = resourceLoader().bytesForResource( namespace, resourceType, resourceName ); cacheMap.put( resourceName, resource ); } } else { - resource = resourceLoader().bytesForResource( resourceType, resourceName ); + resource = resourceLoader().bytesForResource( namespace, resourceType, resourceName ); } return resource;