/**
* 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.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.core.Utils;
import org.swordapp.server.SwordError;
import org.swordapp.server.SwordServerException;
import org.swordapp.server.UriRegistry;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class SimpleZipContentDisseminator implements SwordContentDisseminator
{
public InputStream disseminate(Context context, Item item)
throws DSpaceSwordException, SwordError, SwordServerException
{
try
{
// first write everything to a temp file
String tempDir = ConfigurationManager.getProperty("upload.temp.dir");
String fn = tempDir + File.separator + "SWORD." + item.getID() + "." + UUID.randomUUID().toString() + ".zip";
OutputStream outStream = new FileOutputStream(new File(fn));
ZipOutputStream zip = new ZipOutputStream(outStream);
Bundle[] originals = item.getBundles("ORIGINAL");
for (Bundle original : originals)
{
Bitstream[] bss = original.getBitstreams();
for (Bitstream bitstream : bss)
{
ZipEntry ze = new ZipEntry(bitstream.getName());
zip.putNextEntry(ze);
InputStream is = bitstream.retrieve();
Utils.copy(is, zip);
zip.closeEntry();
is.close();
}
}
zip.close();
return new TempFileInputStream(new File(fn));
}
catch (SQLException e)
{
throw new DSpaceSwordException(e);
}
catch (IOException e)
{
throw new DSpaceSwordException(e);
}
catch (AuthorizeException e)
{
throw new DSpaceSwordException(e);
}
}
public boolean disseminatesContentType(String contentType)
throws DSpaceSwordException, SwordError, SwordServerException
{
return "application/zip".equals(contentType);
}
public boolean disseminatesPackage(String contentType)
throws DSpaceSwordException, SwordError, SwordServerException
{
return UriRegistry.PACKAGE_SIMPLE_ZIP.equals(contentType);
}
public void setContentType(String contentType)
{
// this only does the one thing, so we can ignore this
}
public void setPackaging(String packaging)
{
// this only does the one thing, so we can ignore this
}
public String getContentType()
{
return "application/zip";
}
public String getPackaging()
{
return UriRegistry.PACKAGE_SIMPLE_ZIP;
}
}