/**
* 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.authorize.AuthorizeException;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Item;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.BitstreamService;
import org.dspace.content.service.BundleService;
import org.dspace.content.service.ItemService;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
public class VersionManager
{
protected ItemService itemService = ContentServiceFactory.getInstance()
.getItemService();
protected BundleService bundleService = ContentServiceFactory.getInstance()
.getBundleService();
protected BitstreamService bitstreamService = ContentServiceFactory
.getInstance().getBitstreamService();
public void removeBundle(Context context, Item item, String name)
throws SQLException, AuthorizeException, IOException
{
boolean keep = ConfigurationManager
.getBooleanProperty("swordv2-server", "versions.keep");
Iterator<Bundle> bundles = item.getBundles().iterator();
while (bundles.hasNext())
{
Bundle b = bundles.next();
if (name.equals(b.getName()))
{
bundles.remove();
this.removeBundle(context, item, b, keep);
}
}
}
public void removeBundle(Context context, Item item, Bundle source)
throws SQLException, AuthorizeException, IOException
{
boolean keep = ConfigurationManager
.getBooleanProperty("swordv2-server", "versions.keep");
this.removeBundle(context, item, source, keep);
}
public void removeBundle(Context context, Item item, Bundle source,
boolean archive)
throws SQLException, AuthorizeException, IOException
{
// archive the bundle contents if desired
if (archive)
{
this.archiveBundle(context, item, source);
}
// remove all the bitstreams from the bundle
Iterator<Bitstream> bitstreams = source.getBitstreams()
.iterator();
while (bitstreams.hasNext())
{
Bitstream bitstream = bitstreams.next();
bitstreams.remove();
bundleService.removeBitstream(context, source,
bitstream);
}
// delete the bundle itself
itemService.removeBundle(context, item, source);
}
public void removeBitstream(Context context, Item item, Bitstream bitstream)
throws SQLException, AuthorizeException, IOException
{
boolean keep = ConfigurationManager
.getBooleanProperty("swordv2-server", "versions.keep");
this.removeBitstream(context, item, bitstream, keep);
}
public void removeBitstream(Context context, Item item, Bitstream bitstream,
boolean keep)
throws SQLException, AuthorizeException, IOException
{
Bundle exempt = null;
if (keep)
{
exempt = this.archiveBitstream(context, item, bitstream);
}
Iterator<Bundle> bundles = bitstream.getBundles()
.iterator();
while (bundles.hasNext())
{
Bundle bundle = bundles.next();
if (exempt != null &&
bundle.getID() != exempt.getID())
{
bundles.remove();
bundleService
.removeBitstream(context, bundle,
bitstream);
}
}
// there is nowhere in the metadata to say when this file was moved, so we
// are going to drop it into the description
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
String desc = bitstream.getDescription();
String newDesc = "[Deleted on: " + sdf.format(new Date()) + "] ";
if (desc != null)
{
newDesc += desc;
}
bitstream.setDescription(context, newDesc);
bitstreamService.update(context, bitstream);
}
private Bundle archiveBitstream(Context context, Item item,
Bitstream bitstream)
throws SQLException, AuthorizeException, IOException
{
String swordBundle = ConfigurationManager
.getProperty("swordv2-server", "bundle.deleted");
if (swordBundle == null)
{
swordBundle = "DELETED";
}
List<Bundle> bundles = item.getBundles();
Bundle archive = null;
for (Bundle bundle : bundles)
{
if (swordBundle.equals(bundle.getName()))
{
archive = bundle;
break;
}
}
if (archive == null)
{
archive = bundleService.create(context, item, swordBundle);
}
this.archiveBitstream(context, archive, bitstream);
return archive;
}
private void archiveBitstream(Context context, Bundle target,
Bitstream bitstream)
throws SQLException, AuthorizeException, IOException
{
bundleService.addBitstream(context, target, bitstream);
}
private void archiveBundle(Context context, Item item, Bundle source)
throws SQLException, AuthorizeException, IOException
{
// get the datestamped root bundle name
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String oldName = "VER" + sdf.format(new Date());
oldName = this.getNumberedName(item, oldName, 0);
Bundle old = bundleService.create(context, item, oldName);
List<Bitstream> bitstreams = source.getBitstreams();
for (Bitstream bitstream : bitstreams)
{
bundleService
.addBitstream(context, old, bitstream);
}
}
private String getNumberedName(Item item, String name, int number)
throws SQLException
{
String nName = name + "." + Integer.toString(number);
List<Bundle> bundles = item.getBundles();
for (Bundle bundle : bundles)
{
if (nName.equals(bundle.getName()))
{
return this.getNumberedName(item, name, number + 1);
}
}
return nName;
}
}