Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: ceiphren am 26.06.09 - 16:45:06

Titel: Verständnisfrage für die DocumentCollection
Beitrag von: ceiphren am 26.06.09 - 16:45:06
Hallo zusammen,

Ich versteh die Ordnung der DocumentCollection nicht ganz.
Im folgenden Agenten erzeuge ich eine view und will in der Reihenfolge, in der die ViewEntries ankommen, Dokumente in eine DocumentCollection schreiben.

Der ViewNavigator iteriert auch richtig durch die Dokumente durch, aber die
DocumentCollection schreibt sie nicht in der gleichen Reihenfolge rein.
Das Resultat kann man in der zweiten Schleife sehen, wo die Dokumente in einer anderen, aber nicht wirklich nachvollziehbaren Reihenfolge herauskommen.

import lotus.domino.*;

import java.io.FileOutputStream;
import java.util.Random;

public class dxlExporter extends AgentBase
{
   public void NotesMain()
   {
      try
      {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();
         Database db = agentContext.getCurrentDatabase();
         
         DocumentCollection selectedDocs = agentContext.getUnprocessedDocuments();
         DocumentCollection coll = createDocumentCollection(db);
         
         View view = selectedDocs.getFirstDocument().getParentView();
         ViewNavigator viewNav = view.createViewNav();
         
         System.out.println(view);
         ViewEntry entry = viewNav.getFirst();
         while(entry != null)
         {
            Document doc = entry.getDocument();
            if(doc != null)
            {
               System.out.println(doc.getItemValue("Subject"));
               
               if(selectedDocs.getDocument(doc) != null)
                  coll.addDocument(doc, false);
            }
            entry = viewNav.getNext();
         }
         
         System.out.println("\n");
         Document doc3 = coll.getFirstDocument();
         while(doc3 != null)
         {
            System.out.println(doc3.getItemValue("Subject"));
            doc3 = coll.getNextDocument();
         }
         
         
      } catch(Exception e) { e.printStackTrace(); }
   }
   
   public DocumentCollection createDocumentCollection(Database db) throws NotesException
   {
      double b = new Random().nextDouble();
      return db.search(b+" = \""+b+"\"");
   }
}


btw. das Erstellen der DocumentCollection erscheint etwas wirr, aber ich muss in domino 7 programmieren und die dortige java-version kennt keine Methode zum erstellen einer leeren Collection.
Titel: Re: Verständnisfrage für die DocumentCollection
Beitrag von: Gandhi am 26.06.09 - 16:46:10
DocumentCollections im Notes kennen keine Reihenfolge  >:(
Titel: Re: Verständnisfrage für die DocumentCollection
Beitrag von: ceiphren am 29.06.09 - 08:50:58
Das ist verdammt schlecht. Es geht schlussendlich darum, die Dokumente in einer gewünschten Reihenfolge als dxl zu exportieren, aber der Exporter nimmt nur DocumentCollections und NoteCollections an und beide ignorieren die Reihenfolge, mit der sie die Dokumente bekommen.

Mir fällt langsam nichts weiter ein, als so ne Art Meta-Item zu erzeugen, indem der Index des Dokumentes festgehalten wird, damit ich die Reihenfolge der Dokumente aus der dxl abfragen kann... aber das ist ne ziemlich blöde Lösung.
Titel: Re: Verständnisfrage für die DocumentCollection
Beitrag von: flaite am 29.06.09 - 16:00:49
In Java kannst du die DocumentCollection iterieren und die Documents in ein SortedSet schreiben. Hm. Bzw. du mußt Wrapper Objekte erzeugen, die dann das Comparator-Interface implementieren. Und DXLExporter/Importer könntest du mit solchen Gebilden eh nicht nutzen.
Du kannst natürlich auch jedes Dokument einzeln als importieren/exportieren. Und im Filesystem eine Sortierung erzeugen.
In JavaCollectionFrameworkSprach ist DocumentCollection hinsichtlich der Sortierung unwiderruflich HashSet. Es existieren keine sortierbaren Kinder-Klassen davon. 
 
Titel: Re: Verständnisfrage für die DocumentCollection
Beitrag von: ceiphren am 29.06.09 - 16:11:20
@Pitiyankee: das Problem, die Dokumente einzeln zu exportierten ist aber, dass ich dann zum einen mal locker über 100 xml-Dateien habe, anstatt eines einfachen Streams. Das weitere handling würde dann etwas ausufern.

Also nichtsdestotrotz hab ich das Wunder hinbekommen, die DocumentCollection in der gewünschten Reihenfolge zu erzeugen.

Die Dokumente stehen also an den gewünschten Stellen.

Jetzt kommt aber das Problem, dass der dxlExporter meine Reihenfolge ignoriert.
Er exportiert die Dokumente nämlich immer so, wie sie in der Kategorie "All Documents" steht (ich benutze die Datenbank "personal journal", die in jeder Notes-Version dabei sein müsste, als Testapplikation).

Die Sortierungen nach "By Category" und "By Diary Date" kann ich zwar in meiner Collection erzeugen, das juckt den Exporter aber herzlich wenig.

Zurzeit sieht der Agent wie folgt aus:

import lotus.domino.*;

import java.io.FileOutputStream;
import java.util.Random;

public class dxlExporter extends AgentBase
{
   private String Path = "Path-to-file";
   
   public void NotesMain()
   {
      try
      {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();
         Database db = agentContext.getCurrentDatabase();
         
         DocumentCollection selectedDocs = agentContext.getUnprocessedDocuments();
         DocumentCollection coll = createDocumentCollection(db);
         
         View view = selectedDocs.getFirstDocument().getParentView();
         ViewEntryCollection viewNav = view.getAllEntries();
         
         System.out.println(db.getViews());
         
         ViewEntry entry = viewNav.getFirstEntry();
         while(entry != null)
         {
            Document doc = entry.getDocument();
            if(doc != null)
            {
               System.out.println(doc.getItemValue("Subject"));   
               if(selectedDocs.getDocument(doc) != null)
                  coll.addDocument(doc, false);
            }
            entry = viewNav.getNextEntry();
         }
         
         System.out.println("blubberblabla\n\n");
         Document doc3 = coll.getFirstDocument();
         while(doc3 != null)
         {
            System.out.println(doc3.getItemValue("Subject"));
            doc3 = coll.getNextDocument();
         }
         
         exportDocs(coll, session, db);
         
      } catch(Exception e) { e.printStackTrace(); }
   }


   public DocumentCollection createDocumentCollection(Database db) throws NotesException
   {
      double b = new Random().nextDouble();
      return db.FTSearch(null);
   }
   
   
   void exportDocs(DocumentCollection coll, Session session, Database db) throws Exception
   {
      NoteCollection coll2 = db.createNoteCollection(true);
      System.out.println(coll2.getCount());
      Document doc = coll.getFirstDocument();
      while(doc != null)
      {
         coll2.add(doc);
         doc = coll.getNextDocument();
      }
      System.out.println(coll2.getCount());
      DxlExporter exp = session.createDxlExporter();
      exp.setOutputDOCTYPE(false);
      exp.setConvertNotesBitmapsToGIF(true);
      
      String dxlResult = exp.exportDxl(coll2);
      
      FileOutputStream out = new FileOutputStream(Path);
      out.write(dxlResult.getBytes("utf-8"));
      out.close();
   }
}