In diesem Tutorial werde ich am Beispiel eines Download-Buttons einige Features demonstrieren,
die mit diesem oder dem letzten Release in MyCoRe integriert wurden.
Im Speziellen geht es dabei um die Anreicherung zusätzlicher Informationen aus den Derivaten im <structure>-Teil des MyCoRe-Objektes, XSLT-Funktionen und Data-URLs.
Schauen wir uns zunächst das Endergebnis und den dazugehörigen HTML-Quellcode an:
Der Button zeigt ein Dateityp-abhängiges Symbol, den Derivate-Typ als Label, die Dateigröße und den Dateinamen.
Weiterhin besteht die Möglichkeit eine Datei herunterzuladen, die eine MD5-Prüfsumme für die Validierung enthält.
Anreicherung des <structure>-Headers mit Derivate-Informationen (MCRMetaEnrichedLinkID)
Über die URL /receive/{mcrobjectid}?XSL.Style=xml können wir uns das interne XML eines MyCoRe-Objektes
ansehen. Zur Generierung von Detailansichten (Frontpage) werden in den Kopfbereich des Objektes
seit Version
2019.06
weitere Informationen zu den Derivaten
(Name der Hauptdatei und Derivate-Typ-Klassifikation) eingebettet.
In der überschriebenen Methode getDerivateLink() erweitern wir die Liste der XML-Elemente
um Einträge für Dateigröße und MD5-Prüfsumme der Hauptdatei (maindoc).
publicclassMCRExtendedDerivateLinkIDFactoryextendsMCRDefaultEnrichedDerivateLinkIDFactory{privatestaticfinalLoggerLOGGER=LogManager.getLogger();@OverridepublicMCREditableMetaEnrichedLinkIDgetDerivateLink(MCRDerivateder){MCREditableMetaEnrichedLinkIDderivateLinkID=super.getDerivateLink(der);finalStringmainDoc=derivateLinkID.getMainDoc();if(!StringUtils.isEmpty(mainDoc)){MCRPathmcrPath=MCRPath.getPath(der.getId().toString(),mainDoc);if(Files.exists(mcrPath)){try{@SuppressWarnings("rawtypes")MCRFileAttributesattrs=Files.readAttributes(mcrPath,MCRFileAttributes.class);derivateLinkID.setOrCreateElement("maindoc_size",Long.toString(attrs.size()));derivateLinkID.getContentList().add(newElement("maindoc_md5").setText(attrs.md5sum()));}catch(IOExceptione){LOGGER.error(e);}}else{LOGGER.error("Error - maindoc '"+mainDoc+"' does not exist for "+der.getId().toString());}}returnderivateLinkID;}}
Quellcode: MCRExtendedDerivateLinkIDFactory.java
Mit der Methode setOrCreateElement() kann ein neues Element mit Textinhalt erzeugt werden.
Über die Methode getContentList() erhält man Zugriff auf die Liste der Kindelemente von <derobject> und kann diese
um weitere, bei Bedarf auch komplexere Elemente erweitern. Als XML-Bibliothek wird in MyCoRe
JDOM
verwendet.
Im Ergebnis sehen wir nun die neuen XML-Elemente <maindoc_size> und <maindoc_md5>:
Zur Erzeugung des HTML-Codes der Detailansicht (Frontpage) können wir ab Version
2020.06
XSLT3 verwenden.
Ein neues Feature sind XSLT-Funktionen. Die MyCoRe-Community stellt einige
XSLT-Funktionen
zur Verfügung, die
beispielsweise die Arbeit mit Übersetzungen (I18N) oder Anzeige von Klassifikationen erleichtern.
Um die Funktionen nutzen zu können muss im <stylesheet>- Element deren Namespace deklariert werden
und die Funktionen selbst noch einmal via <xsl:import> eingebunden werden.
Wir nutzen den resource:-URI-Resolver
um die XSLT-Dateien mit den Funktionsdefinitionen aus dem Classpath laden zu können.
Zum Schluss möchte ich noch auf ein weiteres Feature hinweisen - Data-URLs.
Mit
Data-URLs
lassen sich Dateien (z.B. Bilder oder Downloads) simulieren.
Sie werden entweder als ASCII oder als Base64 kodiert und direkt in den HTML-Quellcode eingebettet.
Diese Möglichkeit erspart uns die Implementation eines zusätzlichen Servlets oder einer anderen serverseitigen Komponente,
die die MD5-Prüfsummen-Datei erzeugt.
Die Datei besteht in unserem Fall aus nur einer Zeile:
1
{MD5} {Dateiname}
Folgendes XSLT-Skript kann für die Generierung verwendet werden. Auch hier nutzen wir wieder die Informationen aus dem
angereicherten <structure>-Element.
Im href-Attribut wird eingeleitet mit data: und anschließendem Mime-Type der Inhalt der zukünftigen Datei codiert.
Das download-Atttribut gibt den Dateinamen vor, den unsere MD5-Datei beim Download erhalten soll.
Und so sieht dann die heruntergeladene MD5-Datei aus: