findDeletedBitstreams(Context context, int limit, int offset) throws SQLException;
/**
diff --git a/dspace-api/src/main/java/org/dspace/event/Consumer.java b/dspace-api/src/main/java/org/dspace/event/Consumer.java
index 1a8b16e98a..f56efcc7ba 100644
--- a/dspace-api/src/main/java/org/dspace/event/Consumer.java
+++ b/dspace-api/src/main/java/org/dspace/event/Consumer.java
@@ -10,18 +10,16 @@ package org.dspace.event;
import org.dspace.core.Context;
/**
- * Interface for content event consumers. Note that the consumer cannot tell if
- * it is invoked synchronously or asynchronously; the consumer interface and
- * sequence of calls is the same for both. Asynchronous consumers may see more
- * consume() calls between the start and end of the event stream, if they are
- * invoked asynchronously, once in a long time period, rather than synchronously
- * after every Context.commit().
- *
- * @version $Revision$
+ * Interface for content event consumers. Note that the consumer cannot tell
+ * if it is invoked synchronously or asynchronously; the consumer interface
+ * and sequence of calls is the same for both. Asynchronous consumers may see
+ * more consume() calls between the start and end of the event stream, if they
+ * are invoked asynchronously, once in a long time period, rather than
+ * synchronously after every Context.commit().
*/
public interface Consumer {
/**
- * Initialize - allocate any resources required to operate. This may include
+ * Allocate any resources required to operate. This may include
* initializing any pooled JMS resources. Called ONCE when created by the
* dispatcher pool. This should be used to set up expensive resources that
* will remain for the lifetime of the consumer.
@@ -31,12 +29,17 @@ public interface Consumer {
public void initialize() throws Exception;
/**
- * Consume an event; events may get filtered at the dispatcher level, hiding
- * it from the consumer. This behavior is based on the dispatcher/consumer
- * configuration. Should include logic to initialize any resources required
- * for a batch of events.
+ * Consume an event. Events may be filtered by a dispatcher, hiding them
+ * from the consumer. This behavior is based on the dispatcher/consumer
+ * configuration. Should include logic to initialize any resources
+ * required for a batch of events.
*
- * @param ctx the execution context object
+ * This method must not commit the context. Committing causes
+ * re-dispatch of the event queue, which can result in infinite recursion
+ * leading to memory exhaustion as seen in
+ * {@link https://github.com/DSpace/DSpace/pull/8756}.
+ *
+ * @param ctx the current DSpace session
* @param event the content event
* @throws Exception if error
*/
diff --git a/dspace-api/src/main/java/org/dspace/event/package-info.java b/dspace-api/src/main/java/org/dspace/event/package-info.java
new file mode 100644
index 0000000000..544dfb271a
--- /dev/null
+++ b/dspace-api/src/main/java/org/dspace/event/package-info.java
@@ -0,0 +1,20 @@
+/**
+ * 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/
+ */
+/**
+ * Actions which alter DSpace model objects can queue {@link Event}s, which
+ * are presented to {@link Consumer}s by a {@link Dispatcher}. A pool of
+ * {@code Dispatcher}s is managed by an {@link service.EventService}, guided
+ * by configuration properties {@code event.dispatcher.*}.
+ *
+ *
One must be careful not to commit the current DSpace {@code Context}
+ * during event dispatch. {@code commit()} triggers event dispatching, and
+ * doing this during event dispatch can lead to infinite recursion and
+ * memory exhaustion.
+ */
+
+package org.dspace.event;
diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java
index 7705fd2b57..0fac326ca1 100644
--- a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java
+++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java
@@ -306,6 +306,7 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident
public DSpaceObject resolve(Context context, String identifier, String... attributes) {
// We can do nothing with this, return null
try {
+ identifier = handleService.parseHandle(identifier);
return handleService.resolveToObject(context, identifier);
} catch (IllegalStateException | SQLException e) {
log.error(LogHelper.getHeader(context, "Error while resolving handle to item", "handle: " + identifier),
@@ -426,6 +427,19 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident
}
}
+ DSpaceObject itemWithCanonicalHandle = handleService.resolveToObject(context, canonical);
+ if (itemWithCanonicalHandle != null) {
+ if (itemWithCanonicalHandle.getID() != previous.getItem().getID()) {
+ log.warn("The previous version's item (" + previous.getItem().getID() +
+ ") does not match with the item containing handle " + canonical +
+ " (" + itemWithCanonicalHandle.getID() + ")");
+ }
+ // Move the original handle from whatever item it's on to the newest version
+ handleService.modifyHandleDSpaceObject(context, canonical, dso);
+ } else {
+ handleService.createHandle(context, dso, canonical);
+ }
+
// add a new Identifier for this item: 12345/100.x
String idNew = canonical + DOT + version.getVersionNumber();
//Make sure we don't have an old handle hanging around (if our previous version was deleted in the workspace)
diff --git a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java
index 1961ce8274..33ef058e16 100644
--- a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java
+++ b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java
@@ -141,7 +141,6 @@ public class DOIConsumer implements Consumer {
+ item.getID() + " and DOI " + doi + ".", ex);
}
}
- ctx.commit();
}
}
diff --git a/dspace-api/src/main/java/org/dspace/importer/external/liveimportclient/service/LiveImportClientImpl.java b/dspace-api/src/main/java/org/dspace/importer/external/liveimportclient/service/LiveImportClientImpl.java
index 81a6631127..1a8a7a7861 100644
--- a/dspace-api/src/main/java/org/dspace/importer/external/liveimportclient/service/LiveImportClientImpl.java
+++ b/dspace-api/src/main/java/org/dspace/importer/external/liveimportclient/service/LiveImportClientImpl.java
@@ -60,7 +60,8 @@ public class LiveImportClientImpl implements LiveImportClient {
requestConfigBuilder.setConnectionRequestTimeout(timeout);
RequestConfig defaultRequestConfig = requestConfigBuilder.build();
- method = new HttpGet(buildUrl(URL, params.get(URI_PARAMETERS)));
+ String uri = buildUrl(URL, params.get(URI_PARAMETERS));
+ method = new HttpGet(uri);
method.setConfig(defaultRequestConfig);
Map headerParams = params.get(HEADER_PARAMETERS);
@@ -71,7 +72,9 @@ public class LiveImportClientImpl implements LiveImportClient {
}
configureProxy(method, defaultRequestConfig);
-
+ if (log.isDebugEnabled()) {
+ log.debug("Performing GET request to \"" + uri + "\"...");
+ }
HttpResponse httpResponse = httpClient.execute(method);
if (isNotSuccessfull(httpResponse)) {
throw new RuntimeException("The request failed with: " + getStatusCode(httpResponse) + " code, reason= "
@@ -98,7 +101,8 @@ public class LiveImportClientImpl implements LiveImportClient {
Builder requestConfigBuilder = RequestConfig.custom();
RequestConfig defaultRequestConfig = requestConfigBuilder.build();
- method = new HttpPost(buildUrl(URL, params.get(URI_PARAMETERS)));
+ String uri = buildUrl(URL, params.get(URI_PARAMETERS));
+ method = new HttpPost(uri);
method.setConfig(defaultRequestConfig);
if (StringUtils.isNotBlank(entry)) {
method.setEntity(new StringEntity(entry));
@@ -106,7 +110,9 @@ public class LiveImportClientImpl implements LiveImportClient {
setHeaderParams(method, params);
configureProxy(method, defaultRequestConfig);
-
+ if (log.isDebugEnabled()) {
+ log.debug("Performing POST request to \"" + uri + "\"..." );
+ }
HttpResponse httpResponse = httpClient.execute(method);
if (isNotSuccessfull(httpResponse)) {
throw new RuntimeException();
@@ -185,4 +191,4 @@ public class LiveImportClientImpl implements LiveImportClient {
this.httpClient = httpClient;
}
-}
\ No newline at end of file
+}
diff --git a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java
index ba23167553..6536026058 100644
--- a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java
+++ b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java
@@ -121,12 +121,14 @@ public class PubmedDateMetadatumContributor implements MetadataContributor
int j = 0;
// Use the first dcDate that has been formatted (Config should go from most specific to most lenient)
- while (j < dateFormatsToAttempt.size() && dcDate == null) {
+ while (j < dateFormatsToAttempt.size()) {
String dateFormat = dateFormatsToAttempt.get(j);
try {
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
Date date = formatter.parse(dateString);
dcDate = new DCDate(date);
+ values.add(metadataFieldMapping.toDCValue(field, formatter.format(date)));
+ break;
} catch (ParseException e) {
// Multiple dateformats can be configured, we don't want to print the entire stacktrace every
// time one of those formats fails.
@@ -136,9 +138,7 @@ public class PubmedDateMetadatumContributor implements MetadataContributor
}
j++;
}
- if (dcDate != null) {
- values.add(metadataFieldMapping.toDCValue(field, dcDate.toString()));
- } else {
+ if (dcDate == null) {
log.info(
"Failed parsing " + dateString + ", check " +
"the configured dataformats in config/spring/api/pubmed-integration.xml");
diff --git a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/service/PubmedImportMetadataSourceServiceImpl.java b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/service/PubmedImportMetadataSourceServiceImpl.java
index b30ea22ca4..933d6b1446 100644
--- a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/service/PubmedImportMetadataSourceServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/service/PubmedImportMetadataSourceServiceImpl.java
@@ -292,7 +292,14 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
int countAttempt = 0;
while (StringUtils.isBlank(response) && countAttempt <= attempt) {
countAttempt++;
+
+ long time = System.currentTimeMillis() - lastRequest;
+ if ((time) < interRequestTime) {
+ Thread.sleep(interRequestTime - time);
+ }
+
response = liveImportClient.executeHttpGetRequest(1000, uriBuilder.toString(), params);
+ lastRequest = System.currentTimeMillis();
}
if (StringUtils.isBlank(response)) {
@@ -316,7 +323,13 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
countAttempt = 0;
while (StringUtils.isBlank(response2) && countAttempt <= attempt) {
countAttempt++;
+ long time = System.currentTimeMillis() - lastRequest;
+ if ((time) < interRequestTime) {
+ Thread.sleep(interRequestTime - time);
+ }
response2 = liveImportClient.executeHttpGetRequest(1000, uriBuilder2.toString(), params2);
+
+ lastRequest = System.currentTimeMillis();
}
if (StringUtils.isBlank(response2)) {
@@ -418,7 +431,13 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
int countAttempt = 0;
while (StringUtils.isBlank(response) && countAttempt <= attempt) {
countAttempt++;
+ long time = System.currentTimeMillis() - lastRequest;
+ if ((time) < interRequestTime) {
+ Thread.sleep(interRequestTime - time);
+ }
+
response = liveImportClient.executeHttpGetRequest(1000, uriBuilder.toString(), params);
+ lastRequest = System.currentTimeMillis();
}
if (StringUtils.isBlank(response)) {
@@ -441,7 +460,12 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
countAttempt = 0;
while (StringUtils.isBlank(response2) && countAttempt <= attempt) {
countAttempt++;
+ long time = System.currentTimeMillis() - lastRequest;
+ if ((time) < interRequestTime) {
+ Thread.sleep(interRequestTime - time);
+ }
response2 = liveImportClient.executeHttpGetRequest(1000, uriBuilder2.toString(), params2);
+ lastRequest = System.currentTimeMillis();
}
if (StringUtils.isBlank(response2)) {
@@ -501,4 +525,4 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
this.urlSearch = urlSearch;
}
-}
\ No newline at end of file
+}
diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java b/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java
index 38632a1a2b..29801433e3 100644
--- a/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java
+++ b/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java
@@ -183,6 +183,7 @@ public abstract class AbstractRemoteMetadataSource {
log.warn("Error in trying operation " + operationId + " " + retry + " " + warning + ", retrying !", e);
} finally {
+ this.lastRequest = System.currentTimeMillis();
lock.unlock();
}
@@ -262,5 +263,7 @@ public abstract class AbstractRemoteMetadataSource {
*/
public abstract void init() throws Exception;
-
+ public void setInterRequestTime(final long interRequestTime) {
+ this.interRequestTime = interRequestTime;
+ }
}
diff --git a/dspace-api/src/main/java/org/dspace/orcid/OrcidHistory.java b/dspace-api/src/main/java/org/dspace/orcid/OrcidHistory.java
index 33edea112e..a567c6e7a7 100644
--- a/dspace-api/src/main/java/org/dspace/orcid/OrcidHistory.java
+++ b/dspace-api/src/main/java/org/dspace/orcid/OrcidHistory.java
@@ -79,6 +79,8 @@ public class OrcidHistory implements ReloadableEntity {
/**
* A description of the synchronized resource.
*/
+ @Lob
+ @Type(type = "org.dspace.storage.rdbms.hibernate.DatabaseAwareLobType")
@Column(name = "description")
private String description;
diff --git a/dspace-api/src/main/java/org/dspace/orcid/OrcidQueue.java b/dspace-api/src/main/java/org/dspace/orcid/OrcidQueue.java
index 4794e89008..9261f14eea 100644
--- a/dspace-api/src/main/java/org/dspace/orcid/OrcidQueue.java
+++ b/dspace-api/src/main/java/org/dspace/orcid/OrcidQueue.java
@@ -64,6 +64,8 @@ public class OrcidQueue implements ReloadableEntity {
/**
* A description of the resource to be synchronized.
*/
+ @Lob
+ @Type(type = "org.dspace.storage.rdbms.hibernate.DatabaseAwareLobType")
@Column(name = "description")
private String description;
diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java
index b8a1a2e96a..977b5b7b32 100644
--- a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java
@@ -17,6 +17,7 @@ import java.util.Map;
import java.util.UUID;
import javax.annotation.Nullable;
+import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -224,25 +225,62 @@ public class BitstreamStorageServiceImpl implements BitstreamStorageService, Ini
@Override
public void cleanup(boolean deleteDbRecords, boolean verbose) throws SQLException, IOException, AuthorizeException {
Context context = new Context(Context.Mode.BATCH_EDIT);
- int commitCounter = 0;
+
+ int offset = 0;
+ int limit = 100;
+
+ int cleanedBitstreamCount = 0;
+
+ int deletedBitstreamCount = bitstreamService.countDeletedBitstreams(context);
+ System.out.println("Found " + deletedBitstreamCount + " deleted bistream to cleanup");
try {
context.turnOffAuthorisationSystem();
- List storage = bitstreamService.findDeletedBitstreams(context);
- for (Bitstream bitstream : storage) {
- UUID bid = bitstream.getID();
- Map wantedMetadata = new HashMap();
- wantedMetadata.put("size_bytes", null);
- wantedMetadata.put("modified", null);
- Map receivedMetadata = this.getStore(bitstream.getStoreNumber()).about(bitstream, wantedMetadata);
+ while (cleanedBitstreamCount < deletedBitstreamCount) {
+
+ List storage = bitstreamService.findDeletedBitstreams(context, limit, offset);
+
+ if (CollectionUtils.isEmpty(storage)) {
+ break;
+ }
+
+ for (Bitstream bitstream : storage) {
+ UUID bid = bitstream.getID();
+ Map wantedMetadata = new HashMap();
+ wantedMetadata.put("size_bytes", null);
+ wantedMetadata.put("modified", null);
+ Map receivedMetadata = this.getStore(bitstream.getStoreNumber()).about(bitstream, wantedMetadata);
- // Make sure entries which do not exist are removed
- if (MapUtils.isEmpty(receivedMetadata)) {
- log.debug("bitstore.about is empty, so file is not present");
+ // Make sure entries which do not exist are removed
+ if (MapUtils.isEmpty(receivedMetadata)) {
+ log.debug("bitstore.about is empty, so file is not present");
+ if (deleteDbRecords) {
+ log.debug("deleting record");
+ if (verbose) {
+ System.out.println(" - Deleting bitstream information (ID: " + bid + ")");
+ }
+ checksumHistoryService.deleteByBitstream(context, bitstream);
+ if (verbose) {
+ System.out.println(" - Deleting bitstream record from database (ID: " + bid + ")");
+ }
+ bitstreamService.expunge(context, bitstream);
+ }
+ context.uncacheEntity(bitstream);
+ continue;
+ }
+
+ // This is a small chance that this is a file which is
+ // being stored -- get it next time.
+ if (isRecent(Long.valueOf(receivedMetadata.get("modified").toString()))) {
+ log.debug("file is recent");
+ context.uncacheEntity(bitstream);
+ continue;
+ }
+
if (deleteDbRecords) {
- log.debug("deleting record");
+ log.debug("deleting db record");
if (verbose) {
System.out.println(" - Deleting bitstream information (ID: " + bid + ")");
}
@@ -252,64 +290,42 @@ public class BitstreamStorageServiceImpl implements BitstreamStorageService, Ini
}
bitstreamService.expunge(context, bitstream);
}
+
+ if (isRegisteredBitstream(bitstream.getInternalId())) {
+ context.uncacheEntity(bitstream);
+ continue; // do not delete registered bitstreams
+ }
+
+
+ // Since versioning allows for multiple bitstreams, check if the internal
+ // identifier isn't used on
+ // another place
+ if (bitstreamService.findDuplicateInternalIdentifier(context, bitstream).isEmpty()) {
+ this.getStore(bitstream.getStoreNumber()).remove(bitstream);
+
+ String message = ("Deleted bitstreamID " + bid + ", internalID " + bitstream.getInternalId());
+ if (log.isDebugEnabled()) {
+ log.debug(message);
+ }
+ if (verbose) {
+ System.out.println(message);
+ }
+ }
+
context.uncacheEntity(bitstream);
- continue;
}
- // This is a small chance that this is a file which is
- // being stored -- get it next time.
- if (isRecent(Long.valueOf(receivedMetadata.get("modified").toString()))) {
- log.debug("file is recent");
- context.uncacheEntity(bitstream);
- continue;
+ // Commit actual changes to DB after dispatch events
+ System.out.print("Performing incremental commit to the database...");
+ context.commit();
+ System.out.println(" Incremental commit done!");
+
+ cleanedBitstreamCount = cleanedBitstreamCount + storage.size();
+
+ if (!deleteDbRecords) {
+ offset = offset + limit;
}
- if (deleteDbRecords) {
- log.debug("deleting db record");
- if (verbose) {
- System.out.println(" - Deleting bitstream information (ID: " + bid + ")");
- }
- checksumHistoryService.deleteByBitstream(context, bitstream);
- if (verbose) {
- System.out.println(" - Deleting bitstream record from database (ID: " + bid + ")");
- }
- bitstreamService.expunge(context, bitstream);
- }
-
- if (isRegisteredBitstream(bitstream.getInternalId())) {
- context.uncacheEntity(bitstream);
- continue; // do not delete registered bitstreams
- }
-
-
- // Since versioning allows for multiple bitstreams, check if the internal identifier isn't used on
- // another place
- if (bitstreamService.findDuplicateInternalIdentifier(context, bitstream).isEmpty()) {
- this.getStore(bitstream.getStoreNumber()).remove(bitstream);
-
- String message = ("Deleted bitstreamID " + bid + ", internalID " + bitstream.getInternalId());
- if (log.isDebugEnabled()) {
- log.debug(message);
- }
- if (verbose) {
- System.out.println(message);
- }
- }
-
- // Make sure to commit our outstanding work every 100
- // iterations. Otherwise you risk losing the entire transaction
- // if we hit an exception, which isn't useful at all for large
- // amounts of bitstreams.
- commitCounter++;
- if (commitCounter % 100 == 0) {
- context.dispatchEvents();
- // Commit actual changes to DB after dispatch events
- System.out.print("Performing incremental commit to the database...");
- context.commit();
- System.out.println(" Incremental commit done!");
- }
-
- context.uncacheEntity(bitstream);
}
System.out.print("Committing changes to the database...");
diff --git a/dspace-api/src/main/resources/Messages.properties b/dspace-api/src/main/resources/Messages.properties
index c478e4e69b..9be443f5ea 100644
--- a/dspace-api/src/main/resources/Messages.properties
+++ b/dspace-api/src/main/resources/Messages.properties
@@ -51,6 +51,7 @@ metadata.bitstream.iiif-virtual.bytes = File size
metadata.bitstream.iiif-virtual.checksum = Checksum
org.dspace.app.itemexport.no-result = The DSpaceObject that you specified has no items.
+org.dspace.app.util.SyndicationFeed.no-description = No Description
org.dspace.checker.ResultsLogger.bitstream-format = Bitstream format
org.dspace.checker.ResultsLogger.bitstream-found = Bitstream found
org.dspace.checker.ResultsLogger.bitstream-id = Bitstream ID
diff --git a/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/h2/V7.6_2023.03.29__orcid_queue_and_history_descriptions_to_text_type.sql b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/h2/V7.6_2023.03.29__orcid_queue_and_history_descriptions_to_text_type.sql
new file mode 100644
index 0000000000..7641eb9fc2
--- /dev/null
+++ b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/h2/V7.6_2023.03.29__orcid_queue_and_history_descriptions_to_text_type.sql
@@ -0,0 +1,10 @@
+--
+-- 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/
+--
+
+ALTER TABLE orcid_history ALTER COLUMN description SET DATA TYPE CLOB;
+ALTER TABLE orcid_queue ALTER COLUMN description SET DATA TYPE CLOB;
diff --git a/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/oracle/V7.6_2023.03.29__orcid_queue_and_history_descriptions_to_text_type.sql b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/oracle/V7.6_2023.03.29__orcid_queue_and_history_descriptions_to_text_type.sql
new file mode 100644
index 0000000000..509e0a2869
--- /dev/null
+++ b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/oracle/V7.6_2023.03.29__orcid_queue_and_history_descriptions_to_text_type.sql
@@ -0,0 +1,10 @@
+--
+-- 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/
+--
+
+ALTER TABLE orcid_history MODIFY (description CLOB);
+ALTER TABLE orcid_queue MODIFY (description CLOB);
diff --git a/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/postgres/V7.6_2023.03.29__orcid_queue_and_history_descriptions_to_text_type.sql b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/postgres/V7.6_2023.03.29__orcid_queue_and_history_descriptions_to_text_type.sql
new file mode 100644
index 0000000000..ae0e414e44
--- /dev/null
+++ b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/postgres/V7.6_2023.03.29__orcid_queue_and_history_descriptions_to_text_type.sql
@@ -0,0 +1,10 @@
+--
+-- 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/
+--
+
+ALTER TABLE orcid_history ALTER COLUMN description TYPE TEXT;
+ALTER TABLE orcid_queue ALTER COLUMN description TYPE TEXT;
diff --git a/dspace-api/src/main/resources/spring/spring-dspace-addon-import-services.xml b/dspace-api/src/main/resources/spring/spring-dspace-addon-import-services.xml
index b8f02c46ff..6b0ef3e9b9 100644
--- a/dspace-api/src/main/resources/spring/spring-dspace-addon-import-services.xml
+++ b/dspace-api/src/main/resources/spring/spring-dspace-addon-import-services.xml
@@ -57,6 +57,7 @@
+
xml
@@ -199,4 +200,4 @@
-
\ No newline at end of file
+
diff --git a/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml
index 87bfcbc86c..3ce641d99c 100644
--- a/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml
+++ b/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml
@@ -13,15 +13,6 @@
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
-
-
-
-
@@ -31,12 +22,6 @@
-
-
-
-
diff --git a/dspace-api/src/test/data/dspaceFolder/config/spring/api/identifier-service.xml b/dspace-api/src/test/data/dspaceFolder/config/spring/api/identifier-service.xml
index 206b801d08..8f7cc297d7 100644
--- a/dspace-api/src/test/data/dspaceFolder/config/spring/api/identifier-service.xml
+++ b/dspace-api/src/test/data/dspaceFolder/config/spring/api/identifier-service.xml
@@ -19,7 +19,18 @@
+ scope="singleton">
+
+
+
+
+
+
+
+
+
+
+
-
- 9.4.48.v20220622
+ 9.4.51.v20230217
2.17.1
2.0.27
1.18.0