mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-17 06:53:09 +00:00
Code for moving bitstreams to a different bundle moved to BundleService
This commit is contained in:
@@ -7,6 +7,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.dspace.content;
|
package org.dspace.content;
|
||||||
|
|
||||||
|
import static org.dspace.core.Constants.ADD;
|
||||||
|
import static org.dspace.core.Constants.REMOVE;
|
||||||
|
import static org.dspace.core.Constants.WRITE;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -292,6 +296,57 @@ public class BundleServiceImpl extends DSpaceObjectServiceImpl<Bundle> implement
|
|||||||
setOrder(context, bundle, bitstreamIds.toArray(new UUID[bitstreamIds.size()]));
|
setOrder(context, bundle, bitstreamIds.toArray(new UUID[bitstreamIds.size()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void moveBitstreamToBundle(Context context, Bundle targetBundle, Bitstream bitstream)
|
||||||
|
throws SQLException, AuthorizeException, IOException {
|
||||||
|
List<Bundle> bundles = new LinkedList<>();
|
||||||
|
bundles.addAll(bitstream.getBundles());
|
||||||
|
|
||||||
|
if (hasSufficientMovePermissions(context, bundles, targetBundle)) {
|
||||||
|
this.addBitstream(context, targetBundle, bitstream);
|
||||||
|
this.update(context, targetBundle);
|
||||||
|
for (Bundle bundle : bundles) {
|
||||||
|
this.removeBitstream(context, bundle, bitstream);
|
||||||
|
this.update(context, bundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies if the context (user) has sufficient rights to the bundles in order to move a bitstream
|
||||||
|
*
|
||||||
|
* @param context The context
|
||||||
|
* @param bundles The current bundles in which the bitstream resides
|
||||||
|
* @param targetBundle The target bundle
|
||||||
|
* @return true when the context has sufficient rights
|
||||||
|
* @throws AuthorizeException When one of the necessary rights is not present
|
||||||
|
*/
|
||||||
|
private boolean hasSufficientMovePermissions(final Context context, final List<Bundle> bundles,
|
||||||
|
final Bundle targetBundle) throws SQLException, AuthorizeException {
|
||||||
|
for (Bundle bundle : bundles) {
|
||||||
|
if (!authorizeService.authorizeActionBoolean(context, bundle, WRITE) || !authorizeService
|
||||||
|
.authorizeActionBoolean(context, bundle, REMOVE)) {
|
||||||
|
throw new AuthorizeException(
|
||||||
|
"The current user does not have WRITE and REMOVE access to the current bundle: " + bundle
|
||||||
|
.getID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!authorizeService.authorizeActionBoolean(context, targetBundle, WRITE) || !authorizeService
|
||||||
|
.authorizeActionBoolean(context, targetBundle, ADD)) {
|
||||||
|
throw new AuthorizeException(
|
||||||
|
"The current user does not have WRITE and ADD access to the target bundle: " + targetBundle
|
||||||
|
.getID());
|
||||||
|
}
|
||||||
|
for (Item item : targetBundle.getItems()) {
|
||||||
|
if (!authorizeService.authorizeActionBoolean(context, item, WRITE)) {
|
||||||
|
throw new AuthorizeException(
|
||||||
|
"The current user does not have WRITE access to the target bundle's item: " + item.getID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setOrder(Context context, Bundle bundle, UUID[] bitstreamIds) throws AuthorizeException, SQLException {
|
public void setOrder(Context context, Bundle bundle, UUID[] bitstreamIds) throws AuthorizeException, SQLException {
|
||||||
authorizeService.authorizeAction(context, bundle, Constants.WRITE);
|
authorizeService.authorizeAction(context, bundle, Constants.WRITE);
|
||||||
|
@@ -121,6 +121,18 @@ public interface BundleService extends DSpaceObjectService<Bundle>, DSpaceObject
|
|||||||
*/
|
*/
|
||||||
public void moveBitstream(Context context, Bundle bundle, int from, int to) throws AuthorizeException, SQLException;
|
public void moveBitstream(Context context, Bundle bundle, int from, int to) throws AuthorizeException, SQLException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves a bitstream from its current bundle to a new target bundle
|
||||||
|
* @param context DSpace Context
|
||||||
|
* @param targetBundle The target bundle where bitstream will be moved to
|
||||||
|
* @param bitstream The bitstream being moved
|
||||||
|
* @throws SQLException if database error
|
||||||
|
* @throws AuthorizeException if authorization error
|
||||||
|
* @throws IOException if IO error
|
||||||
|
*/
|
||||||
|
public void moveBitstreamToBundle(Context context, Bundle targetBundle, Bitstream bitstream) throws SQLException,
|
||||||
|
AuthorizeException, IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes bitstream order according to the array
|
* Changes bitstream order according to the array
|
||||||
*
|
*
|
||||||
|
@@ -7,16 +7,11 @@
|
|||||||
*/
|
*/
|
||||||
package org.dspace.app.rest.repository;
|
package org.dspace.app.rest.repository;
|
||||||
|
|
||||||
import static org.dspace.core.Constants.ADD;
|
|
||||||
import static org.dspace.core.Constants.REMOVE;
|
|
||||||
import static org.dspace.core.Constants.WRITE;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
@@ -32,7 +27,6 @@ import org.dspace.authorize.AuthorizeException;
|
|||||||
import org.dspace.authorize.service.AuthorizeService;
|
import org.dspace.authorize.service.AuthorizeService;
|
||||||
import org.dspace.content.Bitstream;
|
import org.dspace.content.Bitstream;
|
||||||
import org.dspace.content.Bundle;
|
import org.dspace.content.Bundle;
|
||||||
import org.dspace.content.Item;
|
|
||||||
import org.dspace.content.service.BitstreamService;
|
import org.dspace.content.service.BitstreamService;
|
||||||
import org.dspace.content.service.BundleService;
|
import org.dspace.content.service.BundleService;
|
||||||
import org.dspace.core.Context;
|
import org.dspace.core.Context;
|
||||||
@@ -181,53 +175,8 @@ public class BitstreamRestRepository extends DSpaceObjectRestRepository<Bitstrea
|
|||||||
throw new DSpaceBadRequestException("The provided bitstream is already in the target bundle");
|
throw new DSpaceBadRequestException("The provided bitstream is already in the target bundle");
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Bundle> bundles = new LinkedList<>();
|
bundleService.moveBitstreamToBundle(context, targetBundle, bitstream);
|
||||||
bundles.addAll(bitstream.getBundles());
|
|
||||||
|
|
||||||
if (hasSufficientMovePermissions(context, bundles, targetBundle)) {
|
|
||||||
bundleService.addBitstream(context, targetBundle, bitstream);
|
|
||||||
bundleService.update(context, targetBundle);
|
|
||||||
for (Bundle bundle : bundles) {
|
|
||||||
bundleService.removeBitstream(context, bundle, bitstream);
|
|
||||||
bundleService.update(context, bundle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return targetBundle;
|
return targetBundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Verifies if the context (user) has sufficient rights to the bundles in order to move a bitstream
|
|
||||||
*
|
|
||||||
* @param context The context
|
|
||||||
* @param bundles The current bundles in which the bitstream resides
|
|
||||||
* @param targetBundle The target bundle
|
|
||||||
* @return true when the context has sufficient rights
|
|
||||||
* @throws AuthorizeException When one of the necessary rights is not present
|
|
||||||
*/
|
|
||||||
private boolean hasSufficientMovePermissions(final Context context, final List<Bundle> bundles,
|
|
||||||
final Bundle targetBundle) throws SQLException, AuthorizeException {
|
|
||||||
for (Bundle bundle : bundles) {
|
|
||||||
if (!authorizeService.authorizeActionBoolean(context, bundle, WRITE) || !authorizeService
|
|
||||||
.authorizeActionBoolean(context, bundle, REMOVE)) {
|
|
||||||
throw new AuthorizeException(
|
|
||||||
"The current user does not have WRITE and REMOVE access to the current bundle: " + bundle
|
|
||||||
.getID());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!authorizeService.authorizeActionBoolean(context, targetBundle, WRITE) || !authorizeService
|
|
||||||
.authorizeActionBoolean(context, targetBundle, ADD)) {
|
|
||||||
throw new AuthorizeException(
|
|
||||||
"The current user does not have WRITE and ADD access to the target bundle: " + targetBundle
|
|
||||||
.getID());
|
|
||||||
}
|
|
||||||
for (Item item : targetBundle.getItems()) {
|
|
||||||
if (!authorizeService.authorizeActionBoolean(context, item, WRITE)) {
|
|
||||||
throw new AuthorizeException(
|
|
||||||
"The current user does not have WRITE access to the target bundle's item: " + item.getID());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user