/**
* 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.app.xmlui.aspect.versioning;
import org.dspace.app.xmlui.aspect.administrative.FlowResult;
import org.dspace.app.xmlui.utils.UIException;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.AuthorizeManager;
import org.dspace.content.Item;
import org.dspace.content.WorkspaceItem;
import org.dspace.core.Context;
import org.dspace.utils.DSpace;
import org.dspace.versioning.Version;
import org.dspace.versioning.VersionHistory;
import org.dspace.versioning.VersioningService;
import java.io.IOException;
import java.sql.SQLException;
/**
*
*
* @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 VersionManager {
private static final Message T_version_created = new Message("default", "The new version has been created.");
private static final Message T_version_delete = new Message("default", "The selected version(s) have been deleted.");
private static final Message T_version_updated = new Message("default", "The version has been updated.");
private static final Message T_version_restored = new Message("default", "The version has been restored.");
/**
* Create a new version of the specified item
*
* @param context The DSpace context
* @param itemID The id of the to-be-versioned item
* @return A result object
*/
// Versioning
public static FlowResult processCreateNewVersion(Context context, int itemID, String summary) throws SQLException, AuthorizeException, IOException {
FlowResult result = new FlowResult();
try {
result.setContinue(false);
Item item = Item.find(context, itemID);
if (AuthorizeManager.isAdmin(context, item) || item.canEdit()) {
VersioningService versioningService = new DSpace().getSingletonService(VersioningService.class);
Version version = versioningService.createNewVersion(context, itemID, summary);
WorkspaceItem wsi = WorkspaceItem.findByItem(context, version.getItem());
context.commit();
result.setParameter("wsid", wsi.getID());
result.setOutcome(true);
result.setContinue(true);
result.setMessage(T_version_created);
result.setParameter("summary", summary);
}
} catch (Exception ex) {
context.abort();
throw new RuntimeException(ex);
}
return result;
}
/**
* Modify latest version
*
* @param context The DSpace context
* @param itemID The id of the to-be-versioned item
* @return A result object
*/
// Versioning
public static FlowResult processUpdateVersion(Context context, int itemID, String summary) throws SQLException, AuthorizeException, IOException {
FlowResult result = new FlowResult();
try {
result.setContinue(false);
Item item = Item.find(context, itemID);
if (AuthorizeManager.isAdmin(context, item)) {
VersioningService versioningService = new DSpace().getSingletonService(VersioningService.class);
versioningService.updateVersion(context, itemID, summary);
context.commit();
result.setOutcome(true);
result.setContinue(true);
result.setMessage(T_version_updated);
result.setParameter("summary", summary);
}
} catch (Exception ex) {
context.abort();
throw new RuntimeException(ex);
}
return result;
}
/**
* Restore a version
*
* @param versionID id of the version to restore
* @param context The DSpace context
* @return A result object
*/
// Versioning
public static FlowResult processRestoreVersion(Context context, int versionID, String summary) throws SQLException, AuthorizeException, IOException {
FlowResult result = new FlowResult();
try {
result.setContinue(false);
VersioningService versioningService = new DSpace().getSingletonService(VersioningService.class);
versioningService.restoreVersion(context, versionID, summary);
context.commit();
result.setOutcome(true);
result.setContinue(true);
result.setMessage(T_version_restored);
} catch (Exception ex) {
context.abort();
throw new RuntimeException(ex);
}
return result;
}
/**
* Delete version(s)
*
* @param context The DSpace context
* @param versionIDs list of versionIDs to delete
* @return A result object
*/
// Versioning
public static FlowResult processDeleteVersions(Context context, int itemId, String[] versionIDs) throws SQLException, AuthorizeException, IOException, UIException {
FlowResult result = new FlowResult();
try {
result.setContinue(false);
VersioningService versioningService = new DSpace().getSingletonService(VersioningService.class);
VersionHistory versionHistory = versioningService.findVersionHistory(context, itemId);
for (String id : versionIDs) {
versioningService.removeVersion(context, Integer.parseInt(id));
}
context.commit();
//Retrieve the latest version of our history (IF any is even present)
Version latestVersion = versionHistory.getLatestVersion();
if(latestVersion == null){
result.setParameter("itemID", null);
}else{
result.setParameter("itemID", latestVersion.getItemID());
}
result.setContinue(true);
result.setOutcome(true);
result.setMessage(T_version_delete);
} catch (Exception ex) {
context.abort();
throw new RuntimeException(ex);
}
return result;
}
}