Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Silke Wolf am 27.10.11 - 13:57:42

Titel: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 27.10.11 - 13:57:42
Hallo,

mein Lotus Script Code lädt die Datei nur herunter, wenn ich sie zuvor per Internetexplorer geöffnet habe. Der selbe Code als Visual Basic unter Excel verlangt dies nicht und lädt alle Dateien ohne vorherigen Besuch der Webseite auf die Festplatte. Es muß lediglich einmal unter Visual Basic (Excel) der Zugriff auf die Homepage erfolgen, aber eben nicht für jeden weiteren Zugriff. (Ganz am Ende habe ich noch das VB im Excel geschrieben).

Frage: Wie bekomme ich es hin, dass mein Lotus Script Code die Dateien aus dem Internet lädt, ohne dass ich die einzelnen Webseiten zuvor besucht haben muss?

Hier mein Lotus Script Code:

Sub Click(Source As Button)
   Print "Start: Bei Dokumenten erfolgt TextPDF-Download und Import"
   On Error Goto ErrHandler
   Dim ses As New NotesSession
   Dim db As NotesDatabase
   Dim col As NotesDocumentCollection
   Dim doc As NotesDocument   
   Dim Url As String
   Dim Url2 As String
   Dim Schriftnummer As String
   Dim Dateiname As String
   'Dim aLog As AgentLog
   'Dim VerarbeiteteDokumente As String
   Dim importdatei As String
   Dim object As NotesEmbeddedObject
   Set ses = New NotesSession   
   Set db = ses.CurrentDatabase
   Set col = db.UnprocessedDocuments
   Set view = db.getView("pdftext-Import")
   Set doc = view.GetfirstDocument
   Set w = New NotesUIWorkspace
   'Set aLog = New AgentLog("TextPDF Import")
   'VerarbeiteteDokumtente=""
   
   Call w.URLOpen( "http://depatisnet.dpma.de/")
   Do Until doc Is Nothing
      'Download from Internet
      Schriftnummer = Cstr(doc.CY_PN_KD(0))         
'Beispiel Hyperlink
'http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE03003827T1
      Url2 =  "http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=" & Schriftnummer
'Beispiel Dateiname
'C:\textpdf\DE03003827T1_text.pdf
      Dateiname = "C:\textpdf\"+Schriftnummer+"_text.pdf"         
      'Url = Inputbox$("URL eingeben",,Url2)
      Url = Url2
' Download-Funktion hier                          
DownloadFile Url, Dateiname
      Call DeleteUrlCacheEntry(Url)
      
      ' Get the next document
      Set doc = view.getNextDocument( doc )
      i% = i% + 1
      all% = col.Count
      Print "Bitte warten ... " +  Cstr(i%) + " Dokument(e) insgesamt heruntergeladen"   
      
   Loop
   
   Print "Ende: TextPDFs wurden importiert. Siehe Protokoll."
   
   Exit Sub
   
ErrHandler:
   
   Resume Next
End Sub

###########################################

Function DownloadFile(URL As String, LocalFilename As String) As Boolean
   Dim lngRetVal As Long
   lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
   If lngRetVal = 0 Then DownloadFile = True
End Function

#############################################

Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (Byval pCaller As Long, Byval szURL As String, _
Byval szFileName As String, Byval dwReserved As Long, Byval lpfnCB As Long) As Long

Declare Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryA" (Byval lpszUrlName As String) As Long
############################################

Use "Common"




********************************************************************
*** Visual Basic Code (als Makro in Excel, ausgeführt über eine Schaltfläche)
*** In der ersten Tabellenspalte stehen die Hyperlinks (pro Zelle ein Link),
*** in der zweiten Tabellenspalte die Dateinamen.
*** Wobei auch hier das Depatisnet einmalig zuvor geöffnet werden muss.
*** URL                                 Localfilename             
http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE000000001IT   C:\textpdf\DE000000001IT_text.pdf   
http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE0000001A   C:\textpdf\DE0000001A_text.pdf   
http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE03003827T1   C:\textpdf\DE03003827T1_text.pdf   
********************************************************************
Option Explicit

Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Public Sub DownloadFiles()
Dim rng As Range

For Each rng In Range("A2:A" & Application.Max(2, Cells(Rows.Count, 1).End(xlUp).Row))
   If rng <> "" Then
      URLDownloadToFile 0, rng.Text, rng.Offset(0, 1).Text, 0, 0
   End If
Next
    
End Sub



Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: m3 am 27.10.11 - 14:36:16
Und Deine Frage lautet ..... ?

http://www.tty1.net/smart-questions_de.html#explicit
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: klaussal am 27.10.11 - 14:39:23
Zitat
Und Deine Frage lautet ..... ?

Vermutlich: warum kann LN nicht das, was Excel kann ?

Zitat
Der selbe Code als Visual Basic unter Excel verlangt dies nicht
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: mezz am 03.11.11 - 09:45:32
libcurl ist dein freund: http://curl.haxx.se/libcurl/
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: pram am 03.11.11 - 12:32:16
Das Problem liegt wohl an depatis. Wenn ich folgenden Link zum ersten Mal (oder nach dem Löschen der Sessioncookies) anklicke:
http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE0000001A werde ich auf
http://depatisnet.dpma.de/DepatisNet/depatisnet?window=1&space=menu&content=index&action=index&docid=DE0000001A umgeleitet und erhalte folgenden Hinweis
Zitat
Herzlich willkommen zur Recherche in den Datenbeständen des DEPATIS-Systems des Deutschen Patent- und Markenamtes (DPMA)

Dieser Dienst wendet sich vor allem an Erstnutzer von Patentinformationen, vor allem in kleinen und mittleren Unternehmen, sowie an Schulen, Universitäten und anderen wissenschaftlichen Einrichtungen. Angesichts beschränkter Systemkapazität steht der Dienst insbesondere nicht dafür zur Verfügung, größere Datenmengen herunterzuladen. Daten und Dokumente in größerem Umfang können Sie gegen Erstattung der Bereitstellungskosten über unsere Datenabgabedienste DPMAdatenabgabe und DEPATISconnect erhalten. Personen, die die allgemeine Nutzung dieses Dienstes durch eine ungewöhnliche hohe Anzahl manueller oder softwareunterstützter Zugriffe zu behindern drohen (mehr als 5000 Datenbankzugriffe täglich durch dieselbe Person oder unter derselben IP-Adresse bzw. unter einem zusammengehörigen Adressbereich), können ohne weitere Vorwarnung von der Nutzung ausgeschlossen werden. Gleiches gilt bei Umgehungstatbeständen, durch die der Dienst über das angegebene Maß hinaus in Anspruch genommen wird.

Dabei wird ein JSESSIONID-cookie angelegt. Ein erneuter Klick auf den Link
http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE0000001A
öffnet dann auch das PDF (solange der Cookie existiert)
Dies wird gerne gemacht, damit Suchmaschinen etc. den Content nicht so einfach abgrasen können  ;)

Gruß
Roland

Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 10.11.11 - 11:13:22
In Excel funktioniert es jedoch, nur nicht in Notes. Ich muß nur einmalig eine Verbindung mit Depatisnet erstellen, danach kann ich quasi beliebig viele PDFs im Hintergrund herunterladen. Somit muß es etwas mit Lotus Notes zu tun haben und nicht mit Depatisnet.

Das mit dem Sessioncookie und mit dem "Abgrasen" weiß ich. Trotzdem funktioniert es Excel super. Innherhalb weniger Minuten kann ich hunderte Dateien herunterladen ohne dass ich diese zuvor geöffnet haben muß. Nur am Anfang muß lediglich einmal das Depatisnet manuell geöffnet werden.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: pram am 11.11.11 - 14:42:35
ich denke mal dass 
  Call w.URLOpen( "http://depatisnet.dpma.de/")
nicht das Selbe ist wie
  DownloadFile "http://depatisnet.dpma.de/", "index.html"

Probier mal letzeres, evt. wird dann der Cookie angelegt
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 14.11.11 - 08:07:53
Das weiß ich auch, dass diese zwei Funktionen nicht identisch sind.
Mein Lotus Notes Code lädt die Datei auch mit DownloadFile Url, Dateiname herunter. Das steht aber alles in meinem Beitrag, auch die detailierte Funktion. Aber hier ist nochmals der Code:

Function DownloadFile(URL As String, LocalFilename As String) As Boolean
   Dim lngRetVal As Long
   lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
   If lngRetVal = 0 Then DownloadFile = True
End Function

Grundsätzlich geht der Download, aber halt nur, wenn ich die zu herunterladende Datei im Browser einmal geöffnet habe. In Excel ist dies nicht notwendig! In Excel ist es ausreichend, einmal eine Verbindung zum Depatisnet aufzubauen. Aber eben nur einmal, danach kann ich beliebig viele Dateien von dortherunterladen.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 21.11.11 - 12:32:23
biete an das heute abend in Java zu schreiben, wenn du magst.
Antworte einfach auf den Thread. 
Hab allerdings kein Notes 7.
Das funktioniert aber. Hab ich schon öfters gemacht.
Wär einfacher, wenn Du zufällig mit Eclipse umgehen könntest.

Gruß Axel
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 22.11.11 - 07:48:04
Hallo Axel,

habe erst heute morgen gesehen, dass du geschrieben hast, da ich gestern nicht so lang gearbeitet habe.

Das wäre echt toll, wenn du das in Java hinbekommst.
Ich kann kein Java und leider auch kein Eclipse.
Ich bin immernoch an dem Thema fest drann und wäre echt froh, wenn ich nicht den Umweg über Excel gehen müsste.

Danke auch, dass du dich damit überhaupt auseindergesetzt hast.

Silke
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 22.11.11 - 20:02:45
Hallo Silke,

heute abend schaff ich das vermutlich nicht mehr. Fang frühestens um 22:00 Uhr an  ;D
Im günstigsten Fall findet sich jemand mit Java Kenntnissen in Notes mit einem Notes7 Client, der das u.U. ein wenig vortesten kann.

Gruß Axel
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: koehlerbv am 22.11.11 - 22:18:58
Hallo Silke,
Im günstigsten Fall findet sich jemand mit Java Kenntnissen in Notes mit einem Notes7 Client, der das u.U. ein wenig vortesten kann.
Bei Abgabe entsprechender Euro-Scheine würde ich diese Rolle ausfüllen.

Bernhard
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 22.11.11 - 23:25:49
Bernhard, dein charmanter Humor  ;D

Ok. Silke, ich hoffe du hast wenigstens Java auf deinem Rechner installiert. Als Laufzeitumgebung?
Das findest Du sehr schnell raus, indem du in die Cmd Box von Windows
java -version eingibst.
Da sollte sowas wie java  version 1.7.0 oder so stehen. Wenn da nix von Java steht, kannst du auch den Rest nicht ausführen. Du kannst natürlich java von http://www.java.com kostenlos herunterladen und installieren. Notfalls kannst Du auch die JRE von deiner Notes Installation in den PATH von dem Betriebssystem hinzufügen. Nebenwirkungen hätte aber die Installation von java.com nach meinem Dafürhalten nicht.  

Du kannst das erstmal von der Command Box ohne Notes starten.
Das Zeugs liegt teilweise in dem zip File, das ich unten an dieses Posting dranhänge.
Teilweise bedeutet, dass ich die .jar Libs da nicht reinpacken wollte, weil das sonst zu groß würde.

1. Schritt
Du entpackst das zip irgendwo auf deiner Festplatte. Da siehst du dann einen leeren lib Ordner direkt unter von dem Root Verzeichnis httpClientForNotes von dem ausgepackten zip.  

2. Schritt
In diesen lib Ordner kopierst Du 3 jar Dateien, die du über diese urls herunterladen kannst:
 http://mirrors.ibiblio.org/pub/mirrors/maven2/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar
http://mirrors.ibiblio.org/pub/mirrors/maven/commons-logging/jars/commons-logging-1.0.4.jar
http://mirrors.ibiblio.org/pub/mirrors/maven/commons-codec/jars/commons-codec-1.2-javadoc.jar

3. Schritt
Du öffnest eine cmd Box von Windows oder eine Shell und navigierst in dieses Verzeichnis von dem entpackten zip:
httpClientForNotes/bin

4. In diesem Verzeichnis kopierst Du diesen Befehl genauso. Alles in eine Zeile:
java -cp ../lib/commons-httpclient -3.1.jar;../lib/commons-logging.jar;../lib/commons-codec-1.2.jar;. HttpClientTutorial http://twitter.com/#!/azetaene

Nach Return sollte nun das html von der Webseite in der cmd Box ausgegeben werden. Irgendwelche java Fehlermeldungen oder sonstiges abweichende Verhalten bitte hier posten.

Statt dem http://twitter.com/#!/azetaene solltest Du dann die url als letzten Parameter angeben, auf die Du zugreifen möchtest.


lG

Axel


Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 23.11.11 - 07:32:01
Dann lege ich mal los. Danke für deine Mühe Axel. Gruß Silke

Installiertes Java:
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) Client VM (build 14.0-b16, mixed mode, sharing)

#1. Ergebniss lt. Ausführung nach Schritt 3 und 4 (mit deiner URL):
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
        at org.apache.commons.httpclient.HttpClient.<clinit>(HttpClient.java:66)
        at HttpClientTutorial.main(HttpClientTutorial.java:22)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        ... 2 more
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 23.11.11 - 08:43:03
Hallo Silke,

kleine Panne.

Die Zeile sollte so heissen:
java -cp ../lib/commons-httpclient -3.1.jar;../lib/commons-logging-1.0.4.jar;../lib/commons-codec-1.2.jar;. HttpClientTutorial http://twitter.com/#!/azetaene

Oder du läßt den Befehl wie vorher und bennenst im lib Verzeichnis
commons-logging-1.0.4.jar
in
commons-logging.jar
um.

Das -1.0.4 bei commons-logging. Ich habs getestet, nur hier das gleiche jar mit anderem Namen als auf der maven seite wo du das runterlädst verwendet. Zwischendurch beim Schreiben des Postings hab ich sogar daran gedacht. Es war spät. Der -cp Flag von dem Befehl fügt die dahinterliegenden sich im lib Verzeichnis befindenden Bibliotheken zum java Classpath hinzu. commons-logging war oben falsch benamst. 

Das httpclient-3.1 hat er gefunden, nur den commons-logging nicht. Seh ich sogar an dem Stacktrace.

Gruß Axel
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 23.11.11 - 08:57:22
Hallo Axel,

leider läuft es noch nicht rund:

java -cp ../lib/commons-httpclient-3.1.jar;../lib/commons-logging-1.0.4.jar;../lib/commons-codec-1.2.jar;. HttpClientTutorial http://twitter.com/#!/azetaene

Calling url: http://twitter.com/#!/azetaene
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException
        at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:220)
        at org.apache.commons.httpclient.methods.GetMethod.<init>(GetMethod.java:89)
        at HttpClientTutorial.main(HttpClientTutorial.java:27)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.DecoderException
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        ... 3 more


Gruß Silke
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 23.11.11 - 09:05:14
Weitere Panne meinerseits.
Du mußt natürlich diese Datei runterladen und ins Lib-Verzeichnis kopieren:
http://mirrors.ibiblio.org/pub/mirrors/maven/commons-codec/jars/commons-codec-1.2.jar
NICHT commons-codec-1.2-javadoc.jar
Der Prozess funktioniert, ist aber sehr fehleranfällig und erfordert von mir mehr Konzentration als ich gestern abend um 23:00 Uhr hatte.
Das wars dann aber.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 23.11.11 - 09:40:57
Geht leider immernoch nicht:
Calling url: http://twitter.com/#!/azetaene
Fatal transport error: twitter.com
java.net.UnknownHostException: twitter.com
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:80)
        at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:122)
        at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
        at HttpClientTutorial.main(HttpClientTutorial.java:39)
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 23.11.11 - 10:12:26
Deine Organisation einen Reverse-Proxy um ins Internet zu kommen.
Deshalb war auch vorher der Effekt, dass Du die Seiten einmal im IE öffnen mußtest.
Schau dir mal die Proxy Einstellungen von deinem IE an.
Ging früher über Extras/Internetoptionen/ Registerkarte Verbindungen -> Lan Einstellung Button.
In neuen IEs gibts kein extras mehr, dafür aber ganz rechts so ein Icon, das wie ein Zahnrad aussieht.

Was ist da angegeben. Falls nicht Konfigurations-Script sondern direkt ein Proxy den besser nicht posten sondern einfach sagen, dass da eine IP Adresse steht. 
 
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 23.11.11 - 10:24:18
Es wird ein "automatisches Konfigurationsscript" verwendet.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 23.11.11 - 10:33:11
Hallo Silke,

da steht eine url oder ein Pfad. Du solltest an dieses Start-Script kommen können.
Afaik sind die lesbar. Heißt ja script.
Ansonsten kannst Du dich auch mit dem Admin in Verbindung setzen und ihm dein Anliegen mitteilen und das deine Programme den Proxy nicht finden.
Mein Java-Programm müßte ein wenig ergänzt werden. Ist aber kein Problem. Vielleicht kannst du mit dem jetzigen Wissen auch die c-libraries der vorherigen Versuche ans Laufen bekommen. Da sollte es Einträge für Proxy usw. geben.
Habt ihr ein Internetpassword, dh. mußt du, wenn Du von dem Arbeitsplatzrechner ins Internet willst ein extra usernamen/passwort eingeben? Auch damit käme die java Lösung zurecht. Muss aber ein wenig ergänzt werden.

Das erklärt btw auch die obigen Effekte, dass es aus Excel funktioniert und aus Notes mit dieser c-lib nur, wenn du die runterzuladende PDF einmal mit dem IE geöffnet hast. Das Excel ist so tief mit dem IE integriert, dass es dessen Proxy-Einstellungen ausliest. Die c-lib findet den Proxy nicht, kann aber den Browser-cache auslesen.

Gruß Axel

Gruß Axel
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 23.11.11 - 10:38:55
Dank deiner Info weiß ich nun endlich, woran es liegt. Danke!

Ja wir müssen Userkennung und Passwort eingeben.

Das Script kann ich lesen. Muß nur den Pfad samt Dateinamen in den Browser eingeben und es wird mir angezeigt.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 23.11.11 - 12:55:47
Note to self. Hätte dich das mit dem Proxy auch direkt prüfen lassen.  ;D
1. Proxy Zeugs prüfen?
2. Hat die Ziel-Webseite eine Authentifizierung und wenn ja welche?
3. Wie soll das heruntergeladende Zeug in Notes weiterverarbeitet werden?
Ich mach heut abend den java Code mal proxy-fähig. Haben immer wieder Leute Interesse an sowas. Schreib das als eine Art Modulsystem, in dem Proxy Authentifizierung, Webseite Authentifizierung und Art der Weiterverarbeitung deklarativ per .property Datei hinzugeblendet werden können. Dependency Injection für Arme. 
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 24.11.11 - 10:26:19
Zu
1.) Was meinst du damit, brauchst du noch Informationen?
2.) Nein, hat keine Authentifizierung.
3.) In Notes wird die heruntergeladene PDF-Textdatei in einem Lotus Notes Dokument in einem Rich-Text-Feld angehängt (meistens stehen hier schon Dateien).
-> In einer Schleife werden alle Dokumente, die eben noch mit solch einer PDF-Textdatei versehen werden sollen, gesammelt.
Verarbeitunsvariante a) Anschließend wird Dokument für Dokument abgearbeitet und die Textdatei vom Internet heruntergeladen und gleich im Lotus Notes Dokument im entsprechenden - schon bestehenden Feld - angehängt.
Verarbeitunsvariante b) Alle Text-PDFs werden heruntergeladen und dann in den Dokumenten gespeichert.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 24.11.11 - 13:41:39
Hallo Silke,

heute abend schaff ich das vermutlich. Problem kann noch bereiten, wenn der Proxy NTLM Authentifizierung benutzt.
Ich kann das allerdings nicht testen, weil ich nicht hinter einem Proxy hänge.

Gruß Axel
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 24.11.11 - 21:40:40
Hallo Silke,

unten ist die neue Version.
Wie gehabt entpacken und die jars in das leere lib Verzeichnis.

Unter bin gibts jetzt eine Datei settings.properties

url=http://www.google.de
clazz.processReturn=de.aja.docall.ProcessReturnString
clazz.prepareCall1=de.aja.preparecall.PrepareCallBaseReverseProxy
proxyHost=127.0.0.1
proxyPort=8080
proxyUser=axel
proxyPwd=test

Hinter die Proxy Werte trägst Du deine Werte ein. Die restlichen Zeilen so lassen wie sind.
Es wird nicht funktionieren, wenn euer Reverse Proxy NTLM Authentifizierung. Das ist aber eher selten.
In die url kannst Du später deine URL eintragen, allerdings gibts zur Zeit kein Handler, der Dateien verarbeitet. Der schreibt aktuell einfach den Return vom remote Webserver als String raus. Ist aber kein Problem. Vielleicht schreib ich das heute abend noch. So kannst Du zumindest testen, ob Du nach draussen kommst.
Den Proxy-Code konnte ich nicht testen, weil ich keinen Proxy hab. Sollte aber funktionieren, sofern nicht NTLM Authentifizierung benutzt wird.

Neuer Startbefehl. Wieder aus dem bin Verzeichnis

java -cp ../lib/commons-httpclient-3.1.jar;../lib/commons-logging-1.0.4.jar;../lib/commons-codec-1.2.jar;. de.aja.main.CommandManager

FALLS JEMAND ANDERS DAS MAL AUSPROBIERT und keinen Proxy hat:
Einfach in settings.properties vor clazz.prepareCall1=de.aja.preparecall.PrepareCallBaseReverseProxy ein Gatterzeichen setzen.
Also
#clazz.prepareCall1=de.aja.preparecall.PrepareCallBaseReverseProxy
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 24.11.11 - 22:50:20
Falls dieses Zeugs hier läuft, kannst Du es in einem Notes Java Agenten integrieren.
Das ist relativ einfach.
Dann hast Du 2 Optionen:
a) Du schreibst den ganzen restlichen Code in Java um. Das stell ich mir ohne Java-Kenntnisse relativ schwierig vor, obwohl die Java und LotusScript Apis sich kaum unterscheiden.
b) Du benutzt dieses Zeugs hier, um die PDF Dateien in einem Verzeichnis auf dem Rechner zu speichern und der LotusScript Agent bleibt wie er ist, er holt die Dateien halt nur auf diesem Verzeichnis. Damit entsteht eine gewisse Zeitverzögerung, aber oft ist das nicht so schlimm.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 24.11.11 - 23:23:35
Und diese Version läd ein PDF runter und schreibt es in ein Verzeichnis.

settings.properties

folderDest beschreibt den Ordner auf dem OS, in dem die Datei abgespeichert wird.
clazz.prepareCall1 hier nicht auskommentiert. D.h. es wird reverse Proxy benutzt.
clazzProzessReturn nun mit ProcessReturnStream (nicht mehr String)
proxy Werte natürlich wieder anpassen.

urlBase=http://www.digbib.org
urlDetail=/Kurt_Tucholsky_1890/Schloss_Gripsholm_.pdf
folderDest=D:/test/notes/
#clazz.processReturn=de.aja.docall.ProcessReturnString
clazz.prepareCall1=de.aja.preparecall.PrepareCallBaseReverseProxy
clazz.processReturn=de.aja.docall.ProcessReturnStream
proxyHost=127.0.0.1
proxyPort=8080
proxyUser=axel
proxyPwd=test

Man kann aber auch wieder zur Lösung oben zurück (String wird ausgegeben). Dafür einfach die clazz.processReturn auskommentieren und bei der anderen das # wegnehmen. (Gatterzeichen ist Kommentarzeichen).
Das meinte ich mit "modularer Lösung".
Bei einem pdf machts nur halt keinen Sinn das als String auszugebren.
Später erweitere ich das noch damit, dass man auch Http-POST Methoden benutzen kann. Zur Zeit ist alles GET.
Auch Authentizifizierung beim entfernten Host, SSL, Cookies läßt sich alles einbauen.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 25.11.11 - 08:26:46
Hallo Axel,

Wow! -  es geht (sowohl mit zip3 als auch mit zip4 [PDF wurde erzeugt].

Ich werde es jetzt mal mit meinen Depatisnet-Links versuchen.

Gruß Silke

Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 25.11.11 - 08:55:10
Jetzt habe ich mal meinen Link eingefügt.
Zuvor habe ich die Depatisnetseite einmal von Hand im IE geöffnet - könnte aber sein, dass das nicht hilft, weil dein Java-Code das nicht registriert. Vielleicht muß er zuvor auch einfach nur einmal die Seite http://depatisnet.dpma.de/ ansprechen?

Mein Link: http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE03003827T1

In Datei "settings.properties" folgende Änderung vorgenommen

urlBase=http://depatisnet.dpma.de/DepatisNet/
urlDetail=depatisnet?action=textpdf&docid=DE03003827T1
folderDest=C:/textpdf/

Wobei ich verschiedenste Varianten meines Links auf die ersten beiden Zeilen vorgenommen habe, was jedoch an der Ausgabe nichts verändert hat.

Z.B.:
urlBase=http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE03003827T1
urlDetail=

Proxy-Infos und Login-Daten haben ich in der Ausgabe ausgeixt (XXXXX):

No further prepareCall objects found. Last index was: 2
PrepareCallBaseReverseProxy called
Will call proxy with XXXXX:XXXXX->XXXXX/XXXXX
25.11.2011 08:48:13 org.apache.commons.httpclient.HttpMethodDirector authenticateHost
WARNUNG: Required credentials not available for BASIC <any realm>@depatisnet.dpma.de:80
25.11.2011 08:48:13 org.apache.commons.httpclient.HttpMethodDirector authenticateHost
WARNUNG: Preemptive authentication requested but no default credentials available
Exception in thread "main" org.apache.commons.httpclient.CircularRedirectException: Circular redirect to 'http://depatisnet.dpma.de:80/DepatisNet/depatisnet'
        at org.apache.commons.httpclient.HttpMethodDirector.processRedirectResponse(HttpMethodDirector.java:638)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:179)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
        at de.aja.main.HttpClientInvoker.invoke(HttpClientInvoker.java:50)
        at de.aja.main.DefaultHttpClientInvoker.doInvoke(DefaultHttpClientInvoker.java:24)
        at de.aja.main.CommandManager.action(CommandManager.java:60)
        at de.aja.main.CommandManager.main(CommandManager.java:83)
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 25.11.11 - 12:45:38
Hallo Silke,

das wäre kein Problem.

Es gibt aber ein anderes Problem:
Wenn ich mit dem Browser die URL http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE03003827T1 aufrufe, werde ich auf eine andere Seite geleitet.
Beim 2. Aufruf gibt er dann das PDF zurück.
Mit Firebug sieht das extrem so aus, dass er beim ersten Aufruf ein jsessionid Cookie setzt und es dann beim zweiten Aufruf mit dieser Session geht.
Nicht unlösbar, erhöht aber die Komplexität.
Schau mir das in ein paar Stunden mal mit wire-shark und dem Java Code an.

Gruß Axel 
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 25.11.11 - 12:56:54
Wie gesagt, in Excel rufe ich einmal von Hand nur die Seite "http://depatisnet.dpma.de/" auf, danach kann ich dann im Hintergrund die PDFs ziehen.
Dafür stelle nur die Nummern (können tausende Nummern sein) in einer Excel-Datei zur Verfügung, z.B. DE03003827T1 usw., setzen den Link zusammen, z.B. http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE03003827T1 usw und den Dateinamen und Pfad zum Abspeichern, z.B. C:\textpdf\DE03003827T1_text.pdf usw.
Das mit der Session-ID ist klar, aber Excel kriegt das gebacken.

Ich habe in Lotus Notes eine Ansicht, in der mir nur die Dokumente angezeigt werden, wo dieses Text-PDF fehlt. Über eine Schaltfläche exportiert er mir alle Schutzrechtsnummern in eine Textdatei.

In Excel lese ich die Textdatei ein (pro Nummer eine Zeile) und generiere gleichzeitig den Ausgabepfad samt Dateinamen. Anschließend gehe ich einmal manuell auf die Depatisnet-Seite. Dann starte ich per VB-Code in Excel den Dateidownload.

Anschließend gehe ich wieder ins Notes und per Schaltfläche starte ich den Import der heruntergeladenen Dateien in die entsprechenden Dokumente.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 25.11.11 - 17:24:38
Silke,

Das hat mich jetzt ein wenig beunruhigt, aber es gibt kein Grund zur Panik.

Erstmal ein paar Überlegungen, auch falls jemand mitliest.  

Wenn das Cookie nicht gesetzt ist, gibt es einen HTTP Status code 302 als Antwort.
Als Antwort auf die redirect Antwort des Browsers schickt der Server diese html Seite, in der steht steht: Herzlich willkommen zur Recherche in den Datenbeständen des DEPATIS-Systems

Wenn das Cookie gesetzt ist, gibts direkt das PDF zurück, ohne redirect.

Ich müßte follow-redirects ausschalten und den HTTP-Statuscode auslesen und bei einem 300er
a) den Cookie auslesen, oder falls keiner gesendet wird
b) die "http://depatisnet.dpma.de/" anfordern, weil da steht der Cookie definitiv im Response Header vom GET
c) der Wert des Cookies im Property File abspeichern und einen neuen PDF - Request mit Cookie starten.
Folge-Calls können dann den im properties file gespeicherten cookies-Wert nutzen, solange der gültig ist.

Muß noch geklärt werden, was bei einem ungültigen Cookie geschieht. Denke aber dasselbe wie wenn kein Cookie gesetzt ist. Würd man also noch mal den obigen a)b)c) Prozess durchlaufen.

Bis Montag ist das vermutlich fertig.

Ich hab das öfters gemacht und die Intention hiervon ist, das mit den Erfahrungen einmal richtig zu machen, d.h. praktisch eine openSource Lösung, die sehr modular und erweiterbar ist, und für möglichst viele Einsatzgebiete ohne viel Programmier-Aufwand anpassbar ist. In diesem Sinne ist dein Input wertvoll, Silke.
Fühl Dich durch nix verpflichtet: mein vermeintlicher Aufwand, etc. Aber falls Bedarf besteht und ihr dafür Budget habt, könnt ihr mich auch tageweise als Consultant buchen. Gilt natürlich auch für alle anderen, die das Zeugs nutzen wollen.
Hab vor das irgendwo in google oder auf sourceforge als openSource Projekt zu veröffentlichen.

Zitat
aber Excel kriegt das gebacken.
Meine Grube hier ist ja eine ganz andere Baustelle. Excel kostet Lizenzgebühren und profitiert von gewaltigen Skalenerträgen (i.S. von Economies of Scale). Microsoft lebt ja unter anderem davon, dass ihre verschiedenen Produkte so tief integriert sind. Die haben das da irgendwann reinprogrammiert, Lotus nicht.
Ich arbeite hier mit einer Implementierung des HTTP Protokolls namens apache jakarta HTTPClient, eine anwendungs-entferntere und protokoll-nähere Schicht. Es ist schon eine Abstraktion. Wenn ich mir das in dem Netzwerk-Sniffer wireshark anschaue geht darunter noch eine Menge mehr vor. Arbeit, die mir jakarta HTTPClient abnimmt.  
  
lG

Axel
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 27.11.11 - 17:25:46
Hallo Silke,

am besten du entpackst das unten in einen neuen Ordner.
Als nächstes kopierst Du die vorher von dir heruntergeladenen jars von dem alten lib Verzeichnis ins neue.

Zunächst mußt Du noch eine weitere Datei herunterladen, die wieder fürs Lib-Verzeichnis bestimmt ist.  
http://mirrors.ibiblio.org/pub/mirrors/maven2/log4j/log4j/1.2.16/log4j-1.2.16.jar

Im lib Verzeichnis befinden sich nun diese 4 Dateien mit genau diesen Namen
commons-httpclient-3.1.jar
commons-logging-1.0.4.jar
commons-codec-1.2.jar
log4j-1.2.16.jar

Wenn nicht, benenn sie entsprechend um.
Im bin des neuen entpackten zip befindet sich eine bat namens setClasspath.bat
Ruf die als erstes aus der cmd-Box auf.

Dann kannst Du die Datei debatisCommon.properties in bin mit deinen Werten füllen, d.h. Werte für den Proxy und für den Ordner, in dem die PDF Dateien landen sollen.

Als nächstes startest Du mit
java de.aja.main.TestDebatis

Programm wird zunächst keine cookies.properties Datei vorfinden und besorgt sich das Cookie von der http://depatisnet.dpma.de/
Dann schreibt es eine cookies.properties Datei. (findest Du im bin Verzeichnis)
Sofort versucht es dann das PDF mit dem Cookie runterzuladen.
Beim nächsten Versuch wird die http://depatisnet.dpma.de nicht mehr aufgerufen, solange das Cookie gültig ist.
Wenn das Cookie ungültig geworden ist, holt sich das Programm ein frisches Cookie und schließt damit dann den download erfolgreich ab.
Du kannst das simmulieren, indem Du zwischen 2 Aufrufen den Inhalt von cookies.properties ein wenig veränderst. Etwa .dp-app02 statt .dp-app06 oder was immer da steht.

Sofern das erfolgreich läuft, kann ich Dir erklären, wie man das ganze in einen Notes Agenten einbindet.

Bei mir läuft es gut.

Gruß Axel

Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 28.11.11 - 07:48:49
Hallo Axel,

wenn ich jetzt bei dir um die Ecke wäre, würde ich dich jetzt aus dem Bett klingeln und zum Frühstück einladen  :-*.

Die Datei wurde erfolgreich heruntergeladen.

Es wäre auch gut, wenn das Passwort für den Intnetzugang verschlüsselt wäre. Er liegt ja lesbar in der Datei und da ist mir nicht ganz wohl dabei. Meinst du, dass du dafür auch noch eine Lösung hättest?

Und wie binde ich das ganze nun in Notes ein?

LG Silke

p.s. bin fast ein wenig neidisch auf dein Können  >:D
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 28.11.11 - 11:31:28
Hallo Silke,

dazu komme ich heute abend. Die Erklärung wie man das in Domino einbindet.
Grundsätzlich gibt es 2 Möglichkeiten:
1) was in /bin ist mit java1.4 komplilieren und als jar packen.
2) was in /src ist in eine Java Scriptbibliothek importieren und dort kompilieren (abspeichern)

Für beide Fälle müßte:
Ein Notes Konfigurationsdokument (neue Notes Form mit 1 Dokument in einer Ansicht) geschrieben werden, dass all die Werte aus den Properties als Notes Felder aufnimmt. Dieses Dokument kannst Du mit einem READER Feld so absichern, dass das ganze nur für die Administratoren und den Server sichtbar ist. Ich geh davon aus, dass dies zeitgesteuert auf einem Server läuft?

Der source code von de.aja.main.TestDebatis aus /test-acceptance in einen Notes Java Agenten copy&pasted werden. Im Agenten Allow Restricted Operations oder so ähnlich anhaken. Hier sind ein paar Änderungen notwendig. Die Properties werden nicht mehr aus den .properties files gelesen, sondern halt aus dem Notes-dokument. Man kann sich hier überlegen, wo der Agent die URLs für die runterzuladenden PDF Dokumente herbekommt? Also praktisch eine Liste des XXX hinter dem docid= von dem pdf download links: http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=XXX
Ich schreib heute abend eine detaillierte Liste mit code für den Agenten.   

Schön, dass es so weit funktioniert.

Das Passwort liesse sich symetrisch verschlüsseln. Eine solche Erweiterung kann ich allerdings frühestens am nächsten WE schreiben, 
Allerdings liesse es sich auch in ein Notes-Dokument schreiben, das über Reader Felder nur für Administratoren und den Server sichtbar ist. Das ist okaye Domino Sicherheit.

Ich würd dafür sowieso einen "technischen User" benutzen. Für normale User existiert normalerweise eine Politik, dass das Passwort alle 4 Wochen oder so geändert werden muss.

Zu deiner privaten Mitteilung: Für mich macht es aus meiner Sicht wenig Sinn, als Product-Company aufzutreten. Hätte allemöglichen legalen Konsequenzen und Werbungskosten zur Folge. Auch Supportaufwand ist schwer zu übersehen. Dann lieber openSource. 
Werd versuchen, das auf openNTF unterzubringen. Das liesse sich dann einfach werbemässig nutzen. Danke für den Link zur Konkurrenz.   

lG

Axel
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 28.11.11 - 19:27:17
Silke,

Schritt I Importieren der Sourcen und jars in eine Java  Scriptbibliothek (nicht zu verwechseln mit javascript scriptBibliothek.


ich hab hier nur Notes8.5. Aber in 7 gibts alle die Gestaltungselemente auch. Sieht halt ein wenig anders aus.

1. Schritt: Erstelle eine Java Script Bibliothek (nicht zu verwechseln mit JavaScript Script Bibliothek). Unter Notes 8.5 steht die unter
Code
-> Scriptlibraries
2. Klicke auf Import - Java Source
Navigiere in dem Fenster zu dem letzten entpackten Zeugs von was ich am Sonntag abend gepostet hab und stell die Maus auf den src-Ordner.
Hak links src an und rechts bei Bedarf HttpClientTutorial ab (brauch man eh nicht mehr, ist aber egal).
Finish Button drücken
3. Die sourcen sind jetzt in die java ScriptBibliothek importiert. Es erscheinen sehr viele Fehlermeldungen.
Noch mal Import klicken. Da jetzt Archive wählen. Wieder zu dem letzten entpackten Zeug von Sonntag, jetzt aber der lib Ordner.
Die 4 jars anhaken (s. screenshot)
Nach finish verschwinden die Fehlermeldungen.
Java   Scriptbibliothek speichern.

   
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 28.11.11 - 20:18:53
Jetzt der Agent.
1. Erzeuge einen neuen Agenten. Nenn ihn irgendwie und wähle Java.
2. Irgendwo in der 2. Lasche in den Design-Einstellungen. Irgendwo kannst Du die Runtime Security des Agenten einstellen. Das ist sehr wichtig. Ich hab unten ein Screenshot, aber das ist in Notes 8.5 an einer völlig anderen Stelle..
3. Jetzt wählst Du unter Import die Java ScriptBibliothek aus, die du vorher gespeichert hast. Sieht unter Notes85 auch sehr anders aus.

Jetzt kannst Du den JavaCode bearbeiten.

Da steht jetzt sowas:
Code
import lotus.domino.*;

public class JavaAgent extends AgentBase {

    public void NotesMain() {

      try {
          Session session = getSession();
          AgentContext agentContext = session.getAgentContext();

          // (Your code goes here)

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

Ich schreib das jetzt schnell und teste das dabei direkt. Sieht aber gut aus. Kompiliert alles.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 28.11.11 - 22:08:47
Alles was im NotesAgent an Code drin steht löschen. Dann das da rein kopieren.
Du müßtest dann noch ein configDoc in Notes erzeugen. Erklärungen s.u. Frag nach!
Wieder unten deine Proxy Werte und die Wert des destDir setzen.

Zwei Sachen hab ich oben vergessen.
Im Agenten einstellen Runtime Trigger: on Event : Action Event Selection (ist glaub ich Standard)
und v.a. Target: None. Steht standardmässig all Selected Documents.

Im Menü vom Designer findest du unter Tools den Eintrag "Show Java Debug Console". Da draufklicken. Das Fenster zeigt Fehlermeldungen und System.out.println an.
Bei mir funktioniert das. 

Code
import java.io.File;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import org.apache.commons.httpclient.methods.GetMethod;

import de.aja.main.HttpClientInvoker;

import lotus.domino.*;

public class JavaAgent extends AgentBase {

	public void NotesMain() {
		
		

		try {
			
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();
			Document docConfig = null; // 
			Database db = agentContext.getCurrentDatabase();
			//View vw = db.getView("vwConfig");
			//docConfig = vw.getFirstDocument();
			List urlDetails = new ArrayList();
			urlDetails.add("DE03003827T1");
			// mit add können beliebig viele urlDetails hinzugefügt werden. 
			
			
			
			downloadManager(docConfig, urlDetails);

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

	/**
	 * @param args
	 * @throws Exception
	 */
	public void downloadManager(Document docProps, List urlDetails)
			throws Exception {
		Properties propsMain = new Properties();
		Properties propsPDF = new Properties();
		Properties propsCommon = new Properties();
		

		/*
		 * DIESE WERTE WIEDER MIT DEINEN ERSETZEN!!!
		 */
		/*
		 * IN EINEM ZWEITEN SCHRITT KANNST DU DIE WERTE FÜR DIE PROPS (das
		 * zweite Argument von den .put calls aus einem Notes Document docProps
		 * holen!
		 */
		propsCommon.put("de.aja.preparecall.AddReverseProxyBaseAuth.proxyHost",
				"http://111.111.111.111");
		propsCommon.put("de.aja.preparecall.AddReverseProxyBaseAuth.proxyPort",
				"8080");
		propsCommon.put("de.aja.preparecall.AddReverseProxyBaseAuth.proxyUser",
				"axel");
		propsCommon.put("de.aja.preparecall.AddReverseProxyBaseAuth.proxyPwd",
				"kennwort");
		propsCommon.put("folderDest", "D:/test/notes/");

		
		// kann so bleiben, übersichtlicher aber von docConfig. Zugriff mit docConfig.getStringValue("fieldCookie");
		propsMain.put("url", "http://depatisnet.dpma.de/");
		propsMain.put("clazzesPrepareCall","de.aja.preparecall.AddReverseProxyBaseAuth");
		propsMain.put("de.aja.preparecall.AddFollowRedirects.followRedirects",
				"false");
		propsMain.put("clazzProcessReturn",
				"de.aja.docall.ReturnCookiesHandler");

		// propsPDF.put("url","http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid=DE03003827T1");
		propsPDF.put("clazzesPrepareCall",
				"de.aja.preparecall.AddRequestHeader:de.aja.preparecall.AddReverseProxyBaseAuth");
		propsPDF.put("de.aja.preparecall.AddFollowRedirects.followRedirects",
				"false");
		propsPDF.put("clazzProcessReturn",
				"de.aja.docall.ReturnBodyAsStreamHandler");

		propsMain.putAll(propsCommon);
		propsPDF.putAll(propsCommon);

		Iterator it = urlDetails.iterator();
		int counter = 0;
		
		//this.cookie = docConfig.getItemValueString("cookie"); // cookie aus config Doc holen!
		String cookie = null; // die Zeile auskommentieren, wenn cookie aus doc, ist logisch.
		String cookieBefore = cookie; // die stehenlassen
		
		while (it.hasNext()) {
			
			String urlDetail = (String) it.next();
			System.out.println("downloading doc " + urlDetail + " " + ++counter + " of " + urlDetails.size());
			propsPDF.put("url",
					"http://depatisnet.dpma.de/DepatisNet/depatisnet?action=textpdf&docid="
							+ urlDetail);

			
			
			if (cookie != null) {
				
				boolean ret = callPDF(propsPDF, cookie);
				if (!ret) {
					System.out
							.println("Probably cookie isn't valid no more. Try to get fresh cookie.");
					cookie = callMain(propsMain);
					
					callPDF(propsPDF, cookie);

				}

			} else {
				System.out
						.println("Can't find cookie. Probably its not there. Try to get cookie and save value to disk.");
				cookie = callMain(propsMain);
				
				callPDF(propsPDF, cookie);
			}
		} // end while it.hasNext()
		
		if (cookie!= null) {
			if (!cookie.equals(cookieBefore)) {
				//docConfig.replaceItemValue("fieldCookie", cookie); // cookie in ConfigDoc speichern
				// docConfig.save(true, false);
			}
		}

	}

	// find cookie to new value if needed.
	public String callMain(Properties propsMain) throws Exception {
		System.out.println("Calling Main with this properties" + propsMain);

		HttpClientInvoker invoker = HttpClientInvoker
				.getDefaultHttpClientInvoker(propsMain);

		Object res = invoker.doInvoke(new GetMethod());

		//Properties propsCookies = new Properties();
	
		return (String) res;
	}

	public boolean callPDF(Properties propsPDF, String cookie) throws Exception {

		propsPDF.put("globals.requestHeader.Cookie", cookie);
		

		HttpClientInvoker invoker = HttpClientInvoker
				.getDefaultHttpClientInvoker(propsPDF);

		Object res = invoker.doInvoke(new GetMethod());
		if (res instanceof java.lang.Integer) {
			System.out.println("Return Integer is:" + res);
			return false;
		} else if (res instanceof java.io.InputStream) {
			InputStream in = (InputStream) res;
			savePDFToDisk(in, propsPDF, invoker);

		} else {
			System.out.println("Unexpected return"
					+ (res == null ? "null" : res.getClass().getName()));
		}

		return true;
	}

	public void savePDFToDisk(InputStream in, Properties propsPDF,
			HttpClientInvoker invoker) throws Exception {
		String[] urlParts = invoker.getUrl().split("=");
		File fileDest = new File(propsPDF.getProperty("folderDest")
				+ urlParts[urlParts.length - 1] + ".pdf");
		System.out.println("file destination is " + fileDest.getAbsolutePath());
		OutputStream out = new FileOutputStream(fileDest);

		// Transfer bytes from in to out
		byte[] buf = new byte[1024];
		int len;
		while ((len = in.read(buf)) > 0) {
			out.write(buf, 0, len);
		}
		in.close();
		out.close();
		System.out.println("DONE! Saved pdf to " + fileDest.getAbsolutePath());

	}

}
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 29.11.11 - 08:16:51
Hallo Axel,

ich :knuddel: dich jetzt mal ganz fest.

Es hat funktioniert.  JUHUUUUUU.

LG Silke
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: Silke Wolf am 29.11.11 - 09:57:11
Hallo Axel,

habe gerade meinen ersten eigenen Java-Code geschrieben.

Hab dein urlDetails.add(...)

ersetzt durch:
               // CODE wi -> urlDetails sammeln
               View view = db.getView("pdftext");
               Document tmpdoc;
               Document doc = view.getFirstDocument();
               while (doc != null) {
               urlDetails.add(doc.getItemValueString("CY_PN_KD"));
               tmpdoc = view.getNextDocument(doc);
               doc.recycle();
               doc = tmpdoc;
   // CODE wi ENDE
   downloadManager(docConfig, urlDetails);
                }

Und ... es hat funktioniert. Er sammelt alle Dokumente in der Ansicht und holt aus jedem Dokument die Patentnummer und lädt dazu das textpdf.
Titel: Re: URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
Beitrag von: flaite am 29.11.11 - 11:24:39
Hallo Silke,

schön, dass es geklappt hat.  ;D
Der Einsatz mit dem recycle ist völlig korrekt. In der Schleife. Die restlichen Notes-Objekte werden vom Agenten recyclet.

lG

Axel