2023.06 2024.06

Developer-Tools

Dieser Abschnitt beschreibt von MyCoRe bereitgestellte Komponenten und Werkzeuge, die die Entwicklung vereinfachen sollen.

Developer-Modus

Der Developer-Modus bietet die Möglichkeit, verschiedene Ressourcen zur Laufzeit zu überschreiben, ohne MyCoRe oder die Anwendung neu zu bauen.

Konfiguration

Zusammengefasst sieht eine mögliche Konfiguration z.B. für die Viewer- und MIR-Entwicklung wie folgt aus:

1
2
3
4
MCR.Developer.Resource.Override=/Pfad-zu-mir/mir-layout/src/main/resources,/Pfad-zu-mycore/mycore-viewer/src/main/resources
MCR.LayoutService.LastModifiedCheckPeriod=0
MCR.UseXSLTemplateCache=false
MCR.SASS.DeveloperMode=true

Im Property MCR.Developer.Resource.Override kann eine Liste von Ordnern angegeben werden, die beim Laden der Template- und Konfigurationsdateien zuerst ausgelesen werden. Dadurch ist es möglich, Templates zu editieren und die Änderungen unmittelbar (ohne erneutes Kompilieren und Bauen der JAR-Datei) in der gestarteten Anwendung zu nutzen. Gleich benannte Templates in den JAR-Dateien werden überschrieben. Die Pfade die als erstes aufgelistet werden haben eine höhere Priorität.

Das Überschreiben von Ressourcen funktioniert für folgende Ressource-Typen:

  • XSL-Stylesheets
  • XEditor-Formulare
  • Sass-Stylesheets

Damit das Überschreiben von XSL-Stylesheets funktioniert, muss mittels MCR.UseXSLTemplateCache=false das Caching der XSLT-Templates deaktiviert und mit MCR.LayoutService.LastModifiedCheckPeriod=0 das Caching für den Layout-Service ausgeschaltet werden.

Im MyCoRe-Standardbetrieb werden Sass-Stylesheets nur einmal in CSS übersetzt und das Ergebnis gespeichert. Wünscht man eine permanente CSS-Übersetzung, kann man mit mit MCR.SASS.DeveloperMode=true den Sass-Entwickler-Modus einschalten.

Diese Properties sollten nur im Entwicklungssystem und nicht im Produktivsystem gesetzt werden!!!
Der beste Ort dafür ist die mycore.properties-Datei im Benutzerverzeichnis des Entwicklungssystems.

Developer-Kommandos

Konfiguration

Um die Developer-Kommandos nutzen zu können, müssen diese in der Konfiguration eingebunden werden:

1
 MCR.CLI.Classes.Internal=%MCR.CLI.Classes.Internal%,org.mycore.frontend.cli.MCRDeveloperCommands 

Kommandos

show message {0} for {1}
Das Kommando hat dieselbe Funktion wie show all messages for {0}, zeigt aber nur den Schlüssel und Wert dessen Schlüssel mit dem als {1} gegebenem Wert übereinstimmt.
show messages {0} for {1}
Das Kommando hat dieselbe Funktion wie show all messages for {0}, zeigt aber nur die Schlüssel und Werte deren Schlüssel mit dem als {1} gegebenem Wert beginnen.
show all messages for {0}
Das Kommando zeigt alle in den Übersetzungsdateien konfigurierten Schlüssel und die für die als {0} gegebene Sprache verwendeten Werte. Dies erspart einen Blick in die Datei messages_XX.resolved.properties.
show property {0}
Das Kommando hat dieselbe Funktion wie show all properties, zeigt aber nur das Schlüssel-Werte-Paar, dessen Schlüssel mit dem als {0} gegebenem Wert übereinstimmt.
show properties {0}
Das Kommando hat dieselbe Funktion wie show all properties, zeigt aber nur die Schlüssel-Werte-Paare, deren Schlüssel mit dem als {0} gegebenen Wert beginnen.
show all properties
Das Kommando zeigt alle aktuellen Schlüssel-Werte-Paare der Konfiguration. Dies erspart einen Blick in die Datei mycore.resolved.properties und berücksichtigt auch zur Laufzeit getätigte Änderungen der Konfiguration.
check permission {0} on {1} as {2}
Das Kommando prüft, ob der gegebene Nutzer {2} das gegebene Recht {0} für das gegebene Ziel {1} hat. Der Nutzer wird dabei mit dem MCRUserInformationResolver ermittelt (z.B. system:JANITOR oder user:username@realm).
resolve uri {0}
Das Kommando liefert den Inhalt für die gegebenen URI {0}. Hierzu wird der MCRURIResolver verwendet.
resolve uri {0} as {1}
Das Kommando liefert den Inhalt für die gegebenen URI {0} für den gegebenen Benutzer 1. Hierzu wird der MCRURIResolver verwendet. Der Nutzer wird dabei mit dem MCRUserInformationResolver ermittelt (z.B. system:JANITOR oder user:username@realm).
touch object {0}
Das Kommando speichert das Objekt mit der angegebenen ID erneut ab, ohne inhaltliche Veränderungen an diesem vorzunehmen. Hierdurch werden alle beim Speichen von Objekten auszuführenden Aktionen (z.B.: EventHandler, Aktualisierung des modifydate) ausgeführt.
touch derivate {0}
Das Kommando speichert das Derivat mit der angegebenen ID erneut ab, ohne inhaltliche Veränderungen an diesem vorzunehmen. Hierdurch werden alle beim Speichen von Derivaten auszuführenden Aktionen (z.B.: EventHandler, Aktualisierung des modifydate) ausgeführt.
Zudem gibt es einige Kommandos für den Umgang mit Ressourcen.

Tracken von Datenbankverbindungen

Für den Fall, dass Datenbankverbindungen nicht ordentlich geschlossen werden (und damit nicht in den ggf. konfigurierten Connection-Pool zurückgegeben werden), kann es zur Problembehebung hilfreich sein, die geöffneten Datenbankverbindungen zu tracken. Hierzu stellt MyCoRe den MCRTrackingConnectionProvider, eine Erweiterung des HikariCPConnectionProvider, bereit. Zum Verwenden muss der Connection-Provider von Hikari normal konfiguriert werden. Anschließend kann MCRTrackingConnectionProvider als Alternative verwendet werden.

Der alternative Connection-Provider legt in der verwendeten Datenbank initial eine Tabelle mit Namen connection_log an. Wenn eine Datenbankverbindung aus dem Pool herausgegeben wird, werden Informationen zum Verursacher (z.B. Thread-Name und Stacktrace) in dieser Tabelle gespeichert. Wenn die Verbindung zurückgegeben wird, wird der zugehörige Eintrag wieder gelöscht. Einträge über nicht-zurückgegebene Verbindungen bleiben dementsprechend erhalten. Die Tabelle wird beim Start der MyCoRe-Anwendung geleert. Wenn Einträge dauerhaft erhalten bleiben sollen, so kann dies mit MCR.JPA.TrackingConnectionProvider.PersistDataAcrossRestarts=true erreicht werden.

Konfiguration

Um den alternativen Connection-Provider zu verwenden, muss je nach Art der JPA-Konfiguration entweder

1
 <property name="hibernate.connection.provider_class" value="org.mycore.backend.jpa.MCRTrackingConnectionProvider" />

oder

1
 MCR.JPA.Connection.ProviderClass=org.mycore.backend.jpa.MCRTrackingConnectionProvider

oder z.B.

1
 MCR.JPA.PersistenceUnit.MyCoRe.Properties.hibernate.connection.provider_class=org.mycore.backend.jpa.MCRTrackingConnectionProvider

in die entsprechende Konfiguration aufgenommen werden.