/** * 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.sword2; import org.dspace.content.*; import org.dspace.core.Constants; import org.dspace.core.Context; import org.swordapp.server.Deposit; import org.swordapp.server.SwordError; import org.swordapp.server.UriRegistry; import java.sql.SQLException; import java.util.List; /** * This implementation of WorkflowManager is unrestricted and allows UPDATE and DELETE operations * on items in any state (in workflow, in archive, or withdrawn). */ public class WorkflowManagerUnrestricted implements WorkflowManager { public void retrieveServiceDoc(Context context) throws SwordError { // do nothing - operation allowed } public void listCollectionContents(Context context, Collection collection) throws SwordError { // do nothing - operation allowed } public void createResource(Context context, Collection collection) throws SwordError { // do nothing - operation allowed } public void retrieveContent(Context context, Item item) throws SwordError { // do nothing - operation allowed } public void retrieveBitstream(Context context, Bitstream bitstream) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void replaceResourceContent(Context context, Item item) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void replaceMetadata(Context context, Item item) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void replaceMetadataAndMediaResource(Context context, Item item) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void deleteMediaResource(Context context, Item item) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void deleteBitstream(Context context, Bitstream bitstream) throws SwordError, DSpaceSwordException { // this is equivalent to asking whether the media resource in the item can be deleted try { List<Bundle> bundles = bitstream.getBundles(); for (Bundle bundle : bundles) { // is the bitstream in the ORIGINAL bundle? If not, it can't be worked on if (!Constants.CONTENT_BUNDLE_NAME .equals(bundle.getName())) { throw new SwordError(UriRegistry.ERROR_METHOD_NOT_ALLOWED, "The file is not in a bundle which can be modified"); } List<Item> items = bundle.getItems(); for (Item item : items) { this.deleteMediaResource(context, item); } } } catch (SQLException e) { throw new DSpaceSwordException(e); } } public void replaceBitstream(Context context, Bitstream bitstream) throws SwordError, DSpaceSwordException { // this is equivalent to asking whether the media resource in the item can be deleted try { List<Bundle> bundles = bitstream.getBundles(); for (Bundle bundle : bundles) { // is the bitstream in the ORIGINAL bundle? If not, it can't be worked on if (!Constants.CONTENT_BUNDLE_NAME .equals(bundle.getName())) { throw new SwordError(UriRegistry.ERROR_METHOD_NOT_ALLOWED, "The file is not in a bundle which can be modified"); } List<Item> items = bundle.getItems(); for (Item item : items) { this.replaceResourceContent(context, item); } } } catch (SQLException e) { throw new DSpaceSwordException(e); } } public void addResourceContent(Context context, Item item) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void addMetadata(Context context, Item item) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void deleteItem(Context context, Item item) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void retrieveStatement(Context context, Item item) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void modifyState(Context context, Item item) throws SwordError, DSpaceSwordException { // do nothing - operation allowed } public void resolveState(Context context, Deposit deposit, DepositResult result, VerboseDescription verboseDescription) throws DSpaceSwordException { this.resolveState(context, deposit, result, verboseDescription, true); } public void resolveState(Context context, Deposit deposit, DepositResult result, VerboseDescription verboseDescription, boolean containerOperation) throws DSpaceSwordException { // the containerOperation flag tells us whether this method was called by an operation which happened on the // container. This workflow implementation only changes workflow states on contaner operations, not media // resource operations, so we just bounce this right back. if (!containerOperation) { return; } // if we get to here this is a container operation, and we can decide how best to process Item item = result.getItem(); // find out where the item is in the workflow WorkflowTools wft = new WorkflowTools(); boolean inwf = wft.isItemInWorkflow(context, item); boolean inws = wft.isItemInWorkspace(context, item); // or find out if the item is in the archive boolean inarch = item.isArchived() || item.isWithdrawn(); // in progress inws inwf inarch action description // 0 0 0 1 NOTHING the deposit finished, and the item is in the archive; // 0 0 1 0 NOTHING the deposit finished, and the item is in the workflow. Carry on as normal // 0 1 0 0 START WF the deposit is finished, and the item is in the workflow, so we start it // 1 0 0 1 NOTHING the deposit is not finished, and the item is in the archive; // 1 0 1 0 STOP WF the deposit is not finished, and it is in the workflow. Pull it out into the workspace // 1 1 0 0 NOTHING the deposit is not finished, and is in the workspace; leave it there if (!deposit.isInProgress() && inarch) { verboseDescription .append("The deposit is finished, and the item is already in the archive"); // throw new DSpaceSwordException("Invalid workflow state"); } if (!deposit.isInProgress() && inws) { verboseDescription .append("The deposit is finished: moving it from the workspace to the workflow"); wft.startWorkflow(context, item); } if (deposit.isInProgress() && inarch) { verboseDescription .append("The deposit is not finished, and the item is already in the archive"); // throw new DSpaceSwordException("Invalid workflow state"); } if (deposit.isInProgress() && inwf) { verboseDescription .append("The deposit is in progress, but is in the workflow; returning to the workspace"); wft.stopWorkflow(context, item); } } }