Autor Thema: java - db.open  (Gelesen 1270 mal)

klaussal

  • Gast
java - db.open
« am: 27.05.03 - 19:18:07 »
hi zusammen,

folgendes prob:
wenn dieser code auf eine db stösst, für die er keinen zugriff hat, fliegt er über catch execption raus.
frage: wie drehe ich es, dass er diese db ignoriert und mit getNextDatabase weitermacht ? ??? ???
(versuche gerade meinen ersten java-agenten zu basteln; deshalb noch nicht ganz fit darin  :'( ).

vielen dank vorab für tipps !

Database db = dir.getFirstDatabase
            (DbDirectory.DATABASE);
while (db != null) {
db.open();
if (db.isOpen()) {
DocumentCollection dc = db.getAllDocuments();
System.out.println("Last modified: " +
db.getLastModified().getLocalTime() + dc.getCount());
              }
db = dir.getNextDatabase(); }
.
.
.
.
} catch(Exception e) {
e.printStackTrace();

Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
Re:java - db.open
« Antwort #1 am: 27.05.03 - 19:44:03 »
Ich habs nicht getestet, aber so ungefähr, mein ich jedenfalls.
fliegt er über catch execption raus.
Wo genau fliegt er raus?

Ich vermute bei der Zeile:
db.open();
d.h. kann eigentlich nicht sein. Bitte poste den stackTrace.

Hier 2 Ideen
Du kannst try-catches natürlich auch schachteln. Lass also alles wie es ist, ersetze nur deine Zeilen mit:


Database db = dir.getFirstDatabase
            (DbDirectory.DATABASE);
while (db != null) {
try {
db.open();
if (db.isOpen()) {
DocumentCollection dc = db.getAllDocuments();
System.out.println("Last modified: " +
db.getLastModified().getLocalTime() + dc.getCount());
} // end db.isOpen
db = dir.getNextDatabase();

} // end if try
catch (Exception e) {
System.out.println("Datenbank konnte nicht geöffnet werden...");
db = dir.getNextDatabase();
} // end catch
} end while
.
.
} catch(Exception e) {
e.printStackTrace();

...oder eigentlich ist es schlechter Stil, error-handling für den Programm-Fluss zu nutzen.
warum nicht einfacher

Database db = dir.getFirstDatabase
            (DbDirectory.DATABASE);
while (db != null) {
// db.open() returns boolean
if (db.open()) {
DocumentCollection dc = db.getAllDocuments();
System.out.println("Last modified: " +
db.getLastModified().getLocalTime() + dc.getCount());
} // end db.open())
db = dir.getNextDatabase();
}
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

klaussal

  • Gast
Re:java - db.open
« Antwort #2 am: 28.05.03 - 07:48:20 »
hi axel,
erst einmal vielen dank, dein tipp wird gleich getestet.
doch, er fliegt beim open raus, weil ich keine zugriffsberechtigung habe. wie ich ein java-pgm debugge, habe ich noch nicht herausbekommen. bin eben noch ein java-anfänger (unds stehe hier alleine auf weiter flur)... :-\

klaussal

  • Gast
Re:java - db.open
« Antwort #3 am: 28.05.03 - 08:35:48 »
hi axel,

lösungsvorschlag 1 hat gefunzt, nr. 2 leider nicht, weil es hier einige db's gibt, auf die anscheinend kein mensch zugriff hat(  ???).

DANKE  :D

Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
Re:java - db.open
« Antwort #4 am: 28.05.03 - 10:22:45 »
(gehe davon aus wir reden über Domino5)
A. debuggen:
-> bei Notes Menü File // Tools // Java Debug Console
bekommst das gleichnamige Teil.
Hier kannst du zumindest mit System.out.println debuggen (so habe ich auch in nicht ganz kleinen Projekten gearbeitet).

--> Es gibt eine Möglichkeit über Visual Age for Java (Agent Runner). Ich war nie ein grosser VAJ Freund, habe aber den Agent Runner mal gestestet. lief. Falls ihr kein VAJ habt, würde ich es mir schenken. Lohnt sich nicht. Die Nachfolgeprogramm Galaxis Eclipse/WSAD & Plugins bietet meines Wissens keine Testumgebung für Domino - Agenten. Kann mich aber hier auch irren.

--> Bei wirklich grösseren Projekten entweder darüber nachdenken auf Domino6 upzugraden oder sich mit Log4u (logging framework) beschäftigen. Das ist zwar auch kein debugging, aber sehr viel besser als System.out..

B. Code
gut.

Offenbar, wenn man keine Berechtigungen auf die Datenbank hat, wirft database.open() immer eine NotesException. Ich dachte es würde nur false zurückgeben, stimmt aber nicht.
Warum eigentlich?
Hat vermutlich irgendwelche Sicherheitsgründe.

Die erste Lösung funktioniert aber bei mir (Version 5.08). (ohh bei dir ja auch...)
Der Trick ist das "innere try-catch".
Das ist so wie ich das gemacht habe nicht ganz die feine englische.
So schlimm ist das aber wieder auch nicht.

Es wird ja jegliche Exception im catch der System.out.println("Datenbank konnte nicht geöffnet werden...");
abgefangen.
Hier könnte man nach Optimierungen suchen.
Also erstmal catch NotesException.
Und dann vielleicht noch feingranularer auf die spezifische Exception eingrenzen (versuchtes open, ohne das user Zugriff hat).
Denke drüber nach, wenn ich Zeit habe.

Exceptions und try-catch werden besser als ich das je könnte im gratis downloadbaren Handbuch der Java Programmierung (3. Auflage) erklärt http://www.javabuch.de, Kapitel 12.


hier ist code:
wäre unnötig, wenn ich lesen könnte

Schreibe nur den richtigen SERVER_NAME da hin.

import lotus.domino.*;

public class JavaAgent extends AgentBase {
   
   private static String SERVER_NAME = "srv01";
   
   public void NotesMain() {

      try {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();
         DbDirectory dir = session.getDbDirectory(SERVER_NAME);  
         Database db = dir.getFirstDatabase (DbDirectory.DATABASE);
     
         while (db != null) {
            try {
               db.open();
               if (db.isOpen()) {
                  DocumentCollection dc = db.getAllDocuments();
                  System.out.println("Last modified: " +
                  db.getLastModified().getLocalTime() + dc.getCount());
               } // end db.isOpen
               db = dir.getNextDatabase();

            } // end if try
            catch (Exception e) {
               System.out.println("Datenbank konnte nicht geöffnet werden...");
               db = dir.getNextDatabase();
            } // end catch
         } //end while


      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}



Halt. Noch ein Bonutip
Was mir mal 1 Tag gekostet hat, war die Tatsache, das viele Methoden, die in Skript in NotesSession stehen, in der Java Implementierung der Domino-Klassen in AgentContext stehen. Also
getCurrentDatabase
getDocumentContext
etc.
Ansonsten ist das quasi wie LotusScript
« Letzte Änderung: 28.05.03 - 10:34:48 von Axel_Janssen »
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz