Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Applets oder Anwendung

<< < (2/4) > >>

Axel_Janssen:
FRAGE AN RALF: Wie stelle ich bei Netbeans ein, daß es die Notes-VM benutzt (vereinfacht das Testen).

Hatte nun die erwartete Begegnung der 3. Art.
In der ComboBox cbWoche tausche ich an einer Stelle alle Items aus (wenn der User ein neues Jahr wählt).
Etwa so:

--- Code: ---cbWoche.removeAllItems();
      for (int i=0; i < selectionWeeks.size(); i++) {
            WeekInfoVO temp = (WeekInfoVO) selectionWeeks.get(i);      
            cbWoche.addItem(temp.getFormatedElement());
        }

--- Ende Code ---


JComboBox.addItem() ruft intern das entsprechende ActionPerformed-Event auf. Sowas muß man natürlich wissen. Steht nur leider nirgendwo. Dies führte in meinem code dann dazu, daß das Modell der ComboBox während des Item-Wechsels auf einen ItemIndex gesetzt wurde, der nicht existiert.

Die Java14 VM hält diesen unstabilen Zustand aus, ohne einen ArrayIndexOutOfBound-Exception zu werfen. Die 1.3-VM in Notes leider nicht.  Bücher und Newsgroups schwiegen zu diesem speziellen Problem. Habe jetzt einen workaround gefunden. Das Finden der Ursache hat aber jetzt genau 5 Stunden 30 Minuten gedauert.

Erwarte noch weitere solcher Subtilitäten in der komplexen Swing-API.

Vorsätze für Besserung:
- immer die gleiche VM für Entwicklungs- und Targetplattform zu verwenden.
- Log4U einsetzen. Der debugger startet mir einfach zu langsam. Debuggen dauert mir zu lange. Deshalb arbeite ich derzeit mit System.out.println(). Eine vernünftige Strategie mit log4U ist vermutlich das beste.

Ralf_M_Petter:
Hallo Axel!

Freut mich, dass du dich jetzt doch mit Applets beschäftigst. Leider für dich bin ich derzeit in Urlaub und habe daher nicht Zugriff auf meine Sourcen und Netbeans. Das mit der JVM geht über irgendeine Konfigurationsdatei, Wie man das direkt in Netbeans machen kann weiß ich auswendig nicht. Aber frag mal auf der Netbeans Seite. Das Debuggen langsam ist, kann ich nicht ganz nachvollziehen, wenn ich ein Applet im Debugger starte, startet es nicht langsamer als wenn ich es Normal starte.

Etwas anderes, du musst bei Jtable und Zugriff auf Notes unbedingt ein eigenes Datenmodell verwenden. Sonst wird es für die Zukunft nichts. In den jeweiligen Get Methoden der Zellen, kommt dann der Zugriff auf Notes hinein. Das funktioniert super. Ich habe das selber bereits gemacht. Übrigens so richtig geil wird JTable, wenn du eigens programmierte Renderer und Editor für die Zelle verwendest. Aber auch schon ein Jslider in einer Zelle sieht ziemlich gut aus. Probier es einfach mal aus. Wenn ich nächste Woche wieder in der Firma bin, poste ich mal ein Tablemodell mit Notes Unterstützung.

Grüße

Ralf

Axel_Janssen:
Hi Ralf,

schönen Urlaub.
Das geht eigentlich ziemlich gut mit dem Applet. Bisher war das auch bedeutend schneller als ich dachte. Sowohl Runtime als auch Entwicklungszeit. 8)

Der Debugger ist nicht schlecht, aber ich meine diesen ganzen Prozess des breakpoint-setzen, Variablen inspizieren, etc.
Mein Ziel ist es so gut planen zu können, dass ich das nur noch in Ausnahmefällen brauche (o.k. ist noch ein weiter Weg). Ich versuche die Klassen auch immer so zu machen, dass ich auch immer Teile testen kann. Hast du dich mal mit JUnit beschäftigt? Da schreibt man zuerst den Test und dann die Klasse. Tendentiell finde ich das nicht schlecht, aber ein bischen zu extrem.
Wenn ich aber eine funktional kohäsive NotesConnection Klasse schreibe, bekommt die eine main und ich teste die direkt. Je kleiner die Einheiten sind, die ich unmittelbar teste, desto weniger benötige ich den debugger.
UML - Skizzen (im Sinne von mies aussehenden Zeichnungen) helfen mir auch dabei.

Ich habe ein eigenes Modell (extends AbstractTableModel), dass auf eine andere Klasse NotesConnection zugreift, um mit Notes zu kommunizieren.
Das geht.

Ich kann mir aber die Daten nicht in einem Schwung holen (könnnen schon, aber es ist vielleicht nicht so sinnvoll). Vielmehr kann der User eine Woche auswählen und das Applet holt sich dann alle Wochen-Daten von Notes.

Nervig ist, dass wenn ich mit sinitThread, stermThread arbeite, eigentlich keine Notes-Objekte in Instanzvariablen der NotesConnection_klasse abgelegt werden können.
Ich dachte erst: Im Konstruktor das (NOtes)Database Objekt initialisieren und dann in der Methode getMAs () dieses wiederverwenden. Das geht aber zumindest mit sinit/stermThread nicht, weil ich eine can't access Object, cause it was recyclet or sonstwas Meldung bekomme.  ::) stermThread() macht die Objekte wohl unbrauchbar. Werde das jetzt nochmal genauer lesen. Es gibt ja auch andere Möglichkeiten NotesThreads zu verwalten. Obwohl... wenn ich genau darüber nachdenke. Vielleicht geht das auch gar nicht. Vielleicht ist diese Notes_Klasse zwangsläufig statuslos. Sonst kann es nämlich sein, dass der User zwischen 2 aufrufen das Applet schliesst und dann werden die Objekte nicht recyclet. Das will ich unter allen Umständen vermeiden.

Editoren kommen später. Sonst kann ich das Applet ja nur angucken und keine Daten dort reinschreiben. ;)

Hier ist Screenshot. Die Personen kommen aus der Notes-Datenbank.  

Axel_Janssen:
O.k. vielleicht brauche ich das von einem Performance-Standpunkt für diese Applikation nicht. Vielleicht aber schon. Ich habe 768 MB Arbeitsspeicher. Notes-Client und -Server sind auf einer Maschine.

Caching von Notes-Objekten in Instanzvariablen?

Wie wäre es damit (bin mir echt nicht so sicher, ob ich das alles richtig verstehe):
So in der Art, ohne daß ich es jetzt ausprobiere:


--- Code: ---package de.aja.db;
import java.util.*;
import lotus.domino.*;

public class NotesConnection extends NotesThread {
   
    Database nDbCurrent;
    Session nSession;
    View nViewMAs;
    String serverName;
    String serverPath;
   
    public static NotesConnection factory(HashMap appletParameters) {
     if (nConnection == null) {            
        nConnection = new NotesConnection(appletParameters);  
     }
     return nConnection;
    }

    /** Creates a new instance of NotesConnection */
    public NotesConnection(HashMap appletParameters) {
         serverName = (String) appletParameters.get("dbServerName");
         serverPath = (String) appletParameters.get("dbPathName");
        this.serverName = serverName;
        this.serverPath = serverPath;
    }


     runNotes () {
       try {
         if (nSession == null) {
              nSession =NotesFactory.createSession();
         }
          if (nDbCurrent == null)  {
                 nDbCurrent.getDatabase(serverName, serverPath);
           }
            if (nViewMAs == null) {
                  nViewsMAs = nDbCurrent.getView("vMAs");
             }
       
            Vector vecMAs = new Vector();
           
            Document nDoc = null;
           
           
            nDoc = nViewMAs.getFirstDocument();
            while (nDoc != null) {
                                        vecMAs.add(nDoc.getItemValueString("userNameAbb"));
               
                nDoc = nViewMAs.getNextDocument(nDoc);  
            }
// do more business logic stuff            
// von hier TableModel über invokeLater()  evtl. invokeAndWait() aktualisieren.
// weil Swing-Komponenten nur so von einem anderen Thread
// als dem berühmten event dispatch thread sicher aufgerufen
// werden können
             
        } catch (NotesException e) {
              // do recycle() stuff
               e.printStackTrace();
        } finally {
        }  
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
      //
   }    
}

--- Ende Code ---

Diese Klasse wird von TableModel initialisiert. Von dort wird auch die runNotes-Methode aufgerufen.
Am besten im init() des Applets (erzeugt das TableModel und delegiert zu ihm die Initialisierung des Notes-Thread. Und Notes-Thread in destroy von der Applet-Klasse beenden. Einfach ist das nicht.  ::)

Axel

Axel_Janssen:
Mit Netbeans für Notes entwickeln.
Sobald man anfängt aus dem Applet auf LoNo zuzugreifen, wird es ein bischen kompliziert.

Da spielt die Sandbox nicht mit, was auch zu erwarten war.
SecurityAccessControlException. JaJa.
Es gibt ja nun seit Java2 Möglichkeiten, die Sandbox policies liberaler zu gestalten. Beschäftige mich damit aber später (Ralf weißt du wie das geht?).

Es erschien mir weniger risikoreich (Donnerstag soll jemand präsentieren) einfach zusätzlich eine standalone gui zusammenzuklicken und damit zu testen. Hat 1 Stunde gedauert. Läuft. Dabei habe ich auch gleich noch den Applet code ein bischen ausgemist ...öhem refaktoriert.

---
Nicht Corba - Applets müssen den Servernamen, Pfad der Datenbank von aussen bekommen? Also nicht wie in Agenten

--- Code: ---Database db = AgentContext.getCurrentDatabase() // oder so ähnlich

--- Ende Code ---
 
Bin mir da ziemlich sicher. Das kann man aber ganz einfach lösen, da die Appletparameter in der Notes-Maske auch mit Formelsprache geschrieben werden können. @Subset(@dbName; 1); und @Subset(@dbName; -1);  
Die packe ich dann alle in eine HashMap und schicke sie dahin, wo ich sie brauche. Man kann die HashMap dann auch als statisches Property in eine für alle interessierten zugängliche ConfigKlasse legen. Ärgerlich ist nur, daß ich mich gestern nacht genau 4 mal bei den Namen verschrieben habe. ::) Da beginnt einen der jar-Editor von Netbeans zu nerven. Werde glaub ich auf Ant umsteigen. Das hilft aber auch nix in Notes. Da muß man alles von Hand machen. Applet in Ressourcen der db legen. Applet in Seite einbinden. Parameter eintippen (mit Formel).
Vielleicht kann man diesen Notes-Arbeiten auch via Database als xml rausschreiben, xml ändern, aus xml wieder Datenbank machen automatisieren. Ich glaube das ist relativ viel Arbeit.

Btw: Applets in Notes sind wirlich nicht schlecht. In Notes finde ich es oft so nervig, dauernd irgendwelche Dokumente zu öffnen und auf Buttons zu klicken. Mit Applets kann man die GUI eben wesentlich besser auf die wirklichen User-Bedürfnisse customizen.

Swing macht mir auch bedeutend mehr Spaß als vor 1.5 Jahren. Allgemeines Java/OO-Wissen hilft eben für alle Java-Aufgaben :) .
Außerdem ist das wegen VM-Verbesserungen und so wesentlich schneller geworden.
 
Hier ist eine interessante Diskussion zum Thema Swing vs. SWT:
http://www.logemann.info/day/archives/000008.html
Es existieren eben eine Reihe von Tools/Libraries/Frameworks und alle haben ihre Vor- und Nachteile.
Man kann sich sicher auch noch darüber Gedanken machen, ob man auf Swing noch weitere Helferlein draufsetzt (z.B. existieren frameworks, wo man die GUI als xml Dok beschreibt. Aber da kenne ich mich noch nicht so aus mit.

Axel

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln