Search the FirstSpirit Knowledge Base
Hallo zusammen,
wir haben in einem Projekt den Anwendungsfall, daß wir Dateien per API in den Mediastore schreiben oder vorhandene Dateien updaten. Die Dateinamen sind immer gleich und bei uns gilt Dateiname = Resourcenname. Das funktioniert soweit gut.
Falls aber jemand im Java Client eine Resource aus dem MediaStore löscht bekommen wir Probleme. Unsere Implementierung macht das hier, um bereits vorhandene MediaStore Resourcen zu finden
(Media) mediaStore.getStoreElement(targetFileId, UidType.MEDIASTORE_LEAF)
Die Resource wird nicht gefunden, deshalb wird versucht eine neue anzulegen. Da die gelöschte Version immer noch im System ist und die targetFileId blockiert, erhalten wir eine
DuplicateReferenceNameException
Alle gelöschten Resourcen können wir uns über
mediaStore.getDeletedChilds(-1, 0);
holen, allerdings fehlt noch der Schritt gelöschte Resourcen wiederherstellen zu können. In der zurückgegebenen Liste befinden sich DeletedElementsInfo, die wiederum Listen von ElementInfo enthalten.
Die Methode revert() habe ich allerdings nur auf IDProvidern gefunden.
Wie kann ich mit einem ElementInfo eine Resource im MediaStore wiederherstellen? Irgendwie muß das ja gehen, schließlich kann der Java Client das auch
Vielen Dank im Voraus,
Christoph
Hallo Christoph,
Der MediaStoreRoot hat die Methode restore(), welche es ermöglicht gelöschte Elemente wiederherzustellen.
Dies funktioniert beispielsweise mit folgendem Skript:
//!Beanshell
p = context.getProject();
lang = p.getMasterLanguage();
mediaStore = p.getUserService().getStore(de.espirit.firstspirit.access.store.Store.Type.MEDIASTORE, false);
childs = mediaStore.getDeletedChilds(-1, 0);
mediaStore.restore(childs.get(0).getDeletedElements().get(0), null);
Die Methode mediaStore.getDeletedChilds(-1, 0) liefert eine Liste von Objekten vom Typ DeletedElementsInfo zurück. Hier wird nur der erste Listeneintrag genommen und eine Liste von ElementInfo Objekten geholt. Das obige Skript stellt erstmal nur das erste Element wieder her. Um wirklich alle wiederherzustellen muss man durch die beiden Listen iterieren, statt nur get(0) aufzurufen.
Aufpassen muss man aber beim Aufruf von mediaStore.getDeletedChilds(-1, 0). Wenn es sich um ein großes Projekt handelt wird die Anzahl der Ergebnisse unüberschaubar groß und es kann zu starken Performanceproblemen kommen.
Um das zu verhindern kann man die Anzahl der Ergebnisse auf z.B. 2000 begrenzen und nur ab einer bestimmten Revision wiederherstellen. (revisionDate ist das Datum ab dem die Elemente wiederhergestellt werden sollen, z.B. die letzten 10 Wochen)
mediaStore.getDeletedChilds( project.getRevision(Date revisionDate, 2000)
Viele Grüße
Rouven
Hallo Christoph,
Der MediaStoreRoot hat die Methode restore(), welche es ermöglicht gelöschte Elemente wiederherzustellen.
Dies funktioniert beispielsweise mit folgendem Skript:
//!Beanshell
p = context.getProject();
lang = p.getMasterLanguage();
mediaStore = p.getUserService().getStore(de.espirit.firstspirit.access.store.Store.Type.MEDIASTORE, false);
childs = mediaStore.getDeletedChilds(-1, 0);
mediaStore.restore(childs.get(0).getDeletedElements().get(0), null);
Die Methode mediaStore.getDeletedChilds(-1, 0) liefert eine Liste von Objekten vom Typ DeletedElementsInfo zurück. Hier wird nur der erste Listeneintrag genommen und eine Liste von ElementInfo Objekten geholt. Das obige Skript stellt erstmal nur das erste Element wieder her. Um wirklich alle wiederherzustellen muss man durch die beiden Listen iterieren, statt nur get(0) aufzurufen.
Aufpassen muss man aber beim Aufruf von mediaStore.getDeletedChilds(-1, 0). Wenn es sich um ein großes Projekt handelt wird die Anzahl der Ergebnisse unüberschaubar groß und es kann zu starken Performanceproblemen kommen.
Um das zu verhindern kann man die Anzahl der Ergebnisse auf z.B. 2000 begrenzen und nur ab einer bestimmten Revision wiederherstellen. (revisionDate ist das Datum ab dem die Elemente wiederhergestellt werden sollen, z.B. die letzten 10 Wochen)
mediaStore.getDeletedChilds( project.getRevision(Date revisionDate, 2000)
Viele Grüße
Rouven
Hallo Rouven,
danke für deine Antwort, das war der "missing link". Meine Implementierung funktioniert nun so wie gedacht.
Gut finde ich auch deinen Performancehinweis für
mediaStore.getDeletedChilds(-1, 0);
Ich verwende die Methode allerdings nur, wenn ich eine DuplicateReferenceNameException erhalte und es ist auch nicht der Regelfall, daß eine programmatisch erzeugte Datei gelöscht wird. Deshalb gehe ich davon aus, daß dieser Fall nur selten eintritt.
Noch praktischer wäre es natürlich, wenn in der DuplicateRefernceException direkt das passende ElementInfo enthalten wäre. So könnte ich mir diverses Loopen ersparen.
Schöne Ostern,
Christoph