mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-18 07:23:08 +00:00
Export all collections of a community recursively
This commit is contained in:
@@ -21,9 +21,12 @@ import java.text.SimpleDateFormat;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
@@ -821,16 +824,17 @@ public class ItemExport
|
|||||||
// items
|
// items
|
||||||
// it will be checked against the config file entry
|
// it will be checked against the config file entry
|
||||||
double size = 0;
|
double size = 0;
|
||||||
final ArrayList<Integer> items = new ArrayList<Integer>();
|
final HashMap<String, List<Integer>> itemsMap = new HashMap<String, List<Integer>>();
|
||||||
for (DSpaceObject dso : dsObjects)
|
for (DSpaceObject dso : dsObjects)
|
||||||
{
|
{
|
||||||
if (dso.getType() == Constants.COMMUNITY)
|
if (dso.getType() == Constants.COMMUNITY)
|
||||||
{
|
{
|
||||||
Community community = (Community) dso;
|
Community community = (Community) dso;
|
||||||
// get all the collections in the community
|
// get all the collections in the community
|
||||||
Collection[] collections = community.getCollections();
|
Collection[] collections = community.getAllCollections();
|
||||||
for (Collection collection : collections)
|
for (Collection collection : collections)
|
||||||
{
|
{
|
||||||
|
ArrayList<Integer> items = new ArrayList<Integer>();
|
||||||
// get all the items in each collection
|
// get all the items in each collection
|
||||||
ItemIterator iitems = collection.getItems();
|
ItemIterator iitems = collection.getItems();
|
||||||
try
|
try
|
||||||
@@ -859,12 +863,18 @@ public class ItemExport
|
|||||||
{
|
{
|
||||||
iitems.close();
|
iitems.close();
|
||||||
}
|
}
|
||||||
|
if (items.size() > 0)
|
||||||
|
{
|
||||||
|
itemsMap.put("collection_"+collection.getID(), items);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (dso.getType() == Constants.COLLECTION)
|
else if (dso.getType() == Constants.COLLECTION)
|
||||||
{
|
{
|
||||||
Collection collection = (Collection) dso;
|
Collection collection = (Collection) dso;
|
||||||
|
ArrayList<Integer> items = new ArrayList<Integer>();
|
||||||
|
|
||||||
// get all the items in the collection
|
// get all the items in the collection
|
||||||
ItemIterator iitems = collection.getItems();
|
ItemIterator iitems = collection.getItems();
|
||||||
try
|
try
|
||||||
@@ -893,6 +903,10 @@ public class ItemExport
|
|||||||
{
|
{
|
||||||
iitems.close();
|
iitems.close();
|
||||||
}
|
}
|
||||||
|
if (items.size() > 0)
|
||||||
|
{
|
||||||
|
itemsMap.put("collection_"+collection.getID(), items);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (dso.getType() == Constants.ITEM)
|
else if (dso.getType() == Constants.ITEM)
|
||||||
@@ -910,7 +924,9 @@ public class ItemExport
|
|||||||
size += bit.getSize();
|
size += bit.getSize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ArrayList<Integer> items = new ArrayList<Integer>();
|
||||||
items.add(item.getID());
|
items.add(item.getID());
|
||||||
|
itemsMap.put("item_"+item.getID(), items);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -942,7 +958,7 @@ public class ItemExport
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if we have any items to process then kick off annonymous thread
|
// if we have any items to process then kick off annonymous thread
|
||||||
if (items.size() > 0)
|
if (itemsMap.size() > 0)
|
||||||
{
|
{
|
||||||
Thread go = new Thread()
|
Thread go = new Thread()
|
||||||
{
|
{
|
||||||
@@ -955,16 +971,30 @@ public class ItemExport
|
|||||||
// create a new dspace context
|
// create a new dspace context
|
||||||
context = new Context();
|
context = new Context();
|
||||||
// ignore auths
|
// ignore auths
|
||||||
context.setIgnoreAuthorization(true);
|
context.turnOffAuthorisationSystem();
|
||||||
iitems = new ItemIterator(context, items);
|
|
||||||
|
|
||||||
String fileName = assembleFileName("item", eperson,
|
String fileName = assembleFileName("item", eperson,
|
||||||
new Date());
|
new Date());
|
||||||
String workDir = getExportWorkDirectory()
|
String workParentDir = getExportWorkDirectory()
|
||||||
+ System.getProperty("file.separator")
|
+ System.getProperty("file.separator")
|
||||||
+ fileName;
|
+ fileName;
|
||||||
String downloadDir = getExportDownloadDirectory(eperson
|
String downloadDir = getExportDownloadDirectory(eperson
|
||||||
.getID());
|
.getID());
|
||||||
|
File dnDir = new File(downloadDir);
|
||||||
|
if (!dnDir.exists() && !dnDir.mkdirs())
|
||||||
|
{
|
||||||
|
log.error("Unable to create download directory");
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator<String> iter = itemsMap.keySet().iterator();
|
||||||
|
while(iter.hasNext())
|
||||||
|
{
|
||||||
|
String keyName = iter.next();
|
||||||
|
iitems = new ItemIterator(context, itemsMap.get(keyName));
|
||||||
|
|
||||||
|
String workDir = workParentDir
|
||||||
|
+ System.getProperty("file.separator")
|
||||||
|
+ keyName;
|
||||||
|
|
||||||
File wkDir = new File(workDir);
|
File wkDir = new File(workDir);
|
||||||
if (!wkDir.exists() && !wkDir.mkdirs())
|
if (!wkDir.exists() && !wkDir.mkdirs())
|
||||||
@@ -972,23 +1002,21 @@ public class ItemExport
|
|||||||
log.error("Unable to create working directory");
|
log.error("Unable to create working directory");
|
||||||
}
|
}
|
||||||
|
|
||||||
File dnDir = new File(downloadDir);
|
|
||||||
if (!dnDir.exists() && !dnDir.mkdirs())
|
|
||||||
{
|
|
||||||
log.error("Unable to create download directory");
|
|
||||||
}
|
|
||||||
|
|
||||||
// export the items using normal export method
|
// export the items using normal export method
|
||||||
exportItem(context, iitems, workDir, 1, migrate);
|
exportItem(context, iitems, workDir, 1, migrate);
|
||||||
|
iitems.close();
|
||||||
|
}
|
||||||
|
|
||||||
// now zip up the export directory created above
|
// now zip up the export directory created above
|
||||||
zip(workDir, downloadDir
|
zip(workParentDir, downloadDir
|
||||||
+ System.getProperty("file.separator")
|
+ System.getProperty("file.separator")
|
||||||
+ fileName + ".zip");
|
+ fileName + ".zip");
|
||||||
// email message letting user know the file is ready for
|
// email message letting user know the file is ready for
|
||||||
// download
|
// download
|
||||||
emailSuccessMessage(context, eperson, fileName + ".zip");
|
emailSuccessMessage(context, eperson, fileName + ".zip");
|
||||||
// return to enforcing auths
|
// return to enforcing auths
|
||||||
context.setIgnoreAuthorization(false);
|
context.restoreAuthSystemState();
|
||||||
}
|
}
|
||||||
catch (Exception e1)
|
catch (Exception e1)
|
||||||
{
|
{
|
||||||
@@ -1023,6 +1051,11 @@ public class ItemExport
|
|||||||
go.isDaemon();
|
go.isDaemon();
|
||||||
go.start();
|
go.start();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Locale supportedLocale = I18nUtil.getEPersonLocale(eperson);
|
||||||
|
emailErrorMessage(eperson, I18nUtil.getMessage("org.dspace.app.itemexport.no-result", supportedLocale));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -793,6 +793,48 @@ public class Community extends DSpaceObject
|
|||||||
return communityArray;
|
return communityArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an array of collections of this community and its subcommunities
|
||||||
|
*
|
||||||
|
* @return an array of colections
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Collection[] getAllCollections() throws SQLException
|
||||||
|
{
|
||||||
|
List<Collection> collectionList = new ArrayList<Collection>();
|
||||||
|
for (Community subcommunity : getSubcommunities())
|
||||||
|
{
|
||||||
|
addCollectionList(subcommunity, collectionList);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Collection collection : getCollections())
|
||||||
|
{
|
||||||
|
collectionList.add(collection);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put them in an array
|
||||||
|
Collection[] collectionArray = new Collection[collectionList.size()];
|
||||||
|
collectionArray = (Collection[]) collectionList.toArray(collectionArray);
|
||||||
|
|
||||||
|
return collectionArray;
|
||||||
|
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Internal method to process subcommunities recursively
|
||||||
|
*/
|
||||||
|
private void addCollectionList(Community community, List<Collection> collectionList) throws SQLException
|
||||||
|
{
|
||||||
|
for (Community subcommunity : community.getSubcommunities())
|
||||||
|
{
|
||||||
|
addCollectionList(subcommunity, collectionList);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Collection collection : community.getCollections())
|
||||||
|
{
|
||||||
|
collectionList.add(collection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new collection within this community. The collection is created
|
* Create a new collection within this community. The collection is created
|
||||||
* without any workflow groups or default submitter group.
|
* without any workflow groups or default submitter group.
|
||||||
|
@@ -1350,6 +1350,7 @@ news-side.html = news-side.html
|
|||||||
|
|
||||||
news-top.html = news-top.html
|
news-top.html = news-top.html
|
||||||
|
|
||||||
|
org.dspace.app.itemexport.no-result = The DSpaceObject that you specified has no items.
|
||||||
org.dspace.app.webui.jsptag.CollectionListTag.collectionName = Collection Name
|
org.dspace.app.webui.jsptag.CollectionListTag.collectionName = Collection Name
|
||||||
org.dspace.app.webui.jsptag.CommunityListTag.communityName = Community Name
|
org.dspace.app.webui.jsptag.CommunityListTag.communityName = Community Name
|
||||||
org.dspace.app.webui.jsptag.ItemListTag.authors = Authors
|
org.dspace.app.webui.jsptag.ItemListTag.authors = Authors
|
||||||
|
@@ -766,6 +766,37 @@ public class CommunityTest extends AbstractDSpaceObjectTest
|
|||||||
assertThat("testGetAllParents 4", son.getAllParents()[0], equalTo(c));
|
assertThat("testGetAllParents 4", son.getAllParents()[0], equalTo(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of getAllCollections method, of class Community.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGetAllCollections() throws Exception
|
||||||
|
{
|
||||||
|
new NonStrictExpectations()
|
||||||
|
{
|
||||||
|
AuthorizeManager authManager;
|
||||||
|
{
|
||||||
|
AuthorizeManager.authorizeAction((Context) any, (Community) any,
|
||||||
|
Constants.ADD); result = null;
|
||||||
|
AuthorizeManager.authorizeActionBoolean((Context) any, (Community) any,
|
||||||
|
Constants.ADD); result = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//empty by default
|
||||||
|
assertThat("testGetAllCollections 0",c.getAllCollections(), notNullValue());
|
||||||
|
assertTrue("testGetAllCollections 1", c.getAllCollections().length == 0);
|
||||||
|
|
||||||
|
//community has a collection and a subcommunity, subcommunity has a collection
|
||||||
|
Collection collOfC = c.createCollection();
|
||||||
|
Community sub = Community.create(c, context);
|
||||||
|
Collection collOfSub = sub.createCollection();
|
||||||
|
assertThat("testGetAllCollections 2",c.getAllCollections(), notNullValue());
|
||||||
|
assertTrue("testGetAllCollections 3", c.getAllCollections().length == 2);
|
||||||
|
assertThat("testGetAllCollections 4", c.getAllCollections()[0], equalTo(collOfSub));
|
||||||
|
assertThat("testGetAllCollections 5", c.getAllCollections()[1], equalTo(collOfC));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test of createCollection method, of class Community.
|
* Test of createCollection method, of class Community.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user