JAR2NSF

von jNotes - Team

Für Notes-Entwickler, die sich mit der Java-Welt anfreunden wollen, ist die Hemmschwelle für eigene Entwicklungen relativ hoch. Ein Grund dafür ist die Vielzahl existierender Java-Klassen, die oft nur auf für Notes unübliche Weise dokumentiert sind. Offizielle Dokumentationen zu verfügbaren Java-Klassen sind oft erst spät erhältlich und zeigen nur einen kleinen Teil der implementierten Klassen und deren Methoden.

Mit diesem Problemhintergrund wurde das Werkzeug "JAR2NSF" entwickelt, das in der Lage ist, aus jedem Java-Archiv (JAR-Dateien) eine Dokumentation sämtlicher darin enthaltenen Klassen als Notes-Datenbank zu erzeugen.

Das Tool erzeugt für jede Klasse eines Archivs ein Dokument, das neben sämtlichen Methoden der Klasse auch wichtige Informationen wie Vererbungs- und Implementierungsbeziehungen oder die Klassen/Interfaceeigenschaften enthält.

Arbeitsweise

Eins vorneweg: JAR2NSF benutzt keine verbotenen Cracker oder Decompilierer, sondern arbeitet vollständig mit Werkzeugen aus dem Sun JDK. Dieses enthält zwei Kommandozeilenwerkzeuge, die wir für die Umwandlung der JARs in eine NSF benötigen:

  1. JAR: Das Java-Archivierungswerkzeug JAR gestattet es, beliebige Dateien zu einer JAR-Datei zusammenzupacken und diese wieser aus JAR-Dateien zu extrahieren.
  2. JavaP: JavaP ist ein mit dem Sun JDK ausgeliefertes Werkzeug, das es gestattet, aus dem Bytecode einer *.class-Datei eine Interfacebeschreibung der Klasse im Java-Quellcode zu erzeugen.

Auf der Grundlage dieser beiden Tools arbeitet ein LotusScript-Agent, der die Dokumentation für eine JAR-Datei in folgenden Schritten generiert:

  1. Aus dem Archiv wird eine Liste aller enthaltenen Java-Klassen extrahiert und in einer Textdatei gespeichert. Die einzelnen *.class-Dateien werden extrahiert.
  2. Anhand der Datei mit der Liste der im Archiv enthaltenen Klassen wird für jede Klasse JAVAP.EXE gestartet und eine Textdatei mit der Interfacebeschreibung erzeugt.
  3. Für jede generierte Interface-Beschreibungsdatei wird ein Notes-Dokument erstellt und eingelesen.
  4. Nach dem Einlesen der Interfacebeschreibungen werden für jede Klasse die Implements- und Extends-Angaben ausgelesen und in eigenen Feldern gespeichert.

Der ganze Prozess ist also nichts weiter als die Automatisierung von viel Handarbeit. Es werden jede Menge *.exe-Dateien gestartet, die mit Input versehen werden. Deren Output wird via Textdatei nach Notes übertragen.

Falls jemand wirklich am Quellcode interessiert ist, der bekommt ihn hier. Er ist allerdings überhaupt nicht aufbereitet und wird laufend weiterentwickelt. Bis jetzt gibt es erstmal bloß die Ergebnisse zu bestaunen: die vollständige Dokumentation der R5-Java-Klassen als Notes-Datenbank. Die ganze Applikation wird natürlich zur Verfügung stehen, sobald Sie fertig ist.

Sourcecode

Der vollständige Quelltext zum Script-Agenten, allerdings unkommentiert. Was man sich u.U. abgucken kann, ist das Handling für den Aufruf von externen Programmen und das Warten auf deren Ende.

 
     Set classdoc=doc.parentdatabase.createdocument
     classdoc.form="class"
     Line Input #f%,lin$
     p%=Instr(lin$,"class ")
     s1$=Mid$(lin$,p%+6)
     p%=Instr(s1$," extends ")
     If p%<>0 Then s1$=Left$(s1$,p%-1)
     classdoc.classname=s1$
     classdoc.classdef= lin$                       
                         'classdoc.save True,True
     Do
      Line Input #f%,lin$
      classdoc.getfirstitem("classdef").appendtotextlist(lin$)
     Loop Until Eof(f%)
     classdoc.jarfile=Mid$(doc.jarfile(0),Instr(doc.jarfile(0),"\")+1)
     myformula$=|_1:=@subset(classdef;1);
_2:=@RightBack("class "+_1;"class ");
_3:=@RightBack("interface "+_2;"interface ");
_4:=@Left(_3+" extends";" extends");
_5:=@left(_4+" implements";" implements");
                        
FIELD classname:=_5;
FIELD Extends:=@Left(@Left(@RightBack(_1;"extends")+"implements";"implements")+"{";"{");
FIELD Implements:=@Left(@RightBack(@Subset(classdef;1);"implements")+"{";"{");
FIELD objecttype:=@If(@Contains(_1;"class ");"class";"interface"); |
     r=Evaluate(myformula$, classdoc)
     classdoc.save True,True
    End If
    Close f%
    Forall o In doc.options              
     If o="0" Then Kill filename$ : Kill vs$
    End Forall
   End If
  End If
  Line Input #c%,vs$
 Loop
 Close c%
 Forall o In doc.options              
  If o="0" Then Kill temp$+"\classes.txt"
 End Forall
End Sub

Sub CreateBatchJar(temppath As String, jdkpath As String, arcpath As String)
 b%=Freefile
 Open temppath+"\get.bat" For Output As b%
 Print #b%,"set path=" + jdkpath
 Print #b%,"set classpath=%classpath%;"+arcpath+";"
 Print #b%,Left$(temppath,2)
 Print #b%,"cd " + temppath$
 Print #b%,"jar -xf "+arcpath+" "
 Print #b%,"dir /B "+temppath+"\*.class /s >"+temppath+"\classes.txt"
 Print #b%,"copy "+temppath+"\get.bat " + temppath+"\stop"
 Print #b%,"exit"
 Close b%
End Sub

Sub CreateBatchJavap(temppath As String, jdkpath As String, arcpath As String)
 b%=Freefile
 Open temppath+"\run.bat" For Output As b%
 Print #b%,"set path=" + jdkpath
 Print #b%,"set classpath=%classpath%;"+arcpath+";"
 Print #b%,"javap %1 >"+temppath+"\%1.java"
 Print #b%,"copy "+temppath+"\run.bat " + temppath+"\stop"
 Print #b%,"exit"
 Close b%
End Sub

Wie geht es weiter?

Natürlich wird alles bunter, schöner und größer:

  • Das Tool selbst wird hier veröffentlicht. Aber natürlich erst dann, wenn es auch ausserhalb meines Rechners läuft.
  • Das Tool wird besser. Hoffentlich durch Euch. Vorstellen könnte ich mir gut, das man JAR und JAVAP nicht mehr über eine Batch als EXE aufruft (ist ätzend langsam, könnt ihr glauben), sondern durch ein "echtes" Java-Programm ersetzt. Die JavaP- und JAR-Klassen gibt es irgendwo in der RunTime. Also, wenn mal einer Zeit hat, ransetzen!
erstellt am 27.02.2004 - nicht bewertet
Abgelegt unter: Java, Notes

Bewerten Sie diesen Artikel:


Senden Sie einen Kommentar

Name
E-Mail
Kommentar
FrageGATY-98TJBU (bitte diesen Wert in unten stehendes Feld eintragen)
Antwort