diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 89b74b701f..c714746337 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -308,15 +308,10 @@ org.dspace handle + - org.eclipse.jetty.aggregate - jetty-all - - - javax.servlet - org.eclipse.jetty.orbit - - + org.eclipse.jetty + jetty-server org.dspace @@ -489,6 +484,13 @@ org.apache.solr solr-cell ${solr.client.version} + + + + org.ow2.asm + asm-commons + + diff --git a/dspace-oai/pom.xml b/dspace-oai/pom.xml index 45bb394740..d5a129c90a 100644 --- a/dspace-oai/pom.xml +++ b/dspace-oai/pom.xml @@ -142,19 +142,22 @@ org.springframework.boot spring-boot-starter-web - + - org.ow2.asm - asm - - - - org.springframework.boot - spring-boot-configuration-processor + org.parboiled + parboiled-java + + + org.parboiled + parboiled-java + 1.3.1 + + org.dspace @@ -190,10 +193,10 @@ org.apache.logging.log4j log4j-core - + org.apache.logging.log4j log4j-web - + org.apache.logging.log4j log4j-slf4j-impl @@ -258,12 +261,6 @@ ${spring.version} test - - org.parboiled - parboiled-core - 1.1.7 - test - org.xmlmatchers xml-matchers diff --git a/dspace-rest/pom.xml b/dspace-rest/pom.xml index 221b9f4cc9..8f69306085 100644 --- a/dspace-rest/pom.xml +++ b/dspace-rest/pom.xml @@ -19,7 +19,7 @@ ${basedir}/.. - 5.1.3.RELEASE + 5.3.1.RELEASE @@ -104,7 +104,7 @@ ${jackson.version} - + org.springframework spring-core @@ -123,9 +123,10 @@ org.glassfish.jersey.ext - jersey-spring4 + jersey-spring5 ${jersey.version} + org.springframework spring @@ -150,6 +151,11 @@ org.springframework spring-aop + + + jakarta.annotation + jakarta.annotation-api + diff --git a/dspace-server-webapp/pom.xml b/dspace-server-webapp/pom.xml index cba95214b0..88e31751f3 100644 --- a/dspace-server-webapp/pom.xml +++ b/dspace-server-webapp/pom.xml @@ -27,8 +27,6 @@ @ org.dspace.app.rest.Application - - 7.9 @@ -241,11 +239,7 @@ org.springframework.data spring-data-rest-hal-browser - 3.1.10.RELEASE - + ${spring-hal-browser.version} @@ -255,10 +249,8 @@ ${spring-boot.version} - - + + org.springframework.boot spring-boot-starter @@ -346,6 +338,7 @@ com.jayway.jsonpath json-path-assert + ${json-path.version} test diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/Application.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/Application.java index 900324fc72..8c8fe3e335 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/Application.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/Application.java @@ -11,7 +11,7 @@ import java.util.List; import javax.servlet.Filter; import org.dspace.app.rest.filter.DSpaceRequestContextFilter; -import org.dspace.app.rest.model.hateoas.DSpaceRelProvider; +import org.dspace.app.rest.model.hateoas.DSpaceLinkRelationProvider; import org.dspace.app.rest.parameter.resolver.SearchFilterResolver; import org.dspace.app.rest.utils.ApplicationConfig; import org.dspace.app.rest.utils.DSpaceConfigurationInitializer; @@ -26,7 +26,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; import org.springframework.core.annotation.Order; -import org.springframework.hateoas.RelProvider; +import org.springframework.hateoas.server.LinkRelationProvider; import org.springframework.lang.NonNull; import org.springframework.web.context.request.RequestContextListener; import org.springframework.web.cors.CorsConfiguration; @@ -118,8 +118,8 @@ public class Application extends SpringBootServletInitializer { } @Bean - protected RelProvider dspaceRelProvider() { - return new DSpaceRelProvider(); + protected LinkRelationProvider dspaceLinkRelationProvider() { + return new DSpaceLinkRelationProvider(); } @Bean diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/BundleUploadBitstreamController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/BundleUploadBitstreamController.java index 7035e329f2..a0f5d5f71e 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/BundleUploadBitstreamController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/BundleUploadBitstreamController.java @@ -31,7 +31,7 @@ import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; import org.springframework.data.rest.webmvc.ResourceNotFoundException; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -86,9 +86,11 @@ public class BundleUploadBitstreamController { */ @RequestMapping(method = RequestMethod.POST, headers = "content-type=multipart/form-data") @PreAuthorize("hasPermission(#uuid, 'BUNDLE', 'ADD') && hasPermission(#uuid, 'BUNDLE', 'WRITE')") - public ResponseEntity uploadBitstream(HttpServletRequest request, @PathVariable UUID uuid, - @RequestParam("file") MultipartFile uploadfile, - @RequestParam(value = "properties", required = false) String properties) { + public ResponseEntity> uploadBitstream( + HttpServletRequest request, + @PathVariable UUID uuid, + @RequestParam("file") MultipartFile uploadfile, + @RequestParam(value = "properties", required = false) String properties) { Context context = ContextUtil.obtainContext(request); Bundle bundle = null; diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionGroupRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionGroupRestController.java index f10cd4eb98..d85685a188 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionGroupRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionGroupRestController.java @@ -36,7 +36,7 @@ import org.dspace.xmlworkflow.WorkflowUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; import org.springframework.data.rest.webmvc.ResourceNotFoundException; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -83,7 +83,7 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.POST, value = "/adminGroup") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") - public ResponseEntity postAdminGroup(@PathVariable UUID uuid, HttpServletResponse response, + public ResponseEntity> postAdminGroup(@PathVariable UUID uuid, HttpServletResponse response, HttpServletRequest request) throws SQLException, AuthorizeException { @@ -117,8 +117,9 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.DELETE, value = "/adminGroup") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") - public ResponseEntity deleteAdminGroup(@PathVariable UUID uuid, HttpServletResponse response, - HttpServletRequest request) + public ResponseEntity> deleteAdminGroup(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request) throws SQLException, AuthorizeException, IOException { Context context = ContextUtil.obtainContext(request); @@ -149,8 +150,9 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.POST, value = "/submittersGroup") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") - public ResponseEntity postSubmittersGroup(@PathVariable UUID uuid, HttpServletResponse response, - HttpServletRequest request) + public ResponseEntity> postSubmittersGroup(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request) throws SQLException, AuthorizeException { Context context = ContextUtil.obtainContext(request); @@ -183,8 +185,9 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.DELETE, value = "/submittersGroup") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") - public ResponseEntity deleteSubmittersGroup(@PathVariable UUID uuid, HttpServletResponse response, - HttpServletRequest request) + public ResponseEntity> deleteSubmittersGroup(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request) throws SQLException, AuthorizeException, IOException { Context context = ContextUtil.obtainContext(request); @@ -214,8 +217,9 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.POST, value = "/itemReadGroup") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") - public ResponseEntity postItemReadGroup(@PathVariable UUID uuid, HttpServletResponse response, - HttpServletRequest request) + public ResponseEntity> postItemReadGroup(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request) throws SQLException, AuthorizeException { Context context = ContextUtil.obtainContext(request); @@ -255,8 +259,9 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.DELETE, value = "/itemReadGroup") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") - public ResponseEntity deleteItemReadGroup(@PathVariable UUID uuid, HttpServletResponse response, - HttpServletRequest request) + public ResponseEntity> deleteItemReadGroup(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request) throws SQLException, AuthorizeException, IOException { Context context = ContextUtil.obtainContext(request); @@ -294,8 +299,9 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.POST, value = "/bitstreamReadGroup") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") - public ResponseEntity postBitstreamReadGroup(@PathVariable UUID uuid, HttpServletResponse response, - HttpServletRequest request) + public ResponseEntity> postBitstreamReadGroup(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request) throws SQLException, AuthorizeException { Context context = ContextUtil.obtainContext(request); @@ -336,9 +342,9 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.DELETE, value = "/bitstreamReadGroup") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") - public ResponseEntity deleteBitstreamReadGroup(@PathVariable UUID uuid, - HttpServletResponse response, - HttpServletRequest request) + public ResponseEntity> deleteBitstreamReadGroup(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request) throws SQLException, AuthorizeException, IOException { Context context = ContextUtil.obtainContext(request); @@ -377,10 +383,10 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.GET, value = "/workflowGroups/{workflowRole}") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'READ')") - public ResponseEntity getWorkflowGroupForRole(@PathVariable UUID uuid, - HttpServletResponse response, - HttpServletRequest request, - @PathVariable String workflowRole) + public ResponseEntity> getWorkflowGroupForRole(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request, + @PathVariable String workflowRole) throws Exception { Context context = ContextUtil.obtainContext(request); Collection collection = collectionService.find(context, uuid); @@ -407,10 +413,10 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.POST, value = "/workflowGroups/{workflowRole}") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'READ')") - public ResponseEntity postWorkflowGroupForRole(@PathVariable UUID uuid, - HttpServletResponse response, - HttpServletRequest request, - @PathVariable String workflowRole) + public ResponseEntity> postWorkflowGroupForRole(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request, + @PathVariable String workflowRole) throws Exception { Context context = ContextUtil.obtainContext(request); Collection collection = collectionService.find(context, uuid); @@ -446,10 +452,10 @@ public class CollectionGroupRestController { */ @RequestMapping(method = RequestMethod.DELETE, value = "/workflowGroups/{workflowRole}") @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'READ')") - public ResponseEntity deleteWorkflowGroupForRole(@PathVariable UUID uuid, - HttpServletResponse response, - HttpServletRequest request, - @PathVariable String workflowRole) + public ResponseEntity> deleteWorkflowGroupForRole(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request, + @PathVariable String workflowRole) throws Exception { Context context = ContextUtil.obtainContext(request); Collection collection = collectionService.find(context, uuid); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionItemtemplateController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionItemTemplateController.java similarity index 92% rename from dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionItemtemplateController.java rename to dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionItemTemplateController.java index 8b87df6b06..6a0890fabc 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionItemtemplateController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionItemTemplateController.java @@ -32,7 +32,7 @@ import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; import org.springframework.data.rest.webmvc.ResourceNotFoundException; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -50,7 +50,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/" + CollectionRest.CATEGORY + "/" + CollectionRest.PLURAL_NAME + REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID + "/itemtemplate") -public class CollectionItemtemplateController { +public class CollectionItemTemplateController { @Autowired private Utils utils; @@ -100,9 +100,9 @@ public class CollectionItemtemplateController { */ @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") @RequestMapping(method = RequestMethod.POST) - public ResponseEntity createTemplateItem(HttpServletRequest request, - @PathVariable UUID uuid, - @RequestBody(required = false) JsonNode itemBody) + public ResponseEntity> createTemplateItem(HttpServletRequest request, + @PathVariable UUID uuid, + @RequestBody(required = false) JsonNode itemBody) throws SQLException, AuthorizeException { if (itemBody == null) { @@ -125,7 +125,7 @@ public class CollectionItemtemplateController { context.commit(); return ControllerUtils.toResponseEntity(HttpStatus.CREATED, new HttpHeaders(), - converter.toResource(templateItem)); + (RepresentationModel) converter.toResource(templateItem)); } /** diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionLogoController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionLogoController.java index c0b78cdec0..c3243d8887 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionLogoController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CollectionLogoController.java @@ -26,7 +26,7 @@ import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; import org.springframework.data.rest.webmvc.ResourceNotFoundException; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -89,8 +89,10 @@ public class CollectionLogoController { @PreAuthorize("hasPermission(#uuid, 'COLLECTION', 'WRITE')") @RequestMapping(method = RequestMethod.POST, headers = "content-type=multipart/form-data") - public ResponseEntity createLogo(HttpServletRequest request, @PathVariable UUID uuid, - @RequestParam(value = "file", required = false) MultipartFile uploadfile) + public ResponseEntity> createLogo( + HttpServletRequest request, + @PathVariable UUID uuid, + @RequestParam(value = "file", required = false) MultipartFile uploadfile) throws SQLException, IOException, AuthorizeException { if (uploadfile == null) { diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CommunityAdminGroupRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CommunityAdminGroupRestController.java index bd8493e12b..2265ac941e 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CommunityAdminGroupRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CommunityAdminGroupRestController.java @@ -30,7 +30,7 @@ import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; import org.springframework.data.rest.webmvc.ResourceNotFoundException; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -73,7 +73,7 @@ public class CommunityAdminGroupRestController { */ @RequestMapping(method = RequestMethod.POST) @PreAuthorize("hasPermission(#uuid, 'COMMUNITY', 'WRITE')") - public ResponseEntity postAdminGroup(@PathVariable UUID uuid, HttpServletResponse response, + public ResponseEntity> postAdminGroup(@PathVariable UUID uuid, HttpServletResponse response, HttpServletRequest request) throws SQLException, AuthorizeException { @@ -107,8 +107,9 @@ public class CommunityAdminGroupRestController { */ @RequestMapping(method = RequestMethod.DELETE) @PreAuthorize("hasPermission(#uuid, 'COMMUNITY', 'WRITE')") - public ResponseEntity deleteAdminGroup(@PathVariable UUID uuid, HttpServletResponse response, - HttpServletRequest request) + public ResponseEntity> deleteAdminGroup(@PathVariable UUID uuid, + HttpServletResponse response, + HttpServletRequest request) throws SQLException, AuthorizeException, IOException { Context context = ContextUtil.obtainContext(request); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CommunityLogoController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CommunityLogoController.java index baf8009006..52c0f000b6 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/CommunityLogoController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/CommunityLogoController.java @@ -26,7 +26,7 @@ import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; import org.springframework.data.rest.webmvc.ResourceNotFoundException; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -89,8 +89,9 @@ public class CommunityLogoController { @PreAuthorize("hasPermission(#uuid, 'COMMUNITY', 'WRITE')") @RequestMapping(method = RequestMethod.POST, headers = "content-type=multipart/form-data") - public ResponseEntity createLogo(HttpServletRequest request, @PathVariable UUID uuid, - @RequestParam(value = "file", required = false) MultipartFile uploadfile) + public ResponseEntity> createLogo(HttpServletRequest request, @PathVariable UUID uuid, + @RequestParam(value = "file", required = false) + MultipartFile uploadfile) throws SQLException, IOException, AuthorizeException { if (uploadfile == null) { diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoverableEndpointsService.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoverableEndpointsService.java index 6e8c674d43..1853285d71 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoverableEndpointsService.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoverableEndpointsService.java @@ -68,10 +68,11 @@ public class DiscoverableEndpointsService { discoverableEndpoints.add(link); // sanity check // FIXME improve logging for debugging - if (rels.contains(link.getRel())) { - throw new IllegalStateException("The rel " + link.getRel() + " is defined multiple times!"); + if (rels.contains(link.getRel().value())) { + throw new IllegalStateException("The rel " + link.getRel().value() + + " is defined multiple times!"); } - rels.add(link.getRel()); + rels.add(link.getRel().value()); } } } @@ -87,4 +88,4 @@ public class DiscoverableEndpointsService { // could be used to override default implementation) return true; } -} \ No newline at end of file +} diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoveryRestController.java index 6be17ae24c..df1598b96a 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoveryRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoveryRestController.java @@ -34,7 +34,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.hateoas.Link; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -171,15 +171,15 @@ public class DiscoveryRestController implements InitializingBean { } @RequestMapping(method = RequestMethod.GET, value = "/facets/{name}") - public ResourceSupport getFacetValues(@PathVariable("name") String facetName, - @RequestParam(name = "prefix", required = false) String prefix, - @RequestParam(name = "query", required = false) String query, - @RequestParam(name = "dsoType", required = false) String dsoType, - @RequestParam(name = "scope", required = false) String dsoScope, - @RequestParam(name = "configuration", required = false) String - configuration, - List searchFilters, - Pageable page) throws Exception { + public RepresentationModel getFacetValues(@PathVariable("name") String facetName, + @RequestParam(name = "prefix", required = false) String prefix, + @RequestParam(name = "query", required = false) String query, + @RequestParam(name = "dsoType", required = false) String dsoType, + @RequestParam(name = "scope", required = false) String dsoScope, + @RequestParam(name = "configuration", required = false) String + configuration, + List searchFilters, + Pageable page) throws Exception { if (log.isTraceEnabled()) { log.trace("Facetting on facet " + facetName + " with scope: " + StringUtils.trimToEmpty(dsoScope) + ", dsoType: " + StringUtils.trimToEmpty(dsoType) diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ExternalSourcesRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ExternalSourcesRestController.java index db016218a9..357ea409c0 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ExternalSourcesRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ExternalSourcesRestController.java @@ -16,7 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PagedResourcesAssembler; -import org.springframework.hateoas.PagedResources; +import org.springframework.hateoas.PagedModel; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -54,7 +54,7 @@ public class ExternalSourcesRestController { * @return A paginated list of ExternalSourceEntryResource objects that comply with the params */ @RequestMapping(method = RequestMethod.GET, value = "/entries") - public PagedResources getExternalSourceEntries( + public PagedModel getExternalSourceEntries( @PathVariable("externalSourceName") String externalSourceName, @RequestParam(name = "query") String query, @RequestParam(name = "parent", required = false) String parent, @@ -65,7 +65,7 @@ public class ExternalSourcesRestController { Page externalSourceEntryResources = externalSourceEntryRestPage .map(externalSourceEntryRest -> new ExternalSourceEntryResource(externalSourceEntryRest)); externalSourceEntryResources.forEach(linkService::addLinks); - PagedResources result = assembler.toResource(externalSourceEntryResources); + PagedModel result = assembler.toModel(externalSourceEntryResources); return result; } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/IdentifierRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/IdentifierRestController.java index 09b6468b3c..dadf2c514b 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/IdentifierRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/IdentifierRestController.java @@ -2,12 +2,12 @@ * 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.rest; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; import java.io.IOException; import java.net.URI; diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemAddBundleController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemAddBundleController.java index 12e8e057f9..5175dec5e2 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemAddBundleController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemAddBundleController.java @@ -33,7 +33,7 @@ import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; import org.springframework.data.rest.webmvc.ResourceNotFoundException; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -87,9 +87,9 @@ public class ItemAddBundleController { */ @RequestMapping(method = RequestMethod.POST) @PreAuthorize("hasPermission(#uuid, 'ITEM', 'ADD')") - public ResponseEntity addBundleToItem(@PathVariable UUID uuid, - HttpServletRequest request, - HttpServletResponse response) + public ResponseEntity> addBundleToItem(@PathVariable UUID uuid, + HttpServletRequest request, + HttpServletResponse response) throws SQLException, AuthorizeException { Context context = ContextUtil.obtainContext(request); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemtemplateRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemTemplateRestController.java similarity index 91% rename from dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemtemplateRestController.java rename to dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemTemplateRestController.java index fb77967b15..e297dab44c 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemtemplateRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ItemTemplateRestController.java @@ -32,7 +32,7 @@ import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; import org.springframework.data.rest.webmvc.ResourceNotFoundException; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -49,7 +49,7 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequestMapping("/api/core/itemtemplates" + REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID) -public class ItemtemplateRestController { +public class ItemTemplateRestController { @Autowired private Utils utils; @@ -122,8 +122,8 @@ public class ItemtemplateRestController { */ @PreAuthorize("hasPermission(#uuid, 'ITEM', 'WRITE')") @RequestMapping(method = RequestMethod.PATCH) - public ResponseEntity patch(HttpServletRequest request, @PathVariable UUID uuid, - @RequestBody(required = true) JsonNode jsonNode) + public ResponseEntity> patch(HttpServletRequest request, @PathVariable UUID uuid, + @RequestBody(required = true) JsonNode jsonNode) throws SQLException, AuthorizeException { Context context = ContextUtil.obtainContext(request); @@ -132,7 +132,7 @@ public class ItemtemplateRestController { context.commit(); return ControllerUtils.toResponseEntity(HttpStatus.OK, new HttpHeaders(), - converter.toResource(templateItemRest)); + (RepresentationModel) converter.toResource(templateItemRest)); } /** @@ -155,7 +155,8 @@ public class ItemtemplateRestController { */ @PreAuthorize("hasPermission(#uuid, 'ITEM', 'DELETE')") @RequestMapping(method = RequestMethod.DELETE) - public ResponseEntity deleteTemplateItem(HttpServletRequest request, @PathVariable UUID uuid) + public ResponseEntity> deleteTemplateItem(HttpServletRequest request, + @PathVariable UUID uuid) throws SQLException, AuthorizeException, IOException { Context context = ContextUtil.obtainContext(request); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/RelationshipTypeRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/RelationshipTypeRestController.java index a3d3f0fb32..31d427254a 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/RelationshipTypeRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/RelationshipTypeRestController.java @@ -27,7 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PagedResourcesAssembler; -import org.springframework.hateoas.PagedResources; +import org.springframework.hateoas.PagedModel; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -71,7 +71,7 @@ public class RelationshipTypeRestController { * @throws SQLException If something goes wrong */ @RequestMapping(method = RequestMethod.GET) - public PagedResources retrieve(@PathVariable Integer id, + public PagedModel retrieve(@PathVariable Integer id, HttpServletResponse response, HttpServletRequest request, Pageable pageable, @@ -86,7 +86,7 @@ public class RelationshipTypeRestController { Page relationshipTypeResources = relationshipTypeRestPage .map(relationshipTypeRest -> new RelationshipTypeResource(relationshipTypeRest, utils)); relationshipTypeResources.forEach(halLinkService::addLinks); - PagedResources result = assembler.toResource(relationshipTypeResources); + PagedModel result = assembler.toModel(relationshipTypeResources); return result; diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java index ab338af966..a1684d782e 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -10,8 +10,8 @@ package org.dspace.app.rest; import static org.dspace.app.rest.utils.RegexUtils.REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT; import static org.dspace.app.rest.utils.RegexUtils.REGEX_REQUESTMAPPING_IDENTIFIER_AS_STRING_VERSION_STRONG; import static org.dspace.app.rest.utils.RegexUtils.REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; import java.io.FileNotFoundException; import java.io.IOException; @@ -63,15 +63,13 @@ import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.rest.webmvc.ControllerUtils; -import org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler; import org.springframework.data.rest.webmvc.ResourceNotFoundException; import org.springframework.data.web.PagedResourcesAssembler; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; -import org.springframework.hateoas.PagedResources; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.ResourceSupport; -import org.springframework.hateoas.Resources; -import org.springframework.hateoas.UriTemplate; +import org.springframework.hateoas.PagedModel; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -121,7 +119,7 @@ public class RestResourceController implements InitializingBean { @Override public void afterPropertiesSet() { - List links = new ArrayList(); + List links = new ArrayList<>(); for (String r : utils.getRepositories()) { // this doesn't work as we don't have an active http request // see https://github.com/spring-projects/spring-hateoas/issues/408 @@ -130,7 +128,7 @@ public class RestResourceController implements InitializingBean { String plural = English.plural(split[1]); Link l = new Link("/api/" + split[0] + "/" + plural, plural); links.add(l); - System.out.println(l.getRel() + " " + l.getHref()); + log.debug(l.getRel().value() + " " + l.getHref()); } discoverableEndpointsService.register(this, links); } @@ -145,13 +143,12 @@ public class RestResourceController implements InitializingBean { * identifier * and see {@link RestResourceController#findOne(String, String, UUID)} for uuid as identifier * - * @param apiCategory - * @param model - * @param id - * @return + * @param apiCategory category from request + * @param model model from request + * @param id Identifier from request + * @return single DSpaceResource */ @RequestMapping(method = RequestMethod.GET, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT) - @SuppressWarnings("unchecked") public DSpaceResource findOne(@PathVariable String apiCategory, @PathVariable String model, @PathVariable Integer id) { return findOneInternal(apiCategory, model, id); @@ -177,13 +174,12 @@ public class RestResourceController implements InitializingBean { * identifier * and see {@link RestResourceController#findOne(String, String, UUID)} for uuid as identifier * - * @param apiCategory - * @param model - * @param id - * @return + * @param apiCategory category from request + * @param model model from request + * @param id Identifier from request + * @return single DSpaceResource */ @RequestMapping(method = RequestMethod.GET, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_STRING_VERSION_STRONG) - @SuppressWarnings("unchecked") public DSpaceResource findOne(@PathVariable String apiCategory, @PathVariable String model, @PathVariable String id) { return findOneInternal(apiCategory, model, id); @@ -198,13 +194,12 @@ public class RestResourceController implements InitializingBean { * identifier * and see {@link RestResourceController#findOne(String, String, String)} for string as identifier * - * @param apiCategory - * @param model - * @param uuid - * @return + * @param apiCategory category from request + * @param model model from request + * @param uuid Identifier from request + * @return single DSpaceResource */ @RequestMapping(method = RequestMethod.GET, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID) - @SuppressWarnings("unchecked") public DSpaceResource findOne(@PathVariable String apiCategory, @PathVariable String model, @PathVariable UUID uuid) { return findOneInternal(apiCategory, model, uuid); @@ -213,10 +208,10 @@ public class RestResourceController implements InitializingBean { /** * Internal method to retrieve single resource from an identifier of generic type * - * @param apiCategory - * @param model - * @param id - * @return + * @param apiCategory category from request + * @param model model from request + * @param id Identifier from request + * @return single DSpaceResource */ private DSpaceResource findOneInternal(String apiCategory, String model, ID id) { @@ -238,17 +233,17 @@ public class RestResourceController implements InitializingBean { * * Note that the regular expression in the request mapping accept a number; * - * @param request - * @param apiCategory - * @param model - * @param id - * @param rel - * @param page - * @param assembler - * @return + * @param request current HTTPServletRequest + * @param apiCategory category from request + * @param model model from request + * @param id identifier from request + * @param rel relation from request + * @param page pagination information + * @param assembler PagedResourcesAssembler + * @return single RepresentationModel */ @RequestMapping(method = RequestMethod.GET, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT + "/{rel}") - public ResourceSupport findRel(HttpServletRequest request, HttpServletResponse response, + public RepresentationModel findRel(HttpServletRequest request, HttpServletResponse response, @PathVariable String apiCategory, @PathVariable String model, @PathVariable Integer id, @PathVariable String rel, Pageable page, @@ -262,18 +257,19 @@ public class RestResourceController implements InitializingBean { * Note that the regular expression in the request mapping accept a string as identifier but not the other kind * of identifier; * - * @param request - * @param apiCategory - * @param model - * @param id - * @param rel - * @param page - * @param assembler - * @return + * @param request current HTTPServletRequest + * @param response HTTPServletResponse + * @param apiCategory category from request + * @param model model from request + * @param id identifier from request + * @param rel relation from request + * @param page pagination information + * @param assembler PagedResourcesAssembler + * @return single RepresentationModel */ @RequestMapping(method = RequestMethod.GET, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_STRING_VERSION_STRONG + "/{rel}") - public ResourceSupport findRel(HttpServletRequest request, HttpServletResponse response, + public RepresentationModel findRel(HttpServletRequest request, HttpServletResponse response, @PathVariable String apiCategory, @PathVariable String model, @PathVariable String id, @PathVariable String rel, Pageable page, @@ -296,7 +292,7 @@ public class RestResourceController implements InitializingBean { * @return */ @RequestMapping(method = RequestMethod.GET, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID + "/{rel}") - public ResourceSupport findRel(HttpServletRequest request, HttpServletResponse response, + public RepresentationModel findRel(HttpServletRequest request, HttpServletResponse response, @PathVariable String apiCategory, @PathVariable String model, @PathVariable UUID uuid, @PathVariable String rel, Pageable page, @@ -338,7 +334,7 @@ public class RestResourceController implements InitializingBean { */ @RequestMapping(method = RequestMethod.GET, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_STRING_VERSION_STRONG + "/{rel}/{relid}") - public ResourceSupport findRel(HttpServletRequest request, HttpServletResponse response, + public RepresentationModel findRel(HttpServletRequest request, HttpServletResponse response, @PathVariable String apiCategory, @PathVariable String model, @PathVariable String id, @PathVariable String rel, @PathVariable String relid, @@ -367,10 +363,10 @@ public class RestResourceController implements InitializingBean { * @throws HttpRequestMethodNotSupportedException If something goes wrong */ @RequestMapping(method = RequestMethod.POST, consumes = {"application/json", "application/hal+json"}) - public ResponseEntity post(HttpServletRequest request, - @PathVariable String apiCategory, - @PathVariable String model, - @RequestParam(required = false) String parent) + public ResponseEntity> post(HttpServletRequest request, + @PathVariable String apiCategory, + @PathVariable String model, + @RequestParam(required = false) String parent) throws HttpRequestMethodNotSupportedException { return postJsonInternal(request, apiCategory, model, parent); } @@ -394,9 +390,9 @@ public class RestResourceController implements InitializingBean { * @throws HttpRequestMethodNotSupportedException If something goes wrong */ @RequestMapping(method = RequestMethod.POST, consumes = {"text/uri-list"}) - public ResponseEntity postWithUriListContentType(HttpServletRequest request, - @PathVariable String apiCategory, - @PathVariable String model) + public ResponseEntity> postWithUriListContentType(HttpServletRequest request, + @PathVariable String apiCategory, + @PathVariable String model) throws HttpRequestMethodNotSupportedException { return postUriListInternal(request, apiCategory, model); } @@ -411,9 +407,10 @@ public class RestResourceController implements InitializingBean { * @return The relevant ResponseEntity for this request * @throws HttpRequestMethodNotSupportedException If something goes wrong */ - public ResponseEntity postJsonInternal(HttpServletRequest request, - String apiCategory, - String model, String parent) + public ResponseEntity> postJsonInternal(HttpServletRequest request, + String apiCategory, + String model, + String parent) throws HttpRequestMethodNotSupportedException { checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); @@ -442,9 +439,10 @@ public class RestResourceController implements InitializingBean { * @return The relevant ResponseEntity for this request * @throws HttpRequestMethodNotSupportedException If something goes wrong */ - public ResponseEntity postUriListInternal(HttpServletRequest request, - String apiCategory, - String model) + public ResponseEntity> postUriListInternal( + HttpServletRequest request, + String apiCategory, + String model) throws HttpRequestMethodNotSupportedException { checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); @@ -482,8 +480,8 @@ public class RestResourceController implements InitializingBean { */ @RequestMapping(method = RequestMethod.POST, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT, headers = "content-type=application/x-www-form-urlencoded") - public ResponseEntity action(HttpServletRequest request, @PathVariable String apiCategory, - @PathVariable String model, @PathVariable Integer id) + public ResponseEntity> action(HttpServletRequest request, @PathVariable String apiCategory, + @PathVariable String model, @PathVariable Integer id) throws HttpRequestMethodNotSupportedException, SQLException, IOException { checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = @@ -525,11 +523,11 @@ public class RestResourceController implements InitializingBean { */ @RequestMapping(method = RequestMethod.POST, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT, headers = "content-type=multipart/form-data") - public ResponseEntity upload(HttpServletRequest request, - @PathVariable String apiCategory, - @PathVariable String model, - @PathVariable Integer id, - @RequestParam("file") MultipartFile + public ResponseEntity> upload(HttpServletRequest request, + @PathVariable String apiCategory, + @PathVariable String model, + @PathVariable Integer id, + @RequestParam("file") MultipartFile uploadfile) throws HttpRequestMethodNotSupportedException { return uploadInternal(request, apiCategory, model, id, uploadfile); @@ -555,11 +553,11 @@ public class RestResourceController implements InitializingBean { */ @RequestMapping(method = RequestMethod.POST, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID, headers = "content-type=multipart/form-data") - public ResponseEntity upload(HttpServletRequest request, - @PathVariable String apiCategory, - @PathVariable String model, - @PathVariable UUID uuid, - @RequestParam("file") MultipartFile + public ResponseEntity> upload(HttpServletRequest request, + @PathVariable String apiCategory, + @PathVariable String model, + @PathVariable UUID uuid, + @RequestParam("file") MultipartFile uploadfile) throws HttpRequestMethodNotSupportedException { return uploadInternal(request, apiCategory, model, uuid, uploadfile); @@ -575,10 +573,11 @@ public class RestResourceController implements InitializingBean { * @param uploadfile * @return */ - private ResponseEntity uploadInternal(HttpServletRequest request, - String apiCategory, String model, - ID id, - MultipartFile uploadfile) { + private ResponseEntity> uploadInternal(HttpServletRequest request, + String apiCategory, + String model, + ID id, + MultipartFile uploadfile) { checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); RestAddressableModel modelObject = null; @@ -613,11 +612,11 @@ public class RestResourceController implements InitializingBean { * @throws AuthorizeException */ @RequestMapping(method = { RequestMethod.POST }, headers = "content-type=multipart/form-data") - public ResponseEntity upload(HttpServletRequest request, - @PathVariable String apiCategory, - @PathVariable String model, - @RequestParam("file") MultipartFile - uploadfile) + public ResponseEntity> upload( + HttpServletRequest request, + @PathVariable String apiCategory, + @PathVariable String model, + @RequestParam("file") MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { checkModelPluralForm(apiCategory, model); @@ -630,7 +629,7 @@ public class RestResourceController implements InitializingBean { DSpaceResource result = converter.toResource(modelObject); resources.add(result); } - return ControllerUtils.toResponseEntity(HttpStatus.OK, new HttpHeaders(), Resources.wrap(resources)); + return ControllerUtils.toResponseEntity(HttpStatus.OK, new HttpHeaders(), CollectionModel.wrap(resources)); } /** @@ -648,9 +647,9 @@ public class RestResourceController implements InitializingBean { * @throws HttpRequestMethodNotSupportedException */ @RequestMapping(method = RequestMethod.PATCH, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT) - public ResponseEntity patch(HttpServletRequest request, @PathVariable String apiCategory, - @PathVariable String model, @PathVariable Integer id, - @RequestBody(required = true) JsonNode jsonNode) { + public ResponseEntity> patch(HttpServletRequest request, @PathVariable String apiCategory, + @PathVariable String model, @PathVariable Integer id, + @RequestBody(required = true) JsonNode jsonNode) { return patchInternal(request, apiCategory, model, id, jsonNode); } @@ -669,10 +668,10 @@ public class RestResourceController implements InitializingBean { * @throws HttpRequestMethodNotSupportedException */ @RequestMapping(method = RequestMethod.PATCH, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID) - public ResponseEntity patch(HttpServletRequest request, @PathVariable String apiCategory, - @PathVariable String model, - @PathVariable(name = "uuid") UUID id, - @RequestBody(required = true) JsonNode jsonNode) { + public ResponseEntity> patch(HttpServletRequest request, @PathVariable String apiCategory, + @PathVariable String model, + @PathVariable(name = "uuid") UUID id, + @RequestBody(required = true) JsonNode jsonNode) { return patchInternal(request, apiCategory, model, id, jsonNode); } @@ -687,10 +686,10 @@ public class RestResourceController implements InitializingBean { * @return * @throws HttpRequestMethodNotSupportedException */ - public ResponseEntity patchInternal(HttpServletRequest request, - String apiCategory, - String model, ID id, - JsonNode jsonNode) { + public ResponseEntity> patchInternal(HttpServletRequest request, + String apiCategory, + String model, ID id, + JsonNode jsonNode) { checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); RestAddressableModel modelObject = null; @@ -722,7 +721,7 @@ public class RestResourceController implements InitializingBean { * @param assembler * @return */ - private ResourceSupport findRelEntryInternal(HttpServletRequest request, + private RepresentationModel findRelEntryInternal(HttpServletRequest request, HttpServletResponse response, String apiCategory, String model, String id, String rel, String relid, @@ -745,7 +744,7 @@ public class RestResourceController implements InitializingBean { result.add(object); PageImpl pageResult = new PageImpl(result, page, 1); Page halResources = pageResult.map(restObject -> converter.toResource(restObject)); - return assembler.toResource(halResources, link); + return assembler.toModel(halResources, link); } catch (InvocationTargetException e) { // This catch has been made to resolve the issue that caused AuthorizeDenied exceptions for the methods // on the repository defined by the @PreAuthorize etc annotation to be absorbed by the reflection's @@ -775,7 +774,7 @@ public class RestResourceController implements InitializingBean { * @param assembler * @return */ - private ResourceSupport findRelInternal(HttpServletRequest request, + private RepresentationModel findRelInternal(HttpServletRequest request, HttpServletResponse response, String apiCategory, String model, ID uuid, String subpath, Pageable page, @@ -785,7 +784,7 @@ public class RestResourceController implements InitializingBean { Class domainClass = repository.getDomainClass(); LinkRest linkRest = utils.getClassLevelLinkRest(subpath, domainClass); - PagedResources result; + PagedModel result; if (linkRest != null) { LinkRestRepository linkRepository = utils.getLinkResourceRepository(apiCategory, model, linkRest.name()); @@ -813,7 +812,7 @@ public class RestResourceController implements InitializingBean { link = linkTo(this.getClass(), apiCategory, model).slash(uuid).slash(subpath).withSelfRel(); } - return new Resource(new EmbeddedPage(link.getHref(), + return new EntityModel(new EmbeddedPage(link.getHref(), pageResult.map(converter::toResource), null, subpath)); } else { RestModel object = (RestModel) linkMethod.invoke(linkRepository, request, uuid, page, @@ -852,10 +851,10 @@ public class RestResourceController implements InitializingBean { for (Link l : resource.getLinks()) { if (l.isTemplated()) { if (l.getHref().substring(0, l.getHref().indexOf("?")).contentEquals(request.getRequestURL())) { - rel = l.getRel(); + rel = l.getRel().value(); } } else if (l.getHref().contentEquals(request.getRequestURL())) { - rel = l.getRel(); + rel = l.getRel().value(); } } @@ -877,7 +876,7 @@ public class RestResourceController implements InitializingBean { List fullList = ep.getFullList(); if (fullList == null || fullList.size() == 0) { PageImpl pageResult = new PageImpl(fullList, page, 0); - result = assembler.toResource(pageResult); + result = assembler.toModel(pageResult); return result; } int start = Math.toIntExact(page.getOffset()); @@ -886,12 +885,12 @@ public class RestResourceController implements InitializingBean { .getResourceRepository(fullList.get(0).getCategory(), fullList.get(0).getType()); PageImpl pageResult = new PageImpl(fullList.subList(start, end), page, fullList.size()); - return assembler.toResource(pageResult.map(converter::toResource)); + return assembler.toModel(pageResult.map(converter::toResource)); } else { if (resource.getEmbeddedResources().get(rel) == null) { response.setStatus(HttpServletResponse.SC_NO_CONTENT); } - return (ResourceSupport) resource.getEmbeddedResources().get(rel); + return (RepresentationModel) resource.getEmbeddedResources().get(rel); } } @@ -907,7 +906,7 @@ public class RestResourceController implements InitializingBean { */ @RequestMapping(method = RequestMethod.GET) @SuppressWarnings("unchecked") - public PagedResources> findAll(@PathVariable String apiCategory, + public PagedModel> findAll(@PathVariable String apiCategory, @PathVariable String model, Pageable page, PagedResourcesAssembler assembler, @@ -923,7 +922,7 @@ public class RestResourceController implements InitializingBean { } catch (PaginationException pe) { resources = new PageImpl<>(new ArrayList<>(), page, pe.getTotal()); } - PagedResources> result = assembler.toResource(resources, link); + PagedModel> result = assembler.toModel(resources, link); if (repositoryUtils.haveSearchMethods(repository)) { result.add(linkTo(this.getClass(), apiCategory, model).slash("search").withRel("search")); } @@ -942,8 +941,8 @@ public class RestResourceController implements InitializingBean { } @RequestMapping(method = RequestMethod.GET, value = "/search") - public ResourceSupport listSearchMethods(@PathVariable String apiCategory, @PathVariable String model) { - ResourceSupport root = new ResourceSupport(); + public RepresentationModel listSearchMethods(@PathVariable String apiCategory, @PathVariable String model) { + RepresentationModel root = new RepresentationModel(); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); List searchMethods = repositoryUtils.listSearchMethods(repository); @@ -961,14 +960,14 @@ public class RestResourceController implements InitializingBean { @RequestMapping(method = RequestMethod.GET, value = "/search/{searchMethodName}") @SuppressWarnings("unchecked") - public ResourceSupport executeSearchMethods(@PathVariable String apiCategory, - @PathVariable String model, - @PathVariable String searchMethodName, - HttpServletResponse response, - Pageable pageable, Sort sort, - PagedResourcesAssembler assembler, - @RequestParam MultiValueMap parameters) + public RepresentationModel executeSearchMethods( + @PathVariable String apiCategory, + @PathVariable String model, + @PathVariable String searchMethodName, + HttpServletResponse response, + Pageable pageable, Sort sort, + PagedResourcesAssembler assembler, + @RequestParam MultiValueMap parameters) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { Link link = linkTo(this.getClass(), apiCategory, model).slash("search").slash(searchMethodName).withSelfRel(); @@ -990,7 +989,7 @@ public class RestResourceController implements InitializingBean { .executeQueryMethod(repository, parameters, searchMethod, pageable, sort, assembler); returnPage = searchMethod.getReturnType().isAssignableFrom(Page.class); - ResourceSupport result = null; + RepresentationModel result = null; if (returnPage) { Page> resources; if (searchResult == null) { @@ -998,7 +997,7 @@ public class RestResourceController implements InitializingBean { } else { resources = ((Page) searchResult).map(converter::toResource); } - result = assembler.toResource(resources, link); + result = assembler.toModel(resources, link); } else { if (searchResult == null) { response.setStatus(HttpServletResponse.SC_NO_CONTENT); @@ -1009,30 +1008,16 @@ public class RestResourceController implements InitializingBean { return result; } - /** - * Sets the location header pointing to the resource representing the given instance. Will make sure we properly - * expand the URI template potentially created as self link. - * - * @param headers must not be {@literal null}. - * @param assembler must not be {@literal null}. - * @param source must not be {@literal null}. - */ - private void addLocationHeader(HttpHeaders headers, PersistentEntityResourceAssembler assembler, Object source) { - - String selfLink = assembler.getSelfLinkFor(source).getHref(); - headers.setLocation(new UriTemplate(selfLink).expand()); - } - @RequestMapping(method = RequestMethod.DELETE, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT) - public ResponseEntity delete(HttpServletRequest request, @PathVariable String apiCategory, - @PathVariable String model, @PathVariable Integer id) + public ResponseEntity> delete(HttpServletRequest request, @PathVariable String apiCategory, + @PathVariable String model, @PathVariable Integer id) throws HttpRequestMethodNotSupportedException { return deleteInternal(apiCategory, model, id); } @RequestMapping(method = RequestMethod.DELETE, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID) - public ResponseEntity delete(HttpServletRequest request, @PathVariable String apiCategory, - @PathVariable String model, @PathVariable UUID uuid) + public ResponseEntity> delete(HttpServletRequest request, @PathVariable String apiCategory, + @PathVariable String model, @PathVariable UUID uuid) throws HttpRequestMethodNotSupportedException { return deleteInternal(apiCategory, model, uuid); } @@ -1045,8 +1030,9 @@ public class RestResourceController implements InitializingBean { * @param id * @return */ - private ResponseEntity deleteInternal(String apiCategory, String model, - ID id) { + private ResponseEntity> deleteInternal(String apiCategory, + String model, + ID id) { checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); repository.deleteById(id); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ScriptProcessesController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ScriptProcessesController.java index 43788dfd1f..122fa76ac0 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ScriptProcessesController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ScriptProcessesController.java @@ -16,7 +16,7 @@ import org.dspace.app.rest.model.hateoas.ProcessResource; import org.dspace.app.rest.repository.ScriptRestRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -50,7 +50,7 @@ public class ScriptProcessesController { */ @RequestMapping(method = RequestMethod.POST) @PreAuthorize("hasAuthority('ADMIN')") - public ResponseEntity startProcess(@PathVariable(name = "name") String scriptName) + public ResponseEntity> startProcess(@PathVariable(name = "name") String scriptName) throws Exception { if (log.isTraceEnabled()) { log.trace("Starting Process for Script with name: " + scriptName); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/StatisticsRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/StatisticsRestController.java index 9422ef32ae..5fbf053588 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/StatisticsRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/StatisticsRestController.java @@ -26,8 +26,8 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.ControllerUtils; import org.springframework.hateoas.Link; -import org.springframework.hateoas.PagedResources; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.PagedModel; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -75,33 +75,33 @@ public class StatisticsRestController implements InitializingBean { } @RequestMapping(method = RequestMethod.GET, value = "/viewevents/{uuid}") - public PagedResources getViewEvent(@PathVariable(name = "uuid") UUID uuid) throws Exception { + public PagedModel getViewEvent(@PathVariable(name = "uuid") UUID uuid) throws Exception { throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", ""); } @RequestMapping(method = RequestMethod.GET, value = "/searchevents/{uuid}") - public PagedResources getSearchEvent(@PathVariable(name = "uuid") UUID uuid) throws Exception { + public PagedModel getSearchEvent(@PathVariable(name = "uuid") UUID uuid) throws Exception { throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", ""); } @RequestMapping(method = RequestMethod.GET, value = "/viewevents") - public PagedResources getViewEvents() throws Exception { + public PagedModel getViewEvents() throws Exception { throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", ""); } @RequestMapping(method = RequestMethod.GET, value = "/searchevents") - public PagedResources getSearchEvents() throws Exception { + public PagedModel getSearchEvents() throws Exception { throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", ""); } @RequestMapping(method = RequestMethod.POST, value = "/viewevents") - public ResponseEntity postViewEvent() throws Exception { + public ResponseEntity> postViewEvent() throws Exception { ViewEventResource result = converter.toResource(viewEventRestRepository.createViewEvent()); return ControllerUtils.toResponseEntity(HttpStatus.CREATED, new HttpHeaders(), result); } @RequestMapping(method = RequestMethod.POST, value = "/searchevents") - public ResponseEntity postSearchEvent() throws Exception { + public ResponseEntity> postSearchEvent() throws Exception { SearchEventResource result = converter.toResource(searchEventRestRepository.createSearchEvent()); return ControllerUtils.toResponseEntity(HttpStatus.CREATED, new HttpHeaders(), result); } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/UUIDLookupRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/UUIDLookupRestController.java index b20848b3e4..17ce7d4c54 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/UUIDLookupRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/UUIDLookupRestController.java @@ -2,12 +2,12 @@ * 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.rest; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; import java.io.IOException; import java.net.URI; diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowDefinitionCollectionsLinkRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowDefinitionCollectionsLinkRepository.java index 9496e32738..1f66c0928d 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowDefinitionCollectionsLinkRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowDefinitionCollectionsLinkRepository.java @@ -71,7 +71,7 @@ public class WorkflowDefinitionCollectionsLinkRepository extends AbstractDSpaceR } collectionsMappedToWorkflow.addAll(xmlWorkflowFactory.getCollectionHandlesMappedToWorklow(context, workflowName)); - Pageable pageable = optionalPageable != null ? optionalPageable : new PageRequest(0, 20); + Pageable pageable = optionalPageable != null ? optionalPageable : PageRequest.of(0, 20); return converter.toRestPage(utils.getPage(collectionsMappedToWorkflow, pageable), projection); } else { diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowDefinitionStepsLinkRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowDefinitionStepsLinkRepository.java index fe05a4c1d0..4fdc391641 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowDefinitionStepsLinkRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowDefinitionStepsLinkRepository.java @@ -54,7 +54,7 @@ public class WorkflowDefinitionStepsLinkRepository extends AbstractDSpaceRestRep Projection projection) { try { List steps = xmlWorkflowFactory.getWorkflowByName(workflowName).getSteps(); - Pageable pageable = optionalPageable != null ? optionalPageable : new PageRequest(0, 20); + Pageable pageable = optionalPageable != null ? optionalPageable : PageRequest.of(0, 20); return converter.toRestPage(utils.getPage(steps, pageable), projection); } catch (WorkflowConfigurationException e) { throw new ResourceNotFoundException("No workflow with name " + workflowName + " is configured"); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowStepActionsLinkRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowStepActionsLinkRepository.java index b11dd929d5..8ddab1381f 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowStepActionsLinkRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/WorkflowStepActionsLinkRepository.java @@ -51,7 +51,7 @@ public class WorkflowStepActionsLinkRepository extends AbstractDSpaceRestReposit @Nullable Pageable optionalPageable, Projection projection) { List actions = xmlWorkflowFactory.getStepByName(workflowStepName).getActions(); - Pageable pageable = optionalPageable != null ? optionalPageable : new PageRequest(0, 20); + Pageable pageable = optionalPageable != null ? optionalPageable : PageRequest.of(0, 20); return converter.toRestPage(utils.getPage(actions, pageable), projection); } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/ConverterService.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/ConverterService.java index 295634599b..a9dc827b79 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/ConverterService.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/ConverterService.java @@ -32,8 +32,8 @@ import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; -import org.springframework.hateoas.Resource; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; @@ -286,7 +286,7 @@ public class ConverterService { // scan all resource classes and look for compatible rest classes (by naming convention), // creating a map of resource constructors keyed by rest class, for later use. ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); - provider.addIncludeFilter(new AssignableTypeFilter(Resource.class)); + provider.addIncludeFilter(new AssignableTypeFilter(EntityModel.class)); Set beanDefinitions = provider.findCandidateComponents( HALResource.class.getPackage().getName().replaceAll("\\.", "/")); for (BeanDefinition beanDefinition : beanDefinitions) { diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/AuthorityEntryHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/AuthorityEntryHalLinkFactory.java index eeca19617c..e24d70a526 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/AuthorityEntryHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/AuthorityEntryHalLinkFactory.java @@ -7,7 +7,7 @@ */ package org.dspace.app.rest.link; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; import java.util.LinkedList; @@ -18,6 +18,7 @@ import org.dspace.app.rest.model.AuthorityRest; import org.dspace.app.rest.model.hateoas.AuthorityEntryResource; import org.dspace.app.rest.utils.AuthorityUtils; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; import org.springframework.web.util.UriComponentsBuilder; @@ -50,7 +51,7 @@ public class AuthorityEntryHalLinkFactory extends HalLinkFactory getControllerClass() { diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/DSpaceResourceHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/DSpaceResourceHalLinkFactory.java index a2d2626734..c306691eb3 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/DSpaceResourceHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/DSpaceResourceHalLinkFactory.java @@ -22,6 +22,7 @@ import org.dspace.app.rest.model.hateoas.DSpaceResource; import org.dspace.app.rest.utils.Utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -80,7 +81,7 @@ public class DSpaceResourceHalLinkFactory extends HalLinkFactory getControllerClass() { diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/HalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/HalLinkFactory.java index 7b3cb71d7d..093c93a182 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/HalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/HalLinkFactory.java @@ -7,8 +7,8 @@ */ package org.dspace.app.rest.link; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; import java.util.LinkedList; import java.util.List; diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/HalLinkService.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/HalLinkService.java index 2529d275ab..164823527f 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/HalLinkService.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/HalLinkService.java @@ -48,7 +48,7 @@ public class HalLinkService { links.addAll(halLinkFactory.getLinksFor(halResource, pageable)); } - links.sort((Link l1, Link l2) -> ObjectUtils.compare(l1.getRel(), l2.getRel())); + links.sort((Link l1, Link l2) -> ObjectUtils.compare(l1.getRel().value(), l2.getRel().value())); halResource.add(links); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/RootHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/RootHalLinkFactory.java index 420dbd622c..55751435d4 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/RootHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/RootHalLinkFactory.java @@ -29,7 +29,8 @@ public class RootHalLinkFactory extends HalLinkFactory list) throws Exception { for (Link endpointLink : discoverableEndpointsService.getDiscoverableEndpoints()) { list.add( - buildLink(endpointLink.getRel(), halResource.getContent().getDspaceRest() + endpointLink.getHref())); + buildLink(endpointLink.getRel().value(), + halResource.getContent().getDspaceRest() + endpointLink.getHref())); } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/SubmissionSectionHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/SubmissionSectionHalLinkFactory.java index 71c77091b7..50fd250382 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/SubmissionSectionHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/SubmissionSectionHalLinkFactory.java @@ -7,7 +7,7 @@ */ package org.dspace.app.rest.link; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; import java.util.LinkedList; diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/externalsources/ExternalSourceEntryHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/externalsources/ExternalSourceEntryHalLinkFactory.java index 44ce3b25d8..0c0f9678b8 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/externalsources/ExternalSourceEntryHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/externalsources/ExternalSourceEntryHalLinkFactory.java @@ -13,6 +13,7 @@ import org.dspace.app.rest.ExternalSourcesRestController; import org.dspace.app.rest.link.HalLinkFactory; import org.dspace.app.rest.model.hateoas.ExternalSourceEntryResource; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -27,7 +28,7 @@ public class ExternalSourceEntryHalLinkFactory protected void addLinks(ExternalSourceEntryResource halResource, Pageable pageable, LinkedList list) throws Exception { - list.add(buildLink(Link.REL_SELF, + list.add(buildLink(IanaLinkRelations.SELF.value(), getMethodOn().getExternalSourceEntryValue(halResource.getContent().getExternalSource(), halResource.getContent().getId()))); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/harvest/HarvestedCollectionHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/harvest/HarvestedCollectionHalLinkFactory.java index 12b3f89f3d..feca681ed6 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/harvest/HarvestedCollectionHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/harvest/HarvestedCollectionHalLinkFactory.java @@ -13,6 +13,7 @@ import java.util.UUID; import org.dspace.app.rest.model.HarvestedCollectionRest; import org.dspace.app.rest.model.hateoas.HarvestedCollectionResource; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -31,7 +32,7 @@ public class HarvestedCollectionHalLinkFactory if (data != null) { list.add( buildLink( - Link.REL_SELF, + IanaLinkRelations.SELF.value(), getMethodOn().get(UUID.fromString(data.getCollectionRest().getUuid()), null, null) ) ); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/FacetConfigurationResourceHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/FacetConfigurationResourceHalLinkFactory.java index 272dc25a68..2a35be24a5 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/FacetConfigurationResourceHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/FacetConfigurationResourceHalLinkFactory.java @@ -12,6 +12,7 @@ import java.util.LinkedList; import org.dspace.app.rest.model.FacetConfigurationRest; import org.dspace.app.rest.model.hateoas.FacetConfigurationResource; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -31,7 +32,7 @@ public class FacetConfigurationResourceHalLinkFactory extends DiscoveryRestHalLi FacetConfigurationRest data = halResource.getContent(); if (data != null) { - list.add(buildLink(Link.REL_SELF, getMethodOn() + list.add(buildLink(IanaLinkRelations.SELF.value(), getMethodOn() .getFacetsConfiguration(data.getScope(), data.getConfiguration(), page))); } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/FacetsResourceHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/FacetsResourceHalLinkFactory.java index 91050021c7..1c2fb35058 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/FacetsResourceHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/FacetsResourceHalLinkFactory.java @@ -16,6 +16,7 @@ import org.dspace.app.rest.model.hateoas.FacetsResource; import org.dspace.app.rest.model.hateoas.SearchFacetEntryResource; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -34,7 +35,8 @@ public class FacetsResourceHalLinkFactory extends DiscoveryRestHalLinkFactory(facetData.getValues(), new PageRequest(0, facetData.getFacetLimit()), + PageImpl page = new PageImpl<>(facetData.getValues(), PageRequest.of(0, facetData.getFacetLimit()), facetData.getValues().size() + (BooleanUtils .isTrue(facetData.isHasMore()) ? 1 : 0)); halResource.setPageHeader(new EmbeddedPageHeader(uriBuilder, page, false)); } else { - list.add(buildLink(Link.REL_SELF, uriBuilder.build().toUriString())); + list.add(buildLink(IanaLinkRelations.SELF.value(), uriBuilder.build().toUriString())); } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/SearchResultsResourceHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/SearchResultsResourceHalLinkFactory.java index eeceafae2e..f68846c407 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/SearchResultsResourceHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/SearchResultsResourceHalLinkFactory.java @@ -12,6 +12,7 @@ import java.util.LinkedList; import org.dspace.app.rest.model.SearchResultsRest; import org.dspace.app.rest.model.hateoas.SearchResultsResource; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -26,7 +27,7 @@ public class SearchResultsResourceHalLinkFactory extends DiscoveryRestHalLinkFac throws Exception { SearchResultsRest resultsRest = halResource.getContent(); - list.add(buildLink(Link.REL_SELF, buildSearchBaseLink(resultsRest).toUriString())); + list.add(buildLink(IanaLinkRelations.SELF.value(), buildSearchBaseLink(resultsRest).toUriString())); } @Override @@ -35,4 +36,4 @@ public class SearchResultsResourceHalLinkFactory extends DiscoveryRestHalLinkFac } -} \ No newline at end of file +} diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/SearchSupportHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/SearchSupportHalLinkFactory.java index e253781d2d..94bf24d9a2 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/SearchSupportHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/SearchSupportHalLinkFactory.java @@ -13,6 +13,7 @@ import org.dspace.app.rest.DiscoveryRestController; import org.dspace.app.rest.link.HalLinkFactory; import org.dspace.app.rest.model.hateoas.SearchSupportResource; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -26,7 +27,7 @@ public class SearchSupportHalLinkFactory extends HalLinkFactory list) throws Exception { - list.add(buildLink(Link.REL_SELF, getMethodOn() + list.add(buildLink(IanaLinkRelations.SELF.value(), getMethodOn() .getSearchSupport(null, null))); list.add(buildLink("search", getMethodOn().getSearchConfiguration(null, null))); list.add(buildLink("facets", getMethodOn().getFacetsConfiguration(null, null, pageable))); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/statistics/StatisticsSupportHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/statistics/StatisticsSupportHalLinkFactory.java index 07b75dc023..d9cdce49e4 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/statistics/StatisticsSupportHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/statistics/StatisticsSupportHalLinkFactory.java @@ -13,6 +13,7 @@ import org.dspace.app.rest.StatisticsRestController; import org.dspace.app.rest.link.HalLinkFactory; import org.dspace.app.rest.model.hateoas.StatisticsSupportResource; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -22,7 +23,7 @@ public class StatisticsSupportHalLinkFactory protected void addLinks(StatisticsSupportResource halResource, Pageable pageable, LinkedList list) throws Exception { - list.add(buildLink(Link.REL_SELF, getMethodOn().getStatisticsSupport())); + list.add(buildLink(IanaLinkRelations.SELF.value(), getMethodOn().getStatisticsSupport())); list.add(buildLink("viewevents", getMethodOn().getViewEvents())); list.add(buildLink("searchevents", getMethodOn().getSearchEvents())); } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/BaseObjectRest.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/BaseObjectRest.java index 6afc04ecd1..b728e3870d 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/BaseObjectRest.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/BaseObjectRest.java @@ -13,22 +13,20 @@ import java.util.List; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; -import org.springframework.hateoas.Identifiable; /** - * Base class for any REST resource that need to be addressable + * Base class for any REST resource that need to be addressable and identifiable (via an ID) * * @param the class of the resource identifier * @author Andrea Bollini (andrea.bollini at 4science.it) */ -public abstract class BaseObjectRest extends RestAddressableModel implements Identifiable { +public abstract class BaseObjectRest extends RestAddressableModel { protected T id; @JsonInclude(Include.NON_EMPTY) private List errors; - @Override public T getId() { return id; } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceRelProvider.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceLinkRelationProvider.java similarity index 64% rename from dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceRelProvider.java rename to dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceLinkRelationProvider.java index f4afdf8bc5..a1385727ef 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceRelProvider.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceLinkRelationProvider.java @@ -9,21 +9,22 @@ package org.dspace.app.rest.model.hateoas; import org.dspace.app.rest.model.hateoas.annotations.RelNameDSpaceResource; import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.hateoas.core.EvoInflectorRelProvider; +import org.springframework.hateoas.LinkRelation; +import org.springframework.hateoas.server.core.EvoInflectorLinkRelationProvider; /** - * A DSpace Relation Provider that use the RelNameDSpaceResource to use the + * A DSpace Link Relation Provider that use the RelNameDSpaceResource annotation to use the * right names for the embedded collection when a DSpaceResource is requested * * @author Andrea Bollini (andrea.bollini at 4science.it) */ -public class DSpaceRelProvider extends EvoInflectorRelProvider { +public class DSpaceLinkRelationProvider extends EvoInflectorLinkRelationProvider { @Override - public String getItemResourceRelFor(Class type) { + public LinkRelation getItemResourceRelFor(Class type) { RelNameDSpaceResource nameAnnotation = AnnotationUtils.findAnnotation(type, RelNameDSpaceResource.class); if (nameAnnotation != null) { - return nameAnnotation.value(); + return LinkRelation.of(nameAnnotation.value()); } return super.getItemResourceRelFor(type); } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/HALResource.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/HALResource.java index eb10b13ac2..31e2c672e3 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/HALResource.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/HALResource.java @@ -13,13 +13,13 @@ import java.util.Map; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonUnwrapped; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; -import org.springframework.hateoas.Resource; /** * The abstract, generic class for the HalResources */ -public abstract class HALResource extends Resource { +public abstract class HALResource extends EntityModel { public HALResource(T content) { super(content); @@ -46,9 +46,10 @@ public abstract class HALResource extends Resource { } @Override - public void add(Link link) { + public EntityModel add(Link link) { if (!hasLink(link.getRel())) { - super.add(link); + return super.add(link); } + return this; } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/projection/EmbedRelsProjection.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/projection/EmbedRelsProjection.java index 1db0c6a74d..d992bd2ef0 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/projection/EmbedRelsProjection.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/projection/EmbedRelsProjection.java @@ -44,7 +44,7 @@ public class EmbedRelsProjection extends AbstractProjection { StringBuilder fullName = new StringBuilder(); for (Link oldLink : oldLinks) { - fullName.append(oldLink.getRel()).append("/"); + fullName.append(oldLink.getRel().value()).append("/"); } fullName.append(linkRest.name()); // If the full name matches, the link can be embedded (e.g. mappedItems/owningCollection on a collection page) diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java index 8c6dca2af9..93224f78cd 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java @@ -115,7 +115,7 @@ public class BrowseEntryLinkRepository extends AbstractDSpaceRestRepository } BrowseInfo binfo = be.browse(bs); - Pageable pageResultInfo = new PageRequest((binfo.getStart() - 1) / binfo.getResultsPerPage(), + Pageable pageResultInfo = PageRequest.of((binfo.getStart() - 1) / binfo.getResultsPerPage(), binfo.getResultsPerPage()); Page page = new PageImpl<>(Arrays.asList(binfo.getStringResults()), pageResultInfo, binfo.getTotal()).map(browseEntryConverter); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java index 4a8c171d3b..f60178fe52 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java @@ -143,7 +143,7 @@ public class BrowseItemLinkRepository extends AbstractDSpaceRestRepository BrowseInfo binfo = be.browse(bs); Pageable pageResultInfo = - new PageRequest((binfo.getStart() - 1) / binfo.getResultsPerPage(), binfo.getResultsPerPage()); + PageRequest.of((binfo.getStart() - 1) / binfo.getResultsPerPage(), binfo.getResultsPerPage()); List tmpResult = new ArrayList(); for (Item bb : binfo.getBrowseItemResults()) { tmpResult.add(bb); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java index 145dcb1818..c0d40c4f3e 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java @@ -161,7 +161,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { List searchFilters) { Context context = obtainContext(); - Pageable page = new PageRequest(1, 1); + Pageable page = PageRequest.of(1, 1); IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope); DiscoveryConfiguration discoveryConfiguration = searchConfigurationService .getDiscoveryConfigurationByNameOrDso(configuration, scopeObject); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/VersionsLinkRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/VersionsLinkRepository.java index ca89a29853..4b17b46c91 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/VersionsLinkRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/VersionsLinkRepository.java @@ -63,7 +63,7 @@ public class VersionsLinkRepository extends AbstractDSpaceRestRepository " couldn't be found"); } List versions = versioningService.getVersionsByHistory(context, versionHistory); - Pageable pageable = optionalPageable != null ? optionalPageable : new PageRequest(0, 20); + Pageable pageable = optionalPageable != null ? optionalPageable : PageRequest.of(0, 20); return converter.toRestPage(utils.getPage(versions, pageable), projection); } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/RestRepositoryUtils.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/RestRepositoryUtils.java index e4cc3f1faf..a6e9b5e5be 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/RestRepositoryUtils.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/RestRepositoryUtils.java @@ -29,8 +29,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.repository.support.QueryMethodParameterConversionException; import org.springframework.data.web.PagedResourcesAssembler; -import org.springframework.hateoas.core.AnnotationAttribute; -import org.springframework.hateoas.core.MethodParameters; +import org.springframework.hateoas.server.core.AnnotationAttribute; +import org.springframework.hateoas.server.core.MethodParameters; import org.springframework.stereotype.Component; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/Utils.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/Utils.java index f241ba3b30..15a0237d82 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/Utils.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/Utils.java @@ -9,7 +9,7 @@ package org.dspace.app.rest.utils; import static java.lang.Integer.parseInt; import static java.util.stream.Collectors.toList; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -57,7 +57,6 @@ import org.dspace.app.rest.model.ResourcePolicyRest; import org.dspace.app.rest.model.RestAddressableModel; import org.dspace.app.rest.model.RestModel; import org.dspace.app.rest.model.VersionHistoryRest; -import org.dspace.app.rest.model.hateoas.DSpaceResource; import org.dspace.app.rest.model.hateoas.EmbeddedPage; import org.dspace.app.rest.model.hateoas.HALResource; import org.dspace.app.rest.projection.CompositeProjection; @@ -159,32 +158,64 @@ public class Utils { * @return the existing instance if it is not null, a default pageable instance otherwise. */ public Pageable getPageable(@Nullable Pageable optionalPageable) { - return optionalPageable != null ? optionalPageable : new PageRequest(0, DEFAULT_PAGE_SIZE); - } - - public Link linkToSingleResource(DSpaceResource r, String rel) { - RestAddressableModel data = r.getContent(); - return linkToSingleResource(data, rel); + return optionalPageable != null ? optionalPageable : PageRequest.of(0, DEFAULT_PAGE_SIZE); } + /** + * Create a HAL Link to a single resource + * @param data the resource itself + * @param rel name of the link relation to create + * @return created Link object + */ public Link linkToSingleResource(RestAddressableModel data, String rel) { - return linkTo(data.getController(), data.getCategory(), data.getTypePlural()).slash(data) + // Create link using Spring HATEOAS link builder + return linkTo(data.getController(), data.getCategory(), data.getTypePlural()).slash(getIdentifierForLink(data)) .withRel(rel); } + /** + * Create a HAL Link to a subresource of given resource. This method assumes the name & link to the subresource + * are both the same string value. See other linkToSubResource method if they are different. + * @param data main resource + * @param rel name/subpath of the subresource (assumed to be the same) + * @return created Link object + */ public Link linkToSubResource(RestAddressableModel data, String rel) { return linkToSubResource(data, rel, rel); } + /** + * Create a HAL Link to a subresource of given resource using given path name and link name + * @param data main resource + * @param rel name of the subresource link relation to create + * @param path subpath for the subresource + * @return created Link object + */ public Link linkToSubResource(RestAddressableModel data, String rel, String path) { - return linkTo(data.getController(), data.getCategory(), data.getTypePlural()).slash(data).slash(path) + // Create link using Spring HATEOAS link builder + return linkTo(data.getController(), data.getCategory(), data.getTypePlural()).slash(getIdentifierForLink(data)) + .slash(path) .withRel(rel); } + /** + * Returns an identifier for a given resource, to be used in a Link. + * @param data resource to identify + * @return identifier, which is either an ID (if exists) or string representation of the object. + */ + private Serializable getIdentifierForLink(RestAddressableModel data) { + // If the resource is identifiable by an ID, use it. Otherwise use toString() to represent it. + Serializable identifier = data.toString(); + if (data instanceof BaseObjectRest) { + identifier = ((BaseObjectRest) data).getId(); + } + return identifier; + } + /** * Retrieve the {@link DSpaceRestRepository} for the specified category and model in the plural form as used in the endpoints. * If the model is available in its singular form use {@link #getResourceRepositoryByCategoryAndModel(String, String)} - * + * * @param apiCategory * @param modelPlural * @return @@ -197,7 +228,7 @@ public class Utils { /** * Retrieve the {@link DSpaceRestRepository} for the specified category and model. The model is in the singular form * as returned by the {@link RestAddressableModel#getType()} method - * + * * @param apiCategory * @param modelSingular * @return @@ -278,7 +309,7 @@ public class Utils { /** * Create a temporary file from a multipart file upload - * + * * @param multipartFile * the multipartFile representing the uploaded file. Please note that it is a complex object including * additional information other than the binary like the orginal file name and the mimetype @@ -312,7 +343,7 @@ public class Utils { /** * Return the filename part from a multipartFile upload that could eventually contains the fullpath on the client - * + * * @param multipartFile * the file uploaded * @return the filename part of the file on the client filesystem @@ -771,23 +802,23 @@ public class Utils { return new EmbeddedPage(link.getHref(), page.map((restObject) -> { restObject.setEmbedLevel(childEmbedLevel); return converter.toResource(restObject, newList); - }), null, link.getRel()); + }), null, link.getRel().value()); } else if (linkedObject instanceof List) { // The full list has been retrieved and we need to provide the first page for embedding List list = (List) linkedObject; if (list.size() > 0) { PageImpl page = new PageImpl( list.subList(0, list.size() > DEFAULT_PAGE_SIZE ? DEFAULT_PAGE_SIZE : list.size()), - new PageRequest(0, DEFAULT_PAGE_SIZE), list.size()); + PageRequest.of(0, DEFAULT_PAGE_SIZE), list.size()); return new EmbeddedPage(link.getHref(), page.map((restObject) -> { restObject.setEmbedLevel(childEmbedLevel); return converter.toResource(restObject, newList); }), - list, link.getRel()); + list, link.getRel().value()); } else { PageImpl page = new PageImpl(list); - return new EmbeddedPage(link.getHref(), page, list, link.getRel()); + return new EmbeddedPage(link.getHref(), page, list, link.getRel().value()); } } else { return linkedObject; @@ -823,7 +854,7 @@ public class Utils { /** * Convert the input string in the primary key class according to the repository interface - * + * * @param repository * @param pkStr * @return @@ -837,7 +868,7 @@ public class Utils { * rest object is supported by a {@link DSpaceRestRepository} that also implement the * {@link ReloadableEntityObjectRepository} interface. If this is not the case the method will throw an * IllegalArgumentException - * + * * @param context * the DSpace Context * @param restObj @@ -859,7 +890,7 @@ public class Utils { /** * Get the rest object associated with the specified URI - * + * * @param context the DSpace context * @param uri the uri of a {@link BaseObjectRest} * @return the {@link BaseObjectRest} identified by the provided uri diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/converter/ConverterServiceIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/converter/ConverterServiceIT.java index c0555d1e57..80e3c8be7f 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/converter/ConverterServiceIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/converter/ConverterServiceIT.java @@ -34,8 +34,8 @@ import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.junit.Test; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; -import org.springframework.hateoas.Resource; /** * Tests functionality of {@link ConverterService}. @@ -153,7 +153,7 @@ public class ConverterServiceIT extends AbstractControllerIntegrationTest { assertHasEmbeds(resource, new String[] { "restPropUnannotated" // embedded; unannotated properties can't be omitted by projections }, new Class[] { - Resource.class + EntityModel.class }); assertHasLinks(resource, new String[] { @@ -182,7 +182,8 @@ public class ConverterServiceIT extends AbstractControllerIntegrationTest { r0.setRestPropUnannotated(restPropUnannotatedValue); String r0json = new ObjectMapper().writeValueAsString(r0); - when(mockLink.getRel()).thenReturn("mockLink"); + // return "mockLink" LinkRelation when getRel() is called + when(mockLink.getRel()).thenReturn(() -> "mockLink"); r0.setProjection(new MockProjection(mockLink, mockEmbeddedResource)); MockObjectResource resource = converter.toResource(r0); @@ -198,10 +199,10 @@ public class ConverterServiceIT extends AbstractControllerIntegrationTest { "optionallyEmbeddedChildren", "resource" // added by MockProjection }, new Class[] { - Resource.class, + EntityModel.class, null, - Resource.class, - Resource.class, + EntityModel.class, + EntityModel.class, EmbeddedPage.class, Object.class }); @@ -217,9 +218,9 @@ public class ConverterServiceIT extends AbstractControllerIntegrationTest { }); } - private void assertHasLinks(Resource resource, String[] rels) { + private void assertHasLinks(EntityModel resource, String[] rels) { Map map = new HashMap<>(); - resource.getLinks().stream().forEach((link) -> map.put(link.getRel(), link)); + resource.getLinks().stream().forEach((link) -> map.put(link.getRel().value(), link)); assertThat(new TreeSet(map.keySet()), equalTo(new TreeSet(Sets.newHashSet(rels)))); } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/link/search/FacetConfigurationResourceHalLinkFactoryTest.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/link/search/FacetConfigurationResourceHalLinkFactoryTest.java index 504543119f..b7069470b8 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/link/search/FacetConfigurationResourceHalLinkFactoryTest.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/link/search/FacetConfigurationResourceHalLinkFactoryTest.java @@ -16,7 +16,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.springframework.hateoas.mvc.ControllerLinkBuilder; +import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; /** * This class' purpose is to test the FacetConfigurationResourceHalLinkFactory @@ -25,7 +25,7 @@ public class FacetConfigurationResourceHalLinkFactoryTest { @Mock - ControllerLinkBuilder controllerLinkBuilder; + WebMvcLinkBuilder webMvcLinkBuilder; @Mock HalLinkFactory halLinkFactory; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/link/search/SearchConfigurationResourceHalLinkFactoryTest.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/link/search/SearchConfigurationResourceHalLinkFactoryTest.java index dd1b16127e..d832b8e168 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/link/search/SearchConfigurationResourceHalLinkFactoryTest.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/link/search/SearchConfigurationResourceHalLinkFactoryTest.java @@ -16,16 +16,15 @@ import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.springframework.hateoas.mvc.ControllerLinkBuilder; +import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; /** * This class' purpose is to test the SearchConfigurationResourceHalLinkFactory */ public class SearchConfigurationResourceHalLinkFactoryTest { - @Mock - ControllerLinkBuilder controllerLinkBuilder; + WebMvcLinkBuilder webMvcLinkBuilder; @Mock HalLinkFactory halLinkFactory; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java index 183fb27b8c..de9003b2fe 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java @@ -11,7 +11,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup; -import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.Arrays; import java.util.List; @@ -58,7 +57,7 @@ import org.springframework.web.context.WebApplicationContext; * @author Tim Donohue * @see org.dspace.app.rest.test.AbstractWebClientIntegrationTest */ -// Run tests with JUnit 4 and Spring TestContext Framework +// Run tests with JUnit and Spring TestContext Framework @RunWith(SpringRunner.class) // Specify main class to use to load Spring ApplicationContext // NOTE: By default, Spring caches and reuses ApplicationContext for each integration test (to speed up tests) @@ -81,7 +80,7 @@ public class AbstractControllerIntegrationTest extends AbstractIntegrationTestWi public static final String BASE_REST_SERVER_URL = "http://localhost"; protected MediaType contentType = new MediaType(MediaTypes.HAL_JSON.getType(), - MediaTypes.HAL_JSON.getSubtype(), StandardCharsets.UTF_8); + MediaTypes.HAL_JSON.getSubtype()); protected MediaType textUriContentType = RestMediaTypes.TEXT_URI_LIST; @@ -121,7 +120,7 @@ public class AbstractControllerIntegrationTest extends AbstractIntegrationTestWi if (StringUtils.isNotBlank(authToken)) { mockMvcBuilder.defaultRequest( - get("").header(AUTHORIZATION_HEADER, AUTHORIZATION_TYPE + authToken)); + get("/").header(AUTHORIZATION_HEADER, AUTHORIZATION_TYPE + authToken)); } return mockMvcBuilder diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java index ba503b053f..195cc31027 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java @@ -168,7 +168,7 @@ public class DiscoverQueryBuilderTest { query = "my test case"; searchFilter = new SearchFilter("subject", "equals", "Java"); - page = new PageRequest(1, 10, Sort.Direction.ASC, "dc.title"); + page = PageRequest.of(1, 10, Sort.Direction.ASC, "dc.title"); queryBuilder.afterPropertiesSet(); } @@ -230,7 +230,7 @@ public class DiscoverQueryBuilderTest { @Test public void testSortByScore() throws Exception { - page = new PageRequest(2, 10, Sort.Direction.ASC, "SCORE"); + page = PageRequest.of(2, 10, Sort.Direction.ASC, "SCORE"); DiscoverQuery discoverQuery = queryBuilder.buildQuery(context, null, discoveryConfiguration, null, null, null, page); @@ -346,4 +346,4 @@ public class DiscoverQueryBuilderTest { } }; } -} \ No newline at end of file +} diff --git a/dspace/modules/server/pom.xml b/dspace/modules/server/pom.xml index f59e4d55ce..06d466f522 100644 --- a/dspace/modules/server/pom.xml +++ b/dspace/modules/server/pom.xml @@ -234,39 +234,16 @@ just adding new jar in the classloader war - - org.springframework.boot - spring-boot-starter-tomcat - provided - ${spring-boot.version} - - - org.springframework - spring-test - test - + org.springframework.boot spring-boot-starter-test - - - - org.json - json - - - - com.jayway.jsonpath - json-path - - test com.jayway.jsonpath json-path-assert + ${json-path.version} test @@ -279,10 +256,69 @@ just adding new jar in the classloader h2 test + + org.mockito + mockito-core + test + org.apache.solr solr-cell test + + + org.eclipse.jetty + jetty-continuation + + + org.eclipse.jetty + jetty-deploy + + + org.eclipse.jetty + jetty-http + + + org.eclipse.jetty + jetty-io + + + org.eclipse.jetty + jetty-jmx + + + org.eclipse.jetty + jetty-rewrite + + + org.eclipse.jetty + jetty-security + + + org.eclipse.jetty + jetty-server + + + org.eclipse.jetty + jetty-servlet + + + org.eclipse.jetty + jetty-servlets + + + org.eclipse.jetty + jetty-util + + + org.eclipse.jetty + jetty-webapp + + + org.eclipse.jetty + jetty-xml + + diff --git a/pom.xml b/pom.xml index cd5d0d4e46..3c50f65136 100644 --- a/pom.xml +++ b/pom.xml @@ -17,34 +17,50 @@ - UTF-8 - ${project.build.sourceEncoding} + 11 - 2.0.15 - 3.17 - 42.2.9 - - 2.13.0 - 2.3.1 - 2.3.1 - 1.3.2 - 1.2.22 - 2.3.4 - 2.11.2 - 1.7.25 - - 2.10.2 - 2.28 + 5.2.5.RELEASE + 2.2.6.RELEASE 5.4.10.Final - 6.0.17.Final + 6.0.18.Final + 42.2.9 7.3.1 - 5.1.9.RELEASE - 2.1.8.RELEASE - + + 1.2.22 + 2.3.4 + + 2.10.2 + 1.3.2 + 2.3.1 + 2.3.1 + + 9.4.8.v20171121 + 2.11.2 + 2.0.15 + 3.17 + 1.7.25 + + + + 3.2.6.RELEASE + 2.4.0 + + 7.9 + + + + 2.13.0 + + 2.30.1 + + + UTF-8 + ${project.build.sourceEncoding} ${basedir} @@ -1064,7 +1080,7 @@ org.ow2.asm asm - 5.1 + 7.1 @@ -1168,21 +1184,22 @@ org.springframework.boot spring-boot-starter-test ${spring-boot.version} + test - + - org.json - json + org.junit.jupiter + junit-jupiter - - com.jayway.jsonpath - json-path + org.junit.vintage + junit-vintage-engine + + + org.mockito + mockito-junit-jupiter - test @@ -1199,19 +1216,6 @@ test - - com.jayway.jsonpath - json-path-assert - ${json-path.version} - test - - - com.jayway.jsonpath - json-path - ${json-path.version} - test - - org.apache.ant ant @@ -1234,16 +1238,11 @@ handle 9.1.0.v20190416 + - org.eclipse.jetty.aggregate - jetty-all - 8.1.22.v20160922 - - - javax.servlet - org.eclipse.jetty.orbit - - + org.eclipse.jetty + jetty-server + ${jetty.version} org.dspace @@ -1576,7 +1575,7 @@ org.mockito mockito-core - 2.28.2 + 3.1.0 test