/**
* 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.Item;
import org.dspace.content.MetadataValue;
import org.dspace.content.WorkspaceItem;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.WorkspaceItemService;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.workflow.WorkflowItem;
import org.dspace.workflow.WorkflowItemService;
import org.dspace.workflow.factory.WorkflowServiceFactory;
import org.swordapp.server.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CollectionListManagerDSpace extends DSpaceSwordAPI
implements CollectionListManager
{
protected WorkspaceItemService workspaceItemService = ContentServiceFactory
.getInstance().getWorkspaceItemService();
protected WorkflowItemService workflowItemService = WorkflowServiceFactory
.getInstance().getWorkflowItemService();
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());
if (collection == null)
{
throw new SwordError(404);
}
List<Item> items = this.listItems(sc, collection, swordConfig);
return this.itemListToFeed(sc, items, swordConfig);
}
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<>();
// first get the ones out of the archive
Iterator<Item> items = itemService
.findBySubmitter(sc.getContext(), person);
while (items.hasNext())
{
Item item = items.next();
List<Collection> cols = item.getCollections();
for (Collection col : cols)
{
if (col.getID().equals(collection.getID()))
{
collectionItems.add(item);
break;
}
}
}
// now get the ones out of the workspace
List<WorkspaceItem> wsis = workspaceItemService
.findByEPerson(sc.getContext(), person);
for (WorkspaceItem wsi : wsis)
{
Item item = wsi.getItem();
// check for the wsi collection
Collection wsCol = wsi.getCollection();
if (wsCol.getID().equals(collection.getID()))
{
collectionItems.add(item);
}
// then see if there are any additional associated collections
List<Collection> cols = item.getCollections();
for (Collection col : cols)
{
if (col.getID().equals(collection.getID()))
{
collectionItems.add(item);
break;
}
}
}
// finally get the ones out of the workflow
List wfis = workflowItemService.findBySubmitter(sc.getContext(),
person);
for (Object found : wfis)
{
if (found instanceof WorkflowItem)
{
WorkflowItem wfi = (WorkflowItem) found;
Item item = wfi.getItem();
// check for the wfi collection
Collection wfCol = wfi.getCollection();
if (wfCol.getID().equals(collection.getID()))
{
collectionItems.add(item);
}
// then see if there are any additional associated collections
List<Collection> cols = item.getCollections();
for (Collection col : cols)
{
if (col.getID().equals(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;
}
List<MetadataValue> dcvs = itemService
.getMetadataByMetadataString(item, field);
if (dcvs == null)
{
return null;
}
StringBuilder md = new StringBuilder();
for (MetadataValue dcv : dcvs)
{
if (md.length() > 0)
{
md.append(", ");
}
md.append(dcv.getValue());
}
return md.toString();
}
}