Index: dspace-sword-api/src/main/java/org/dspace/sword/CollectionDepositor.java =================================================================== --- dspace-sword-api/src/main/java/org/dspace/sword/CollectionDepositor.java (.../dspace/trunk/dspace-sword) (revision 5257) +++ dspace-sword-api/src/main/java/org/dspace/sword/CollectionDepositor.java (.../sandbox/aip-external-1_6-prototype/dspace-sword) (revision 5257) @@ -37,6 +37,7 @@ */ package org.dspace.sword; +import java.io.File; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; import org.dspace.content.Bundle; @@ -137,40 +138,6 @@ "Unacceptable packaging type in deposit request: " + deposit.getPackaging()); } - String tempDir = swordConfig.getTempDir(); - String tempFile = tempDir + "/" + swordService.getTempFilename(); - log.debug("Storing temporary file at " + tempFile); - - if (swordConfig.isKeepOriginal()) - { - try - { - swordService.message("DSpace will store an original copy of the deposit, " + - "as well as ingesting the item into the archive"); - - // first, store the temp file - InputStream is = deposit.getFile(); - FileOutputStream fos = new FileOutputStream(tempFile); - Utils.copy(is, fos); - fos.close(); - is.close(); - - // now create an input stream from that temp file to ingest - InputStream fis = new FileInputStream(tempFile); - deposit.setFile(fis); - } - catch (FileNotFoundException e) - { - log.error("caught exception: ", e); - throw new DSpaceSWORDException(e); - } - catch (IOException e) - { - log.error("caught exception: ", e); - throw new DSpaceSWORDException(e); - } - } - // Obtain the relevant ingester from the factory SWORDIngester si = SWORDIngesterFactory.getInstance(context, deposit, collection); swordService.message("Loaded ingester: " + si.getClass().getName()); @@ -185,6 +152,9 @@ { if (swordConfig.isKeepOriginal()) { + swordService.message("DSpace will store an original copy of the deposit, " + + "as well as ingesting the item into the archive"); + // in order to be allowed to add the file back to the item, we need to ignore authorisations // for a moment boolean ignoreAuth = context.ignoreAuthorization(); @@ -209,7 +179,7 @@ String fn = swordService.getFilename(context, deposit, true); - FileInputStream fis = new FileInputStream(tempFile); + FileInputStream fis = new FileInputStream(deposit.getFile()); Bitstream bitstream = swordBundle.createBitstream(fis); bitstream.setName(fn); bitstream.setDescription("SWORD deposit package"); Index: dspace-sword-api/src/main/java/org/dspace/sword/ItemDepositor.java =================================================================== --- dspace-sword-api/src/main/java/org/dspace/sword/ItemDepositor.java (.../dspace/trunk/dspace-sword) (revision 5257) +++ dspace-sword-api/src/main/java/org/dspace/sword/ItemDepositor.java (.../sandbox/aip-external-1_6-prototype/dspace-sword) (revision 5257) @@ -97,39 +97,6 @@ "Unacceptable packaging type in deposit request: " + deposit.getPackaging()); } - String tempDir = swordConfig.getTempDir(); - String tempFile = tempDir + "/" + swordService.getTempFilename(); - - if (swordConfig.isKeepOriginal()) - { - try - { - swordService.message("DSpace will store an original copy of the deposit file, " + - "as well as attaching it to the item"); - - // first, store the temp file - InputStream is = deposit.getFile(); - FileOutputStream fos = new FileOutputStream(tempFile); - Utils.copy(is, fos); - fos.close(); - is.close(); - - // now create an input stream from that temp file to ingest - InputStream fis = new FileInputStream(tempFile); - deposit.setFile(fis); - } - catch (FileNotFoundException e) - { - log.error("caught exception: ", e); - throw new DSpaceSWORDException(e); - } - catch (IOException e) - { - log.error("caught exception: ", e); - throw new DSpaceSWORDException(e); - } - } - // Obtain the relevant ingester from the factory SWORDIngester si = SWORDIngesterFactory.getInstance(context, deposit, item); swordService.message("Loaded ingester: " + si.getClass().getName()); @@ -144,6 +111,9 @@ { if (swordConfig.isKeepOriginal()) { + swordService.message("DSpace will store an original copy of the deposit file, " + + "as well as attaching it to the item"); + // in order to be allowed to add the file back to the item, we need to ignore authorisations // for a moment boolean ignoreAuth = context.ignoreAuthorization(); @@ -168,7 +138,7 @@ String fn = swordService.getFilename(context, deposit, true); - FileInputStream fis = new FileInputStream(tempFile); + FileInputStream fis = new FileInputStream(deposit.getFile()); Bitstream bitstream = swordBundle.createBitstream(fis); bitstream.setName(fn); bitstream.setDescription("Original file deposited via SWORD"); Index: dspace-sword-api/src/main/java/org/dspace/sword/SWORDMETSIngester.java =================================================================== --- dspace-sword-api/src/main/java/org/dspace/sword/SWORDMETSIngester.java (.../dspace/trunk/dspace-sword) (revision 5257) +++ dspace-sword-api/src/main/java/org/dspace/sword/SWORDMETSIngester.java (.../sandbox/aip-external-1_6-prototype/dspace-sword) (revision 5257) @@ -38,7 +38,7 @@ package org.dspace.sword; -import java.io.InputStream; +import java.io.File; import java.util.Date; import java.util.StringTokenizer; @@ -49,15 +49,12 @@ import org.dspace.content.DCValue; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; -import org.dspace.content.WorkspaceItem; import org.dspace.content.packager.PackageIngester; import org.dspace.content.packager.PackageParameters; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.core.PluginManager; import org.dspace.handle.HandleManager; -import org.dspace.workflow.WorkflowItem; -import org.dspace.workflow.WorkflowManager; import org.purl.sword.base.Deposit; import org.purl.sword.base.SWORDErrorException; @@ -90,8 +87,8 @@ // get the things out of the service that we need Context context = swordService.getContext(); - // the DSpaceMETSIngester requires an input stream - InputStream is = deposit.getFile(); + // get deposited file as InputStream + File depositFile = deposit.getFile(); // load the plugin manager for the required configuration String cfg = ConfigurationManager.getProperty("sword.mets-ingester.package-ingester"); @@ -108,24 +105,33 @@ // it's none of our business here String licence = null; - // We don't need to include any parameters + // Initialize parameters to packager PackageParameters params = new PackageParameters(); + // Force package ingester to respect Collection workflows + params.setWorkflowEnabled(true); - // ingest the item - WorkspaceItem wsi = pi.ingest(context, collection, is, params, licence); - if (wsi == null) + // ingest the item from the temp file + DSpaceObject ingestedObject = pi.ingest(context, collection, depositFile, params, licence); + if (ingestedObject == null) { swordService.message("Failed to ingest the package; throwing exception"); throw new SWORDErrorException(DSpaceSWORDErrorCodes.UNPACKAGE_FAIL, "METS package ingester failed to unpack package"); } + + //Verify we have an Item as a result -- SWORD can only ingest Items + if (!(ingestedObject instanceof Item)) + { + throw new DSpaceSWORDException("DSpace Ingester returned wrong object type -- not an Item result."); + } + else + { + //otherwise, we have an item, and a workflow should have already been started for it. + swordService.message("Workflow process started"); + } + + // get reference to item so that we can report on it + Item installedItem = (Item)ingestedObject; - // now we can inject the newly constructed item into the workflow - WorkflowItem wfi = WorkflowManager.startWithoutNotify(context, wsi); - swordService.message("Workflow process started"); - - // pull the item out so that we can report on it - Item installedItem = wfi.getItem(); - // update the item metadata to inclue the current time as // the updated date this.setUpdatedDate(installedItem); Index: dspace-sword-api/src/main/java/org/dspace/sword/SimpleFileIngester.java =================================================================== --- dspace-sword-api/src/main/java/org/dspace/sword/SimpleFileIngester.java (.../dspace/trunk/dspace-sword) (revision 5257) +++ dspace-sword-api/src/main/java/org/dspace/sword/SimpleFileIngester.java (.../sandbox/aip-external-1_6-prototype/dspace-sword) (revision 5257) @@ -37,6 +37,8 @@ */ package org.dspace.sword; +import java.io.File; +import java.io.FileInputStream; import org.purl.sword.base.Deposit; import org.purl.sword.base.SWORDErrorException; import org.dspace.content.Bitstream; @@ -49,7 +51,6 @@ import org.apache.log4j.Logger; import java.sql.SQLException; -import java.io.InputStream; import java.io.IOException; /** @@ -107,8 +108,9 @@ original = item.createBundle("ORIGINAL"); } - InputStream is = deposit.getFile(); - Bitstream bs = original.createBitstream(is); + File depositFile = deposit.getFile(); + FileInputStream fis = new FileInputStream(depositFile); + Bitstream bs = original.createBitstream(fis); String fn = swordService.getFilename(context, deposit, false); bs.setName(fn); Index: dspace-sword-api/src/main/java/org/purl/sword/server/DummyServer.java =================================================================== --- dspace-sword-api/src/main/java/org/purl/sword/server/DummyServer.java (.../dspace/trunk/dspace-sword) (revision 5257) +++ dspace-sword-api/src/main/java/org/purl/sword/server/DummyServer.java (.../sandbox/aip-external-1_6-prototype/dspace-sword) (revision 5257) @@ -37,6 +37,8 @@ package org.purl.sword.server; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; @@ -251,7 +253,9 @@ filenames.append("(slug = " + deposit.getSlug() + ") "); } try { - ZipInputStream zip = new ZipInputStream(deposit.getFile()); + File depositFile = deposit.getFile(); + FileInputStream fileStream = new FileInputStream(depositFile); + ZipInputStream zip = new ZipInputStream(fileStream); ZipEntry ze; while ((ze = zip.getNextEntry()) != null) { filenames.append(" " + ze.toString()); Index: dspace-sword-api/src/main/java/org/purl/sword/server/DepositServlet.java =================================================================== --- dspace-sword-api/src/main/java/org/purl/sword/server/DepositServlet.java (.../dspace/trunk/dspace-sword) (revision 5257) +++ dspace-sword-api/src/main/java/org/purl/sword/server/DepositServlet.java (.../sandbox/aip-external-1_6-prototype/dspace-sword) (revision 5257) @@ -210,9 +210,7 @@ // Set up some variables String filename = null; - File f = null; - FileInputStream fis = null; - + // Do the processing try { // Write the file to the temp directory @@ -266,10 +264,8 @@ log.debug("Bad MD5 for file. Aborting with appropriate error message"); return; } else { - // Set the file - f = new File(filename); - fis = new FileInputStream(f); - d.setFile(fis); + // Set the file to be deposited + d.setFile(file); // Set the X-On-Behalf-Of header String onBehalfOf = request.getHeader(HttpHeaders.X_ON_BEHALF_OF.toString()); @@ -381,14 +377,9 @@ } finally { - // Close the input stream if it still open - if (fis != null) { - fis.close(); - } - // Try deleting the temp file if (filename != null) { - f = new File(filename); + File f = new File(filename); f.delete(); } } Index: dspace-sword-api/src/main/java/org/purl/sword/base/Deposit.java =================================================================== --- dspace-sword-api/src/main/java/org/purl/sword/base/Deposit.java (.../dspace/trunk/dspace-sword) (revision 5257) +++ dspace-sword-api/src/main/java/org/purl/sword/base/Deposit.java (.../sandbox/aip-external-1_6-prototype/dspace-sword) (revision 5257) @@ -36,7 +36,7 @@ */ package org.purl.sword.base; -import java.io.InputStream; +import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -51,7 +51,7 @@ { /** The File deposited */ - private InputStream file; + private File file; /** The content type */ private String contentType; @@ -178,14 +178,14 @@ /** * @return the file */ - public InputStream getFile() { + public File getFile() { return file; } /** * @param file the file to set */ - public void setFile(InputStream file) { + public void setFile(File file) { this.file = file; }