Autor Thema: Java Agent wirft Fehler "Special database object cannot be located"  (Gelesen 8670 mal)

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Hallo Forum,

ich erhalte die Fehlermeldung "Special database object cannot be located" bei folgendem Java Agent Quellcode.

Nach meinen Recherchen ist diese Funktion wohl die Einzigste innerhalb von Lotus Notes, welches mir den kompletten HTML/MIME Code eines Dokuments im Backend zurückliefern kann, um diesen als EML File abzuspeichern.

Der Code soll mir den Dokumentstream zurückgeben, damit ich diesen als EML File abspeichern kann.

Sowohl der Versuch mit "doc.getHttpURL();" als auch der manuelle Versuch danach werfen den gleichen Fehler.
Der Fehler tritt  beim Befehl: InputStream streamIn = docURL.openStream(); auf.

Hier der Auszug aus dem Quellcode:

Code
		//Dokument aus der Ansicht holen und transformieren
			AgentContext agentContext = session.getAgentContext();
			db = agentContext.getCurrentDatabase();
			view = db.getView("aTest1");
			doc = view.getFirstDocument();
			
			
			System.err.println(" ");
			System.err.println("#### Start ####");
			System.err.println("doc.getUniversalID(): " + doc.getUniversalID());
			String docid = doc.getUniversalID();
			//notesURL = "/" + db.getFilePath() + "/" + view.getName() + "/" + docid + "?OpenDocument";
			String notesURL = doc.getHttpURL();
			System.err.println("notesURL: " + notesURL);
			
			notesURL = "http://xxvvzz/__C12578D200357B40.nsf/aTest1/C2AAA058435D4BD0C125794900441DB0?OpenDocument";
			System.err.println("notesURL: " + notesURL);
			
			URL docURL =new URL(notesURL);
			System.err.println("100");
			InputStream streamIn = docURL.openStream();
			System.err.println("110");

In der Anwendung gibt es eine Ansicht die mit dem * für die Defaultview gekennzeichnet ist.
Dies war meine erste Vermutung!

Sowohl das Dokument als auch die Ansicht "aTest1" (zweiter Versuch) sind definitiv vorhanden.

Was kann noch den Fehler werfen?

Anbei der Screenshot von der Serverkonsole.

Systemumgebung:
- Domino 8.5.2 FP3 deutsch
- Lotus Notes 8.5.3 deutsch

Grüße
Legolas


Arbeite klug, nicht hart.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Zur Not kannst Du das Framework benutzen, dass ich in diesem Thread entwickelt hab:
http://atnotes.de/index.php/topic,52899.20.html
Ist zwar ein bischen dappisch, mit jakarta HTTP Client einen HTTP Get von einem Agenten gegen den HTTP Task des gleichen Servers abzusetzen, auf dem der Agent läuft. Aber wenn es schon einen ECHTEN HAMMER gibt, besteht die Welt halt nur noch aus Nägeln.  ;) (was wirklich ironisch gemeint ist)
Schau dir aber vorher besser nochmal HTTPUrlConnection aus dem jdk an. Das ist in diesem Fall möglicherweise viel einfacher.

Gruß Axel

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline m3

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Gib mal "Anonymous" Leserechte auf die DB, starte den HTTP Task neu und probiers dann nochmal.

Was ist denn "URL docURL =new URL(notesURL);" ?? URL ist keine Notes-Klasse, oder? Was macht die, wie macht die, ...
getHttpURL() macht ja, wenn ich das Log richtig gelesen habe.
« Letzte Änderung: 30.11.11 - 19:12:58 von m3 »
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
java.net.URL ist aus der JVM.
Normalerweise macht man das eher mit HTTPUrlConnection. Versuch das mal aus.  
http://www.devdaily.com/blog/post/java/how-open-url-read-contents-httpurl-connection-java ,
oder moment. Das ist vermutlich Verschwendung von Lebenszeit. Les erstmal das unten.

Und in jedem Fall in dem url-String Protokoll://server:port mit drinhaben, falls xxvvzz nicht der server ist.
Aber nochmal versuchen mit http://ipserver:80/
auch nicht  >:(

Sehr vermutlich ist auch einfach ein Leserfeld auf dem Dokument auf welches du zugreifen willst. Die http Engine meldet ja im Log, das sie auf das Dokument zugreifen will, der GET Request ist also beim Server angekommen. Der Server gibt nur nicht das Dokument raus, weils ein Unauthentifizierter Zugriff auf die Ressource ist und die mit einem Lesefeld geschützt ist.

In dem Fall gibts gute Chancen, dass ich einen neuen nicht-zahlenden Kunden für mein Framework gewinne (s.o.)
Ich könnte Dir morgen abend auch eine basic Authentification Erweiterung schreiben. Das Teil soll ja wachsen.

Sobald du in den jre-Klassen bist (wie java.net.URL) bewegst Du dich außerhalb der Notes Security. Der Domino HTTP Task weiss nich, dass der GET Request aus einem der Agenten seines eigenen Domino Servers kommt. Definitiv.

lG

Axel
« Letzte Änderung: 30.11.11 - 22:01:26 von Pitiyankee »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Hallo Pitiyankee,
zuerst mal danke für die prompte Rückmeldung.

Mit der Vermutung der Berechtigung (Leser/Autorenfleder) lagst du richtig.
Es gab Leser- und Autorenfelder im Dokument.

Ich habe zu Testzwecken nun nachfolgendes getan:
-   Alle Leser / Autorenfelder im Dokument komplett raus gelöscht
-   In der ACL den Anonymous auf Zugriff: „Administrator“ gesetzt
Ich erhalte aber leider immer noch diese Fehlermeldung.

Ich bin leider kein Experte im Bezug mit Java Agenten und Lotus Notes.
Vielleicht könntest du mir die unten aufgeführten Fragen kommentieren, das würde mir sicher weiterhelfen.

Hier die Fragen, die sich für mich nach Deinem Posting ergeben haben:
1) Wenn ich dich richtig verstehe, wird ein Java-Agent der auf die http Enging von Domino zugreift nicht im Namen des Dominoservers ausgeführt (wie Notes Agenten), sondern greift immer als Anonymous zu? 
Oder welche Berechtigung benötigt ein solcher Agent denn?
(Normale Java Agenten auf dem Server laufen aber im Kontext des Servers. Hier habe ich schon Agenten laufen, die auf Dokumente mit Autorenfeldern zugreifen!)

2) Hat das obige Problem vielleicht irgendwas mit den Einstellungen „Öffentliches Dokument“ zu tun?

3) Benötigt die Anwendung irgendwelche Designelemente, die diese Art von Java-Agent Aufruf erwartet? (z.B.: DefaultView, usw.)

4) Gibt es eine Möglichkeit, den Java Code der auf den http Task zugreift so auszuführen, dass dieser mit einer Berechtigung auf die DB ausgeführt wird, die nicht über den Anonymous läuft? (z.B.: im Kontext des Servers läuft!) Ziel wäre, mit Dokumente zu arbeiten, die Leser und Autorenfelder besitzen.

5) Kennst du vielleicht einen einfacheren bzw. besseren Weg ein Dokument als HTML/Mime aus dem Backend zu erhalten um dies als EML-Datei abzuspeichern?

6) Wenn ich einen System.err.println() im java-code ausführe, wird dieser in der Domino Konsole immer als "Agent error ...." ausgegeben. Gibt es eine Möglichkeit diesen irreführende Hinweis zu umgehen?

Grüße und Danke für deine Mühe
Legolas

Code
//Dokument aus der Ansicht holen und transformieren
			AgentContext agentContext = session.getAgentContext();
			db = agentContext.getCurrentDatabase();
			view = db.getView("aTest1");
			doc = view.getFirstDocument();
			
			
			System.err.println(" ");
			System.err.println("#### Start ####");
			System.err.println("doc.getUniversalID(): " + doc.getUniversalID());
			String docid = doc.getUniversalID();

			String notesURL = doc.getHttpURL();
			System.err.println("notesURL: " + notesURL);
			
			URL docURL =new URL(notesURL);
			System.err.println("100");
			
			InputStream streamIn = docURL.openStream();
			System.err.println("110");
			
			InputStreamReader str = new InputStreamReader(streamIn);
			System.err.println("120");
Arbeite klug, nicht hart.

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Wenn dein Agent auf eine URL zugreifen will, geht das mit garantie in die Hose, solange Du nichts am Java.policy File machst.
 In der Regel werden alle Zugriffe von Java zu irgendwelchen Netzwerkresourcen blockiert.
Entweder Du packst deinen Agenten in ein Jar File und dann im Domino unter jvm\lib\ext oder Du änderst das Policy File
unter jvm\lib\security\java.policy

da den Eintrag bei Grant All um den die Zeile AllPermission ergänzen.
 Grant all {
   permission java.security.AllPermission;
}

Nachteil dieser Methode, es wird jeglicher Java Code mit allen Berechtigungen ausgestattet und lässt so relativ ein grosses Loch in der Sicherheit offen.

Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Wenn dein Agent auf eine URL zugreifen will, geht das mit garantie in die Hose, solange Du nichts am Java.policy File machst.
 In der Regel werden alle Zugriffe von Java zu irgendwelchen Netzwerkresourcen blockiert.
Entweder Du packst deinen Agenten in ein Jar File und dann im Domino unter jvm\lib\ext oder Du änderst das Policy File
unter jvm\lib\security\java.policy

da den Eintrag bei Grant All um den die Zeile AllPermission ergänzen.
 Grant all {
   permission java.security.AllPermission;
}

Nachteil dieser Methode, es wird jeglicher Java Code mit allen Berechtigungen ausgestattet und lässt so relativ ein grosses Loch in der Sicherheit offen.



Das ist so nicht wahr. In dem Design Dokument des Agenten kann man die Security mit einem einfach Mausklick so einstellen, dass er auf URLs zugreift.
Das 2. angehängte Bild im Posting vom  28.11.11 - 20:18:53 in diesem Thread. http://atnotes.de/index.php/topic,52899.20.html
Stichwort Runtime Security Level.
« Letzte Änderung: 01.12.11 - 13:27:33 von Pitiyankee »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Hallo umi,

ich lege immmer das jar File im Dominoserver unter jvm\lib\ext ab.
So kenne ich dies auch von allern anderen periodischen Agenten, die ich unter Lotus laufen habe.

Daher kommt das Problem sicherlich nicht!

Grüße
Legolas
Arbeite klug, nicht hart.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Zitat
1) Wenn ich dich richtig verstehe, wird ein Java-Agent der auf die http Enging von Domino zugreift nicht im Namen des Dominoservers ausgeführt (wie Notes Agenten), sondern greift immer als Anonymous zu?  
Oder welche Berechtigung benötigt ein solcher Agent denn?
(Normale Java Agenten auf dem Server laufen aber im Kontext des Servers. Hier habe ich schon Agenten laufen, die auf Dokumente mit Autorenfeldern zugreifen!)
Wenn Du mit docURL.openStream() auf dem Server zugreifst generiert Java ein HTTP-Get. Die Java-Klasse URL weiss aber nix über Domino Security. Domino erwartet eine BASIC oder sessionbasierte Authentifizierungsinfo des HTTP Get Requests. Das müßtest Du selber bauen. Am einfachsten geht das aus meiner Sicht mit den jars von jakarta HTTPClient und dafür hab ich ein openSource Framework am Start (s.o.)


Zitat
2) Hat das obige Problem vielleicht irgendwas mit den Einstellungen „Öffentliches Dokument“ zu tun?
Sicher nicht. Du kannst den Browsercache und die Cookies löschen und versuchen auf diese URL zuzugreifen. Sofern keine Authentifizierungsbox erscheint, funktioniert das auch aus Java Klassen ohne Authentifizierungs Information. Ich hab gute Erfahrung damit gemacht, den Netzwerkverkehr mit wireshark zu monitoren, um so ein Verständnis zu erhalten, was da eigentlich vor sich geht.

Zitat
3) Benötigt die Anwendung irgendwelche Designelemente, die diese Art von Java-Agent Aufruf erwartet? (z.B.: DefaultView, usw.)
Defaultview kann sein. Du kannst ja mal versuchen statt auf das Dokument auf eine View per URL aus dem Agenten zuzugreifen
Zitat
4) Gibt es eine Möglichkeit, den Java Code der auf den http Task zugreift so auszuführen, dass dieser mit einer Berechtigung auf die DB ausgeführt wird, die nicht über den Anonymous läuft? (z.B.: im Kontext des Servers läuft!) Ziel wäre, mit Dokumente zu arbeiten, die Leser und Autorenfelder besitzen.
Ja, aber die Berechtigung (username, kennwort) mußt du irgendwo hinterlegen. Der Agent kann diese Informationen nicht aus sich selbst erzeugen.
Zitat
5) Kennst du vielleicht einen einfacheren bzw. besseren Weg ein Dokument als HTML/Mime aus dem Backend zu erhalten um dies als EML-Datei abzuspeichern?
Nein. Deine Idee eine URL an die HTTP-Engine zu senden ist nach meiner Kenntnis ohne Alternative.
Zitat

6) Wenn ich einen System.err.println() im java-code ausführe, wird dieser in der Domino Konsole immer als "Agent error ...." ausgegeben. Gibt es eine Möglichkeit diesen irreführende Hinweis zu umgehen?
Ja, indem du System.out.println() schreibst  ;D
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Hallo Pitiyankee,

danke für die ausführliche Rückmeldung von dir.
Werde mal schauen wie weit ich kommen.

Wegen Punkt 6) Ja,ja, die Jahre gehen halt nicht ohne Schaden an einem vorbei! Ich versinke im Boden....

Grüße
Legolas
Arbeite klug, nicht hart.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz