Function Mapper

In JSP-EL sind Funktionsreferenzen in Ausdrücken möglich. Dabei wird das Format <Präfix>:<lokaler Name>(…) verwendet. JSP-EL-basierte Ausdrucksmanager delegieren Auflösung derartiger Funktionsreferenzen an einen Funktions-Mapper. In Java ist der Funktions-Mapper eine Implementierung der javax.servlet.jsp.el.FunctionMapper-Schnittstelle. Die Aufgabe des Funktions-Mappers ist es, das Präfix und den lokalen Namen einer statischen Java-Funktion (einer Instanz von java.lang.reflect.Method) zuzuweisen, die von Expression Manager als Bestandteil der Auswertung von Ausdrücken aufgerufen werden kann.

Im Baustein „Expression Manager“ steht eine Implementierung eines Funktions-Mappers zur Verfügung. Dies ist ein OSGi-Dienst, der als Bestandteil des Expression Manager-Bundles bereitgestellt wird. Diese Implementierung erstellt eine Registrierung für die Funktionen, indem sie in den anderen im selben CRX-Container bereitgestellten Bundles eine Abfrage nach Funktionen durchführt, die von diesen Bundles zur Verwendung in Ausdrücken exportiert werden. Das Präfix und der lokale Name, die für den Funktions-Mapper angegeben werden, müssen danach einer der Funktionen in dieser aggregierten Registrierung zugewiesen werden können. Expression Manager unterstützt zwei Typen von Funktionen für den Export durch Bundles:
  • Remote-Funktionen: Diese Funktionen können Methoden zugewiesen werden, die in durch Beans implementierten Schnittstellen deklariert werden. Host-Bundles exportieren die Beans als OSGi-Dienste und über die Flex-Remoting-Funktionen. Remote-Funktionen können wie folgt aufgerufen werden:
    • über den serverseitigen Expression Manager aufgrund der Bereitstellung im selben CRX-Container

    • über den clientseitigen Expression Manager, da diese Funktionen über Flex-Remoting bereitgestellt werden

    Für Remote-Funktionen werden Präfixe verwendet, die mit dem Schlüsselwort „REMOTE_“ beginnen.

  • Lokale Funktionen: Diese Funktionen sind lokal und werden nur in der Laufzeit verwendet, in der die Ausdrücke ausgewertet werden. In Java entsprechen diese Funktionen statischen Funktionen, die für Java-Klassen definiert werden. In Flex entsprechen diese Funktionen normalen Methoden, die für ActionScript-Klassen definiert wurden. In der Expression Manager-Implementierung werden symmetrische lokale Funktionen angenommen, für die sowohl in Java als auch in Flex Implementierungen vorhanden sind.

    So könnte z. B. eine logische Funktion „str:substring(…)“ vorhanden sein. Die Java-Implementierung dieser Funktion könnte dann eine für die Java-Klasse „com.adobe.exm.java.StringUtils“ definierte „substring“-Methode sein, die Flex-Implementierung eine für die ActionScript-Klasse „com.adobe.exm.flex.StringUtilities“ definierte „substr“-Methode.

Bei jedem Präfix, das nicht mit dem Schlüsselwort „REMOTE_“ beginnt, wird angenommen, dass es zu einer lokalen Funktion gehört. Der Funktions-Mapper in Expression Manager kann beide Funktionstypen verarbeiten. Um sie zu unterscheiden, prüft er, ob das Präfix mit dem Schlüsselwort „REMOTE_“ beginnt oder nicht. Dieser Funktions-Mapper steht nicht als öffentliche Klasse zur Verfügung, die in Spring-Kontexten verwendet werden kann. Er ist ein OSGi-Dienst, der vom Expression Manager-Bundle gehostet wird, und muss mithilfe von BluePrint in benutzerdefinierte Spring-Kontexte der Bundles importiert werden, die die Funktionen nutzen sollen:
<bp:reference id="<mapper_id> " 
    interface="javax.servlet.jsp.el.FunctionMapper" 
filter="(exm.function.mapper.id=lc.exm.compositeFunctionMapper)"/>

Der importierte Dienst kann dann in die im benutzerdefinierten Spring-Kontext konfigurierte DefaultEXPEvaluator-Bean injiziert werden, wobei <Mapper-ID> als Referenz verwendet wird.