/**
* 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.i18n.iri.IRI;
import org.apache.log4j.Logger;
import org.dspace.content.*;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.swordapp.server.DepositReceipt;
import org.swordapp.server.SwordError;
import org.swordapp.server.SwordServerException;
import org.swordapp.server.UriRegistry;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Richard Jones
*
* Class to generate an ATOM Entry document for a DSpace Item
*/
public class ReceiptGenerator
{
/** logger */
private static Logger log = Logger.getLogger(ReceiptGenerator.class);
protected ItemService itemService =
ContentServiceFactory.getInstance() .getItemService();
protected DepositReceipt createFileReceipt(Context context,
DepositResult result, SwordConfigurationDSpace config)
throws DSpaceSwordException, SwordError, SwordServerException
{
SwordUrlManager urlManager = config.getUrlManager(context, config);
DepositReceipt receipt = new DepositReceipt();
receipt.setLocation(new IRI(urlManager
.getActionableBitstreamUrl(result.getOriginalDeposit())));
receipt.setEmpty(true);
return receipt;
}
protected DepositReceipt createMediaResourceReceipt(Context context,
Item item, SwordConfigurationDSpace config)
throws DSpaceSwordException, SwordError, SwordServerException
{
SwordUrlManager urlManager = config.getUrlManager(context, config);
DepositReceipt receipt = new DepositReceipt();
receipt.setLocation(urlManager.getContentUrl(item));
return receipt;
}
protected DepositReceipt createReceipt(Context context,
DepositResult result, SwordConfigurationDSpace config)
throws DSpaceSwordException, SwordError, SwordServerException
{
return this.createReceipt(context, result, config, false);
}
/**
* Construct the entry
*
* @param context
* The relevant DSpace Context.
* @param result
* deposit result
* @param config
* SWORD configuration
* @param mediaResourceLocation
* set media resource URL
* @return deposit receipt
* @throws DSpaceSwordException
* can be thrown by the internals of the DSpace SWORD implementation
* @throws SwordError
* SWORD error per SWORD spec
* @throws SwordServerException
* thrown by SWORD server implementation
*/
protected DepositReceipt createReceipt(Context context,
DepositResult result, SwordConfigurationDSpace config,
boolean mediaResourceLocation)
throws DSpaceSwordException, SwordError, SwordServerException
{
SwordUrlManager urlManager = config.getUrlManager(context, config);
DepositReceipt receipt = new DepositReceipt();
receipt.setAtomStatementURI(
urlManager.getAtomStatementUri(result.getItem()));
receipt.setOREStatementURI(
urlManager.getOreStatementUri(result.getItem()));
receipt.setEditIRI(urlManager.getEditIRI(result.getItem()));
receipt.setSplashUri(urlManager.getSplashUrl(result.getItem()));
receipt.setSwordEditIRI(urlManager.getEditIRI(result.getItem()));
receipt.setTreatment(result.getTreatment());
receipt.setContent(
urlManager.getContentUrl(result.getItem()), "application/zip");
receipt.addEditMediaIRI(
urlManager.getContentUrl(result.getItem()), "application/zip");
receipt.setMediaFeedIRI(urlManager.getMediaFeedUrl(result.getItem()));
receipt.setLastModified(result.getItem().getLastModified());
if (mediaResourceLocation)
{
receipt.setLocation(urlManager.getContentUrl(result.getItem()));
}
else
{
receipt.setLocation(urlManager.getEditIRI(result.getItem()));
}
try
{
Bitstream od = result.getOriginalDeposit();
if (od != null)
{
// note here that we don't provide an actionable url
receipt.setOriginalDeposit(
urlManager.getActionableBitstreamUrl(od),
od.getFormat(context).getMIMEType());
}
Map<String, String> derived = new HashMap<String, String>();
List<Bitstream> drs = result.getDerivedResources();
if (drs != null)
{
for (Bitstream bs : result.getDerivedResources())
{
// here we provide actionable urls for the parts of the resource
derived.put(urlManager.getActionableBitstreamUrl(bs),
bs.getFormat(context).getMIMEType());
}
}
receipt.setDerivedResources(derived);
}
catch (SQLException e)
{
throw new DSpaceSwordException(e);
}
// add the category information to the sword entry
this.addCategories(result, receipt);
// add the publish date
this.addPublishDate(result, receipt);
// add the item's metadata
SwordEntryDisseminator disseminator = SwordDisseminatorFactory
.getEntryInstance();
disseminator.disseminate(context, result.getItem(), receipt);
StringBuilder rightsString = new StringBuilder();
List<Bundle> bundles = result.getItem().getBundles();
for (Bundle bundle : bundles)
{
if (!Constants.LICENSE_BUNDLE_NAME.equals(bundle.getName()))
{
continue;
}
List<Bitstream> bss = bundle.getBitstreams();
for (Bitstream bs : bss)
{
String url = urlManager.getBitstreamUrl(bs);
rightsString.append(url).append(" ");
}
}
receipt.getWrappedEntry().setRights(rightsString.toString());
// add the date on which the entry was last updated
this.addLastUpdatedDate(result, receipt);
// do this from configuration
receipt.setPackaging(config.getDisseminatePackaging());
return receipt;
}
/**
* Construct the entry
*
* @param context
* The relevant DSpace Context.
* @param item
* the target item to generate the ATOM document for
* @param config
* SWORD configuration
* @return deposit receipt
* @throws DSpaceSwordException
* can be thrown by the internals of the DSpace SWORD implementation
* @throws SwordError
* SWORD error per SWORD spec
* @throws SwordServerException
* thrown by SWORD server implementation
*/
protected DepositReceipt createReceipt(Context context, Item item,
SwordConfigurationDSpace config)
throws DSpaceSwordException, SwordError, SwordServerException
{
SwordUrlManager urlManager = config.getUrlManager(context, config);
DepositReceipt receipt = new DepositReceipt();
receipt.setAtomStatementURI(urlManager.getAtomStatementUri(item));
receipt.setOREStatementURI(urlManager.getOreStatementUri(item));
receipt.setEditIRI(urlManager.getEditIRI(item));
receipt.setLocation(urlManager.getEditIRI(item));
receipt.setSplashUri(urlManager.getSplashUrl(item));
receipt.setSwordEditIRI(urlManager.getEditIRI(item));
receipt.setContent(urlManager.getContentUrl(item), "application/zip");
receipt.addEditMediaIRI(
urlManager.getContentUrl(item), "application/zip");
receipt.setMediaFeedIRI(urlManager.getMediaFeedUrl(item));
receipt.setLastModified(item.getLastModified());
// add the category information to the sword entry
this.addCategories(item, receipt);
// add the publish date
this.addPublishDate(item, receipt);
// add the item's metadata
SwordEntryDisseminator disseminator = SwordDisseminatorFactory
.getEntryInstance();
disseminator.disseminate(context, item, receipt);
StringBuilder rightsString = new StringBuilder();
List<Bundle> bundles = item.getBundles();
for (Bundle bundle : bundles)
{
if (!Constants.LICENSE_BUNDLE_NAME.equals(bundle.getName()))
{
continue;
}
List<Bitstream> bss = bundle.getBitstreams();
for (Bitstream bs : bss)
{
String url = urlManager.getBitstreamUrl(bs);
rightsString.append(url).append(" ");
}
}
receipt.getWrappedEntry().setRights(rightsString.toString());
// add the date on which the entry was last updated
this.addLastUpdatedDate(item, receipt);
// do this from configuration
receipt.setPackaging(config.getDisseminatePackaging());
return receipt;
}
/**
* Add all the subject classifications from the bibliographic
* metadata.
*
* @param result
* represents the results of a deposit request
* @param receipt
* deposit receipt
*/
protected void addCategories(DepositResult result, DepositReceipt receipt)
{
List<MetadataValue> dcv = itemService.getMetadataByMetadataString(
result.getItem(), "dc.subject.*");
if (dcv != null)
{
for (MetadataValue aDcv : dcv)
{
receipt.getWrappedEntry().addCategory(
UriRegistry.DC_NAMESPACE, aDcv.getValue(), aDcv.getValue());
}
}
}
/**
* Add all the subject classifications from the bibliographic
* metadata.
*
* @param item
* target item
* @param receipt
* deposit receipt
*/
protected void addCategories(Item item, DepositReceipt receipt)
{
List<MetadataValue> dcv = itemService
.getMetadataByMetadataString(item, "dc.subject.*");
if (dcv != null)
{
for (MetadataValue aDcv : dcv)
{
receipt.getWrappedEntry().addCategory(
UriRegistry.DC_NAMESPACE, aDcv.getValue(), aDcv.getValue());
}
}
}
/**
* Add the date of publication from the bibliographic metadata
*
* @param result
* represents the results of a deposit request
* @param receipt
* deposit receipt
*/
protected void addPublishDate(DepositResult result, DepositReceipt receipt)
{
List<MetadataValue> dcv = itemService.getMetadataByMetadataString(
result.getItem(), "dc.date.issued");
if (dcv != null && !dcv.isEmpty())
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date published = sdf.parse(dcv.get(0).getValue());
receipt.getWrappedEntry().setPublished(published);
}
catch (ParseException e)
{
// we tried, but never mind
log.warn("Couldn't add published date", e);
}
}
}
/**
* Add the date of publication from the bibliographic metadata
*
* @param item
* target item
* @param receipt
* deposit receipt
*/
protected void addPublishDate(Item item, DepositReceipt receipt)
{
List<MetadataValue> dcv = itemService.getMetadataByMetadataString(
item, "dc.date.issued");
if (dcv != null && dcv.size() == 1)
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date published = sdf.parse(dcv.get(0).getValue());
receipt.getWrappedEntry().setPublished(published);
}
catch (ParseException e)
{
// we tried, but never mind
log.warn("Couldn't add published date", e);
}
}
}
/**
* Add the date that this item was last updated
*
* @param result
* represents the results of a deposit request
* @param receipt
* deposit receipt
*/
protected void addLastUpdatedDate(DepositResult result,
DepositReceipt receipt)
{
String config = ConfigurationManager.getProperty(
"swordv2-server", "updated.field");
List<MetadataValue> dcv = itemService.getMetadataByMetadataString(
result.getItem(), config);
if (dcv != null && dcv.size() == 1)
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date updated = sdf.parse(dcv.get(0).getValue());
receipt.getWrappedEntry().setUpdated(updated);
}
catch (ParseException e)
{
// we tried, but never mind
log.warn("Couldn't add last updated date", e);
}
}
}
/**
* Add the date that this item was last updated
*
* @param item
* target item
* @param receipt
* deposit receipt
*/
protected void addLastUpdatedDate(Item item, DepositReceipt receipt)
{
String config = ConfigurationManager.getProperty(
"swordv2-server", "updated.field");
List<MetadataValue> dcv = itemService.getMetadataByMetadataString(
item, config);
if (dcv != null && dcv.size() == 1)
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date updated = sdf.parse(dcv.get(0).getValue());
receipt.getWrappedEntry().setUpdated(updated);
}
catch (ParseException e)
{
// we tried, but never mind
log.warn("Couldn't add last updated date", e);
}
}
}
}