Datei im MediaStore programmatisch per API wiederherstellen
Author: christoph_guse
Publication Date: 4/3/2012 15:46
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 :smileywink:
Vielen Dank im Voraus,
Christoph
-
Author: broszeit - 4/5/2012 8:50
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
0
Vous devez vous connecter pour laisser un commentaire.
Commentaires
1 commentaire