From 02c9c69cd9dd8a6d3e3faaf10f0a16b6f60d395f Mon Sep 17 00:00:00 2001 From: David Stuve Date: Thu, 31 Oct 2002 02:52:50 +0000 Subject: [PATCH] first version git-svn-id: http://scm.dspace.org/svn/repo/trunk@517 9c30dcfa-912a-0410-8fc2-9e0234be79fd --- .../org/dspace/app/itemexport/ItemExport.java | 220 ++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 dspace/src/org/dspace/app/itemexport/ItemExport.java diff --git a/dspace/src/org/dspace/app/itemexport/ItemExport.java b/dspace/src/org/dspace/app/itemexport/ItemExport.java new file mode 100644 index 0000000000..c4e3884a4b --- /dev/null +++ b/dspace/src/org/dspace/app/itemexport/ItemExport.java @@ -0,0 +1,220 @@ +package org.dspace.itemexport; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.InputStream; +import java.io.PrintWriter; + +import org.dspace.content.Bitstream; +import org.dspace.content.Bundle; +import org.dspace.content.Collection; +import org.dspace.content.DCValue; +import org.dspace.content.Item; +import org.dspace.content.ItemIterator; +import org.dspace.core.Context; +import org.dspace.core.Constants; +import org.dspace.core.Utils; + +/* + issues + -doesn't handle special characters in metadata + (needs to turn &'s into &, etc.) + */ + +public class ItemExport +{ + /* + + */ + public static void main(String [] argv) + throws Exception + { + if( argv.length < 4 ) + { + printUsage(); + return; + } + + String typeString = argv[0]; + String idString = argv[1]; + String destDirName = argv[2]; + String seqNumString = argv[3]; + + int myID = Integer.parseInt( idString ); + int seqStart = Integer.parseInt( seqNumString ); + int myType; + + if( typeString.equals("ITEM") ) + { + myType = Constants.ITEM; + } + else if( typeString.equals("COLLECTION") ) + { + myType = Constants.COLLECTION; + } + else + { + printUsage(); + return; + } + + Context c = new Context(); + c.setIgnoreAuthorization( true ); + + if( myType == Constants.ITEM ) + { + // it's only a single item + Item myItem = Item.find( c, myID ); + + exportItem( c, myItem, destDirName, seqStart); + } + else + { + // it's a collection, so do a bunch of items + Collection myCollection = Collection.find( c, myID ); + + ItemIterator i = myCollection.getItems(); + } + + File destDir = new File( destDirName ); + + c.complete(); + } + + private static void printUsage() + { + System.out.println("Output simple AIPs, given collection or item ID"); + System.out.println("Usage: ITEM|COLLECTION ID dest_dir sequence_number"); + System.out.println(" dest_dir = destination of archive files"); + System.out.println(" sequence_number = 0, or some other number to start naming the archive directories"); + System.out.println(" first item dir is sequence_number, then sequence_number+1, etc."); + } + + private static void exportItem( Context c, ItemIterator i, String destDirName, int seqStart ) + throws Exception + { + int mySequenceNumber = seqStart; + + while( i.hasNext() ) + { + exportItem(c, i.next(), destDirName, mySequenceNumber); + mySequenceNumber++; + } + } + + private static void exportItem( Context c, Item myItem, String destDirName, int seqStart) + throws Exception + { + File destDir = new File( destDirName ); + + if( destDir.exists() ) + { + // now create a subdirectory + File itemDir = new File ( destDir + "/" + seqStart ); + + if( itemDir.exists() ) + { + throw new Exception("Directory " + destDir + "/" + seqStart + " already exists!"); + } + else + { + if( itemDir.mkdir() ) + { + // make it this far, now start exporting + writeMetadata ( c, myItem, itemDir ); + writeBitstreams( c, myItem, itemDir ); + } + else + { + throw new Exception("Error, can't make dir " + itemDir); + } + } + } + else + { + throw new Exception("Error, directory " + destDirName + " doesn't exist!"); + } + } + + // output the item's dublin core into the item directory + private static void writeMetadata( Context c, Item i, File destDir ) + throws Exception + { + File outFile = new File( destDir, "dublin_core.xml" ); + + System.out.println("Attempting to create file " + outFile); + + if( outFile.createNewFile() ) + { + PrintWriter out = new PrintWriter( new FileWriter( outFile ) ); + + DCValue dcorevalues[] = i.getDC(Item.ANY, Item.ANY, Item.ANY); + + out.println(""); + + for(int j = 0; j < dcorevalues.length; j++) + { + DCValue dcv = dcorevalues[j]; + + String output = " " + + dcv.value + + ""; + + out.println( output ); + } + out.println(""); + out.close(); + } + else + { + throw new Exception( "Cannot create dublin_core.xml in " + destDir ); + } + } + + // create both the bitstreams and the manifest file + private static void writeBitstreams( Context c, Item i, File destDir ) + throws Exception + { + File outFile = new File( destDir, "contents" ); + + if( outFile.createNewFile() ) + { + PrintWriter out = new PrintWriter( new FileWriter( outFile ) ); + + Bundle [] bundles = i.getBundles(); + + for( int j = 0; j < bundles.length; j++ ) + { + // currently one bitstream per bundle! + Bitstream b = (bundles[j].getBitstreams())[0]; + String myName = b.getName(); + + // write the manifest file entry + out.println( myName ); + + InputStream is = b.retrieve(); + + File fout = new File( destDir, myName ); + + if( fout.createNewFile() ) + { + FileOutputStream fos = new FileOutputStream(fout); + Utils.bufferedCopy( is, fos ); + } + else + { + throw new Exception("File " + fout + " already exists!" ); + } + } + + // close the manifest file + out.close(); + } + else + { + throw new Exception( "Cannot create contents in " + destDir ); + } + } +}