/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.sword2;
import org.apache.abdera.Abdera;
import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.dspace.content.Collection;
import org.dspace.content.DCValue;
import org.dspace.content.Item;
import org.dspace.content.ItemIterator;
import org.dspace.content.WorkspaceItem;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.workflow.WorkflowItem;
import org.swordapp.server.AuthCredentials;
import org.swordapp.server.CollectionListManager;
import org.swordapp.server.SwordAuthException;
import org.swordapp.server.SwordConfiguration;
import org.swordapp.server.SwordError;
import org.swordapp.server.SwordServerException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class CollectionListManagerDSpace extends DSpaceSwordAPI implements CollectionListManager
{
public Feed listCollectionContents(IRI colIRI, AuthCredentials authCredentials, SwordConfiguration swordConfig)
throws SwordServerException, SwordError, SwordAuthException
{
SwordContext sc = null;
try
{
SwordConfigurationDSpace config = (SwordConfigurationDSpace) swordConfig;
sc = this.doAuth(authCredentials);
Context context = sc.getContext();
SwordUrlManager urlManager = config.getUrlManager(context, config);
Collection collection = urlManager.getCollection(context, colIRI.toString());
List<Item> items = this.listItems(sc, collection, swordConfig);
Feed feed = this.itemListToFeed(sc, items, swordConfig);
return feed;
}
catch (DSpaceSwordException e)
{
throw new SwordServerException(e);
}
finally
{
// this is a read operation only, so there's never any need to commit the context
if (sc != null)
{
sc.abort();
}
}
}
private Feed itemListToFeed(SwordContext sc, List<Item> items, SwordConfiguration swordConfig)
throws DSpaceSwordException
{
SwordConfigurationDSpace config = (SwordConfigurationDSpace) swordConfig;
SwordUrlManager urlManager = config.getUrlManager(sc.getContext(), config);
Abdera abdera = new Abdera();
Feed feed = abdera.newFeed();
for (Item item : items)
{
Entry entry = feed.addEntry();
entry.setId(urlManager.getEditIRI(item).toString());
String title = this.stringMetadata(item, ConfigurationManager.getProperty("swordv2-server", "title.field"));
title = title == null? "Untitled" : title;
entry.setTitle(title);
entry.addLink(urlManager.getContentUrl(item).toString(), "edit-media");
}
return feed;
}
private List<Item> listItems(SwordContext sc, Collection collection, SwordConfiguration swordConfig)
throws DSpaceSwordException
{
try
{
EPerson person = sc.getOnBehalfOf() != null ? sc.getOnBehalfOf() : sc.getAuthenticated();
List<Item> collectionItems = new ArrayList<Item>();
// first get the ones out of the archive
ItemIterator items = Item.findBySubmitter(sc.getContext(), person);
while(items.hasNext())
{
Item item = items.next();
Collection[] cols = item.getCollections();
for (Collection col : cols)
{
if (col.getID() == collection.getID())
{
collectionItems.add(item);
break;
}
}
}
// now get the ones out of the workspace
WorkspaceItem[] wsis = WorkspaceItem.findByEPerson(sc.getContext(), person);
for (WorkspaceItem wsi : wsis)
{
Item item = wsi.getItem();
// check for the wsi collection
Collection wsCol = wsi.getCollection();
if (wsCol.getID() == collection.getID())
{
collectionItems.add(item);
}
// then see if there are any additional associated collections
Collection[] cols = item.getCollections();
for (Collection col : cols)
{
if (col.getID() == collection.getID())
{
collectionItems.add(item);
break;
}
}
}
// finally get the ones out of the workflow
WorkflowItem[] wfis = WorkflowItem.findByEPerson(sc.getContext(), person);
for (WorkflowItem wfi : wfis)
{
Item item = wfi.getItem();
// check for the wfi collection
Collection wfCol = wfi.getCollection();
if (wfCol.getID() == collection.getID())
{
collectionItems.add(item);
}
// then see if there are any additional associated collections
Collection[] cols = item.getCollections();
for (Collection col : cols)
{
if (col.getID() == collection.getID())
{
collectionItems.add(item);
break;
}
}
}
return collectionItems;
}
catch (SQLException e)
{
throw new DSpaceSwordException(e);
}
}
private String stringMetadata(Item item, String field)
{
if (field == null)
{
return null;
}
DCValue[] dcvs = item.getMetadata(field);
if (dcvs == null)
{
return null;
}
StringBuilder md = new StringBuilder();
for (DCValue dcv : dcvs)
{
if (md.length() > 0)
{
md.append(", ");
}
md.append(dcv.value);
}
return md.toString();
}
}