/**
* 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.log4j.Logger;
import org.dspace.content.*;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.BitstreamFormatService;
import org.dspace.content.service.ItemService;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.swordapp.server.Deposit;
import org.swordapp.server.SwordAuthException;
import org.swordapp.server.SwordError;
import org.swordapp.server.SwordServerException;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
public abstract class AbstractSwordContentIngester
implements SwordContentIngester
{
public static final Logger log = Logger.getLogger(
AbstractSwordContentIngester.class);
protected BitstreamFormatService bitstreamFormatService =
ContentServiceFactory.getInstance().getBitstreamFormatService();
protected ItemService itemService =
ContentServiceFactory.getInstance().getItemService();
public DepositResult ingest(Context context, Deposit deposit,
DSpaceObject dso, VerboseDescription verboseDescription)
throws DSpaceSwordException, SwordError, SwordAuthException,
SwordServerException
{
return this.ingest(context, deposit, dso, verboseDescription, null);
}
public DepositResult ingest(Context context, Deposit deposit,
DSpaceObject dso, VerboseDescription verboseDescription,
DepositResult result)
throws DSpaceSwordException, SwordError, SwordAuthException,
SwordServerException
{
if (dso instanceof Collection)
{
return this.ingestToCollection(context, deposit, (Collection) dso,
verboseDescription, result);
}
else if (dso instanceof Item)
{
return this.ingestToItem(context, deposit, (Item) dso,
verboseDescription, result);
}
return null;
}
public abstract DepositResult ingestToCollection(Context context,
Deposit deposit, Collection collection,
VerboseDescription verboseDescription, DepositResult result)
throws DSpaceSwordException, SwordError, SwordAuthException,
SwordServerException;
public abstract DepositResult ingestToItem(Context context, Deposit deposit,
Item item, VerboseDescription verboseDescription,
DepositResult result)
throws DSpaceSwordException, SwordError, SwordAuthException,
SwordServerException;
protected BitstreamFormat getFormat(Context context, String fileName)
throws SQLException
{
String fext = null;
int lastDot = fileName.lastIndexOf(".");
if (lastDot > -1)
{
fext = fileName.substring(lastDot + 1);
}
if (fext == null)
{
return null;
}
List<BitstreamFormat> formats = bitstreamFormatService.findAll(context);
for (BitstreamFormat format : formats)
{
List<String> extensions = format.getExtensions();
for (String ext : extensions)
{
if (ext.equals(fext))
{
return format;
}
}
}
return null;
}
/**
* Add the current date to the item metadata. This looks up
* the field in which to store this metadata in the configuration
* sword.updated.field
*
* @param context
* The relevant DSpace Context.
* @param item
* target item
* @param verboseDescription
* The description.
* @throws DSpaceSwordException
* can be thrown by the internals of the DSpace SWORD implementation
*/
protected void setUpdatedDate(Context context, Item item,
VerboseDescription verboseDescription)
throws DSpaceSwordException
{
String field = ConfigurationManager
.getProperty("swordv2-server", "updated.field");
if (field == null || "".equals(field))
{
throw new DSpaceSwordException(
"No configuration, or configuration is invalid for: sword.updated.field");
}
MetadataFieldInfo info = this.configToDC(field, null);
try
{
itemService.clearMetadata(context, item, info.schema, info.element,
info.qualifier, Item.ANY);
DCDate date = new DCDate(new Date());
itemService.addMetadata(context, item, info.schema, info.element,
info.qualifier, null, date.toString());
}
catch (SQLException e)
{
log.error("Caught exception trying to set update date", e);
throw new DSpaceSwordException(e);
}
verboseDescription.append(
"Updated date added to response from item metadata where available");
}
/**
* Store the given slug value (which is used for suggested identifiers,
* and which DSpace ignores) in the item metadata. This looks up the
* field in which to store this metadata in the configuration
* sword.slug.field
*
* @param context
* The relevant DSpace Context.
* @param item
* target item
* @param slugVal
* slug value
* @param verboseDescription
* The description.
* @throws DSpaceSwordException
* can be thrown by the internals of the DSpace SWORD implementation
*/
protected void setSlug(Context context, Item item, String slugVal,
VerboseDescription verboseDescription)
throws DSpaceSwordException
{
// if there isn't a slug value, don't set it
if (slugVal == null)
{
return;
}
String field = ConfigurationManager
.getProperty("swordv2-server", "slug.field");
if (field == null || "".equals(field))
{
throw new DSpaceSwordException(
"No configuration, or configuration is invalid for: sword.slug.field");
}
MetadataFieldInfo info = this.configToDC(field, null);
try
{
itemService.clearMetadata(context, item, info.schema, info.element,
info.qualifier, Item.ANY);
itemService.addMetadata(context, item, info.schema, info.element,
info.qualifier, null, slugVal);
}
catch (SQLException e)
{
log.error("Caught exception trying to set slug", e);
throw new DSpaceSwordException(e);
}
verboseDescription.append("Slug value set in response where available");
}
/**
* Utility method to turn given metadata fields of the form
schema.element.qualifier into Metadatum objects which can be
used to access metadata in items.
*
* The def parameter should be null, * or "" depending on how
you intend to use the Metadatum object.
*
* @param config
* @param def
*/
private MetadataFieldInfo configToDC(String config, String def)
{
MetadataFieldInfo mfi = new MetadataFieldInfo();
mfi.schema = def;
mfi.element = def;
mfi.qualifier = def;
StringTokenizer stz = new StringTokenizer(config, ".");
mfi.schema = stz.nextToken();
mfi.element = stz.nextToken();
if (stz.hasMoreTokens())
{
mfi.qualifier = stz.nextToken();
}
return mfi;
}
private class MetadataFieldInfo
{
private String schema;
private String element;
private String qualifier;
}
}