AtNotes Übersicht Willkommen Gast. Bitte einloggen oder registrieren.
05.08.20 - 12:27:16
Übersicht Hilfe Regeln Glossar Suche Einloggen Registrieren
News:
Schnellsuche:
+  Das Notes Forum
|-+  Lotus Notes / Domino 9
| |-+  ND9: Entwicklung (Moderatoren: Axel, eknori, Thomas Schulte, koehlerbv, m3)
| | |-+  Lotus Script execute mit Java
« vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Lotus Script execute mit Java  (Gelesen 648 mal)
HH
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 332



« am: 12.02.20 - 14:58:21 »

Hallo zusammen!

In einem Word-Dokument sollen Platzhalter durch Werte aus einem Dokument ersetzt werden. Dazu habe ich für jeden Platzhalter ein Platzhalterdokument erstellt, das entweder direkt den Wert des Feldes ausließt, oder aber den Wert mit einer @Function (evaluate) oder mit Lotus Script (execute) berechnet. Das rendering erfolgt derzeit mit Lotus Script.

Nun soll das Ganze ins Web gebracht werden. Meine Frage:

Kann ich in meinem Platzhalterdokument eine Java Methode (mit Parametern) hinterlegen, die zur Laufzeit mit Java aufgerufen wird und ein Berechnungsergebnis zurückgibt?

Ich hoffe, dass ich mich einigermaßen verständlich ausgedrückt habe. Meine Java-Kenntnisse sind recht begrenzt und ich bin für jeden Hinweis dankbar.

Gruß
Hubert
Gespeichert
Sven Hasselbach
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 316



WWW
« Antworten #1 am: 13.02.20 - 09:46:34 »

Es gibt hierfür verschiedene Möglichkeiten, von daher wäre es erst einmal interessant zu wissen, wie ihr die Anwendungen ins Web bringt bzw. mit welchem Technologiestack?

Und natürlich die Frage, warum es denn Java sein muß. Wäre Javascript auch eine Option?
Gespeichert

HH
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 332



« Antworten #2 am: 13.02.20 - 12:22:37 »

Bisher ist alles nur Planung. D.h. wir sind nach allen Seiten offen und Javascript wäre ggf. auch eine Option.

In einem Dialog im Browser würde ich die Parameter, die ich für meine Exporte benötige abfragen und dann über eine REST-Schnittstelle (<xe:restService>) an eine service Bean posten. Die holt sich dann die Platzhalterdefinitionen und das Office Template und bringt das dann mit den Daten zusammen. Ergebnis soll dann das gerenderte Word-Dokument als download sein.

Für Importe / Exporte nach Microsoft Office nutzen wir derzeit die Apache POI Klassen.
Gespeichert
Sven Hasselbach
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 316



WWW
« Antworten #3 am: 13.02.20 - 15:36:07 »

Ah, XPages. Das ist gut. Dann kann man SSJS nutzen (und damit ja auch Java-Code).


Hier ein Beispiel einer einfachen anonymen Funktion, die den übergebenen String zurück liefert:

1. Die anonyme Funktion
Zitat
function(param : string){  
   return param;
}


2. Die Funktion in einen String packen, und Klammern darum setzen:

Code:
var code = "(function(param : string){  return param; })";

3. Jetzt den eval ausführen und das Ergebnis direkt erneut ausführen mit einem passenden Parameter

Code:
eval(code)("bar")
« Letzte Änderung: 13.02.20 - 15:37:45 von Sven Hasselbach » Gespeichert

HH
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 332



« Antworten #4 am: 13.02.20 - 15:54:53 »

Danke Sven, das habe ich soweit verstanden.

Allerdings fehlt mir der Ansatz, wo ich das dann hinterlegen muss und wie ich daraus meinen Java-Code aufrufen kann. Wie schon erwähnt, bin ich da nicht unbedingt der Spezialist. Also, ein weiterer Hinweis dazu wäre nett.

Gruß
Hubert
Gespeichert
Sven Hasselbach
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 316



WWW
« Antworten #5 am: 13.02.20 - 18:46:07 »

Nur als Hinweis: Es gibt neben den Standard-Java Libraries auch Tools wie z.B. den Runtime Compiler von OpenHTF https://github.com/OpenHFT/Java-Runtime-Compiler.

In SSJS ist die Nutzung von Java-Code von Haus aus vorgesehen. SSJS sind Strings, die von der JVM zur Laufzeit interpretiert werden, dass muss man also nicht nochmal neu erfinden. Der Vorteil von SSJS ist, dass Du sämtliche Classloader-Problematiken umgehst, und sofort Zugriff auf die Domino-Umgebung/NSF-Klassen hast, da quietscht es sonst manchmal ganz gewaltig. Auch wenn es um "dynamische Parameter" geht, ist Javascript aufgrund seiner - nennen wir es in diesem Fall "Flexibilität" - von Vorteil.

So kannst Du Dir also eine SSJS - Funktion aufbauen, die direkt auf deinen Java-Code zugreift. Um Java-Klassen wie z.B. Apache-POI aufzurufen, kannst Du diese ja direkt einbinden.

Mit dieser anonymen SSJS-Funktion würde der Name und die aus Java stammende Nano-Time direkt zurück gegeben:
Code:
function(name : string){ 
   return "Hello " + name + "! - " +java.lang.System.nanoTime() ;
}

Ich baue mir immer simple Java-Klassen als Wrapper, die letztlich nur die Parameter aufnehmen, und der "echte" Code wird dann in Java ausgeführt. Keine Lust, alles von Java nach SSJS zu portieren, ist aber natürlich machbar.

In Javascript kann ich eine Funktion zur Laufzeit in einer Variable "parken" (so funktionieren die ganzen Callbacks). Wie ich diese befülle (also auch zur Laufzeit geladener Code aus einem Notes-Dokument) ist meine Entscheidung (=> http://hasselba.ch/blog/?p=832).

Das vorige Beispiel des Evals kann man auch wie folgt abändern:
Code:
var myCode = eval(code);

Wenn du dir den Datentyp von myCode anschaust, wirst du feststellen, dass es vom Typ JSFunction (oder so ähnlich) ist.

In Javascript ist es dann möglich, die Variable mit zwei Klammern auszuführen:
Code:
varCode();

Und per Definition kann ich auch beliebig viele Parameter übergeben, da gibt es keine Begrenzungen. Wenn ich also sowas aufrufe, führt es nicht zu Problemen während der Laufzeit (keine Defintion der Parameter notwendig; man kann die weglassen oder einfach welche ergänzen):
Code:
varCode(1,2,3,4,5,6);
Gespeichert

Sven Hasselbach
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 316



WWW
« Antworten #6 am: 14.02.20 - 10:09:02 »

Um das noch ein wenig zu konkretisieren:

In deinem REST-Service hast du SSJS Code, der den eigentlichen auszuführenden Code aus einem Konfigurations-Dokument o.ä. lädt, mit eval() in eine Funktion umwandelt und diese dann mit den notwendigen Parametern ausführt. Also grob so etwas:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex">

<xe:restService pathInfo="/foo">

<xe:this.service>
<xe:customRestService>
<xe:this.doGet><![CDATA[#{javascript:
function ladeCode(codeId:string) : string {

// hier wird der Code geladen
return geladenerCode;

}

var code = ladeCode( 'CodeID' );
var func = eval( '(' + code + ')' );


return func( 'bar' )
}]]></xe:this.doGet>
</xe:customRestService>
</xe:this.service>
</xe:restService>

</xp:view>


In dem Code-Dokument ist dann einfach eine anonyme(!) Funktion hinterlegt, z.B. so etwas:
Code:
    function(foo:string){
        return foo;
    }

In dieser anonymen Funktion kannst Du dann deine Java-Klassen aufrufen:
Code:
    function(excelSheetName: string, docId: string){
        return com.example.ExcelGenerator( excelSheetName, docId ) ;
    }
Gespeichert

HH
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 332



« Antworten #7 am: 14.02.20 - 12:42:18 »

Hallo Sven,

danke für die ausführlichen Antworten! Werde mal versuchen, das in den nächsten Tagen umzusetzen.

Gruß
Hubert
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS
Impressum Atnotes.de - Powered by Syslords Solutions - Datenschutz | Partner: