Autor Thema: Lotus Script execute mit Java  (Gelesen 2962 mal)

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Lotus Script execute mit Java
« 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

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: Lotus Script execute mit Java
« Antwort #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?

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Re: Lotus Script execute mit Java
« Antwort #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.

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: Lotus Script execute mit Java
« Antwort #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 »

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Re: Lotus Script execute mit Java
« Antwort #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

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: Lotus Script execute mit Java
« Antwort #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);

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: Lotus Script execute mit Java
« Antwort #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 ) ;
    }

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Re: Lotus Script execute mit Java
« Antwort #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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz