Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: petra.mint am 02.11.14 - 18:04:16

Titel: URL-Stream - File download (Java) klappt nicht
Beitrag von: petra.mint am 02.11.14 - 18:04:16
Hallo zusammen!

Mein erster Beitrag hier und gleich sowas... also, folgender Sachverhalt:

In einigen Maildokumenten verschiedener User/innen befinden sich im Body bestimmte URLs (als URL-Hotspot), die ich mittels JAVA Agent "erkenne" und als String-Array speichere.
Hinter jeder der URLs  (z. B: "http://{THE-DOMAIN}:8081/?sGet&UCfX1aAlZUXQoBalRMy8wME0wNQw%3D") verbirgt sich jeweils eine Datei (unterschiedlichste Mime types vorhanden, z.B. PDF, DOC, GIF, JPG, AVI usw...) auf einem HTTP-Server, die ich nun herunterladen und lokal ablegen möchte. Dazu sei gesagt, dass der ausliefernde HTTP-Server im hausinternen Netzwerk zur Verfügung steht (also nicht etwa nach draußen über Proxy, Firewall in's weite WWW).

Das Problem besteht nun darin, dass beim Schritt "Herunterladen" der JAVA Agent (wird manuell auf meinem Client ausgeführt) die nachfolgende Exception [1] wirft. Anbei ist auch ein Auszug der aufgerufenen Methode [2] "saveURL", welche das Herunterladen der Datei durchführen soll.
Rufe ich nun z.B. eine der URLs (z. B: "http://{THE-DOMAIN}:8081/?sGet&UCfX1aAlZUXQoBalRMy8wME0wNQw%3D") von Hand im Browser auf, so wird die Datei heruntergeladen.

Übrings: Das gleiche (!) Programmcoding des Agents funktioniert, wenn ich das Coding in meiner "echten" JAVA-Entwicklungsumgebung (der IBM RAD) eingebe und ausführe. Die selbe URL wie aus dem Notes Client Beispiel funktioniert und die Dateien werden erfolgreich heruntergeladen!
Wer hat eine Idee, woran es liegen könnte?!

Schon erfolglos getestet:
Der Agent selbst ist sicherheitstechnisch so eingestellt, dass er auf "(3) Beschränke Operationen mit Admin-Rechten zulassen" eingestellt ist. Klappt auch nicht.

Sonstige Angaben:
Windows 7 Enterprise SP 1
Notes Client & Designer 8.5.3FP6
JAVA Version 1.6

[1] EXCEPTION (Console output):

Code
-- 1 --
-- 2 --
URLConnection --> COM.ibm.JEmpower.applet.http.HttpURLConnection:http://{THE-DOMAIN}:8081/?sGet&UCfX1aAlZUXQoBalRMy8wME0wNQw%3D
-- 3 --
java.lang.NullPointerException
	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:727)
	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:654)
	at COM.ibm.JEmpower.applet.http.HttpURLConnection.getInputStream(HttpURLConnection.java:411)
	at COM.ibm.JEmpower.applet.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:692)
	at java.net.URLConnection.getHeaderFieldInt(URLConnection.java:603)
	at java.net.URLConnection.getContentLength(URLConnection.java:498)
	at JavaAgent.saveURL(Unknown Source)
	at JavaAgent.NotesMain(Unknown Source)
	at lotus.domino.AgentBase.runNotes(Unknown Source)
	at lotus.domino.NotesThread.run(Unknown Source)
   
   
   
[2] METHODE (JAVA coding):
Code
	private void saveURL(String sURL, String destDir, String filename) throws IOException {
		System.out.println("-- 1 --");
		URL u = new URL(sURL);
		System.out.println("-- 2 --");
		URLConnection uc = u.openConnection();
		System.out.println("URLConnection --> " + uc);
		System.out.println("-- 3 --");
		int contentLength = uc.getContentLength(); // <-- HIER EXCEPTION!
		System.out.println("-- 4 --");
		InputStream raw = uc.getInputStream();
		System.out.println("-- 5 --");
		InputStream in = new BufferedInputStream(raw);
		System.out.println("-- 6 --");
		byte[] data = new byte[contentLength];
		int bytesRead = 0;
		int offset = 0;
		System.out.println("-- 7 --");
		while (offset < contentLength) {
			bytesRead = in.read(data, offset, data.length - offset);
			if (bytesRead == -1)
				break;
			offset += bytesRead;
		}
		System.out.println("-- 8 --");
		in.close();
		raw.close();
		if (offset != contentLength) {
			throw new IOException("[**ERROR**] Only read " + offset + " bytes; Expected " + contentLength + " bytes!");
		}
		System.out.println("-- 9 --");
		FileOutputStream out = new FileOutputStream(destDir + "/" + filename);
		out.write(data);
		out.flush();
		out.close();
	}

Danke schon mal... !
Titel: Re: URL-Stream - File download (Java) klappt nicht
Beitrag von: Mitch am 03.11.14 - 07:27:24
Huhu Petra,

im Detail kann ich dir nicht sagen was das Problem ist, aber ich habe einen Java-Webservice zum Download von Dateien über eine URL, der Code sieht in etwa so aus:

Code
URL url = new URL(sourceUrl); // java.net.URL
        
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // java.net.HttpURLConnection
connection.setRequestMethod("GET");
connection.setUseCaches(false);
		
InputStream is = connection.getInputStream();

Ich habe also einen expliziten Cast in eine HttpURLConnection mit drin. Ehrlich gesagt weiß ich nicht ob ich das damals so gemacht habe weil ich ähnliche Probleme hatte wie du, oder ob das auf meine eingeschränkten Java-Kenntnisse zurück zu führen ist. Ein Versuch ist es aber Wert...

Gruß,

Mitch
Titel: Re: URL-Stream - File download (Java) klappt nicht
Beitrag von: Tode am 03.11.14 - 08:12:23
Herzlich willkommen Petra erst mal, und Kompliment: das ist eine vorbildlich aufbereitete Frage. Doch nun genug der "Lobhudelei" und zurück zu Deinem Problem:
Ich bin leider kein Java- Spezialist, aber eins fällt mir auf: Fehlt nicht u.U. der "connect"- Befehl für die connection? in den Beispielen, die ich kurz gegoogelt habe, sieht das immer so aus:
Code
//Set up the initial connection
          connection = (HttpURLConnection)serverAddress.openConnection();
          connection.setRequestMethod("GET");
          connection.setDoOutput(true);
          connection.setReadTimeout(10000);
                    
          connection.connect();
Und in einer stackoverflow- antwort hier (http://stackoverflow.com/questions/20696245/java-nullpointerexception-in-java-agent) steht folgende Anmerkung:
Zitat
It's pointless getting the response code before you've sent anything. You're supposed to send the request first, then get the response code, then get the response if required
Titel: Re: URL-Stream - File download (Java) klappt nicht
Beitrag von: petra.mint am 03.11.14 - 17:33:20
Hallo zusammen!

Vielen dank für Eure Hinweise... det hab icke ooch schon allet "gegoogelt"... leider ohne Erfolg!
@Tode: Nee, der connect ist nicht erforderlich (hab ick auch schon probiert....)
Fazit: vajisset! Ick habe keene Lust mehr, dem weiter nachzugehen. Also habe ich das Projekt nun in meinen RAD gehievt, die notes.jar implementiert, den Notes thread herum gebaut - und siehe da: es klappt dort tadellos! Das gleiche (!) Coding wie oben beschrieben! Wahnsinn...

Also, da ich nur gelegentlich im Notesumfeld tätig bin, komme ich eh besser mit der "richtigen" Java Entwicklungsumgebung zurecht. Der Notes-Designer & Java gehen mir ziemlich auf'n Keks, da wirste echt meschugge bei!

Trotzdem Danke für Eure Hilfe! :-) Habe mich mal hier umgesehen, scheint ja ein knorkes Forum zu sein. Sieht man selten. Ich bin wie jesacht selten im Notesumfeld, und wenn dann nur mit Java... aber vlt. "sieht" man sich. So und jetz stopp ick det quasseln!

Danke und lieben Gruß
Petra

 
Titel: Re: URL-Stream - File download (Java) klappt nicht
Beitrag von: pram am 03.11.14 - 21:34:57
Das Problem hier ist die "Spezialimplementierung" von "COM.ibm.JEmpower.applet.http.HttpURLConnection"
Diese ist alles andere als vollständig, bzw. korrekt und ich hab mich auch schon sehr darüber geärgert.... bei mir war es die mangelhafte Proxy-Authentifizieren, welche NUR bei HTTPs funktioniert (bis die Seite auf TLS umstellen)
Man kann also froh sein, wenn sie überhaupt funktioniert, was hier offensichtlich nicht der Fall ist >:()

Mit einem Java-Decompiler sieht man auch warum ;)
in Zeile 411 von COM.ibm.JEmpower.applet.http.HttpURLConnection.getInputStream steht (dritter Parameter: httpURLConnection = null)
Code
/* 411 */         this.http.parseHTTP(this.responses, this.pe, null);
und in Zeile 727 in der HttpClient Klasse kracht es dann, da httpURLConnection null ist.:
Code
/*  727 */         if ((this.cookieHandler = httpURLConnection.getCookieHandler()) != null) {
Das Problem liese sich fixen, wenn in der IBM-Klasse "this" anstatt "null" stehen würde. Nur leider kannst du das nicht ändern.

=> Der Code kann so meiner Meinung nach gar nicht (mehr) funktionieren. Hast du die Möglichkeit, dies mit einer ältern/anderen Notes-Version zu testen

/edit: Das hab ich noch gefunden: http://www-01.ibm.com/support/docview.wss?uid=swg1LO75797 - Oracle hat die Implementierung geändert... schon seit 8.5.3 bekannt...

Gruß
Roland