Mit InMemory-Agents lassen sich Agenten wunderbar in XPage-Applikationen integrieren. Die XPage wartet, bis der Agent durchgelaufen ist, und über den Documentcontext kann eine bidirektionale Kommunikation zwischen den beiden stattfinden. Ohne irgendwelche mehr oder minder dubiose Workarounds für das Zwischenspeichern von Werten (z.B. Speichern des Dokumentes, Arbeiten mit Profildokumenten, usw.) können auf diesem Weise bestehende LotusScript-Agenten in eine XPage integriert werden:
Hier ein kleines Beispiel mit einem Button, der einen Agent startet, und dessen Ergebnis auswertet :
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:button value="Label" id="button1"> <xp:eventHandler event="onclick" submit="true" refreshMode="complete"> <xp:this.action><![CDATA[#{javascript: var document = database.createDocument(); var agent = database.getAgent("InMemoryAgent"); agent.runWithDocumentContext( document ); print( document.getItemValueString("InMemReturn") ); }]]> </xp:this.action> </xp:eventHandler> </xp:button> </xp:view>
[In Rot: Der Aufruf des Agenten. Der Code nach dem Aufruf wird erst nach Laufen des Agenten ausgeführt ]
Der LotusScript-Agent für dieses Beispiel schreibt den aktuellen Zeitstempel in das übergebene Dokument:
Option Public Option Declare Sub Initialize Dim session As New NotesSession Dim doc As NotesDocument Set doc = session.Documentcontext doc.Appenditemvalue "InMemReturn", CStr(Now) End Sub
Der print-Befehl in der obigen XPage wird erst nach der Verarbeitung des Agenten ausgeführt; auf der Serverkonsole wird der aktuelle Datumsstring ausgegeben.
Natürlich kann es sich auch um einen Java-Agenten handeln, doch für beide gilt, daß der Haken „Run as Web user“ aktiviert sein muß:
Ist der Haken nicht aktiviert, erhält man ansonsten eine im ersten Moment nichtssagende Fehlermeldung serviert:
Exception occured calling NotesAgent.runWithDocumentContext (lotus.domino.local.Document) null
Die Meldung verwirrt im ersten Moment, und es ist das erste Mal, daß sich im Stack Trace eine wirklich aussagekräftige Information wiederfindet (man muß etwas suchen, hier stark verkürzt):
(…)
com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:304)
com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:261)
com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:291)
NotesException: Unable to pass doc context – Inner agent must run as webuser
lotus.domino.local.Agent.runWithDocumentContext(Unknown Source)
com.ibm.xsp.script.DominoHelper$5.run(DominoHelper.java:154)
(…)
[In Fett: Die erste aussagekräftige Stack Trace-Meldung. Es geht doch, liebe IBM!]