Manchmal wäre es wirklich nützlich, diese "Gemeinsam, privat bei Erstbenutzung"-Ordner
(Shared, private on first use = SPOFU) verwenden zu können.
Soll zum Beispiel jeder Benutzer einer
Notes-Anwendung die Möglichkeit haben, in einem Ordner seine Favoriten
zu sammeln, und hat er keine Berechtigung, alle Dokumente der Datenbank
zu verändern - es kann also nicht irgendetwas für diesen Benutzer in das
Dokument selbst eingetragen werden - dann bleiben nur noch private oder
eben "Gemeinsam, privat bei Erstbenutzung"-Ordner übrig.
Ein solcher Ordner ist auch schnell
erstellt. Die Sache hat trotzdem einen gewichtigen Haken: Hat der Benutzer
einmal auf den gemeinsamen Ordner geklickt und damit seine private Kopie
erstellt, kann man die Gestaltung dieser Kopie nicht mehr zentral aktualisieren.
Eine typische Lösung für das Problem
ist es, diesen Ordner zu löschen, so dass der Benutzer das nächste Mal,
wenn er den Ordner benutzen will, wieder eine neue private Kopie - jetzt
vom veränderten Original erstellt.
Dieser Ansatz ist aber nicht ideal:
Zum einen stellt sich die Frage, wann
die Privatkopie gelöscht werden soll. Bei jedem Verlassen der Datenbank?
Dann kann der Benutzer diesen Ordner praktisch gar nicht zum langfristigen
Sammeln benutzen, weil er zwischen zwei Sitzungen immer geleert würde.
Oder man setzt zentral irgendeine Art Signal, zum Beispiel einen bestimmten
Feldwert in einem Datenbankprofil-Dokument. Dann muss man aber immer, wenn
man die Gestaltung des Ordners verändert, daran denken, dieses Flag zu
setzen. Besser wäre es, wenn dieses Löschen automatisch immer genau dann
und nur dann passieren würde, wenn sich die Gestaltung des Originals verändert.
Zum anderen bedeutet das Löschen des
Ordners natürlich auch, dass alle Dokument-Zuordnungen verloren gehen.
Spätestens nach dem zweiten, dritten Mal wird kaum ein Benutzer den Favoritenordner
mehr verwenden, wenn der seinen Inhalt sowieso irgendwann wieder verliert.
Aber mit ein wenig "Magie"
und Fleiß lassen sich beide Probleme in den Griff bekommen...
Zuerst müssen wir die richtige Stelle finden,
wo wir das Löschen implementieren wollen. Da man den Ordner nur löschen
sollte, wenn er nicht gerade aktiv (also geöffnet) ist, ist das Datenbank-Script
wahrscheinlich der beste Kandidat. Beim Öffnen oder beim Schließen? Ich
habe mich für das Schließen der Datenbank, genauer: das QueryClose() im
Datenbank-Script entschieden, weil es nicht als so performance-kritisch
wahrgenommen wird wie das Öffnen einer Datenbank.
Jetzt müssen wir herausfinden, ob sich
die Gestaltung des Orignials verändert hat. Dazu kann man den LastModified-Zeitpunkt
des öffentlichen Ordners mit dem Created-Zeitpunkt des privaten vergleichen.
Liegt LastModified zeitlich hinter Created, muss die private Kopie aktualisiert
werden.
Also müssen wir auf beide Ordner irgendwie
zugreifen können.
Der private Ordner ist einfach: Ein
GetView(Ordnername) auf die aktuelle Datenbank und wir sind fertig. Wird
Nothing zurückgegeben, wurde die Privatkopie nicht erstellt und es muss
folglich auch nichts aktualisiert werden. Sonst haben wir jetzt die NotesView
mit ihrer Created-Eigenschaft für den Vergleich zur Verfügung.
Der gemeinsame Ordner ist da schon schwieriger.
Eine Möglichkeit, die ich gefunden habe, besteht darin, eine NotesNoteCollection
mit allen Ordnern zu erstellen, diese zu durchlaufen, und beim richtigen
Ordner, also dem nicht-privaten Ordner ($Flags enthält nicht "V")
mit dem gegebenen Namen stehen zu bleiben. Wenn der gemeinsame Ordner nicht
gelöscht oder umbenannt wurde, sollte er so auf alle Fälle gefunden werden.
Performance-mäßig ist das sicherlich nicht ganz so toll, aber wenn es nicht
zu viele Ordner gibt, sollte das noch tolerabel sein. Ich bin offen für
andere Ideen und Ansätze...
Der Rest ist trivial: Die beiden Zeitpunkte
vergleichen und gegebenenfalls den privaten Ordner mittels Remove() löschen.
Halt, da war doch noch was: Es wäre
doch toll, wenn die zugeordneten Dokumente nicht verloren gehen würden.
Dazu erstelle ich einen neuen, versteckten
Ordner und kopiere alle Dokumente des zu löschenden Ordners dort hinein.
Danach erst lösche ich den privaten Ordner.
Hier ist der Code soweit: