Ressourcen sind referenzierbare, statische Inhalte (z.B. Bilder, XML-Dateien, etc.). Dies sind typischerweise Dateien, die der MyCoRe-Anwendung zur Laufzeit zur Verfügung stehen und geladen und verarbeitet werden können; z.B. in Java-Code, während der Interpretation von XML-Stylesheets oder als Antwort auf einen HTTP-Request. Dynamisch generierte Inhalte gelten in diesem Kontext nicht als Ressourcen.
Eine Ressource wird durch einen /
-separierten Pfad identifiziert, z.B. /path/to/resource.txt
.
Dieser Pfad wird im Folgenden als der Pfad der Ressource bezeichnet.
Für den Pfad einer Ressource gilt:
/
ist optional./
enden..class
enden..
oder ..
beinhalten.Die Pfade /path/to/resource.txt
und path/to/resource.txt
sind äquivalent.
Der Pfad /path//to/./some/../resources/
ist in vielerlei Hinsicht ungültig.
Web-Ressourcen sind Ressourcen, deren Pfad mit /META-INF/resources
beginnt.
Dies entspricht einer Konvention aus der Javas Servlet-Welt.
Der Teil des Pfandes nach diesem Prefix wird im Folgenden als der Web-Pfad der Web-Ressource bezeichnet.
Für den Web-Pfad einer Web-Ressource gilt:
/META-INF
oder /WEB-INF
beginnen.Der Pfad /META-INF/resources/META-INF/meta-resource.txt
ist entsprechend ungültig.
Web-Ressourcen werden von einer MyCoRe-Anwendung als Antwort auf einen HTTP-Request ausgeliefert, sofern kein Servlet oder Servlet-Filter konfiguriert ist, der den HTTP-Request beantwortet. Hierbei wird der Pfad des HTTP-Requests als Web-Pfad verwendet, um eine Web-Ressource zu finden und, falls vorhanden, auszuliefern.
Ist z.B. https://my.mycore.de
die Basis-URL der MyCoRe-Anwendung,
so wird bei einer Anfrage von https://my.mycore.de/path/to/web-resource.txt
die Web-Ressource mit dem Web-Pfad /path/to/web-resource.txt
gesucht.
Dies entspricht der Ressource mit dem Ressourcen-Pfad /META-INF/ressource/path/to/web-resource.txt
.
In einer typischen MyCoRe-Anwendung können Ressourcen an verschiedenen Stellen gefunden werden. Dies werden im folgenden als Fundstellen bezeichnet.
Es gibt zwei Arten von Fundstellen:
resource.txt
verdeutlicht).
Beinhaltet eine solche Fundstelle etwa die Datei /path/to/resource.txt
,
so wird diese mit dem Pfad /path/to/resource.txt
gefunden.web-resource.txt
verdeutlicht).
Beinhaltet eine solche Fundstelle etwa die Datei /path/to/web-resource.txt
,
so wird diese mit dem Pfad /META-INF/ressource/path/to/web-resource.txt
gefunden.Fundstellen, deren Inhalt als Ressourcen verwendet wird, können dementsprechend auch Web-Ressourcen beinhalten.
Hierzu müssen diese an dieser Fundstelle explizit unterhalb von /META-INF/ressource
abgelegt werden.
Fundstellen, deren Inhalt als Web-Ressourcen verwendet wird, können keine Ressourcen beinhalten,
die nicht Web-Ressourcen sind.
Für einige Fundstellen dienen die folgenden Verzeichnisse als Basis-Verzeichnisse:
/path/to/configDir
angenommen)./path/to/webappDir
angenommen).In einer typischen MyCoRe-Anwendung gibt es die folgenden Fundstellen:
Ist ein
Developer-Override
konfiguriert
(z.B. mit MCR.Developer.Resource.Override=/path/to/overrideDir
),
so wird der Inhalt der dort genannten Verzeichnisse als Ressourcen verwendet.
/path/to/overrideDir/resource.txt
/path/to/overrideDir/META-INF/resources/web-resource.txt
Ist das
WCMS2
-Modul vorhanden, so wird der Inhalt des Speicherverzeichnisses
(typischerweise /data/save/webpages
im Konfigurationsverzeichnis der MyCoRe-Anwendung)
als Web-Ressourcen verwendet.
/path/to/configDir/data/save/webpages/web-resource.txt
Der Inhalt von /resources
im Konfigurationsverzeichnis der MyCoRe-Anwendung wird als Ressourcen verwendet.
/path/to/configDir/resources/resource.txt
/path/to/configDir/resources/META-INF/resources/web-resource.txt
Der Inhalt des Basis-Verzeichnisses der Web-Anwendung wird als Web-Ressourcen verwendet.
/path/to/webappDir/web-resource.txt
Beim Laden der Web-Anwendung extrahiert der Web-Container (z.B. Tomcat oder Jetty) den Inhalt der WAR-Datei in dieses Verzeichnis.
Abgesehen von den Inhalten der Unterordner /META-INF
und /WEB-INF
wird der Inhalt dieses Ordners von dem Web-Container als Antwort auf einen HTTP-Request ausgeliefert,
sofern kein Servlet oder Servlet-Filter konfiguriert ist, der den HTTP-Request beantwortet.
Dies gilt auch für Inhalte, die nach dem Extrahieren hinzukommen.
Aus diesem Grund dürfen Web-Pfade nicht mit /META-INF
und /WEB-INF
beginnen.
In einem Maven-Projekt zum Erzeugen einer WAR-Datei (z.B. mir-webapp
)
befinden sich die so extrahierten Inhalte im Verzeichnis /src/main/webapp
.
/path/to/mavenWarProject/src/main/webapp/web-resource.txt
Der Inhalt von /WEB-INF/classes
im Basis-Verzeichnisses der Web-Anwendung wird als Ressourcen verwendet.
/path/to/webappDir/WEB-INF/classes/resource.txt
/path/to/webappDir/WEB-INF/classes/META-INF/resources/web-resource.txt
In einem Maven-Projekt zum Erzeugen einer WAR-Datei (z.B. mir-webapp
)
befinden sich diese Inhalte im Verzeichnis /src/main/resources
.
/path/to/mavenWarProject/src/main/resource/resource.txt
/path/to/mavenWarProject/src/main/resource/META-INF/resources/web-resource.txt
Der Inhalt von JAR-Dateien im Verzeichnis /lib
im Konfigurationsverzeichnis der MyCoRe-Anwendung wird als Ressourcen verwendet,
sofern diese Bibliotheken zum Startzeitpunkt der MyCoRe-Anwendung dort vorhanden sind.
Nachträglich hinzugefügte JAR-Dateien werden nicht geladen.
/path/to/configDir/lib/library-1.0.jar
├─ /resource.txt
└─ /META-INF/resources/web-resource.txt
Hierbei kann es sich um MyCoRe-Anwendungsmodule oder normale Programmbibliotheken (z.B. WebJars) handeln.
Der Inhalt von JAR-Dateien im Verzeichnis /WEB-INF/lib
im Basis-Verzeichnisses der Web-Anwendung wird als Ressourcen verwendet,
sofern diese Bibliotheken zum Startzeitpunkt der MyCoRe-Anwendung dort vorhanden sind.
Nachträglich hinzugefügte JAR-Dateien werden nicht geladen.
/path/to/webappDir/WEB-INF/lib/mycore-xxx-2023.08.jar
├─ /resource.txt
└─ /META-INF/resources/web-resource.txt
Diese JAR-Dateien stammen aus der extrahierten WAR-Datei.
Sie sind die (transitiv) eingebundenen Dependencies mit Scope compile
oder runtime
(z.B. org.mycore:mycore-xxx
)
in einem Maven-Projekt zum Erzeugen einer WAR-Datei (z.B. mir-webapp
).
Hierbei kann es sich um MyCoRe-Anwendungsmodule oder normale Programmbibliotheken (z.B. WebJars) handeln.
Der Inhalt von sonstigen JAR-Dateien wird als Ressourcen verwendet, sofern diese Bibliotheken geladen werden. Welche Mechanismen hierzu zur Verfügung stehen, hängt u.A. von verwendeten Web-Container und der verwendeten JVM ab.
Bei Tomcat beispielsweise können herzu JAR-Dateien im Verzeichnis /lib
im Installationsverzeichnis abgelegt werden
oder mit der Umgebungsvariablen CLASSPATH
beim Start weitere Bibliotheken eingebunden werden.
Hierbei kann es sich um MyCoRe-Anwendungsmodule oder normale Programmbibliotheken (z.B. WebJars) handeln.
Das Verfahren zum Arbeiten mit Ressourcen wurde in 2023.08 neu gestaltet.
Ressourcen werden in MyCoRe als URL repräsentiert, wobei der URL einer Ressource geeignet sein muss,
den Inhalt der Ressource zu laden und zu verarbeiten.
Dies muss beliebig oft möglich sei und jedes Mal denselben Inhalt liefern.
Im Folgenden werden Ressourcen und ihre Repräsentation in Java-Code als URL
synonym verwendet.
Ressourcen-Pfade werden im Java-Code als MCRResourcePath
repräsentiert.
Diese Klasse setzt die oben beschriebenen Einschränkungen durch.
Mit den statischen Methoden Optional<MCRResourcePath> ofPath(String path)
und Optional<MCRResourcePath> ofWebPath(String path)
können Instanzen für Ressourcen-Pfade anhand von ausgeschriebenen Pfaden oder Web-Pfaden erstellt werden.
Zum Verwenden von Ressourcen in Java-Code stellt MyCoRe die zentrale Zugangsstelle MCRResourceResolver
bereit.
Diese stellt diverse Methoden zum Auffinden einer Ressource bereit.
Die wesentliche Methode ist hierbei Optional<URL> resolve(MCRResourcePath, MCRHints hints)
.
Sie nimmt einen Ressourcen-Pfad und sucht eine passende Ressource. Diese wird, falls vorhanden, zurückgegeben.
Die meisten anderen Methoden des Resolvers sind hilfreiche Abkürzungen für typische Anwendungsfälle.
Die Hilfsklasse MCRResourceHelper
stellt zudem einen alternativen Zugang zum Resolver bereit.
Hier wird die Abwesenheit einer Ressource nicht durch Optional
-, sondern durch null
-Werte signalisiert.
Diese Hilfsklasse erleichtert insbesondere die Anpassung von bestehendem Java-Code an das neue Verfahren.
Die konkret zum Auffinden von Ressourcen verwendete Strategie ist bei dem neuen Verfahren nicht mehr fest vorgegeben. Sie wird anhand der Angaben in der Konfiguration der MyCoRe-Anwendung instanziiert. Typischerweise wird die Strategie dabei aus mehreren Komponenten zusammengestellt. Eine Übersicht über die verwendete Zusammenstellung wird beim Start der MyCoRe-Anwendung in den Log-Daten ausgegeben.
Für einige Komponenten müssen neben dem Pfad weitere Parameter verarbeitet werden.
Diese werden als MCRHints
übergeben.
Die Hilfsklasse MCRResourceHintKeys
definiert Schlüssel für standardmäßig bereitgestellte Parameter.
Die folgenden Werte werden hierbei bereitgestellt:
CONFIG_DIR
: Das von MCRConfigurationDir#getConfigurationDirectory()
bereitgestellte Konfigurationsverzeichnis.CLASS_LOADER
: Der von MCRClassTools#getClassLoader()
gelieferte ClassLoader
SERVLET_CONTEXT
: Der ServletContext
der Web-Anwendung, falls vorhanden.WEBAPP_DIR
: Das Basis-Verzeichnis der Web-Anwendung, falls vorhanden.In MyCoRe werden verschiedene Strategien zum Auffinden von Ressourcen mit dem Interface MCRResourceProvider
implementiert.
Die wesentliche Methode in diesem Interface ist Optional<URL> provide(MCRResourcePath path, MCRHints hints)
.
Sie nimmt einen Pfad und liefert, falls vorhanden, eine passende Ressource.
MyCoRe stellt diverse Implementierungen von MCRResourceProvider
bereit.
Einige allgemeine Strategien bilden grundsätzliche Verfahren ab.
Diese dienen als Grundlage für spezielle Strategien für die oben genannten typischen Fundstellen oder für eigene Strategien.
Zudem gibt es komponierenden Strategien die aus bestehenden Strategien neuen Strategien zusammenstellen.
Für die allgemeinen Strategien gibt es im Wesentlichen zwei Ansätze:
Jeder Strategie wird im Konstruktor mit dem Parameter coverage
eine kurze Beschreibung ihres Einsatzzwecks übergeben.
Dies dient introspektiven Zwecken.
Typischerweise werden Instanzen von MCRResourceProvider
jedoch nicht direkt erstellt,
sondern aus der Konfiguration der MyCoRe-Anwendung als
konfigurierte Klasseninstanzen
abgeleitet.
Für den eben genannten Parameter coverage
gibt es für alle Implementierungen den Konfigurationsschlüssel Coverage
.
MyCoRe stellt die folgenden allgemeinen Strategien bereit.
Die Strategie MCRClassLoaderResourceProvider
verwendet die Methode ClassLoader#getResource(String)
zum Auffinden einer Ressource.
Die Strategie MCRFileSystemResourceProvider
sucht anhand eines gegebenen Pfades im Dateisystem nach einer passenden Ressource.
Hierzu wird dem Konstruktor eine Liste von Basisverzeichnissen übergeben.
Diese Liste wird beim Suchen von Ressourcen der Reihe nach abgearbeitet.
Der erste Treffer wird verwendet.
Dem Konstruktor muss zudem ein MCRResourceProviderMode
(entweder RESOURCES
oder WEB_RESOURCES
) übergeben werden.
Dieser Parameter bestimmt, ob die im Dateisystem vorhandenen Dateien als Ressourcen oder Web-Ressourcen verwendet werden sollen.
Zusätzliche Konfigurationsschlüssel:
Mode
: Der Modus, entweder RESOURCES
oder WEB_RESOURCES
.BaseDirs
: Eine kommaseparierte Liste von Basisverzeichnissen.Die Strategie MCRLFSResourceProvider
unterteilt die Strategie in drei Phasen: Locate, Filter, Select.
Diese drei Phasen dienen insbesondere der Umsetzung von Strategien, die eine Ressource aus einer Menge von Kandidaten auswählen.
Jeder Phase wird von einer eigenen Komponente umgesetzt.
In der Locate-Phase wird von einem MCRResourceLocator
die Menge der Kandidaten bereitgestellt.
In der Filter-Phase werden ungeeignete Kandidaten von einem MCRResourceFilter
entfernt.
In der Select-Phase wird aus der Menge der geeigneten Kandidaten mit einem MCRResourceSelector
die Menge der präferierten Ressourcen ausgewählt und ihrer Priorität nach sortiert.
Im Gegensatz zur Filter-Phase werden Ressourcen in der Select-Phase nicht nur für sich betrachtet,
sondern können in Bezug auf alle geeigneten Kandidaten bewertet werden.
Sollten nach den drei Phasen noch mehrere Kandidaten zur verfügung stehen, wird der erste Kandidat verwendet.
Zusätzliche Konfigurationsschlüssel::
Locator
: Die Strategie für die Locate-Phase (MCRResourcelocator
).Filter
: Der Filter für die Filter-Phase (MCRResourceFilter
).Selector
: Der Strategie für die Select-Phase (MCRResourceSelector
).Die wesentliche Methode im Interface MCRResourceLocator
ist Stream<URL> locate(MCRResourcePath path, MCRHints hints)
.
Sie nimmt einen MCRResourcePath
und stellt eine Menge von Kandidaten bereit.
MyCoRe stellt mehrere Implementierungen von MCRResourceLocator
bereit.
Die Strategie MCRClassLoaderResourceLocator
verwendet die Methode ClassLoader#getResources(String)
zum Auffinden von Ressourcen.
Die Strategie MCRServletContextResourceLocator
verwendet die Methode ServleteContext#getResource(String)
zum Auffinden einer Web-Ressource.
Die Strategie MCRCombinedResourceLocator
kombiniert mehrere andere Strategien.
Hierbei werden die Ergebnisse aller Strategien nacheinander bereitgestellt.
Zusätzliche Konfigurationsschlüssel:
Locators.
nnn
, wobei nnn
numerische Werte sind: Eine Liste von Strategien (MCRResourceLocator
).Die wesentliche Methode im Interface MCRResourceFilter
ist Stream<URL> filter(Stream<URL> resourceUrls, MCRHints hints)
.
Sie nimmt einen die Menge von Kandidaten aus der Locate-Phase und entfernt ungeeignete Kandidaten.
MyCoRe stellt mehrere Implementierungen von MCRResourceFilter
bereit.
Der Filter MCRLibraryResourceFilter
prüft, ob ein Kandidat Inhalt einer JAR-Datei ist.
Dem Konstruktor muss ein MCRResourceFilterMode
(entweder MUST_MACTH
oder MUST_NOT_MACTH
) übergeben werden.
Dieser Parameter bestimmt, ob die Kandidaten die genannte Bedingung erfüllen müssen oder nicht erfüllen dürfen.
Zusätzliche Konfigurationsschlüssel:
Mode
: Der Modus, entweder MUST_MACTH
oder MUST_NOT_MACTH
.Der Filter MCRConfigDirLibraryResourceFilter
prüft, ob ein Kandidat Inhalt einer JAR-Datei
im Verzeichnis /lib
im Konfigurationsverzeichnis der MyCoRe-Anwendung ist.
Dem Konstruktor muss ein MCRResourceFilterMode
(entweder MUST_MACTH
oder MUST_NOT_MACTH
) übergeben werden.
Dieser Parameter bestimmt, ob die Kandidaten die genannte Bedingung erfüllen müssen oder nicht erfüllen dürfen.
Zusätzliche Konfigurationsschlüssel:
Mode
: Der Modus, entweder MUST_MACTH
oder MUST_NOT_MACTH
.Der Filter MCRConfigDirLibraryResourceFilter
prüft, ob ein Kandidat Inhalt einer JAR-Datei
im Verzeichnis /WEB-INF/lib
im Basis-Verzeichnisses der Web-Anwendung ist.
Dem Konstruktor muss ein MCRResourceFilterMode
(entweder MUST_MACTH
oder MUST_NOT_MACTH
) übergeben werden.
Dieser Parameter bestimmt, ob die Kandidaten die genannte Bedingung erfüllen müssen oder nicht erfüllen dürfen.
Zusätzliche Konfigurationsschlüssel:
Mode
: Der Modus, entweder MUST_MACTH
oder MUST_NOT_MACTH
.Der Filter MCRWebappClassesDirResourceFilter
prüft, ob ein Kandidat
aus dem Verzeichnis /WEB-INF/classes
im Basis-Verzeichnisses der Web-Anwendung stammt.
Dem Konstruktor muss ein MCRResourceFilterMode
(entweder MUST_MACTH
oder MUST_NOT_MACTH
) übergeben werden.
Dieser Parameter bestimmt, ob die Kandidaten die genannte Bedingung erfüllen müssen oder nicht erfüllen dürfen.
Zusätzliche Konfigurationsschlüssel:
Mode
: Der Modus, entweder MUST_MACTH
oder MUST_NOT_MACTH
.Der Filter MCRCombinedResourceLocator
kombiniert mehrere andere Filter.
Hierbei werden alle Filter nacheinander angewendet.
Kandidaten müssen die Bedingungen aller Filter erfüllen werden, um die Bedingung des kombinierten Filters zu erfüllen.
Zusätzliche Konfigurationsschlüssel:
Filters.
nnn
, wobei nnn
numerische Werte sind: Eine Liste von Filtern (MCRResourceFilter
).Die wesentliche Methode im Interface MCRResourceSelector
ist List<URL> select(List<URL> resourceUrls, MCRHints hints)
.
Sie reduziert und sortiert die Menge von geeigneten Kandidaten aus der Filter-Phase.
MyCoRe stellt mehrere Implementierungen von MCRResourceSelector
bereit.
Die Strategie MCRHighestComponentPriorityResourceSelector
wählt aus den geeigneten Kandidaten denjenigen Kandidaten aus,
die aus den MyCoRe-Komponenten stammen, die unter allen MyCore-Komponenten, die Kandidaten bereitstellen,
die höchste Priorität haben.
Hierzu wird für eine effiziente Umsetzung die von MCRRuntimeComponentDetector#getAllComponents(ComponentOrder)
absteigend nach Priorität sortierte Liste der MyCoRe-Komponenten abgearbeitet.
Dies wird so lange gemacht, bis eine Komponente gefunden wurde, die einen der Kandidaten beinhaltet.
Dieser Kandidat wird ausgewählt.
Anschließend werden nur noch MyCoRe-Komponenten betrachtet, und ggf. weitere Kandidaten ausgewählt, die dieselbe Priorität haben,
wie die erste so verwendete MyCoRe-Komponente.
Beispiel:
Angenommen es wird nach einer Resource in den folgenden Komponenten gesucht:
A
, Priorität 90, kein KandidatB
, Priorität 80, KandidatC
, Priorität 80, KandidatD
, Priorität 70, KandidatE
, Priorität 60, KandidatF
, Priorität 60, kein KandidatIn diesem Fall werden die Kandidaten der Komponenten B
und C
ausgewählt.
Beim Betrachten von Komponente C
wird die Suche abgebrochen,
da diese Komponente eine niedrigere Priorität hat,
als eine der Komponenten, die einen Kandidaten beinhaltet.
Die Komponenten E
und F
werden nicht betrachtet.
Die Strategie MCRFirstLibraryJarResourceSelector
wählt aus den verbleibenden Kandidaten denjenigen aus,
die aus der Bibliothek stammt, die unter allen Bibliotheken als erste in der Liste der Bibliotheken auftaucht.
Hierzu wird die von ServletContext#getAttribute(String)
für den Schlüssel ServletContext#ORDERED_LIBS
gelieferte Liste der Bibliotheken abgearbeitet.
Dies wird so lange gemacht, bis eine Bibliothek gefunden wurde, die einen der Kandidaten beinhaltet.
Dieser Kandidat wird ausgewählt.
Anschließend werden keine weiteren Bibliotheken betrachtet.
Die Strategie MCRCombinedResourceSelector
kombiniert mehrere andere Strategien.
Hierbei werden alle Strategien nacheinander angewendet.
Kandidaten müssen von allen Strategien ausgewählt werden, um von der kombinierten Strategie übernommen zu werden.
Es wird die Priorisierung zuletzt angewandten Strategie übernommen.
Zusätzliche Konfigurationsschlüssel:
Selectors.
nnn
, wobei nnn
numerische Werte sind: Eine Liste von Strategien (MCRResourceSelector
).MyCoRe stellt die folgenden speziellen Strategien bereit.
Die Strategie MCRDeveloperOverrideResourceProvider
deckt die Fundstelle „Developer-Override“ ab.
Die Strategie MCRWCMSWebResourceProvider
deckt die Fundstelle „WCMS2“ ab.
Die Strategie MCRConfigDirResourceProvider
deckt die Fundstelle „Ressourcen im Konfigurationsverzeichnis“ ab.
Die Strategie MCRWebappDirWebResourceProvider
deckt die Fundstelle „Web-Ressourcen der Web-Anwendung“ ab.
Die Strategie MCRWebappClassesDirResourceProvider
deckt die Fundstelle „Ressourcen der Web-Anwendung“ ab.
Diese Strategie ist ein MCRLFSResourceProvider
mit einem MCRClassLoaderResourceLocator
und einem MCRWebappClassesDirResourceFilter
.
Die Strategie MCRLibraryResourceProvider
verwendet den Inhalt von beliebigen JAR-Dateien als Ressourcen,
unabhängig davon an welcher Stelle sich diese befinden.
Diese Strategie ist ein MCRLFSResourceProvider
mit einem MCRClassLoaderResourceLocator
,
einem MCRLibraryResourceFilter
und einer Kombination aus MCRHighestComponentPriorityResourceSelector
und MCRFirstLibraryJarResourceSelector
.
Die Strategie MCRConfigDirLibraryResourceProvider
deckt die Fundstelle „Bibliotheken im Konfigurationsverzeichnis“ ab.
Diese Strategie ist ein MCRLFSResourceProvider
mit einem MCRClassLoaderResourceLocator
,
einem MCRConfigDirLibraryResourceFilter
und einer Kombination aus MCRHighestComponentPriorityResourceSelector
und MCRFirstLibraryJarResourceSelector
.
Dem Konstruktor muss ein MCRResourceFilterMode
(entweder MUST_MACTH
oder MUST_NOT_MACTH
) übergeben werden.
Dieser Parameter bestimmt, ob die ausgewählten Ressourcen aus einer Bibliothek im Konfigurationsverzeichnis oder
aus einer anderen Bibliothek stammen müssen. In jedem Fall müssen die Ressourcen aus einer Bibliothek stammen.
Zusätzliche Konfigurationsschlüssel:
Mode
: Der Modus, entweder MUST_MACTH
oder MUST_NOT_MACTH
.Die Strategie MCRWebappLibraryResourceProvider
deckt die Fundstelle „Bibliotheken der Web-Anwendung“ ab.
Diese Strategie ist ein MCRLFSResourceProvider
mit einem MCRClassLoaderResourceLocator
,
einem MCRWebappLibraryResourceFilter
und einer Kombination aus MCRHighestComponentPriorityResourceSelector
und MCRFirstLibraryJarResourceSelector
.
Dem Konstruktor muss ein MCRResourceFilterMode
(entweder MUST_MACTH
oder MUST_NOT_MACTH
) übergeben werden.
Dieser Parameter bestimmt, ob die ausgewählten Ressourcen aus einer Bibliothek der Web-Anwendung oder
aus einer anderen Bibliothek stammen müssen. In jedem Fall müssen die Ressourcen aus einer Bibliothek stammen.
Zusätzliche Konfigurationsschlüssel:
Mode
: Der Modus, entweder MUST_MACTH
oder MUST_NOT_MACTH
.MyCoRe stellt die folgenden komponierenden Strategien bereit.
Die Strategie MCRCachingResourceProvider
übernimmt die Ergebnisse einer anderen Strategie
und speichert diese in einem MCRCache
zwischen.
Dem Konstruktor muss eine Cache-Größe und die zu verwendenden Strategie übergeben werden.
Zusätzliche Konfigurationsschlüssel:
Capacity
: Die Cache-Größe.Provider
: Die zugrundeliegende Strategie (MCRResourceProvider
).Die Strategie MCRCombinedResourceProvider
kombiniert mehrere andere Strategien.
Hierbei wird das erste von einer der Strategien gelieferte Ergebnis bereitgestellt.
Zusätzliche Konfigurationsschlüssel:
Providers.
nnn
, wobei nnn
numerische Werte sind: Eine Liste von Strategien (MCRResourceProvider
).Es können mehrere Konfigurationen zum Auffinden von Ressourcen angegeben werden.
Für eine Konfiguration wird der Konfigurationsschlüssel MCR.Resource.Resolver.
name
verwendet,
wobei name
ein frei wählbarer Name ist.
Für jede solche Konfiguration muss mit dem Schlüssel Provider
eine Strategie zum Auffinden von Ressourcen angegeben werden (MCRResourcelocator
).
Die tatsächlich zu verwendende Konfiguration wird mit dem Konfigurationsschlüssel MCR.Resource.Resolver
ausgewählt,
wobei als Wert der frei gewählten Namen einer Konfiguration angegeben werden muss.
Nur diese Strategie wird instanziiert.
Dieser mechanismus erlaubt den schnellen Wechsel zwischen verschiedenen Konfigurationen.
In MyCoRe sind zwei Konfigurationen vorgegeben: default
und legacy
.
Die Konfiguration legacy
bildet im wesentliche die Strategie nach, die vor
2023.08
fest implementiert war.
Die Konfiguration default
ist eine vereinfachte und effizientere Strategie, die in den meisten Anwendungsfällen ausreichend sein sollte.
Die folgende Übersicht stellt die defualt
-Konfiguration dar:
├─ Class: org.mycore.common.resource.provider.MCRCombinedResourceProvider
├─ Coverage: all resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRDeveloperOverrideResourceProvider
│ └─ Coverage: developer override resources
├─ Provider:
│ ├─ Class: org.mycore.wcms2.MCRWCMSWebResourceProvider
│ └─ Coverage: WCMS web resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRConfigDirResourceProvider
│ └─ Coverage: config dir resources
└─ Provider:
├─ Class: org.mycore.common.resource.provider.MCRCachingResourceProvider
├─ Coverage: cached app resources
├─ Capacity: 1000
└─ Provider:
├─ Class: org.mycore.common.resource.provider.MCRCombinedResourceProvider
├─ Coverage: app resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRWebappDirWebResourceProvider
│ └─ Coverage: webapp dir web resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRWebappClassesDirResourceProvider
│ └─ Coverage: webapp classes dir resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRLibraryResourceProvider
│ └─ Coverage: library resources
└─ Provider:
├─ Class: org.mycore.common.resource.provider.MCRClassLoaderResourceProvider
└─ Coverage: fallback resource
Die folgende Übersicht stellt die legacy
-Konfiguration dar:
├─ Class: org.mycore.common.resource.provider.MCRCombinedResourceProvider
├─ Coverage: all resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRDeveloperOverrideResourceProvider
│ └─ Coverage: developer override resources
├─ Provider:
│ ├─ Class: org.mycore.wcms2.MCRWCMSWebResourceProvider
│ └─ Coverage: WCMS web resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRWebappDirWebResourceProvider
│ └─ Coverage: webapp dir web resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRConfigDirResourceProvider
│ └─ Coverage: config dir resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRConfigDirLibraryResourceProvider
│ ├─ Coverage: config dir library resources
│ └─ Mode: MUST_MATCH
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRWebappClassesDirResourceProvider
│ └─ Coverage: webapp classes dir resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRConfigDirLibraryResourceProvider
│ ├─ Coverage: other library resources
│ └─ Mode: MUST_NOT_MATCH
└─ Provider:
├─ Class: org.mycore.common.resource.provider.MCRClassLoaderResourceProvider
└─ Coverage: fallback resource
Eigene konfigurationen können mit dem oben beschriebenen Mechanismus und den bei den einzelnen Komponenten vorgestellten Konfigurationsschlüsseln erstellt werden.
Verwendet man keinen Developer-Override, kein WCMS und auch keine anderen Mechanismen,
die den Inhalt von Fundstellen zur Laufzeit verändern, kann z.B. die folgendermaßen zusammengestellte Konfiguration
mit dem Namen simple
verwendet werden:
MCR.Resource.Resolver.simple.Provider.Class=org.mycore.common.resource.provider.MCRCachingResourceProvider
MCR.Resource.Resolver.simple.Provider.Coverage=cached app resources
MCR.Resource.Resolver.simple.Provider.Capacity=1000
MCR.Resource.Resolver.simple.Provider.Provider.Class=org.mycore.common.resource.provider.MCRCombinedResourceProvider
MCR.Resource.Resolver.simple.Provider.Provider.Coverage=app resources
MCR.Resource.Resolver.simple.Provider.Provider.Providers.10.Class=org.mycore.common.resource.provider.MCRConfigDirResourceProvider
MCR.Resource.Resolver.simple.Provider.Provider.Providers.20.Class=org.mycore.common.resource.provider.MCRWebappDirWebResourceProvider
MCR.Resource.Resolver.simple.Provider.Provider.Providers.30.Class=org.mycore.common.resource.provider.MCRWebappClassesDirResourceProvider
MCR.Resource.Resolver.simple.Provider.Provider.Providers.40.Class=org.mycore.common.resource.provider.MCRLibraryResourceProvider
MCR.Resource.Resolver.simple.Provider.Provider.Providers.50.Class=org.mycore.common.resource.provider.MCRClassLoaderResourceProvider
MCR.Resource.Resolver.simple.Provider.Provider.Providers.50.Coverage=fallback resource
Die folgende Übersicht stellt diese Konfiguration dar:
├─ Class: org.mycore.common.resource.provider.MCRCachingResourceProvider
├─ Coverage: cached app resources
├─ Capacity: 1000
└─ Provider:
├─ Class: org.mycore.common.resource.provider.MCRCombinedResourceProvider
├─ Coverage: app resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRConfigDirResourceProvider
│ └─ Coverage: config dir resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRWebappDirWebResourceProvider
│ └─ Coverage: webapp dir web resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRWebappClassesDirResourceProvider
│ └─ Coverage: webapp classes dir resources
├─ Provider:
│ ├─ Class: org.mycore.common.resource.provider.MCRLibraryResourceProvider
│ └─ Coverage: library resources
└─ Provider:
├─ Class: org.mycore.common.resource.provider.MCRClassLoaderResourceProvider
└─ Coverage: fallback resource