Tuesday, December 21, 2010

Ricercare oggetti nel Recycle Bin

clip_image001

Qualche giorno fa rispondendo ad alcune domande sul newsgroup di SharePoint 2010 - General Questions and Answers mi sono imbattuto in una richiesta in merito alla possibile di ricercare elementi del cestino (Recyle Bin).

Recycle Bin 101
Il Recycle Bin di SharePoint è accessibile sia a livello di ogni site che a livello di site collection e contiene tutti gli item cancellati. Parlare di un solo cestino non è corretto, SharePoint ha due cestini che si chiamano di primo livello o first stage e secondo livello o second stage.
Perchè due cestini? Una risposta tipo è: " ci sono due cestini perchè conosciamo i nostri polli (utenti ndr)" :)
Spiegazioni: gli utenti con la stessa velocità con il quale inseriscono dati sulle liste attrettanto rapidamente li cancellano (se ne hanno i permessi naturalmente). I cestini servono quindi ad evitare che i dati cancellati vengano effettivamente eliminati, parcheggiandoli invece in un'area temporanea dalla quale è possibile ripristinarli o cancellarli definitivamente.
I dati cancellati dopo un certo periodo di tempo, la configurazione di default è 30 giorni, vengono spostati dal cestino di primo livello a quello di secondo dove permangono ancora per un certo periodo di tempo.
Mentre al cestino di primo livello posso accedere gli utenti membri della site collection che hanno permessi di Contribute, Design o Full Control, in quello di secondo livello posso accedere solo i site collection administrators.

Problema
Facciamo un passo indietro tornando alla richiesta di ricercare item nel cestino.
Avere centinaia, se non migliaia di elementi nel cestino e richiede avere funzionalità avanzate per permettono di ricercare i dati per restorarli. I dati contenuti nel cestino possono essere ordinati ma non è stata inserita nessuna funzionalità di ricerca sulla user interface di SharePoint. Come fare?

Soluzione
L'object model di SharePoint la risposta.
Il cestino non una lista e quindi non è possibile interrogarla tramite CAML query. Ci sono una serie di classi quali ad esempio SPRecycleBinQuery, SPRecycleBinItemCollectionPosition, SPRecycleBinItemCollection, SPRecycleBinItem che permettono di interagire con il cestino. Attenzione però non facciamoci trarre in inganno dal nomi pensando che la classe SPRecycleBinQuery possa filtare i dati in qualche meta linguaggo. Questa permette di settare parametri della ricerca (ordinamenti, livello di stage, numero di elemente per pagina, ecc...) ma non di filtrare i contenuti.


private SPRecycleBinQuery CreateQuery(SPRecycleBinItemCollectionPosition page, int rowlimit)
{
            SPRecycleBinQuery query = new SPRecycleBinQuery();
            query.RowLimit = rowlimit;
            query.ItemState = SPRecycleBinItemState.FirstStageRecycleBin;
            query.OrderBy = SPRecycleBinOrderBy.Default;
            // Set right page
            if (page == null)
                query.ItemCollectionPosition = SPRecycleBinItemCollectionPosition.FirstPage;
            else
                query.ItemCollectionPosition = page;
            return query;
  }

Un'altra particolarità dell'oggetto SPRecycleBinQuery è che restituisce i dati paginati. Per ottenere il set completo di tutti gli dati contenuti nel calendario risultati occorre quindi interrogarlo più volte, pagina per pagina, passandogli un'oggetto di tipo SPRecycleBinItemCollectionPosition che contiene le informazioni relative alla paginazione.


public void GetRecycleBinItems
{
            // Query recycle bin
            SPSite site = SPContext.Current.Site;
            SPRecycleBinItemCollectionPosition page = null;
            do
            {
                SPRecycleBinQuery query = CreateQuery(page, PageRows);
                SPRecycleBinItemCollection recycleitems = site.GetRecycleBinItems(query);
                FilterRecycleBinItems(recycleitems);
                page = recycleitems.ItemCollectionPosition;
            }
            while (page != null);
}


Per filtrare i dati occorrerà quindi lavorare i risultati delle ricerca decidendo se includere o escludere ogni singolo risultato della ricerca.
E' chiaro che in questo esempio di codice non sono state considerate le performance. Per velocizzare le operazioni si potrebbero inserire degli algoritmi di ricerca avanzata. Un punto di partenza potrebbe essere fare una ricerca binaria facendosi restituire dal SharePoint un'array ordinato sul campo da usare come filtro.

Downloads
WSP | Source Code








No comments:

Post a Comment