AtNotes Übersicht Willkommen Gast. Bitte einloggen oder registrieren.
26.05.13 - 10:39:13
Übersicht Hilfe Regeln Glossar Suche Einloggen Registrieren
News:
Schnellsuche:
+  Das Notes Forum
|-+  Lotus Notes / Domino Sonstiges
| |-+  Java und .NET mit Notes/Domino (Moderatoren: Axel, m3)
| | |-+  Java Agent wirft Fehler "Special database object cannot be located"
« vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Java Agent wirft Fehler "Special database object cannot be located"  (Gelesen 1557 mal)
Legolas
Aktives Mitglied
***
Offline Offline

Geschlecht: Männlich
Beiträge: 234



« am: 30.11.11 - 16:30:46 »

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


Gespeichert
Pitiyankee
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2926


WWW
« Antworten #1 am: 30.11.11 - 17:18:26 »

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.  Wink (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

Gespeichert

As far as Connections goes, I consider it as a much more "classic" IBM software. Much like Websphere Portal when portals were the hype. Very powerfull but very complex, very demanding on infrastructure to set up and often sold for the wrong reasons and then a strong deception for customers.

Michael Bourak
---

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
m3
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 7616


Non ex transverso sed deorsum!


WWW
« Antworten #2 am: 30.11.11 - 19:10:55 »

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 » Gespeichert

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
Pitiyankee
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2926


WWW
« Antworten #3 am: 30.11.11 - 19:24:59 »

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  Angry

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 » Gespeichert

As far as Connections goes, I consider it as a much more "classic" IBM software. Much like Websphere Portal when portals were the hype. Very powerfull but very complex, very demanding on infrastructure to set up and often sold for the wrong reasons and then a strong deception for customers.

Michael Bourak
---

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
Legolas
Aktives Mitglied
***
Offline Offline

Geschlecht: Männlich
Beiträge: 234



« Antworten #4 am: 01.12.11 - 10:50:40 »

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");
Gespeichert
umi
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1448


one notes to rule'em all, one notes to find'em....


WWW
« Antworten #5 am: 01.12.11 - 12:46:57 »

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.

Gespeichert

Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CAAD  R6/6.5
CAAD R7
CAD R8
CAD R8.5
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
Twitter: umeli
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>
Pitiyankee
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2926


WWW
« Antworten #6 am: 01.12.11 - 13:13:04 »

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 » Gespeichert

As far as Connections goes, I consider it as a much more "classic" IBM software. Much like Websphere Portal when portals were the hype. Very powerfull but very complex, very demanding on infrastructure to set up and often sold for the wrong reasons and then a strong deception for customers.

Michael Bourak
---

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
Legolas
Aktives Mitglied
***
Offline Offline

Geschlecht: Männlich
Beiträge: 234



« Antworten #7 am: 01.12.11 - 13:14:46 »

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
Gespeichert
Pitiyankee
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2926


WWW
« Antworten #8 am: 01.12.11 - 13:24:57 »

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  Grin
Gespeichert

As far as Connections goes, I consider it as a much more "classic" IBM software. Much like Websphere Portal when portals were the hype. Very powerfull but very complex, very demanding on infrastructure to set up and often sold for the wrong reasons and then a strong deception for customers.

Michael Bourak
---

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
Legolas
Aktives Mitglied
***
Offline Offline

Geschlecht: Männlich
Beiträge: 234



« Antworten #9 am: 01.12.11 - 13:29:47 »

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
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS
Impressum Atnotes.de - Powered by Syslords Solutions - Datenschutz | Partner: Tinte / Toner günstig