/** * 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.content.factory.ContentServiceFactory; import org.dspace.content.service.ItemService; import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.event.Consumer; import org.dspace.event.Event; import org.dspace.versioning.factory.VersionServiceFactory; import org.dspace.versioning.service.VersionHistoryService; import org.dspace.versioning.service.VersioningService; 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; private VersionHistoryService versionHistoryService; private VersioningService versioningService; private ItemService itemService; @Override public void initialize() throws Exception { versionHistoryService = VersionServiceFactory.getInstance().getVersionHistoryService(); versioningService = VersionServiceFactory.getInstance().getVersionService(); itemService = ContentServiceFactory.getInstance().getItemService(); } @Override public void finish(Context ctx) throws Exception {} @Override 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 = versionHistoryService.findByItem(ctx, item); if (history != null) { Version latest = versionHistoryService.getLatestVersion(ctx, history); Version previous = versionHistoryService.getPrevious(ctx, history, 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, itemService.getIdentifiers(ctx, previousItem))); } } } } } } @Override public void end(Context ctx) throws Exception { if(itemsToProcess != null){ for(Item item : itemsToProcess){ ctx.turnOffAuthorisationSystem(); try { itemService.update(ctx, item); } finally { ctx.restoreAuthSystemState(); } } } itemsToProcess = null; } }