/**
* 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.versioning;
import org.dspace.content.Item;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.event.Consumer;
import org.dspace.event.Event;
import org.dspace.utils.DSpace;
import java.util.HashSet;
import java.util.Set;
/**
*
*
* @author Fabio Bolognesi (fabio at atmire dot com)
* @author Mark Diggory (markd at atmire dot com)
* @author Ben Bosman (ben at atmire dot com)
*/
public class VersioningConsumer implements Consumer {
private static Set<Item> itemsToProcess;
public void initialize() throws Exception {}
public void finish(Context ctx) throws Exception {}
public void consume(Context ctx, Event event) throws Exception {
if(itemsToProcess == null){
itemsToProcess = new HashSet<Item>();
}
int st = event.getSubjectType();
int et = event.getEventType();
if(st == Constants.ITEM && et == Event.INSTALL){
Item item = (Item) event.getSubject(ctx);
if (item != null && item.isArchived()) {
VersionHistory history = retrieveVersionHistory(ctx, item);
if (history != null) {
Version latest = history.getLatestVersion();
Version previous = history.getPrevious(latest);
if(previous != null){
Item previousItem = previous.getItem();
if(previousItem != null){
previousItem.setArchived(false);
itemsToProcess.add(previousItem);
//Fire a new modify event for our previous item
//Due to the need to reindex the item in the search
//and browse index we need to fire a new event
ctx.addEvent(new Event(Event.MODIFY,
previousItem.getType(), previousItem.getID(),
null, previousItem.getIdentifiers(ctx)));
}
}
}
}
}
}
public void end(Context ctx) throws Exception {
if(itemsToProcess != null){
for(Item item : itemsToProcess){
ctx.turnOffAuthorisationSystem();
try {
item.update();
} finally {
ctx.restoreAuthSystemState();
}
}
ctx.getDBConnection().commit();
}
itemsToProcess = null;
}
private static org.dspace.versioning.VersionHistory retrieveVersionHistory(Context c, Item item) {
VersioningService versioningService = new DSpace().getSingletonService(VersioningService.class);
return versioningService.findVersionHistory(c, item.getID());
}
}