Der MyCoRe-URI-Resolver

Der MyCoRe-URI-Resolver

Die Klasse org.mycore.common.xml.MCRURIResolver implementiert einen Resolver, mit dem an verschiedenen Stellen im MyCoRe-System XML-Daten über URI's gelesen werden können. Der Resolver wird zur Zeit an vilen Stellen des Layout-Prozesses eingesetzt. Für eigene Ziele kann der URI-Resolver auch entsprechend erweitert werden.

Der Resolver unterstützt neben den Schemata des JAVA-URIResolvers die folgenden Schemata bzw. Protokolle:

webapp:[Path]

liest eine statische XML-Datei vom Dateisystem der Web-Applikation. Im Gegensatz zur file()-Methode kann der Pfad der zu lesenden Datei relativ zum Wurzelverzeichnis der Web-Applikation angegeben werden. Der Zugriff erfolgt direkt, d.h. ohne HTTP Request oder Anwendung eines Stylesheets.

webapp:{path}

webapp:config/labels.xml

request:[Path]

liest eine XML-Datei durch einen HTTP Request an ein Servlet oder Stylesheet innerhalb der aktuellen MyCoRe-Anwendung. Im Gegensatz zur http/https Methode ist der Pfad relativ zur Basis-URL der Web-Applikation anzugeben, die MCRSessionID wird automatisch als HTTP GET Parameter ergänzt.

request:{path}

request:servlets/MCRLinkServlet?
  XSL.Style=xml&form=&to=DocPortal_document_00000001&type=derivate

resource:[Path]

liest eine XML-Datei aus dem CLASSPATH der Web-Applikation, d.h. die Datei wird zunächst im Verzeichnis WEB-INF/classes/ und als nächstes in einer der jar-Dateien im Verzeichnis WEB-INF/lib/ der Web-Applikation gesucht. Diese Methode bietet sich an, um statische XML-Dateien zu lesen, die in einer jar-Datei abgelegt sind.

resource:{path}

resource:ContentStoreSelectionRules.xml

session:[Key]

liest ein XML-Element, das als JDOM-Element in der aktuellen MCRSession abgelegt ist. Mittels der put() Methode der Klasse MCRSession kann analog zu einer Java-Hashtable unter einem Schlüssel ein Objekt abgelegt werden. Ein Servlet kann so z.B. ein JDOM-Element in der MCRSession ablegen, den Schlüssel einem Stylesheet über einen XSL-Parameter mitteilen. Der MyCoRe Editor kann dieses JDOM-Element dann mittels der get() Methode aus der Session lesen.

session:{key}

session:mylist

Das Beispiel liest das JDOM XML-Element, das als Ergebnis von MCRSessionMgr.getCurrentSession().get("mylist"); zurückgegeben wird.

mcrobject:[MCRObjectID]

liest die XML-Darstellung der Metadaten eines MCRObject mit der angegebenen MCRObjectID aus.

mcrobject:{mcrobjectid}

mcrobject:DocPortal_document_07910401

deletedMcrObject:[MCRObjectID]

löscht ein MCRObject mit der angegebenen MCRObjectID.

deletedMcrObject:{mcrobjectid}

deletedMcrObject:DocPortal_document_07910401

classification:[ClassificationQuery]

gibt eine Klassifikation in unterschiedlichen Formaten aus.

classification:{editor['['formatAlias']']|editorComplete|metadata}:{Levels}[:noEmptyLeaves]:{parents|children}:{ClassID}[:CategID]

Die einzelnen Parameter sind durch Doppelpunkte getrennt.

  1. Der erste Parameter bestimmt den Formattyp der Rückgabe.
    • editor bereitet die Klassifikation für die Nutzung in der Editor-Selectbox auf.Letztere kann für den Label-Text noch unterschiedliche Formatanweisungen enthalten, die mit formatAlias referenziert werden.Das Property MCR.UriResolver.Classification.Format.{formatAlias} enthält dann die Formatieranweisung. Diese besteht aus beliebigem Text kombiniert mit Platzhaltern:
      • {id} steht für die Kategorie-ID,
      • {count} steht für die Zahl der zugeordneten MyCoRe-Objekte,
      • {text} steht für das Attribut text im label-Tag der Klassifikationsdefinition,
      • {description} steht für das Attribut description im label-Tag der Klassifikationsdefinition.
    • metadata gibt die Klassifikation im MyCoRe-XML-Format aus.
    • editorComplete bereitet die Klassifikation für die Nutzung in der Editor-Selectbox auf. Dabei wird die für die SOLR Suche erforderliche Notation für den value ClassID:CategID verwendet.
  2. Levels gibt an, wieviel Hierarchiestufen dargestellt werden. Bei Angabe der CategID ist dies die Anzahl der Kindkategoriehierarchiestufen. Ist Levels „-1“ angegeben, so bedeutet dies „komplette Hierarchie“.
  3. noEmptyLeaves ist ein optionaler Parameter. Wenn angegeben, werden leere Kategorien ohne Objekte nicht mit ausgegeben. Diese Funktion ist nur für den Rückgabetyp editor bzw. editorComplete , d.h. sinnvollerweise in Suchmasken, implementiert.
  4. parents oder children gibt an, ob bei Angabe einer CategID zusätzlich alle übergeordneten Kategorien mit zurückgegeben werden ( parents ) oder ob nur die Kinder der Kategorie berücksichtigt werden sollen. Bei Angabe eines positiven Levels und „ parents “ werden sowohl die Eltern ausgegeben, wie auch {Levels} Hierarchieebenen der Kinder.
  5. ClassID ist die Klassifikations-ID
  6. CategID ist Kategorie-ID

classification:editor[CountDocument]:2:noEmptyLeaves:children:DocPortal_class_00000002

classification:editorComplete:3:noEmptyLeaves:children:MyCoRe_class_00000001:Categ0003

classification:metadata:0:parents:DocPortal_class_00000001:Unis.Jena

Mit dem Property MCR.URIResolver.Classification.Sort.{ClassID} kann gesteuert werden, ob die Label in der zurückgelieferten Klassifikation alphabetisch sortiert ausgegeben werden sollen (default=true). Mit dem Wert false wird die interne Sortierung (Reihenfolge der Knoten im XML) verwendet.

access:[ AccessRules ]

liest die XML-Darstellung der ACL-Metadaten für ein MyCoRe-Objekt aus und gibt diese als XML-Darstellung der servacls aus.

access:action=[all|{permision}]&object={MCRObjectID}

  • Der Parameter all gibt alle Permissions für das MyCoRe-Object zurück.
  • Für den Parameter {permision} kann eine relevante Permission angegeben werden.

access:action=all&object=DocPortal_document_07910401

access:action=writedb&object=DocPortal_document_07910401

ifs:[DerivateID]

startet den Abruf der Verzeichnisstruktur eines Derivate-Contents. Derzeit einzige Implementierung ist eine mcrdirectory -Verzeichnisstruktur im XML-Format.

ifs:{MCRDerivateID}

ifs:DocPortal_derivate_00000001

localclass:[Class]

läd eine Java-Klasse und leitet den Aufruf daran weiter. Ist die Klasse einen Instanz des URI-Resolvers wird die resolve -Methode aufgerufen. Andernfalls wird ein JDOM-Source zurückgegeben.

localclass:{class}?{param}

localclass:org.mycore.ClassName?mode=getAll

buildxml:[Strings]

generiert aus dem String ein JDOM-Objekt.

buildxml:_rootName_={root_element_name}&{xpath_entry}[&{xpath_entry}][...]

buildxml:_rootName_=mycoreobject&metadata/parents/parent/@href= 'FooBar_Document_4711'

erzeugt:

<mycoreobject>
 <metadata>
  <parents>
   <parent href="FooBar_Document_4711" />
  </parents>
 </metadata>
</mycoreobject>

mcrfile:[Path]

liefert eine konkrete Datei aus einem MCRDerivate, welche über den Pfad adressiert ist.

mcrfile:{MCRDerivateID}/{path}

file:DocPortal_derivate_00000001/folder1/image2.jpg

fileMeta:[Path]

liefert ???.

fileMeta:???

fileMeta:???

language:[Code]

kann verwendet werden, um zwischen verschiedenen Codes für die gleiche Sprache zu konvertieren. Das zurückgegebene XML enthält die ISO 639-1 und ISO 639-2 Sprachcodes für die angefragte Sprache.

language:{code}

language:de

erzeugt folgenden XML-Output:

<language xmlCode="de" biblCode="ger" termCode="deu" />

basket:[BasketAddr]

liefert Einträge aus der Korbfunktion einer Session einer MyCoRe-Anwendung. Der Resolver wird z. B. für den Input des Korb-Editors genutzt.

basket:{typeID}:{entryID}

  • Die typeID beschreibt den Typ des Korbes. In der Session können mehrere Körbe mit verschiedenen typeID existieren. Bisher ist nur die objects in Gebrauch.
  • Die entryID ist eine passende ID, im Normalfall ist es die MCRObjectID

basket:objects:MyCoRe_basket_00000001

versioninfo:[MCRObjectID]

liefert Versionsinformationen über ein MyCoRe-Objekt im XML-Format. Ist die Versionierung abgeschaltet, wird nur eine Versionszeile mit den Datum der letzten Änderung ausgegeeben.

versioninfo:{MCRObjectID}

versioninfo:MyCore_document_00000001

erzeugt folgenden XML-Output:

<versions>
 <version user="editor" date="2015-06-19" r="12345" action="update"/>
 ...
</versions>

xslInclude:[IncludeParms]

Erzeugt ein XSL-Stylesheet, dass weitere Stylesheets inkludiert. Welche definiert das MCR.URIResolver.xslIncludes.{include_name} Property. Zu Laufzeit können so weitere XSL-Dateien hinzugeladen werden, um zusätzliche Templates bereitszustellen oder vorhandene zu Überschreiben.

MCR.URIResolver.xslInclude.{include_name}={xsl_file1},{xsl_file2}...
          
xslImport:{import_name}:{xsl_file...}

MCR.URIResolver.xslIncludes.components=iview.xsl,wcms.xsl

xslInclude:components

erzeugt folgenden XML-Output:

<xsl:stylesheet version="1.0">
 <xsl:include href="iview.xsl"/>
 <xsl:include href="wcms.xsl"/>
</xsl:stylesheet>

xslImport:[ImportParms]

Erzeugt ähnlich wie "xslInclude" ein XSL-Stylesheet, jedoch werden nicht alle XSL-Dateien inkludiert, sonder in einer Kaskade importiert. Das ermöglicht die Erweiterung bestimmter Templates mittels <xsl:apply-imports /> , um z.B. zusätzliche Felder bei der SOLR-Indizierung (hier ein Link zur Doku, falls vorhanden) zu erzeugen. Die Liste wird im Property MCR.URIResolver.xslImports.{import_name} definiert.

MCR.URIResolver.xslImports.{import_name}={xsl_file1},{xsl_file2}...
          
xslImport:{import_name}:{xsl_file...}

MCR.URIResolver.xslImports.components=first.xsl,second.xsl

<xsl:import href="xslImport:components:first.xsl"/>

redirect:[RedirectAlias]

liest das Alias-Property und leitet die Daten an die URL weiter, welche im Property MCR.URIResolver.redirect.{alias} definiert ist.

MCR.URIResolver.redirect.{alias}={href}

MCR.URIResolver.redirect.alias=webapp:path/to/alias.xml

notnull:[URI]

dieses Vorschaltelement für andere URI stellt sicher, dass es bei Aufruf der genannten URI keine NullPointerException gibt. Sollte es bei Verarbeitung der anhängenden URI eine Exception geben, wird diese geloggt. Im Falle einer Exception oder wenn die URI den Wert NULL zurückgibt, liefert dieser Resolver stattdessen eine leere XML-Datei. Dies ist z.B. hilfreich, um in XSL Stylesheets URIs zu verwenden, aber gegen Fehler abzusichern.

notnull:{uri}

notnull:mcrobject:DocPortal_document_07910401

xslStyle:[stylesheet][param]:[URI]

dieses Vorschaltelement für andere URI wendet das Stylesheet [stylesheet] auf die XML-Auagabedatei der nachfolgenden URI an und gibt das Ergebnis als XML zurück. Das Stylesheet befindet sich im Classpath der Anwendung. Die Extension .xsl entfällt im Parameter {stylesheet} .Es ist als möglich noch Parameter zu übergeben und der Ausgabe von einem Stylesheet gleich durch ein zweites zu weiterzuleiten.

xslStyle:{stylesheet},{stylesheet}{?param1=value1{&param2=value2}}:{anyMyCoReURI}

xslStyle:mycoreobject-mods,mods2dc?derivate=mycore_derivate_00000001:mcrobject:mycore_doc_00000001
Dabei würde das Objekt erst in ein MODS-Dokument umgewandelt, um danach letztendlich als Dublin-Core-Dokument ausgegeben worden zu sein.

xslTransform:[TransformParms]

dieses Vorschaltelement funktioniert wie xslInclude . Nur wird ein definierter MCRContentTransformer verwendet, statt einer vordefinierten Liste von Stylesheets. Im gegensatz zu "xslStyle" ist das Verhalten also noch konfigurierbar und prinzipiell nicht auf "XSL" beschränkt.

xslTransform:{stylesheet}[?param1=value1[&param2=value2]...]:{anyMyCoReURI}

xslTransform:mycoreobject-txt:file:object.txt

data:[DataURLParams]

liefert den Inhalt einer Data-URL zurück.

data:[mime-type[;param1=value1[;param2=value=2]]]{,content}

data:text/html;charset=utf-8,%3Ch1%3EHello%20MyCoRe!%3C%2Fh1%3E

MCRURIResolverFilter

Der MCRURIResolverFilter liefert, bei XML- oder HTML-Output und wenn der Log-Level von MCRURIResolver auf DEBUG steht, Debug-Informationen als Kommentar im Quelltext, welche URIs während der Erstellung aufgerufen worden sind. In der richtigen Reihenfolge und ggf. auch mit Referrer. Da er standardmäßig mit eingebunden ist, muss man bis auf besagten Log-Level nichts konfigurieren.

Erweiterung des URI-Resolvers

Unter Umständen kann es nötig sein den URIResolver für eigene Anwendungen zu erweitern. Dabei ist es nicht möglich vorhandene URI-Schemas zu überschreiben, jedoch neue den bereits vorhandenen hinzuzufügen. Für jedes Schema z.B. file gibt es einen Resolver, der entsprechende URIs auflösen kann. Dieser Resolver muss die Schnittstelle MCRURIResolver.MCRResolver im Paket org.mycore.common.xml implementieren. Für die Zuweisung eines Schemas zur MCRResolver -Implementierung ist der MCRResolverProvider verantwortlich, der diese Schnittstelle aus MCRURIResolver implementiert. Letzterer stellt eine Abbildung von Schema-Strings zu MCRResolver -Instanzen zur Verfügung. Der MCRResolverProvider kann also beliebig viele MCRResolver zu den bereits in MyCoRe integrierten hinzufügen. Eingebunden wird ein zusätzlicher MCRResolverProvider mittels folgendem Property MCR.UriResolver.externalResolver.class = {voller Klassenname}

 Thomas Scheffler, Wiebke Oeltjen, Jens Kupferschmidt - 2015-06-16