Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: AbsoluterBeginner am 13.08.08 - 11:15:28

Titel: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 13.08.08 - 11:15:28
Hallo zusammen, ich stehe vor einem Rätsel und hoffe, dass mit vielleicht jemand weiterhelfen kann.

Zuerst mal die Situation: Es geht darum, mittels eines JavaServlets Daten aus einer SQL-Datenbank in eine Notesdatenbank zu übertragen. Dabei werden sowohl Texte, als auch Dateien übertragen. Die übertragung der Texte funktioniert einwandfrei, aber beim Anhängen der Dateien wirds mysteriös.

Es sind 4 pdf-Dateien, die in ein RichTextFeld eingefügt werden sollen. Das Interessante ist allerdings, 3 Anhänge werden unter das Dokument gehängt, wie ein normales Attachment, und die letzte Datei wird wie vorgesehen in das RTFeld geschrieben. Es werden jedoch alle 4 Dateien als V2 Attachment eingefügt, d.h. mit dem grauen (unschönen) Symbol.
Woran kann das liegen ?

Das einfügen wird von dem JavaServlet erledigt mittels RTItem.embedObject(...).
Das erstellen des Dokuments, sowie das einfügen der Daten erfolgt, da durch das Servlet, im Backend.

Gibt es eine Möglichkeit, dass alle Attachments an der selben Stelle eingefügt werden ? Nach Möglichkeit in das RTF. Und am besten nicht nur mit dem grauen Symbol.

Ich hoffe mir kan jemand helfen.

Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 14.08.08 - 14:04:46
kannst du mal deinen Code posten. Ich denke dann kommen wir dem Problem am schnellsten auf die Sprünge.

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 15.08.08 - 15:12:34
Hier ist der Teill der für das einfügen verantwortlich ist....
   
  String filename = "C:/temp/Bewerbung_" + FileName1 + "_" + FileName2 + "." + FiletypCL;
                                System.out.println(filename);
                                File f = new File(filename);
                                f.createNewFile();
                                BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(f));
                                os.write(data, 0, (int)blob.length());
                                os.flush();
                                os.close();
                                is2.close();
                                RichTextItem rtitem = LoNotesDocument.createRichTextItem("PersonFiles");
                                rtitem.embedObject(1454, "", filename, "PersonFiles");
                                rtitem.addNewLine();
                                f.delete();
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 08:05:54
Ich sehe in dem Code nur 1 Attachment, dass angehängt wird, wo ist der Rest. Läuft das in einer Schleife? Auf jeden Fall würde ich mal die 1454 durch EmbeddedObject.EMBED_ATTACHMENT. Zwar wahrscheinlich jetzt nicht das Problem, aber es könnte sonst in Zukunft mal ein Problem werden.

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 11:34:43
Der Code ist n bissl arg unsauber, aber da ich ihn so übernommen habe will ich ihn nicht komplett neu schreiben, da er sehr umfangreich ist. Für jedes Attachment gibt es exakt den selben Code nochmal. Wäre zwar durch eine Schleife oder so schöner gelöst gewesen, aber momentan ist es so realisiert. Aber daran kann es ja eigentlich nicht liegen dass es nicht so funktioniert wie es soll.
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 11:39:40
Sorry aber ich denke du musst schon mehr Code liefern. Das Problem wird ja daran liegen, dass der Code eben nicht ganz gleich ist, wenn es einmal nicht funktioniert und einmal schon. Dein Code enthält keine Fehlerprüfung und auch keine Recycle Aufrufe. Machst du die wirklich nicht, oder hast du die auch unterschlagen?

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 11:41:52
Nein, ich habe nichts unterschlagen. Recycle-Aufrufe ?
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 11:44:37
Du musst die Notes C++ Backendobjekte nach der Verwendung wieder mit dem Methoden aufruf recycle() löschen. sonst bekommst du schon nach kurzer Laufzeit deines Servlets Probleme mit Memoryleaks. Für genauere Infos suche doch einfach mal nach recycle hier im Forum. Es wurde schon öfters ausführlich diskutiert.

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 11:52:44
Ok, werde ich tun. Aber kann es daran liegen, dass die Attachments so eigenartig übertragen werden ? Das merkwürdige ist ja, das nur das letzte Attachment wirklich in das RTF geschrieben wird, der rest nur unten angefügt an das Dokument. Obwohl die Routine für die Attachments immer gleich ist... ich habe es extra verglichen.
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 11:57:51
Sei mir nicht Böse aber Dein code kann einfach so wie du in beschreibst nicht funktionieren. Denn wenn dein Codeblock mehrfach durchlaufen würde, dann wäre das Richtextitem mehrfach da, da du ja immer wieder ein neues erstellst. (Hm wenn ich es mir Recht überlege, eventuell ist dass ja Dein Problem) Also wenn du den Code nicht vollständig posten kannst, aus welchen Grund auch immer wie soll ich Dir helfen?

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 12:17:17
Also hier ist mal der komplette Code der für die Attachments zuständig ist. Es wird schon unterschieden ob bereits einmal durchlaufen wurde. Das wird hier so realisiert, dass die Attachments noch nen Typ kriegen, PDF1-PDF4. Und je nach Typ wird dann unterschieden. Aber am besten du schaust es dir an.

Code
if(LoStrTempType.indexOf("pdf1") != -1)
                        try
                        {
                            LoStrTempFieldValue = "";
                            Blob blob = SqlResult.getBlob(LoStrTempField);
                            InputStream is2 = blob.getBinaryStream();
                            byte data[] = blob.getBytes(1L, (int)blob.length());
                            int length1 = is2.read();
                            if(length1 != -1)
                            {
                                String filename = "C:/temp/Bewerbung_" + FileName1 + "_" + FileName2 + "." + FiletypCL;
                                System.out.println(filename);
                                File f = new File(filename);
                                f.createNewFile();
                                BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(f));
                                os.write(data, 0, (int)blob.length());
                                os.flush();
                                os.close();
                                is2.close();
                                RichTextItem rtitem = LoNotesDocument.createRichTextItem("PersonFiles");
                                rtitem.embedObject(1454, "", filename, "PersonFiles");
                                rtitem.addNewLine();
                                f.delete();
                            }
                        }
                        catch(Exception oe)
                        {
                            System.out.println("Error: Insert of PDF failed:Skip");
                            LoIntOK = 0;
                        }
                    else
                    if(LoStrTempType.indexOf("pdf2") != -1)
                        try
                        {
                            LoStrTempFieldValue = "";
                            Blob blob = SqlResult.getBlob(LoStrTempField);
                            InputStream is2 = blob.getBinaryStream();
                            int length2 = is2.read();
                            if(length2 != -1)
                            {
                                byte data[] = blob.getBytes(1L, (int)blob.length());
                                String filename = "C:/temp/Lebenslauf_" + FileName1 + "_" + FileName2 + "." + FiletypCV;
                                System.out.println(filename);
                                File f = new File(filename);
                                f.createNewFile();
                                BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(f));
                                os.write(data, 0, (int)blob.length());
                                os.flush();
                                os.close();
                                is2.close();
                                if(LoNotesDocument.hasItem("PersonFiles"))
                                {
                                    RichTextItem rtitem = (RichTextItem)LoNotesDocument.getFirstItem("PersonFiles");
                                    rtitem.embedObject(1454, "", filename, "PersonFiles");
                                } else
                                {
                                    RichTextItem rtitem = LoNotesDocument.createRichTextItem("PersonFiles");
                                    rtitem.embedObject(1454, "", filename, "PersonFiles");
                                }
                                f.delete();
                            }
                        }
                        catch(Exception oe)
                        {
                            System.out.println("Error: Insert of PDF failed:Skip");
                            LoIntOK = 0;
                        }
                    else
                    if(LoStrTempType.indexOf("pdf3") != -1)
                        try
                        {
                            LoStrTempFieldValue = "";
                            Blob blob = SqlResult.getBlob(LoStrTempField);
                            InputStream is2 = blob.getBinaryStream();
                            int length2 = is2.read();
                            if(length2 != -1)
                            {
                                byte data[] = blob.getBytes(1L, (int)blob.length());
                                String filename = "C:/temp/Zeugnisse_" + FileName1 + "_" + FileName2 + "." + FiletypRef;
                                System.out.println(filename);
                                File f = new File(filename);
                                f.createNewFile();
                                BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(f));
                                os.write(data, 0, (int)blob.length());
                                os.flush();
                                os.close();
                                is2.close();
                                if(LoNotesDocument.hasItem("PersonFiles"))
                                {
                                    RichTextItem rtitem = (RichTextItem)LoNotesDocument.getFirstItem("PersonFiles");
                                    rtitem.embedObject(1454, "", filename, "PersonFiles");
                                } else
                                {
                                    RichTextItem rtitem = LoNotesDocument.createRichTextItem("PersonFiles");
                                    rtitem.embedObject(1454, "", filename, "PersonFiles");
                                }
                                f.delete();
                            }
                        }
                        catch(Exception oe)
                        {
                            System.out.println("Error: Insert of PDF failed:Skip");
                            LoIntOK = 0;
                        }
                    else
                    if(LoStrTempType.indexOf("pdf4") != -1)
                        try
                        {
                            LoStrTempFieldValue = "";
                            Blob blob = SqlResult.getBlob(LoStrTempField);
                            InputStream is2 = blob.getBinaryStream();
                            int length2 = is2.read();
                            if(length2 != -1)
                            {
                                byte data[] = blob.getBytes(1L, (int)blob.length());
                                String filename = "C:/temp/Weiteres_" + FileName1 + "_" + FileName2 + "." + FiletypMore;
                                System.out.println(filename);
                                File f = new File(filename);
                                f.createNewFile();
                                BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(f));
                                os.write(data, 0, (int)blob.length());
                                os.flush();
                                os.close();
                                is2.close();
                                if(LoNotesDocument.hasItem("PersonFiles"))
                                {
                                    RichTextItem rtitem = (RichTextItem)LoNotesDocument.getFirstItem("PersonFiles");
                                    rtitem.embedObject(1454, "", filename, "PersonFiles");
                                } else
                                {
                                    RichTextItem rtitem = LoNotesDocument.createRichTextItem("PersonFiles");
                                    rtitem.embedObject(1454, "", filename, "PersonFiles");
                                }
                                f.delete();
                            }
                        }
                        catch(Exception oe)
                        {
                            System.out.println("Error: Insert of PDF failed:Skip");
                            LoIntOK = 0;
                        }  
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 12:25:17
Ok, das ist natürlich schlimm. Ich würde als ersten Schritt empfehlen, die Variable rtitem auf die oberste Ebene zu ziehen und dann nur noch einmal zu belegen beim erstellen. Dann kannst du dir auch die ganzen checks sparen ob das Objet schon da ist. Ich hatte da in dem Bereich schon massive Probleme, da Notes aus mir nicht erklärlichen Gründen RichTextItems erst beim speichern so richtig wieder zugänglich macht. Weiss zwar nicht ob es hier auch von Bedeutung ist, aber ein Versuch ist der minimale Aufwand auf jeden Fall Wert.

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 12:54:01
Ok, das heißt, ich leg rtitem ganz oben in die Methode ? Den Check muss ich doch dann trotzdem einmal ausführen, oder ?

Wie meinst du das mit dem speichern ? Was soll ich da am betsen versuchen ?
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 12:57:40
Laut Deinem Code musst du den Check dann nicht machen, da du ihn ja beim ersten mal auch nicht machst. Ob das richtig ist oder nicht kannst du nur anhand des restlichen Codes beurteilen. Also einfach mal rtitem ganz oben definieren und erstellen. Und dann das rtitem im Code immer wieder verwenden. Der Code wird dadurch auch gleich mal ein wenig aufgeräumter.

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 13:00:53
Ok, vielen Dank, das werde ich gleich ausprobieren. Sollte ich zusätzlich noch irgendwas anderes ausprobieren, wegen speichern o.Ä. ?
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 13:04:28
Nein erst mal nur das.

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 13:06:44
Wird sofort ausprobiert. Ich danke Ihnen für Ihre schnelle Hilfe. Sie haben sich ja doch ne ganze Weile Zeit genommen.

Vielleicht reicht die kleine Änderung ja schon, um das Problem zu lösen. :)
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 15:01:25
Also, leider hat es keine Veränderung gebracht. Die Attachments werden nach wie vor scheinbar willkürlich gespeichert. Haben Sie evtl. noch eine andere Idee ? Evtl. die Sache mit speichern, dei Sie vorhin erwähnten ?
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 15:34:41
Schade das es nichts gebracht hat. Was heisst den willkürlich. ist es nicht immer das gleiche Attachment das nicht im Richtextfeld aufscheint.

Das mit dem Speichern bezog sich auf die Noteseigenart, dass Änderungen an einem Richtextitem im Backend im Frontent erst nach einem speichern und neuladen des Dokuments sichtbar sind. Das kann aber hier eher keine Rolle spielen.

Ich probier das mit den Attachments mal bei mir schnell aus.

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: flaite am 18.08.08 - 15:38:52
Du kannst noch versuchen, dass RichTextItem nicht über getFirstItem() referenzieren, sondern über New RichTextItem(params). Existiert in der Maske ein RichTextItem mit dem Namen PersonFiles  ???
Ich würd dazu tendieren, die langen if-else-Zweige mit Command Pattern zu ersetzen (http://en.wikipedia.org/wiki/Command_pattern), hat aber nichts mit deinem eigentlichen Problem zu tun. 
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 15:40:28
Ja, das RichTextItem Existiert in der Maske.
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 15:56:01
also ich habe es jetzt bei mir ausporbiert mit 4 Attachments in ein Body Feld mit Text gemischt und es funktioniert soweit einwandfrei, dass alle Attachments an die richtige Stelle kommen. Ich bekomme zwar auch graue Symbole, aber ich denke mal dass ist normal, da diese schönen Symbole nur im Frontend gerendert werden. Kannst du eventuell eine Demodatenbank zur Verfügung stellen in der das Problem auftritt, damit ich es bei mir nachvollziehen kann.

Grüße

Ralf

Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 16:40:37
So, ich habe jetzt noch etwas versucht, ich habe jetzt zusätzlich noch mehrmals das Dokument vor und nach dem Einfügen gespeichert ( Document.save() ), habe jetzt aber das Problem, dass nun alle 4 Attachments uner dem Dokument sind, keines mehr im RichTextfeld. Hm, kann es vielleicht doch daran liegen dass ich das Dokument neu laden muss nach dem speichern ? Falls ja, wie mache ich das übers Backend ?

Das mit der Demodatenbank wird sich so schnell wahrscheinlich nicht bewerkstelligen lassen, da an dem System noch einiges dranhängt und es auf ein paar externe Ressourcen zugreift.

Funktioniert das referenzieren mit createRichtextItem auch, wenn in der Maske bereits das RTItem / Feld existiert ?
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 18.08.08 - 17:06:38
Nein createRichTextitem erstellt ein neues Richtextitem. Man kann interessanterweise nämlich mehr Items mit gleichem Namen haben. Das wird aber dann vom Zugriff nur seltsam unterstützt. Ich denke es bleibt nicht viel anderes übrig als das ganze in eine abgespekte Demo zu inkludieren. Ich habe eine solche bei mir schnell gemacht und da funktioniert es einwandfrei.

Grüße

Ralf
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: AbsoluterBeginner am 18.08.08 - 17:24:38
Die Frage ist, ob es überhaupt an der Datenbank liegt...  Die Attachments werden ja von einem Java-Servlet angefügt, das auf dem Dominoserver ausgeführt wird.

Auch das löschen und Neuerstellen des RTItems und referenzieren mittels CreateNew... brachten keine Änderung.
Titel: Re: Attachments per JavaServlet anhängen / embedObject
Beitrag von: Ralf_M_Petter am 19.08.08 - 10:27:05
Du musst den relevanten Java Code ja nicht in einem Servlet laufen lassen, der läuft genausogut zum testen in einem Agenten, oder extern in einem Standalone Javaprogramm. Ich denke ohne reproduzierbaren Testcase, den ich gerne bei uns einmal testen kann, wirst du nicht weiterkommen. Der Vorteil für dich ist falls du dich entschliessen solltest dich an den Support zu wenden, werden sie das gleich verlangen.

Grüße

Ralf