mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-07 18:14:26 +00:00
[TLC-674] Refactor duplicate detection controller to REST repository
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* http://www.dspace.org/license/
|
* http://www.dspace.org/license/
|
||||||
*/
|
*/
|
||||||
package org.dspace.app.rest;
|
package org.dspace.app.rest.repository;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -15,11 +15,12 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.dspace.app.rest.converter.ConverterService;
|
import org.dspace.app.rest.DiscoverableEndpointsService;
|
||||||
|
import org.dspace.app.rest.Parameter;
|
||||||
|
import org.dspace.app.rest.SearchRestMethod;
|
||||||
|
import org.dspace.app.rest.exception.RepositoryMethodNotImplementedException;
|
||||||
import org.dspace.app.rest.model.PotentialDuplicateRest;
|
import org.dspace.app.rest.model.PotentialDuplicateRest;
|
||||||
import org.dspace.app.rest.model.hateoas.PotentialDuplicateResource;
|
|
||||||
import org.dspace.app.rest.utils.ContextUtil;
|
import org.dspace.app.rest.utils.ContextUtil;
|
||||||
import org.dspace.app.rest.utils.Utils;
|
|
||||||
import org.dspace.content.Item;
|
import org.dspace.content.Item;
|
||||||
import org.dspace.content.service.DuplicateDetectionService;
|
import org.dspace.content.service.DuplicateDetectionService;
|
||||||
import org.dspace.content.service.ItemService;
|
import org.dspace.content.service.ItemService;
|
||||||
@@ -32,45 +33,90 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.rest.webmvc.ResourceNotFoundException;
|
import org.springframework.data.rest.webmvc.ResourceNotFoundException;
|
||||||
import org.springframework.data.web.PagedResourcesAssembler;
|
|
||||||
import org.springframework.hateoas.Link;
|
import org.springframework.hateoas.Link;
|
||||||
import org.springframework.hateoas.PagedModel;
|
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The controller for the api/duplicates endpoint, which handles requests for finding
|
* The REST repository for the api/submission/duplicates endpoint, which handles requests for finding
|
||||||
* potential duplicates
|
* potential duplicates of a given item (archived or in-progress).
|
||||||
|
*
|
||||||
|
* Find one and find all are not implemented as actual REST methods because a duplicate is the result
|
||||||
|
* of comparing an item with other indexed items, not an object that can be referenced by some kind of ID, but
|
||||||
|
* we must at least implement the Java methods here in order to extend DSpaceRestRepository and implement
|
||||||
|
* SearchRestMethods.
|
||||||
*
|
*
|
||||||
* @author Kim Shepherd
|
* @author Kim Shepherd
|
||||||
*/
|
*/
|
||||||
@RestController
|
|
||||||
@ConditionalOnProperty("duplicate.enable")
|
@ConditionalOnProperty("duplicate.enable")
|
||||||
@RequestMapping("/api/" + PotentialDuplicateRest.CATEGORY + "/" + PotentialDuplicateRest.NAME)
|
@Component(PotentialDuplicateRest.CATEGORY + "." + PotentialDuplicateRest.NAME)
|
||||||
public class DuplicateDetectionRestController implements InitializingBean {
|
public class DuplicateRestRepository extends DSpaceRestRepository<PotentialDuplicateRest, String>
|
||||||
|
implements InitializingBean {
|
||||||
|
|
||||||
private static final Logger log = LogManager.getLogger(DuplicateDetectionRestController.class);
|
/**
|
||||||
|
* Discoverable endpoints service
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
DiscoverableEndpointsService discoverableEndpointsService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Duplicate detection service
|
||||||
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
protected Utils utils;
|
DuplicateDetectionService duplicateDetectionService;
|
||||||
@Autowired
|
|
||||||
private DiscoverableEndpointsService discoverableEndpointsService;
|
|
||||||
@Autowired
|
|
||||||
private ItemService itemService;
|
|
||||||
@Autowired
|
|
||||||
private DuplicateDetectionService duplicateDetectionService;
|
|
||||||
@Autowired
|
|
||||||
private ConverterService converter;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Item service
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
ItemService itemService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logger
|
||||||
|
*/
|
||||||
|
private final static Logger log = LogManager.getLogger();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register this repository endpoint as /api/submission/duplicates
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() throws Exception {
|
public void afterPropertiesSet() throws Exception {
|
||||||
discoverableEndpointsService
|
discoverableEndpointsService
|
||||||
.register(this, Arrays.asList(Link.of(
|
.register(this, Arrays.asList(Link.of(
|
||||||
"/api/" + PotentialDuplicateRest.CATEGORY + "/" + PotentialDuplicateRest.NAME,
|
"/api/" + PotentialDuplicateRest.CATEGORY + "/" + PotentialDuplicateRest.NAME + "/search",
|
||||||
PotentialDuplicateRest.NAME)));
|
PotentialDuplicateRest.NAME + "-search")));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This REST method is NOT IMPLEMENTED - it does not make sense in duplicate detection, in which the only
|
||||||
|
* real addressable objects involved are Items.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* the dspace context
|
||||||
|
* @param name
|
||||||
|
* the rest object id
|
||||||
|
* @return not implemented
|
||||||
|
* @throws RepositoryMethodNotImplementedException
|
||||||
|
*/
|
||||||
|
@PreAuthorize("permitAll()")
|
||||||
|
@Override
|
||||||
|
public PotentialDuplicateRest findOne(Context context, String name) {
|
||||||
|
throw new RepositoryMethodNotImplementedException("Duplicate detection endpoint only implements searchBy", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This REST method is NOT IMPLEMENTED - it does not make sense in duplicate detection, where there can be no "all"
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* the dspace context
|
||||||
|
* @return not implemented
|
||||||
|
* @throws RepositoryMethodNotImplementedException
|
||||||
|
*/
|
||||||
|
@PreAuthorize("permitAll()")
|
||||||
|
@Override
|
||||||
|
public Page<PotentialDuplicateRest> findAll(Context context, Pageable pageable) {
|
||||||
|
throw new RepositoryMethodNotImplementedException("Duplicate detection endpoint only implements searchBy", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -80,16 +126,14 @@ public class DuplicateDetectionRestController implements InitializingBean {
|
|||||||
* the current user.
|
* the current user.
|
||||||
*
|
*
|
||||||
* @param uuid The item UUID to search
|
* @param uuid The item UUID to search
|
||||||
* @param page Pagination options
|
* @param pageable Pagination options
|
||||||
* @param assembler The paged resources assembler to construct the paged model
|
|
||||||
* @return Paged list of potential duplicates
|
* @return Paged list of potential duplicates
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
@RequestMapping(method = RequestMethod.GET, value = "/search")
|
|
||||||
@PreAuthorize("hasPermission(#uuid, 'ITEM', 'READ')")
|
@PreAuthorize("hasPermission(#uuid, 'ITEM', 'READ')")
|
||||||
public PagedModel<PotentialDuplicateResource> searchPotentialDuplicates(
|
@SearchRestMethod(name = "findByItem")
|
||||||
@RequestParam(name = "uuid", required = true) UUID uuid, Pageable page, PagedResourcesAssembler assembler) {
|
public Page<PotentialDuplicateRest> findByItem(@Parameter(value = "uuid", required = true) UUID uuid,
|
||||||
|
Pageable pageable) {
|
||||||
// Instantiate object to represent this item
|
// Instantiate object to represent this item
|
||||||
Item item;
|
Item item;
|
||||||
// Instantiate list of potential duplicates which we will convert and return as paged ItemRest list
|
// Instantiate list of potential duplicates which we will convert and return as paged ItemRest list
|
||||||
@@ -98,8 +142,6 @@ public class DuplicateDetectionRestController implements InitializingBean {
|
|||||||
int total = 0;
|
int total = 0;
|
||||||
// Obtain context
|
// Obtain context
|
||||||
Context context = ContextUtil.obtainCurrentRequestContext();
|
Context context = ContextUtil.obtainCurrentRequestContext();
|
||||||
// Get pagination
|
|
||||||
Pageable pageable = utils.getPageable(page);
|
|
||||||
|
|
||||||
// Try to get item based on UUID parameter
|
// Try to get item based on UUID parameter
|
||||||
try {
|
try {
|
||||||
@@ -124,14 +166,21 @@ public class DuplicateDetectionRestController implements InitializingBean {
|
|||||||
log.error("Search service error retrieving duplicates: {}", e.getMessage());
|
log.error("Search service error retrieving duplicates: {}", e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct rest and resource pages
|
// Construct rest pages and return
|
||||||
Page<PotentialDuplicateRest> restPage = converter.toRestPage(potentialDuplicates, pageable, total,
|
Page<PotentialDuplicateRest> restPage = converter.toRestPage(potentialDuplicates, pageable, total,
|
||||||
utils.obtainProjection());
|
utils.obtainProjection());
|
||||||
Page<PotentialDuplicateResource> resourcePage = restPage.map(potentialDuplicateRest ->
|
|
||||||
new PotentialDuplicateResource(potentialDuplicateRest));
|
|
||||||
|
|
||||||
// Return the list of items along with pagination info and max results, assembled as PagedModel
|
return restPage;
|
||||||
return assembler.toModel(resourcePage);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the domain class for potential duplicate objects
|
||||||
|
* @return PotentialDuplicateRest.class
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Class<PotentialDuplicateRest> getDomainClass() {
|
||||||
|
return PotentialDuplicateRest.class;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user