Domino 9 und frühere Versionen > ND7: Entwicklung
URLDownloadToFile() lädt nur, wenn Website zuvor geöffnet wurde
flaite:
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
flaite:
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.
flaite:
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();
}
}
}
--- Ende Code ---
Ich schreib das jetzt schnell und teste das dabei direkt. Sieht aber gut aus. Kompiliert alles.
flaite:
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());
}
}
--- Ende Code ---
Silke Wolf:
Hallo Axel,
ich :knuddel: dich jetzt mal ganz fest.
Es hat funktioniert. JUHUUUUUU.
LG Silke
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln