Als erstes muss man die Notes API (com.ibm.notes.java.api und com.ibm.java.ui) dem Plugin als Abhängigkeit hinzufügen.
Als Beispiel habe ich eine scriptlibrary mit einer Funktion getUmsatz mit den Parametern Kundennummer und Jahr hergenommen. In der Funktion der Scriptlibrary werden aufwendige Datenbankzugriffe und Berechnungen durchgeführt, die wir in java nicht nachprogrammieren wollen.
Da man von Java nicht direkt auf die Library zugreifen kann, braucht man als erstes einen kleinen Agent der als Brücke zwischen dem Plugin und der Scriptlibrary fungiert.
Option Public Option Declare Use "UmsatzScriptLibrary" Sub Initialize Dim ses As New NotesSession Dim context As NotesDocument Set context=ses.Documentcontext Call context.Replaceitemvalue("umsatz", getUmsatz(context.Getitemvalue("kundenNummer")(0), context.getItemValue("jahr")(0))) Print context.Getitemvalue("umsatz")(0) context.save True,false End Sub
Der Agent macht nichts anderes, als dass er ein in Memory Dokument über den Dokumentcontext holt. Die Aufrufparameter für die getUmsatz Funktion ausliest und das Ergebnis der Funktion in der Variable Umsatz speichert. Natürlich konnte man den Agent auch dahingehend erweitern, dass in dem in Memory Dokument auch ein Parameter für die auzurufende Funktion mitgegeben wird und er dann die richtige Funktion aus der Scriptlibrary aufruft.
Wichtig bei dem Agent ist, dass man das Ziel auf "None" setzt. Sonst funktioniert der Zugriff auf das übergebene Dokument nicht zuverlässig.
Der Javateil ist etwas aufwendiger:
public static void berechneKundenUmsatz(String kundenNummer, int jahr) { try { // Starte den Zugriff auf den Workspace und erstelle ein // NotesAgentDataobjekt mit unserem Brückenagent. NotesUIWorkspace ws = new NotesUIWorkspace(); NotesAgentData data = new NotesAgentData(new NotesDatabaseData("", "test.nsf"), "agent"); // Füge die Aufrufparameter für die Scriptlibrary dem data Objekt // hinzu. Diese werden später im documentcontext als Items // verfügbar. data.addItem("kundenNummer", kundenNummer); data.addItem("jahr", new Integer(jahr).toString()); // Erstelle ein Callback Objekt. die Methode done dieses Objekts // wird nach Ausführung des Brücken Agent aufgerufen. NotesDocumentDataCallback callBack = new NotesDocumentDataCallback() { @Override public void done(final NotesDocumentDataEvent event) { // Erstelle einen Notessessionjob in dem wir auf das // zurückgegebene Dokument zugreifen können. NotesSessionJob job = new NotesSessionJob( "verarbeite Ergebnis") { @Override protected IStatus runInNotesThread(Session session, IProgressMonitor arg1) throws NotesException { // Lade das Dokument, dass der Agent mit dem // Ergebnis befüllt hat. Document doc = event.getDocumentData() .open(session); // Speichere das Resultat in einer Finalen Variable, // dass wir es im UIThread weiterverwenden können. final double result = doc .getItemValueDouble("umsatz"); // Mache irgendetwas im UI mit dem Resultat. In // unserem Beispiel eine Dialogbox anzeigen. Display.getDefault().asyncExec(new Runnable() { @Override public void run() { MessageBox box = new MessageBox(PlatformUI .getWorkbench() .getActiveWorkbenchWindow() .getShell()); box.setMessage("Das Ergebnis ist: " + result); box.open(); } }); return Status.OK_STATUS; } }; // starte den Notesjob job.schedule(); } }; // Führe den Agent mit dem data und callback Objekt aus. Der letzte // Parameter bedeutet, das der UIContext keine Rolle spielt. Das // heißt es ist egal auf welches Dokument im UI derzeit geöffnet // ist. ws.runAgent(data, callBack, false); } catch (NotesException e) { e.printStackTrace(); } }Das ist jetzt natürlich nur ein kleines Beispiel, bei dem der Aufwand vielleicht nicht dafür steht, aber in dem Lotusscript agent kann auch auf das UI zugegriffen werden. Das heißt der Agent kann Dialoge anzeigen und er kann auch mehrere Werte oder eine ganze Liste als Ergebnis zurückliefern. Damit kann man auch bei der Entwicklung von Plugins sehr leicht bestehenden Code wieder verwenden.
No comments:
Post a Comment