/**
* 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.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Item;
import org.dspace.core.Context;
import org.swordapp.server.OriginalDeposit;
import org.swordapp.server.ResourcePart;
import org.swordapp.server.Statement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.ArrayUtils;
import org.dspace.services.factory.DSpaceServicesFactory;
public abstract class GenericStatementDisseminator
implements SwordStatementDisseminator
{
protected SwordUrlManager urlManager;
protected void populateStatement(Context context, Item item,
Statement statement)
throws DSpaceSwordException
{
this.urlManager = new SwordUrlManager(new SwordConfigurationDSpace(),
context);
List<String> includeBundles = this.getIncludeBundles();
String originalDepositBundle = this.getOriginalDepositsBundle();
// we only list the original deposits in full if the sword bundle is in the includeBundles
if (includeBundles.contains(originalDepositBundle))
{
List<OriginalDeposit> originalDeposits = this
.getOriginalDeposits(context, item, originalDepositBundle);
statement.setOriginalDeposits(originalDeposits);
}
Map<String, String> states = this.getStates(context, item);
statement.setStates(states);
// remove the original deposit bundle from the include bundles
includeBundles.remove(originalDepositBundle);
List<ResourcePart> resources = this
.getResourceParts(context, item, includeBundles);
statement.setResources(resources);
Date lastModified = this.getLastModified(context, item);
statement.setLastModified(lastModified);
}
protected List<OriginalDeposit> getOriginalDeposits(Context context,
Item item, String swordBundle)
throws DSpaceSwordException
{
try
{
// NOTE: DSpace does not store file metadata, so we can't access the information
// about who deposited what, when, on behalf of whoever.
List<OriginalDeposit> originalDeposits = new ArrayList<OriginalDeposit>();
// an original deposit is everything in the SWORD bundle
List<Bundle> bundles = item.getBundles();
for (Bundle bundle : bundles)
{
if (swordBundle.equals(bundle.getName()))
{
List<Bitstream> bitstreams = bundle
.getBitstreams();
for (Bitstream bitstream : bitstreams)
{
// note that original deposits don't have actionable urls
OriginalDeposit deposit = new OriginalDeposit(
this.urlManager.getBitstreamUrl(
bitstream));
deposit.setMediaType(bitstream
.getFormat(context).getMIMEType());
originalDeposits.add(deposit);
}
}
}
return originalDeposits;
}
catch (SQLException e)
{
throw new DSpaceSwordException(e);
}
}
protected Map<String, String> getStates(Context context, Item item)
throws DSpaceSwordException
{
SwordConfigurationDSpace config = new SwordConfigurationDSpace();
WorkflowTools wft = new WorkflowTools();
Map<String, String> states = new HashMap<String, String>();
if (item.isWithdrawn())
{
String uri = config.getStateUri("withdrawn");
String desc = config.getStateDescription("withdrawn");
states.put(uri, desc);
}
else if (item.isArchived())
{
String uri = config.getStateUri("archive");
String desc = config.getStateDescription("archive");
states.put(uri, desc);
}
else if (wft.isItemInWorkflow(context, item))
{
String uri = config.getStateUri("workflow");
String desc = config.getStateDescription("workflow");
states.put(uri, desc);
}
else if (wft.isItemInWorkspace(context, item))
{
String uri = config.getStateUri("workspace");
String desc = config.getStateDescription("workspace");
states.put(uri, desc);
}
return states;
}
protected List<ResourcePart> getResourceParts(Context context, Item item,
List<String> includeBundles)
throws DSpaceSwordException
{
try
{
// the list of resource parts is everything in the bundles to be included
List<ResourcePart> resources = new ArrayList<ResourcePart>();
for (String bundleName : includeBundles)
{
List<Bundle> bundles = item.getBundles();
for (Bundle bundle : bundles)
{
if (bundleName.equals(bundle.getName()))
{
List<Bitstream> bitstreams = bundle
.getBitstreams();
for (Bitstream bitstream : bitstreams)
{
// note that individual bitstreams have actionable urls
ResourcePart part = new ResourcePart(this.urlManager
.getActionableBitstreamUrl(
bitstream));
part.setMediaType(bitstream
.getFormat(context).getMIMEType());
resources.add(part);
}
}
}
}
return resources;
}
catch (SQLException e)
{
throw new DSpaceSwordException(e);
}
}
protected Date getLastModified(Context context, Item item)
{
return item.getLastModified();
}
private List<String> getIncludeBundles()
{
String[] bundles = DSpaceServicesFactory.getInstance().getConfigurationService()
.getArrayProperty("swordv2-server.statement.bundles");
if (ArrayUtils.isEmpty(bundles))
{
bundles = new String[] {"ORIGINAL", "SWORD"};
}
List<String> include = new ArrayList<String>();
for (String bit : bundles)
{
String bundleName = bit.trim().toUpperCase();
if (!include.contains(bundleName))
{
include.add(bundleName);
}
}
return include;
}
private String getOriginalDepositsBundle()
{
String swordBundle = DSpaceServicesFactory.getInstance().getConfigurationService()
.getProperty("swordv2-server.bundle.name");
if (swordBundle == null)
{
swordBundle = "SWORD";
}
return swordBundle;
}
}