diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 723e85ea6028..0144b58510f9 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -24,7 +24,7 @@ jobs:
# NOTE: Unit Tests include a retry for occasionally failing tests
# - surefire.rerunFailingTestsCount => try again for flakey tests, and keep track of/report on number of retries
- type: "Unit Tests"
- java: 11
+ java: 17
mvnflags: "-Dtest.argLine=-Xmx2048m -DskipUnitTests=false -Dsurefire.rerunFailingTestsCount=2"
resultsdir: "**/target/surefire-reports/**"
# NOTE: ITs skip all code validation checks, as they are already done by Unit Test job.
@@ -34,7 +34,7 @@ jobs:
# - xml.skip => Skip all XML/XSLT validation by xml-maven-plugin
# - failsafe.rerunFailingTestsCount => try again for flakey tests, and keep track of/report on number of retries
- type: "Integration Tests"
- java: 11
+ java: 17
mvnflags: "-DskipIntegrationTests=false -Denforcer.skip=true -Dcheckstyle.skip=true -Dlicense.skip=true -Dxml.skip=true -Dfailsafe.rerunFailingTestsCount=2"
resultsdir: "**/target/failsafe-reports/**"
# Do NOT exit immediately if one matrix job fails
@@ -49,7 +49,7 @@ jobs:
# https://github.com/actions/setup-java
- name: Install JDK ${{ matrix.java }}
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
java-version: ${{ matrix.java }}
distribution: 'temurin'
@@ -74,14 +74,14 @@ jobs:
# (This artifact is downloadable at the bottom of any job's summary page)
- name: Upload Results of ${{ matrix.type }} to Artifact
if: ${{ failure() }}
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: ${{ matrix.type }} results
path: ${{ matrix.resultsdir }}
# Upload code coverage report to artifact, so that it can be shared with the 'codecov' job (see below)
- name: Upload code coverage report to Artifact
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: ${{ matrix.type }} coverage report
path: 'dspace/target/site/jacoco-aggregate/jacoco.xml'
@@ -100,7 +100,7 @@ jobs:
# Download artifacts from previous 'tests' job
- name: Download coverage artifacts
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@v4
# Now attempt upload to Codecov using its action.
# NOTE: We use a retry action to retry the Codecov upload if it fails the first time.
@@ -110,10 +110,11 @@ jobs:
- name: Upload coverage to Codecov.io
uses: Wandalen/wretry.action@v1.3.0
with:
- action: codecov/codecov-action@v3
+ action: codecov/codecov-action@v4
# Ensure codecov-action throws an error when it fails to upload
with: |
fail_ci_if_error: true
+ token: ${{ secrets.CODECOV_TOKEN }}
# Try re-running action 5 times max
attempt_limit: 5
# Run again in 30 seconds
diff --git a/.github/workflows/codescan.yml b/.github/workflows/codescan.yml
index 13bb0d2278ad..3a563c6fa39c 100644
--- a/.github/workflows/codescan.yml
+++ b/.github/workflows/codescan.yml
@@ -39,9 +39,9 @@ jobs:
# https://github.com/actions/setup-java
- name: Install JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
- java-version: 11
+ java-version: 17
distribution: 'temurin'
# Initializes the CodeQL tools for scanning.
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 719e953fa601..a9ff8760e763 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -43,7 +43,7 @@ jobs:
needs: dspace-dependencies
uses: ./.github/workflows/reusable-docker-build.yml
with:
- build_id: dspace
+ build_id: dspace-prod
image_name: dspace/dspace
dockerfile_path: ./Dockerfile
secrets:
@@ -120,7 +120,7 @@ jobs:
if: github.repository == 'dspace/dspace'
uses: ./.github/workflows/reusable-docker-build.yml
with:
- build_id: dspace-postgres-pgcrypto
+ build_id: dspace-postgres-pgcrypto-prod
image_name: dspace/dspace-postgres-pgcrypto
# Must build out of subdirectory to have access to install script for pgcrypto.
# NOTE: this context will build the image based on the Dockerfile in the specified directory
@@ -129,354 +129,6 @@ jobs:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }}
-<<<<<<< HEAD
- # https://github.com/docker/build-push-action
- - name: Build and push 'dspace-dependencies' image
- id: docker_build_deps
- uses: docker/build-push-action@v4
- with:
- context: .
- file: ./Dockerfile.dependencies
- platforms: ${{ env.PLATFORMS }}
- # For pull requests, we run the Docker build (to ensure no PR changes break the build),
- # but we ONLY do an image push to DockerHub if it's NOT a PR
- push: ${{ github.event_name != 'pull_request' }}
- # Use tags / labels provided by 'docker/metadata-action' above
- tags: ${{ steps.meta_build_deps.outputs.tags }}
- labels: ${{ steps.meta_build_deps.outputs.labels }}
-
- #######################################
- # Build/Push the 'dspace/dspace' image
- #######################################
- dspace:
- # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace'
- if: github.repository == 'dspace/dspace'
- # Must run after 'dspace-dependencies' job above
- needs: dspace-dependencies
- runs-on: ubuntu-latest
-
- steps:
- # https://github.com/actions/checkout
- - name: Checkout codebase
- uses: actions/checkout@v3
-
- # https://github.com/docker/setup-buildx-action
- - name: Setup Docker Buildx
- uses: docker/setup-buildx-action@v2
-
- # https://github.com/docker/setup-qemu-action
- - name: Set up QEMU emulation to build for multiple architectures
- uses: docker/setup-qemu-action@v2
-
- # https://github.com/docker/login-action
- - name: Login to DockerHub
- # Only login if not a PR, as PRs only trigger a Docker build and not a push
- if: github.event_name != 'pull_request'
- uses: docker/login-action@v2
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
-
- # Get Metadata for docker_build step below
- - name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace' image
- id: meta_build
- uses: docker/metadata-action@v4
- with:
- images: dspace/dspace
- tags: ${{ env.IMAGE_TAGS }}
- flavor: ${{ env.TAGS_FLAVOR }}
-
- - name: Build and push 'dspace' image
- id: docker_build
- uses: docker/build-push-action@v4
- with:
- context: .
- file: ./Dockerfile
- platforms: ${{ env.PLATFORMS }}
- # For pull requests, we run the Docker build (to ensure no PR changes break the build),
- # but we ONLY do an image push to DockerHub if it's NOT a PR
- push: ${{ github.event_name != 'pull_request' }}
- # Use tags / labels provided by 'docker/metadata-action' above
- tags: ${{ steps.meta_build.outputs.tags }}
- labels: ${{ steps.meta_build.outputs.labels }}
-
- #############################################################
- # Build/Push the 'dspace/dspace' image ('-test' tag)
- #############################################################
- dspace-test:
- # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace'
- if: github.repository == 'dspace/dspace'
- # Must run after 'dspace-dependencies' job above
- needs: dspace-dependencies
- runs-on: ubuntu-latest
-
- steps:
- # https://github.com/actions/checkout
- - name: Checkout codebase
- uses: actions/checkout@v3
-
- # https://github.com/docker/setup-buildx-action
- - name: Setup Docker Buildx
- uses: docker/setup-buildx-action@v2
-
- # https://github.com/docker/setup-qemu-action
- - name: Set up QEMU emulation to build for multiple architectures
- uses: docker/setup-qemu-action@v2
-
- # https://github.com/docker/login-action
- - name: Login to DockerHub
- # Only login if not a PR, as PRs only trigger a Docker build and not a push
- if: github.event_name != 'pull_request'
- uses: docker/login-action@v2
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
-
- # Get Metadata for docker_build_test step below
- - name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-test' image
- id: meta_build_test
- uses: docker/metadata-action@v4
- with:
- images: dspace/dspace
- tags: ${{ env.IMAGE_TAGS }}
- # As this is a test/development image, its tags are all suffixed with "-test". Otherwise, it uses the same
- # tagging logic as the primary 'dspace/dspace' image above.
- flavor: ${{ env.TAGS_FLAVOR }}
- suffix=-test
-
- - name: Build and push 'dspace-test' image
- id: docker_build_test
- uses: docker/build-push-action@v4
- with:
- context: .
- file: ./Dockerfile.test
- platforms: ${{ env.PLATFORMS }}
- # For pull requests, we run the Docker build (to ensure no PR changes break the build),
- # but we ONLY do an image push to DockerHub if it's NOT a PR
- push: ${{ github.event_name != 'pull_request' }}
- # Use tags / labels provided by 'docker/metadata-action' above
- tags: ${{ steps.meta_build_test.outputs.tags }}
- labels: ${{ steps.meta_build_test.outputs.labels }}
-
- ###########################################
- # Build/Push the 'dspace/dspace-cli' image
- ###########################################
- dspace-cli:
- # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace'
- if: github.repository == 'dspace/dspace'
- # Must run after 'dspace-dependencies' job above
- needs: dspace-dependencies
- runs-on: ubuntu-latest
-
- steps:
- # https://github.com/actions/checkout
- - name: Checkout codebase
- uses: actions/checkout@v3
-
- # https://github.com/docker/setup-buildx-action
- - name: Setup Docker Buildx
- uses: docker/setup-buildx-action@v2
-
- # https://github.com/docker/setup-qemu-action
- - name: Set up QEMU emulation to build for multiple architectures
- uses: docker/setup-qemu-action@v2
-
- # https://github.com/docker/login-action
- - name: Login to DockerHub
- # Only login if not a PR, as PRs only trigger a Docker build and not a push
- if: github.event_name != 'pull_request'
- uses: docker/login-action@v2
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
-
- # Get Metadata for docker_build_test step below
- - name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-cli' image
- id: meta_build_cli
- uses: docker/metadata-action@v4
- with:
- images: dspace/dspace-cli
- tags: ${{ env.IMAGE_TAGS }}
- flavor: ${{ env.TAGS_FLAVOR }}
-
- - name: Build and push 'dspace-cli' image
- id: docker_build_cli
- uses: docker/build-push-action@v4
- with:
- context: .
- file: ./Dockerfile.cli
- platforms: ${{ env.PLATFORMS }}
- # For pull requests, we run the Docker build (to ensure no PR changes break the build),
- # but we ONLY do an image push to DockerHub if it's NOT a PR
- push: ${{ github.event_name != 'pull_request' }}
- # Use tags / labels provided by 'docker/metadata-action' above
- tags: ${{ steps.meta_build_cli.outputs.tags }}
- labels: ${{ steps.meta_build_cli.outputs.labels }}
-
- ###########################################
- # Build/Push the 'dspace/dspace-solr' image
- ###########################################
- dspace-solr:
- # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace'
- if: github.repository == 'dspace/dspace'
- runs-on: ubuntu-latest
-
- steps:
- # https://github.com/actions/checkout
- - name: Checkout codebase
- uses: actions/checkout@v3
-
- # https://github.com/docker/setup-buildx-action
- - name: Setup Docker Buildx
- uses: docker/setup-buildx-action@v2
-
- # https://github.com/docker/setup-qemu-action
- - name: Set up QEMU emulation to build for multiple architectures
- uses: docker/setup-qemu-action@v2
-
- # https://github.com/docker/login-action
- - name: Login to DockerHub
- # Only login if not a PR, as PRs only trigger a Docker build and not a push
- if: github.event_name != 'pull_request'
- uses: docker/login-action@v2
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
-
- # Get Metadata for docker_build_solr step below
- - name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-solr' image
- id: meta_build_solr
- uses: docker/metadata-action@v4
- with:
- images: dspace/dspace-solr
- tags: ${{ env.IMAGE_TAGS }}
- flavor: ${{ env.TAGS_FLAVOR }}
-
- - name: Build and push 'dspace-solr' image
- id: docker_build_solr
- uses: docker/build-push-action@v4
- with:
- context: .
- file: ./dspace/src/main/docker/dspace-solr/Dockerfile
- platforms: ${{ env.PLATFORMS }}
- # For pull requests, we run the Docker build (to ensure no PR changes break the build),
- # but we ONLY do an image push to DockerHub if it's NOT a PR
- push: ${{ github.event_name != 'pull_request' }}
- # Use tags / labels provided by 'docker/metadata-action' above
- tags: ${{ steps.meta_build_solr.outputs.tags }}
- labels: ${{ steps.meta_build_solr.outputs.labels }}
-
- ###########################################################
- # Build/Push the 'dspace/dspace-postgres-pgcrypto' image
- ###########################################################
- dspace-postgres-pgcrypto:
- # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace'
- if: github.repository == 'dspace/dspace'
- runs-on: ubuntu-latest
-
- steps:
- # https://github.com/actions/checkout
- - name: Checkout codebase
- uses: actions/checkout@v3
-
- # https://github.com/docker/setup-buildx-action
- - name: Setup Docker Buildx
- uses: docker/setup-buildx-action@v2
-
- # https://github.com/docker/setup-qemu-action
- - name: Set up QEMU emulation to build for multiple architectures
- uses: docker/setup-qemu-action@v2
-
- # https://github.com/docker/login-action
- - name: Login to DockerHub
- # Only login if not a PR, as PRs only trigger a Docker build and not a push
- if: github.event_name != 'pull_request'
- uses: docker/login-action@v2
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
-
- # Get Metadata for docker_build_postgres step below
- - name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-postgres-pgcrypto' image
- id: meta_build_postgres
- uses: docker/metadata-action@v4
- with:
- images: dspace/dspace-postgres-pgcrypto
- tags: ${{ env.IMAGE_TAGS }}
- flavor: ${{ env.TAGS_FLAVOR }}
-
- - name: Build and push 'dspace-postgres-pgcrypto' image
- id: docker_build_postgres
- uses: docker/build-push-action@v4
- with:
- # Must build out of subdirectory to have access to install script for pgcrypto
- context: ./dspace/src/main/docker/dspace-postgres-pgcrypto/
- dockerfile: Dockerfile
- platforms: ${{ env.PLATFORMS }}
- # For pull requests, we run the Docker build (to ensure no PR changes break the build),
- # but we ONLY do an image push to DockerHub if it's NOT a PR
- push: ${{ github.event_name != 'pull_request' }}
- # Use tags / labels provided by 'docker/metadata-action' above
- tags: ${{ steps.meta_build_postgres.outputs.tags }}
- labels: ${{ steps.meta_build_postgres.outputs.labels }}
-
- ########################################################################
- # Build/Push the 'dspace/dspace-postgres-pgcrypto' image (-loadsql tag)
- ########################################################################
- dspace-postgres-pgcrypto-loadsql:
- # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace'
- if: github.repository == 'dspace/dspace'
- runs-on: ubuntu-latest
-
- steps:
- # https://github.com/actions/checkout
- - name: Checkout codebase
- uses: actions/checkout@v3
-
- # https://github.com/docker/setup-buildx-action
- - name: Setup Docker Buildx
- uses: docker/setup-buildx-action@v2
-
- # https://github.com/docker/setup-qemu-action
- - name: Set up QEMU emulation to build for multiple architectures
- uses: docker/setup-qemu-action@v2
-
- # https://github.com/docker/login-action
- - name: Login to DockerHub
- # Only login if not a PR, as PRs only trigger a Docker build and not a push
- if: github.event_name != 'pull_request'
- uses: docker/login-action@v2
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
-
- # Get Metadata for docker_build_postgres_loadsql step below
- - name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-postgres-pgcrypto-loadsql' image
- id: meta_build_postgres_loadsql
- uses: docker/metadata-action@v4
- with:
- images: dspace/dspace-postgres-pgcrypto
- tags: ${{ env.IMAGE_TAGS }}
- # Suffix all tags with "-loadsql". Otherwise, it uses the same
- # tagging logic as the primary 'dspace/dspace-postgres-pgcrypto' image above.
- flavor: ${{ env.TAGS_FLAVOR }}
- suffix=-loadsql
-
- - name: Build and push 'dspace-postgres-pgcrypto-loadsql' image
- id: docker_build_postgres_loadsql
- uses: docker/build-push-action@v4
- with:
- # Must build out of subdirectory to have access to install script for pgcrypto
- context: ./dspace/src/main/docker/dspace-postgres-pgcrypto-curl/
- dockerfile: Dockerfile
- platforms: ${{ env.PLATFORMS }}
- # For pull requests, we run the Docker build (to ensure no PR changes break the build),
- # but we ONLY do an image push to DockerHub if it's NOT a PR
- push: ${{ github.event_name != 'pull_request' }}
- # Use tags / labels provided by 'docker/metadata-action' above
- tags: ${{ steps.meta_build_postgres_loadsql.outputs.tags }}
- labels: ${{ steps.meta_build_postgres_loadsql.outputs.labels }}
-=======
########################################################################
# Build/Push the 'dspace/dspace-postgres-pgcrypto' image (-loadsql tag)
########################################################################
@@ -495,5 +147,4 @@ jobs:
tags_flavor: suffix=-loadsql
secrets:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
- DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }}
->>>>>>> refs/remotes/githubDSpace/main
+ DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/issue_opened.yml b/.github/workflows/issue_opened.yml
index b4436dca3aad..0a35a6a95044 100644
--- a/.github/workflows/issue_opened.yml
+++ b/.github/workflows/issue_opened.yml
@@ -16,7 +16,7 @@ jobs:
# Only add to project board if issue is flagged as "needs triage" or has no labels
# NOTE: By default we flag new issues as "needs triage" in our issue template
if: (contains(github.event.issue.labels.*.name, 'needs triage') || join(github.event.issue.labels.*.name) == '')
- uses: actions/add-to-project@v0.5.0
+ uses: actions/add-to-project@v1.0.0
# Note, the authentication token below is an ORG level Secret.
# It must be created/recreated manually via a personal access token with admin:org, project, public_repo permissions
# See: https://docs.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token#permissions-for-the-github_token
diff --git a/.github/workflows/reusable-docker-build.yml b/.github/workflows/reusable-docker-build.yml
index aa8327f4d11b..019dab51eddb 100644
--- a/.github/workflows/reusable-docker-build.yml
+++ b/.github/workflows/reusable-docker-build.yml
@@ -68,9 +68,9 @@ env:
# See "Redeploy" steps below for more details.
REDEPLOY_SANDBOX_URL: ${{ secrets.REDEPLOY_SANDBOX_URL }}
REDEPLOY_DEMO_URL: ${{ secrets.REDEPLOY_DEMO_URL }}
- # Current DSpace maintenance branch (and architecture) which is deployed to demo.dspace.org / sandbox.dspace.org
- # (NOTE: No deployment branch specified for sandbox.dspace.org as it uses the default_branch)
+ # Current DSpace branches (and architecture) which are deployed to demo.dspace.org & sandbox.dspace.org respectively
DEPLOY_DEMO_BRANCH: 'dspace-7_x'
+ DEPLOY_SANDBOX_BRANCH: 'main'
DEPLOY_ARCH: 'linux/amd64'
jobs:
@@ -93,6 +93,14 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
+ # This step converts the slashes in the "arch" matrix values above into dashes & saves to env.ARCH_NAME
+ # E.g. "linux/amd64" becomes "linux-amd64"
+ # This is necessary because all upload artifacts CANNOT have special chars (like slashes)
+ - name: Prepare
+ run: |
+ platform=${{ matrix.arch }}
+ echo "ARCH_NAME=${platform//\//-}" >> $GITHUB_ENV
+
# https://github.com/actions/checkout
- name: Checkout codebase
uses: actions/checkout@v4
@@ -152,9 +160,9 @@ jobs:
# Upload digest to an artifact, so that it can be used in manifest below
- name: Upload Docker build digest to artifact
if: ${{ ! matrix.isPr }}
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
- name: digests-${{ inputs.build_id }}
+ name: digests-${{ inputs.build_id }}-${{ env.ARCH_NAME }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
@@ -166,13 +174,13 @@ jobs:
!matrix.isPR &&
env.REDEPLOY_SANDBOX_URL != '' &&
matrix.arch == env.DEPLOY_ARCH &&
- github.ref_name == github.event.repository.default_branch
+ github.ref_name == env.DEPLOY_SANDBOX_BRANCH
run: |
curl -X POST $REDEPLOY_SANDBOX_URL
# If this build is NOT a PR and passed in a REDEPLOY_DEMO_URL secret,
# Then redeploy https://demo.dspace.org if this build is for our deployment architecture and demo branch.
- - name: Redeploy demo.dspace.org (based on maintenace branch)
+ - name: Redeploy demo.dspace.org (based on maintenance branch)
if: |
!matrix.isPR &&
env.REDEPLOY_DEMO_URL != '' &&
@@ -192,10 +200,12 @@ jobs:
- docker-build
steps:
- name: Download Docker build digests
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@v4
with:
- name: digests-${{ inputs.build_id }}
path: /tmp/digests
+ # Download digests for both AMD64 and ARM64 into same directory
+ pattern: digests-${{ inputs.build_id }}-*
+ merge-multiple: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
diff --git a/.lgtm.yml b/.lgtm.yml
deleted file mode 100644
index 132de8a6de5a..000000000000
--- a/.lgtm.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-# LGTM Settings (https://lgtm.com/)
-# For reference, see https://lgtm.com/help/lgtm/lgtm.yml-configuration-file
-# or template at https://lgtm.com/static/downloads/lgtm.template.yml
-
-extraction:
- java:
- index:
- # Specify the Java version required to build the project
- java_version: 11
diff --git a/Dockerfile b/Dockerfile
index ff113770209c..096fea313cde 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,9 +3,9 @@
#
# - note: default tag for branch: dspace/dspace: dspace/dspace:dspace-8_x
-# This Dockerfile uses JDK11 by default, but has also been tested with JDK17.
-# To build with JDK17, use "--build-arg JDK_VERSION=17"
-ARG JDK_VERSION=11
+# This Dockerfile uses JDK17 by default.
+# To build with other versions, use "--build-arg JDK_VERSION=[value]"
+ARG JDK_VERSION=17
ARG DSPACE_VERSION=latest
# Step 1 - Run Maven Build
@@ -27,9 +27,11 @@ ENV MAVEN_FLAGS="-P-test-environment -Denforcer.skip=true -Dcheckstyle.skip=true
RUN mvn --no-transfer-progress package ${MAVEN_FLAGS} && \
mv /app/dspace/target/${TARGET_DIR}/* /install && \
mvn clean
+# Remove the server webapp to keep image small.
+RUN rm -rf /install/webapps/server/
# Step 2 - Run Ant Deploy
-FROM openjdk:${JDK_VERSION}-slim as ant_build
+FROM eclipse-temurin:${JDK_VERSION} as ant_build
ARG TARGET_DIR=dspace-installer
# COPY the /install directory from 'build' container to /dspace-src in this container
COPY --from=build /install /dspace-src
@@ -49,23 +51,16 @@ RUN mkdir $ANT_HOME && \
# Run necessary 'ant' deploy scripts
RUN ant init_installation update_configs update_code update_webapps
-# Step 3 - Run tomcat
-# Create a new tomcat image that does not retain the the build directory contents
-FROM tomcat:9-jdk${JDK_VERSION}
+# Step 3 - Start up DSpace via Runnable JAR
+FROM eclipse-temurin:${JDK_VERSION}
# NOTE: DSPACE_INSTALL must align with the "dspace.dir" default configuration.
ENV DSPACE_INSTALL=/dspace
# Copy the /dspace directory from 'ant_build' container to /dspace in this container
COPY --from=ant_build /dspace $DSPACE_INSTALL
-# Expose Tomcat port and AJP port
-EXPOSE 8080 8009
+WORKDIR $DSPACE_INSTALL
+# Expose Tomcat port
+EXPOSE 8080
# Give java extra memory (2GB)
ENV JAVA_OPTS=-Xmx2000m
-
-# Link the DSpace 'server' webapp into Tomcat's webapps directory.
-# This ensures that when we start Tomcat, it runs from /server path (e.g. http://localhost:8080/server/)
-RUN ln -s $DSPACE_INSTALL/webapps/server /usr/local/tomcat/webapps/server
-# If you wish to run "server" webapp off the ROOT path, then comment out the above RUN, and uncomment the below RUN.
-# You also MUST update the 'dspace.server.url' configuration to match.
-# Please note that server webapp should only run on one path at a time.
-#RUN mv /usr/local/tomcat/webapps/ROOT /usr/local/tomcat/webapps/ROOT.bk && \
-# ln -s $DSPACE_INSTALL/webapps/server /usr/local/tomcat/webapps/ROOT
+# On startup, run DSpace Runnable JAR
+ENTRYPOINT ["java", "-jar", "webapps/server-boot.jar", "--dspace.dir=$DSPACE_INSTALL"]
diff --git a/Dockerfile.cli b/Dockerfile.cli
index d54978375e54..7dd35c9651d9 100644
--- a/Dockerfile.cli
+++ b/Dockerfile.cli
@@ -3,9 +3,9 @@
#
# - note: default tag for branch: dspace/dspace-cli: dspace/dspace-cli:latest
-# This Dockerfile uses JDK11 by default, but has also been tested with JDK17.
-# To build with JDK17, use "--build-arg JDK_VERSION=17"
-ARG JDK_VERSION=11
+# This Dockerfile uses JDK17 by default.
+# To build with other versions, use "--build-arg JDK_VERSION=[value]"
+ARG JDK_VERSION=17
ARG DSPACE_VERSION=latest
# Step 1 - Run Maven Build
@@ -25,7 +25,7 @@ RUN mvn --no-transfer-progress package && \
mvn clean
# Step 2 - Run Ant Deploy
-FROM openjdk:${JDK_VERSION}-slim as ant_build
+FROM eclipse-temurin:${JDK_VERSION} as ant_build
ARG TARGET_DIR=dspace-installer
# COPY the /install directory from 'build' container to /dspace-src in this container
COPY --from=build /install /dspace-src
@@ -34,9 +34,9 @@ WORKDIR /dspace-src
ENV ANT_VERSION 1.10.13
ENV ANT_HOME /tmp/ant-$ANT_VERSION
ENV PATH $ANT_HOME/bin:$PATH
-# Need wget to install ant, and unzip for managing AIPs
+# Need wget to install ant
RUN apt-get update \
- && apt-get install -y --no-install-recommends wget unzip \
+ && apt-get install -y --no-install-recommends wget \
&& apt-get purge -y --auto-remove \
&& rm -rf /var/lib/apt/lists/*
# Download and install 'ant'
@@ -46,10 +46,15 @@ RUN mkdir $ANT_HOME && \
RUN ant init_installation update_configs update_code
# Step 3 - Run jdk
-FROM openjdk:${JDK_VERSION}
+FROM eclipse-temurin:${JDK_VERSION}
# NOTE: DSPACE_INSTALL must align with the "dspace.dir" default configuration.
ENV DSPACE_INSTALL=/dspace
# Copy the /dspace directory from 'ant_build' container to /dspace in this container
COPY --from=ant_build /dspace $DSPACE_INSTALL
# Give java extra memory (1GB)
ENV JAVA_OPTS=-Xmx1000m
+# Install unzip for AIPs
+RUN apt-get update \
+ && apt-get install -y --no-install-recommends unzip \
+ && apt-get purge -y --auto-remove \
+ && rm -rf /var/lib/apt/lists/*
diff --git a/Dockerfile.dependencies b/Dockerfile.dependencies
index 6f72ab058536..2ca4d3040e98 100644
--- a/Dockerfile.dependencies
+++ b/Dockerfile.dependencies
@@ -2,12 +2,12 @@
# The purpose of this image is to make the build for dspace/dspace run faster
#
-# This Dockerfile uses JDK11 by default, but has also been tested with JDK17.
-# To build with JDK17, use "--build-arg JDK_VERSION=17"
-ARG JDK_VERSION=11
+# This Dockerfile uses JDK17 by default.
+# To build with other versions, use "--build-arg JDK_VERSION=[value]"
+ARG JDK_VERSION=17
# Step 1 - Run Maven Build
-FROM maven:3-openjdk-${JDK_VERSION}-slim as build
+FROM maven:3-eclipse-temurin-${JDK_VERSION} as build
ARG TARGET_DIR=dspace-installer
WORKDIR /app
# Create the 'dspace' user account & home directory
diff --git a/Dockerfile.test b/Dockerfile.test
index 6fcc4eda6be1..cdfd5e83af5f 100644
--- a/Dockerfile.test
+++ b/Dockerfile.test
@@ -5,9 +5,9 @@
#
# This image is meant for TESTING/DEVELOPMENT ONLY as it deploys the old v6 REST API under HTTP (not HTTPS)
-# This Dockerfile uses JDK11 by default, but has also been tested with JDK17.
-# To build with JDK17, use "--build-arg JDK_VERSION=17"
-ARG JDK_VERSION=11
+# This Dockerfile uses JDK17 by default.
+# To build with other versions, use "--build-arg JDK_VERSION=[value]"
+ARG JDK_VERSION=17
ARG DSPACE_VERSION=latest
# Step 1 - Run Maven Build
@@ -26,9 +26,11 @@ ADD --chown=dspace . /app/
RUN mvn --no-transfer-progress package && \
mv /app/dspace/target/${TARGET_DIR}/* /install && \
mvn clean
+# Remove the server webapp to keep image small. Rename runnable JAR to server-boot.jar.
+RUN rm -rf /install/webapps/server/
# Step 2 - Run Ant Deploy
-FROM openjdk:${JDK_VERSION}-slim as ant_build
+FROM eclipse-temurin:${JDK_VERSION} as ant_build
ARG TARGET_DIR=dspace-installer
# COPY the /install directory from 'build' container to /dspace-src in this container
COPY --from=build /install /dspace-src
@@ -48,29 +50,18 @@ RUN mkdir $ANT_HOME && \
# Run necessary 'ant' deploy scripts
RUN ant init_installation update_configs update_code update_webapps
-# Step 3 - Run tomcat
-# Create a new tomcat image that does not retain the the build directory contents
-FROM tomcat:9-jdk${JDK_VERSION}
+# Step 3 - Start up DSpace via Runnable JAR
+FROM eclipse-temurin:${JDK_VERSION}
+# NOTE: DSPACE_INSTALL must align with the "dspace.dir" default configuration.
ENV DSPACE_INSTALL=/dspace
-ENV TOMCAT_INSTALL=/usr/local/tomcat
-# Copy the /dspace directory from 'ant_build' containger to /dspace in this container
+# Copy the /dspace directory from 'ant_build' container to /dspace in this container
COPY --from=ant_build /dspace $DSPACE_INSTALL
-# Enable the AJP connector in Tomcat's server.xml
-# NOTE: secretRequired="false" should only be used when AJP is NOT accessible from an external network. But, secretRequired="true" isn't supported by mod_proxy_ajp until Apache 2.5
-RUN sed -i '/Service name="Catalina".*/a \\n ' $TOMCAT_INSTALL/conf/server.xml
-# Expose Tomcat port and AJP port
-EXPOSE 8080 8009 8000
+WORKDIR $DSPACE_INSTALL
+# Expose Tomcat port and debugging port
+EXPOSE 8080 8000
# Give java extra memory (2GB)
ENV JAVA_OPTS=-Xmx2000m
# Set up debugging
ENV CATALINA_OPTS=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:8000
-
-# Link the DSpace 'server' webapp into Tomcat's webapps directory.
-# This ensures that when we start Tomcat, it runs from /server path (e.g. http://localhost:8080/server/)
-RUN ln -s $DSPACE_INSTALL/webapps/server /usr/local/tomcat/webapps/server
-# If you wish to run "server" webapp off the ROOT path, then comment out the above RUN, and uncomment the below RUN.
-# You also MUST update the 'dspace.server.url' configuration to match.
-# Please note that server webapp should only run on one path at a time.
-#RUN mv /usr/local/tomcat/webapps/ROOT /usr/local/tomcat/webapps/ROOT.bk && \
-# ln -s $DSPACE_INSTALL/webapps/server /usr/local/tomcat/webapps/ROOT
-
+# On startup, run DSpace Runnable JAR
+ENTRYPOINT ["java", "-jar", "webapps/server-boot.jar", "--dspace.dir=$DSPACE_INSTALL"]
diff --git a/LICENSES_THIRD_PARTY b/LICENSES_THIRD_PARTY
index e494c80c5d6e..d7e928147c89 100644
--- a/LICENSES_THIRD_PARTY
+++ b/LICENSES_THIRD_PARTY
@@ -25,25 +25,29 @@ https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines
* AWS Java SDK for AWS KMS (com.amazonaws:aws-java-sdk-kms:1.12.261 - https://aws.amazon.com/sdkforjava)
* AWS Java SDK for Amazon S3 (com.amazonaws:aws-java-sdk-s3:1.12.261 - https://aws.amazon.com/sdkforjava)
* JMES Path Query library (com.amazonaws:jmespath-java:1.12.261 - https://aws.amazon.com/sdkforjava)
+ * Titanium JSON-LD 1.1 (JRE11) (com.apicatalog:titanium-json-ld:1.3.2 - https://github.com/filip26/titanium-json-ld)
* HPPC Collections (com.carrotsearch:hppc:0.8.1 - http://labs.carrotsearch.com/hppc.html/hppc)
- * com.drewnoakes:metadata-extractor (com.drewnoakes:metadata-extractor:2.18.0 - https://drewnoakes.com/code/exif/)
+ * com.drewnoakes:metadata-extractor (com.drewnoakes:metadata-extractor:2.19.0 - https://drewnoakes.com/code/exif/)
* parso (com.epam:parso:2.0.14 - https://github.com/epam/parso)
- * Esri Geometry API for Java (com.esri.geometry:esri-geometry-api:2.2.0 - https://github.com/Esri/geometry-api-java)
- * ClassMate (com.fasterxml:classmate:1.3.0 - http://github.com/cowtowncoder/java-classmate)
- * Jackson-annotations (com.fasterxml.jackson.core:jackson-annotations:2.13.4 - http://github.com/FasterXML/jackson)
- * Jackson-core (com.fasterxml.jackson.core:jackson-core:2.13.4 - https://github.com/FasterXML/jackson-core)
- * jackson-databind (com.fasterxml.jackson.core:jackson-databind:2.13.4.2 - http://github.com/FasterXML/jackson)
+ * ClassMate (com.fasterxml:classmate:1.6.0 - https://github.com/FasterXML/java-classmate)
+ * Jackson-annotations (com.fasterxml.jackson.core:jackson-annotations:2.16.0 - https://github.com/FasterXML/jackson)
+ * Jackson-core (com.fasterxml.jackson.core:jackson-core:2.16.0 - https://github.com/FasterXML/jackson-core)
+ * jackson-databind (com.fasterxml.jackson.core:jackson-databind:2.16.0 - https://github.com/FasterXML/jackson)
* Jackson dataformat: CBOR (com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.12.6 - http://github.com/FasterXML/jackson-dataformats-binary)
- * Jackson dataformat: Smile (com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.13.3 - http://github.com/FasterXML/jackson-dataformats-binary)
- * Jackson-dataformat-YAML (com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.1 - https://github.com/FasterXML/jackson-dataformats-text)
- * Jackson datatype: jdk8 (com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.5 - https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
- * Jackson datatype: JSR310 (com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.1 - https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
- * Jackson datatype: JSR310 (com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.5 - https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
- * Jackson-module-parameter-names (com.fasterxml.jackson.module:jackson-module-parameter-names:2.13.5 - https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names)
+ * Jackson dataformat: Smile (com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.15.2 - https://github.com/FasterXML/jackson-dataformats-binary)
+ * Jackson-dataformat-TOML (com.fasterxml.jackson.dataformat:jackson-dataformat-toml:2.15.2 - https://github.com/FasterXML/jackson-dataformats-text)
+ * Jackson-dataformat-YAML (com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.16.2 - https://github.com/FasterXML/jackson-dataformats-text)
+ * Jackson datatype: jdk8 (com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.4 - https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+ * Jackson datatype: JSR310 (com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.16.0 - https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+ * Jackson Jakarta-RS: base (com.fasterxml.jackson.jakarta.rs:jackson-jakarta-rs-base:2.16.2 - https://github.com/FasterXML/jackson-jakarta-rs-providers/jackson-jakarta-rs-base)
+ * Jackson Jakarta-RS: JSON (com.fasterxml.jackson.jakarta.rs:jackson-jakarta-rs-json-provider:2.16.2 - https://github.com/FasterXML/jackson-jakarta-rs-providers/jackson-jakarta-rs-json-provider)
+ * Jackson module: Jakarta XML Bind Annotations (jakarta.xml.bind) (com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:2.16.2 - https://github.com/FasterXML/jackson-modules-base)
+ * Jackson-module-parameter-names (com.fasterxml.jackson.module:jackson-module-parameter-names:2.15.4 - https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names)
* Java UUID Generator (com.fasterxml.uuid:java-uuid-generator:4.0.1 - https://github.com/cowtowncoder/java-uuid-generator)
- * Woodstox (com.fasterxml.woodstox:woodstox-core:6.2.4 - https://github.com/FasterXML/woodstox)
- * zjsonpatch (com.flipkart.zjsonpatch:zjsonpatch:0.4.6 - https://github.com/flipkart-incubator/zjsonpatch/)
- * Caffeine cache (com.github.ben-manes.caffeine:caffeine:2.9.2 - https://github.com/ben-manes/caffeine)
+ * Woodstox (com.fasterxml.woodstox:woodstox-core:6.5.1 - https://github.com/FasterXML/woodstox)
+ * zjsonpatch (com.flipkart.zjsonpatch:zjsonpatch:0.4.16 - https://github.com/flipkart-incubator/zjsonpatch/)
+ * Caffeine cache (com.github.ben-manes.caffeine:caffeine:2.9.3 - https://github.com/ben-manes/caffeine)
+ * Caffeine cache (com.github.ben-manes.caffeine:caffeine:3.1.6 - https://github.com/ben-manes/caffeine)
* btf (com.github.java-json-tools:btf:1.3 - https://github.com/java-json-tools/btf)
* jackson-coreutils (com.github.java-json-tools:jackson-coreutils:2.0 - https://github.com/java-json-tools/jackson-coreutils)
* jackson-coreutils-equivalence (com.github.java-json-tools:jackson-coreutils-equivalence:1.0 - https://github.com/java-json-tools/jackson-coreutils)
@@ -54,9 +58,9 @@ https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines
* JCIP Annotations under Apache License (com.github.stephenc.jcip:jcip-annotations:1.0-1 - http://stephenc.github.com/jcip-annotations)
* Google APIs Client Library for Java (com.google.api-client:google-api-client:1.23.0 - https://github.com/google/google-api-java-client/google-api-client)
* Google Analytics API v3-rev145-1.23.0 (com.google.apis:google-api-services-analytics:v3-rev145-1.23.0 - http://nexus.sonatype.org/oss-repository-hosting.html/google-api-services-analytics)
- * FindBugs-jsr305 (com.google.code.findbugs:jsr305:3.0.1 - http://findbugs.sourceforge.net/)
- * Gson (com.google.code.gson:gson:2.9.0 - https://github.com/google/gson/gson)
- * error-prone annotations (com.google.errorprone:error_prone_annotations:2.18.0 - https://errorprone.info/error_prone_annotations)
+ * FindBugs-jsr305 (com.google.code.findbugs:jsr305:3.0.2 - http://findbugs.sourceforge.net/)
+ * Gson (com.google.code.gson:gson:2.10.1 - https://github.com/google/gson/gson)
+ * error-prone annotations (com.google.errorprone:error_prone_annotations:2.10.0 - https://errorprone.info/error_prone_annotations)
* Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - https://github.com/google/guava/failureaccess)
* Guava: Google Core Libraries for Java (com.google.guava:guava:32.0.0-jre - https://github.com/google/guava)
* Guava: Google Core Libraries for Java (JDK5 Backport) (com.google.guava:guava-jdk5:17.0 - http://code.google.com/p/guava-libraries/guava-jdk5)
@@ -64,25 +68,24 @@ https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines
* Google HTTP Client Library for Java (com.google.http-client:google-http-client:1.23.0 - https://github.com/google/google-http-java-client/google-http-client)
* GSON extensions to the Google HTTP Client Library for Java. (com.google.http-client:google-http-client-gson:1.41.7 - https://github.com/googleapis/google-http-java-client/google-http-client-gson)
* Jackson 2 extensions to the Google HTTP Client Library for Java. (com.google.http-client:google-http-client-jackson2:1.23.0 - https://github.com/google/google-http-java-client/google-http-client-jackson2)
+ * J2ObjC Annotations (com.google.j2objc:j2objc-annotations:1.3 - https://github.com/google/j2objc/)
* J2ObjC Annotations (com.google.j2objc:j2objc-annotations:2.8 - https://github.com/google/j2objc/)
* Google OAuth Client Library for Java (com.google.oauth-client:google-oauth-client:1.33.3 - https://github.com/googleapis/google-oauth-java-client/google-oauth-client)
* ConcurrentLinkedHashMap (com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2 - http://code.google.com/p/concurrentlinkedhashmap)
* libphonenumber (com.googlecode.libphonenumber:libphonenumber:8.11.1 - https://github.com/google/libphonenumber/)
- * Jackcess (com.healthmarketscience.jackcess:jackcess:4.0.2 - https://jackcess.sourceforge.io)
- * Jackcess Encrypt (com.healthmarketscience.jackcess:jackcess-encrypt:4.0.1 - http://jackcessencrypt.sf.net)
- * project ':json-path' (com.jayway.jsonpath:json-path:2.6.0 - https://github.com/jayway/JsonPath)
- * project ':json-path-assert' (com.jayway.jsonpath:json-path-assert:2.6.0 - https://github.com/jayway/JsonPath)
+ * Jackcess (com.healthmarketscience.jackcess:jackcess:4.0.5 - https://jackcess.sourceforge.io)
+ * Jackcess Encrypt (com.healthmarketscience.jackcess:jackcess-encrypt:4.0.2 - http://jackcessencrypt.sf.net)
+ * json-path (com.jayway.jsonpath:json-path:2.9.0 - https://github.com/jayway/JsonPath)
+ * json-path-assert (com.jayway.jsonpath:json-path-assert:2.9.0 - https://github.com/jayway/JsonPath)
* Disruptor Framework (com.lmax:disruptor:3.4.2 - http://lmax-exchange.github.com/disruptor)
- * builder-commons (com.lyncode:builder-commons:1.0.2 - http://nexus.sonatype.org/oss-repository-hosting.html/builder-commons)
- * MaxMind DB Reader (com.maxmind.db:maxmind-db:1.2.2 - http://dev.maxmind.com/)
- * MaxMind GeoIP2 API (com.maxmind.geoip2:geoip2:2.11.0 - http://dev.maxmind.com/geoip/geoip2/web-services)
- * Nimbus JOSE+JWT (com.nimbusds:nimbus-jose-jwt:7.9 - https://bitbucket.org/connect2id/nimbus-jose-jwt)
- * opencsv (com.opencsv:opencsv:5.6 - http://opencsv.sf.net)
+ * MaxMind DB Reader (com.maxmind.db:maxmind-db:2.1.0 - http://dev.maxmind.com/)
+ * MaxMind GeoIP2 API (com.maxmind.geoip2:geoip2:2.17.0 - https://dev.maxmind.com/geoip?lang=en)
+ * Nimbus JOSE+JWT (com.nimbusds:nimbus-jose-jwt:9.37.3 - https://bitbucket.org/connect2id/nimbus-jose-jwt)
+ * opencsv (com.opencsv:opencsv:5.9 - http://opencsv.sf.net)
* java-libpst (com.pff:java-libpst:0.9.3 - https://github.com/rjohnsondev/java-libpst)
* rome (com.rometools:rome:1.19.0 - http://rometools.com/rome)
* rome-modules (com.rometools:rome-modules:1.19.0 - http://rometools.com/rome-modules)
* rome-utils (com.rometools:rome-utils:1.19.0 - http://rometools.com/rome-utils)
- * fastinfoset (com.sun.xml.fastinfoset:FastInfoset:1.2.15 - http://fi.java.net)
* T-Digest (com.tdunning:t-digest:3.1 - https://github.com/tdunning/t-digest)
* config (com.typesafe:config:1.3.3 - https://github.com/lightbend/config)
* ssl-config-core (com.typesafe:ssl-config-core_2.13:0.3.8 - https://github.com/lightbend/ssl-config)
@@ -94,240 +97,282 @@ https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines
* akka-stream (com.typesafe.akka:akka-stream_2.13:2.5.31 - https://akka.io/)
* scala-logging (com.typesafe.scala-logging:scala-logging_2.13:3.9.2 - https://github.com/lightbend/scala-logging)
* JSON library from Android SDK (com.vaadin.external.google:android-json:0.0.20131108.vaadin1 - http://developer.android.com/sdk)
- * SparseBitSet (com.zaxxer:SparseBitSet:1.2 - https://github.com/brettwooldridge/SparseBitSet)
+ * SparseBitSet (com.zaxxer:SparseBitSet:1.3 - https://github.com/brettwooldridge/SparseBitSet)
* Apache Commons BeanUtils (commons-beanutils:commons-beanutils:1.9.4 - https://commons.apache.org/proper/commons-beanutils/)
- * Apache Commons CLI (commons-cli:commons-cli:1.4 - http://commons.apache.org/proper/commons-cli/)
- * Apache Commons Codec (commons-codec:commons-codec:1.10 - http://commons.apache.org/proper/commons-codec/)
+ * Apache Commons CLI (commons-cli:commons-cli:1.6.0 - https://commons.apache.org/proper/commons-cli/)
+ * Apache Commons Codec (commons-codec:commons-codec:1.16.0 - https://commons.apache.org/proper/commons-codec/)
* Apache Commons Collections (commons-collections:commons-collections:3.2.2 - http://commons.apache.org/collections/)
- * Commons Digester (commons-digester:commons-digester:1.8.1 - http://commons.apache.org/digester/)
- * Apache Commons FileUpload (commons-fileupload:commons-fileupload:1.5 - https://commons.apache.org/proper/commons-fileupload/)
- * Apache Commons IO (commons-io:commons-io:2.7 - https://commons.apache.org/proper/commons-io/)
+ * Commons Digester (commons-digester:commons-digester:2.1 - http://commons.apache.org/digester/)
+ * Apache Commons IO (commons-io:commons-io:2.15.1 - https://commons.apache.org/proper/commons-io/)
* Commons Lang (commons-lang:commons-lang:2.6 - http://commons.apache.org/lang/)
- * Apache Commons Logging (commons-logging:commons-logging:1.2 - http://commons.apache.org/proper/commons-logging/)
- * Apache Commons Validator (commons-validator:commons-validator:1.5.0 - http://commons.apache.org/proper/commons-validator/)
+ * Apache Commons Logging (commons-logging:commons-logging:1.3.0 - https://commons.apache.org/proper/commons-logging/)
+ * Apache Commons Validator (commons-validator:commons-validator:1.7 - http://commons.apache.org/proper/commons-validator/)
* GeoJson POJOs for Jackson (de.grundid.opendatalab:geojson-jackson:1.14 - https://github.com/opendatalab-de/geojson-jackson)
+ * broker-client (eu.openaire:broker-client:1.1.2 - http://api.openaire.eu/broker/broker-client)
* OpenAIRE Funders Model (eu.openaire:funders-model:2.0.0 - https://api.openaire.eu)
* Metrics Core (io.dropwizard.metrics:metrics-core:4.1.5 - https://metrics.dropwizard.io/metrics-core)
* Graphite Integration for Metrics (io.dropwizard.metrics:metrics-graphite:4.1.5 - https://metrics.dropwizard.io/metrics-graphite)
* Metrics Integration for Jetty 9.3 and higher (io.dropwizard.metrics:metrics-jetty9:4.1.5 - https://metrics.dropwizard.io/metrics-jetty9)
* Metrics Integration with JMX (io.dropwizard.metrics:metrics-jmx:4.1.5 - https://metrics.dropwizard.io/metrics-jmx)
* JVM Integration for Metrics (io.dropwizard.metrics:metrics-jvm:4.1.5 - https://metrics.dropwizard.io/metrics-jvm)
- * micrometer-core (io.micrometer:micrometer-core:1.9.11 - https://github.com/micrometer-metrics/micrometer)
- * Netty/Buffer (io.netty:netty-buffer:4.1.68.Final - https://netty.io/netty-buffer/)
- * Netty/Codec (io.netty:netty-codec:4.1.68.Final - https://netty.io/netty-codec/)
+ * SWORD v2 Common Server Library (forked) (io.gdcc:sword2-server:2.0.0 - https://github.com/gdcc/sword2-server)
+ * micrometer-commons (io.micrometer:micrometer-commons:1.12.6 - https://github.com/micrometer-metrics/micrometer)
+ * micrometer-core (io.micrometer:micrometer-core:1.12.6 - https://github.com/micrometer-metrics/micrometer)
+ * micrometer-jakarta9 (io.micrometer:micrometer-jakarta9:1.12.6 - https://github.com/micrometer-metrics/micrometer)
+ * micrometer-observation (io.micrometer:micrometer-observation:1.12.6 - https://github.com/micrometer-metrics/micrometer)
+ * Netty/Buffer (io.netty:netty-buffer:4.1.106.Final - https://netty.io/netty-buffer/)
+ * Netty/Buffer (io.netty:netty-buffer:4.1.99.Final - https://netty.io/netty-buffer/)
+ * Netty/Codec (io.netty:netty-codec:4.1.106.Final - https://netty.io/netty-codec/)
+ * Netty/Codec (io.netty:netty-codec:4.1.99.Final - https://netty.io/netty-codec/)
* Netty/Codec/HTTP (io.netty:netty-codec-http:4.1.53.Final - https://netty.io/netty-codec-http/)
* Netty/Codec/Socks (io.netty:netty-codec-socks:4.1.53.Final - https://netty.io/netty-codec-socks/)
- * Netty/Common (io.netty:netty-common:4.1.68.Final - https://netty.io/netty-common/)
- * Netty/Handler (io.netty:netty-handler:4.1.68.Final - https://netty.io/netty-handler/)
+ * Netty/Common (io.netty:netty-common:4.1.106.Final - https://netty.io/netty-common/)
+ * Netty/Common (io.netty:netty-common:4.1.99.Final - https://netty.io/netty-common/)
+ * Netty/Handler (io.netty:netty-handler:4.1.106.Final - https://netty.io/netty-handler/)
+ * Netty/Handler (io.netty:netty-handler:4.1.99.Final - https://netty.io/netty-handler/)
* Netty/Handler/Proxy (io.netty:netty-handler-proxy:4.1.53.Final - https://netty.io/netty-handler-proxy/)
- * Netty/Resolver (io.netty:netty-resolver:4.1.68.Final - https://netty.io/netty-resolver/)
- * Netty/Transport (io.netty:netty-transport:4.1.68.Final - https://netty.io/netty-transport/)
- * Netty/Transport/Native/Epoll (io.netty:netty-transport-native-epoll:4.1.68.Final - https://netty.io/netty-transport-native-epoll/)
- * Netty/Transport/Native/Unix/Common (io.netty:netty-transport-native-unix-common:4.1.68.Final - https://netty.io/netty-transport-native-unix-common/)
+ * Netty/Resolver (io.netty:netty-resolver:4.1.99.Final - https://netty.io/netty-resolver/)
+ * Netty/Transport (io.netty:netty-transport:4.1.106.Final - https://netty.io/netty-transport/)
+ * Netty/Transport (io.netty:netty-transport:4.1.99.Final - https://netty.io/netty-transport/)
+ * Netty/Transport/Native/Epoll (io.netty:netty-transport-native-epoll:4.1.99.Final - https://netty.io/netty-transport-native-epoll/)
+ * Netty/Transport/Native/Unix/Common (io.netty:netty-transport-native-unix-common:4.1.106.Final - https://netty.io/netty-transport-native-unix-common/)
+ * Netty/Transport/Native/Unix/Common (io.netty:netty-transport-native-unix-common:4.1.99.Final - https://netty.io/netty-transport-native-unix-common/)
* OpenTracing API (io.opentracing:opentracing-api:0.33.0 - https://github.com/opentracing/opentracing-java/opentracing-api)
* OpenTracing-noop (io.opentracing:opentracing-noop:0.33.0 - https://github.com/opentracing/opentracing-java/opentracing-noop)
* OpenTracing-util (io.opentracing:opentracing-util:0.33.0 - https://github.com/opentracing/opentracing-java/opentracing-util)
* Google S2 geometry library (io.sgr:s2-geometry-library-java:1.0.0 - https://github.com/sgr-io/s2-geometry-library-java)
+ * Jandex: Core (io.smallrye:jandex:3.1.2 - https://smallrye.io)
* swagger-annotations (io.swagger:swagger-annotations:1.6.2 - https://github.com/swagger-api/swagger-core/modules/swagger-annotations)
* swagger-compat-spec-parser (io.swagger:swagger-compat-spec-parser:1.0.52 - http://nexus.sonatype.org/oss-repository-hosting.html/swagger-parser-project/modules/swagger-compat-spec-parser)
* swagger-core (io.swagger:swagger-core:1.6.2 - https://github.com/swagger-api/swagger-core/modules/swagger-core)
* swagger-models (io.swagger:swagger-models:1.6.2 - https://github.com/swagger-api/swagger-core/modules/swagger-models)
* swagger-parser (io.swagger:swagger-parser:1.0.52 - http://nexus.sonatype.org/oss-repository-hosting.html/swagger-parser-project/modules/swagger-parser)
* swagger-annotations (io.swagger.core.v3:swagger-annotations:2.1.5 - https://github.com/swagger-api/swagger-core/modules/swagger-annotations)
+ * swagger-annotations-jakarta (io.swagger.core.v3:swagger-annotations-jakarta:2.2.21 - https://github.com/swagger-api/swagger-core/modules/swagger-annotations-jakarta)
* swagger-core (io.swagger.core.v3:swagger-core:2.1.5 - https://github.com/swagger-api/swagger-core/modules/swagger-core)
+ * swagger-core-jakarta (io.swagger.core.v3:swagger-core-jakarta:2.2.21 - https://github.com/swagger-api/swagger-core/modules/swagger-core-jakarta)
+ * swagger-integration-jakarta (io.swagger.core.v3:swagger-integration-jakarta:2.2.21 - https://github.com/swagger-api/swagger-core/modules/swagger-integration-jakarta)
+ * swagger-jaxrs2-jakarta (io.swagger.core.v3:swagger-jaxrs2-jakarta:2.2.21 - https://github.com/swagger-api/swagger-core/modules/swagger-jaxrs2-jakarta)
* swagger-models (io.swagger.core.v3:swagger-models:2.1.5 - https://github.com/swagger-api/swagger-core/modules/swagger-models)
+ * swagger-models-jakarta (io.swagger.core.v3:swagger-models-jakarta:2.2.21 - https://github.com/swagger-api/swagger-core/modules/swagger-models-jakarta)
* swagger-parser (io.swagger.parser.v3:swagger-parser:2.0.23 - http://nexus.sonatype.org/oss-repository-hosting.html/swagger-parser-project/modules/swagger-parser)
* swagger-parser (io.swagger.parser.v3:swagger-parser-core:2.0.23 - http://nexus.sonatype.org/oss-repository-hosting.html/swagger-parser-project/modules/swagger-parser-core)
* swagger-parser-v2-converter (io.swagger.parser.v3:swagger-parser-v2-converter:2.0.23 - http://nexus.sonatype.org/oss-repository-hosting.html/swagger-parser-project/modules/swagger-parser-v2-converter)
* swagger-parser-v3 (io.swagger.parser.v3:swagger-parser-v3:2.0.23 - http://nexus.sonatype.org/oss-repository-hosting.html/swagger-parser-project/modules/swagger-parser-v3)
- * Jakarta Bean Validation API (jakarta.validation:jakarta.validation-api:2.0.2 - https://beanvalidation.org)
- * JSR107 API and SPI (javax.cache:cache-api:1.1.0 - https://github.com/jsr107/jsr107spec)
+ * Jakarta Dependency Injection (jakarta.inject:jakarta.inject-api:2.0.1 - https://github.com/eclipse-ee4j/injection-api)
+ * Jakarta Bean Validation API (jakarta.validation:jakarta.validation-api:3.0.2 - https://beanvalidation.org)
+ * JSR107 API and SPI (javax.cache:cache-api:1.1.1 - https://github.com/jsr107/jsr107spec)
* javax.inject (javax.inject:javax.inject:1 - http://code.google.com/p/atinject/)
- * Bean Validation API (javax.validation:validation-api:2.0.1.Final - http://beanvalidation.org)
+ * Bean Validation API (javax.validation:validation-api:1.1.0.Final - http://beanvalidation.org)
* jdbm (jdbm:jdbm:1.0 - no url defined)
- * Joda-Time (joda-time:joda-time:2.9.2 - http://www.joda.org/joda-time/)
+ * Joda-Time (joda-time:joda-time:2.12.5 - https://www.joda.org/joda-time/)
* Byte Buddy (without dependencies) (net.bytebuddy:byte-buddy:1.11.13 - https://bytebuddy.net/byte-buddy)
* Byte Buddy agent (net.bytebuddy:byte-buddy-agent:1.11.13 - https://bytebuddy.net/byte-buddy-agent)
* eigenbase-properties (net.hydromatic:eigenbase-properties:1.1.5 - http://github.com/julianhyde/eigenbase-properties)
* json-unit-core (net.javacrumbs.json-unit:json-unit-core:2.19.0 - https://github.com/lukas-krecan/JsonUnit/json-unit-core)
* "Java Concurrency in Practice" book annotations (net.jcip:jcip-annotations:1.0 - http://jcip.net/)
- * ASM based accessors helper used by json-smart (net.minidev:accessors-smart:1.2 - http://www.minidev.net/)
- * ASM based accessors helper used by json-smart (net.minidev:accessors-smart:2.4.7 - https://urielch.github.io/)
- * JSON Small and Fast Parser (net.minidev:json-smart:2.3 - http://www.minidev.net/)
- * JSON Small and Fast Parser (net.minidev:json-smart:2.4.7 - https://urielch.github.io/)
+ * ASM based accessors helper used by json-smart (net.minidev:accessors-smart:2.5.0 - https://urielch.github.io/)
+ * JSON Small and Fast Parser (net.minidev:json-smart:2.5.0 - https://urielch.github.io/)
* Abdera Core (org.apache.abdera:abdera-core:1.1.3 - http://abdera.apache.org/abdera-core)
* I18N Libraries (org.apache.abdera:abdera-i18n:1.1.3 - http://abdera.apache.org)
- * Apache Ant Core (org.apache.ant:ant:1.10.11 - https://ant.apache.org/)
- * Apache Ant Launcher (org.apache.ant:ant-launcher:1.10.11 - https://ant.apache.org/)
- * Apache Commons BCEL (org.apache.bcel:bcel:6.6.0 - https://commons.apache.org/proper/commons-bcel)
- * Calcite Core (org.apache.calcite:calcite-core:1.27.0 - https://calcite.apache.org)
- * Calcite Linq4j (org.apache.calcite:calcite-linq4j:1.27.0 - https://calcite.apache.org)
- * Apache Calcite Avatica (org.apache.calcite.avatica:avatica-core:1.18.0 - https://calcite.apache.org/avatica)
- * Apache Commons Collections (org.apache.commons:commons-collections4:4.1 - http://commons.apache.org/proper/commons-collections/)
- * Apache Commons Compress (org.apache.commons:commons-compress:1.21 - https://commons.apache.org/proper/commons-compress/)
- * Apache Commons Configuration (org.apache.commons:commons-configuration2:2.8.0 - https://commons.apache.org/proper/commons-configuration/)
- * Apache Commons CSV (org.apache.commons:commons-csv:1.9.0 - https://commons.apache.org/proper/commons-csv/)
- * Apache Commons DBCP (org.apache.commons:commons-dbcp2:2.9.0 - https://commons.apache.org/dbcp/)
+ * Abdera Parser (org.apache.abdera:abdera-parser:1.1.3 - http://abdera.apache.org/abdera-parser)
+ * Apache Ant Core (org.apache.ant:ant:1.10.14 - https://ant.apache.org/)
+ * Apache Ant Launcher (org.apache.ant:ant-launcher:1.10.14 - https://ant.apache.org/)
+ * Apache Commons BCEL (org.apache.bcel:bcel:6.7.0 - https://commons.apache.org/proper/commons-bcel)
+ * Calcite Core (org.apache.calcite:calcite-core:1.35.0 - https://calcite.apache.org)
+ * Calcite Linq4j (org.apache.calcite:calcite-linq4j:1.35.0 - https://calcite.apache.org)
+ * Apache Calcite Avatica (org.apache.calcite.avatica:avatica-core:1.23.0 - https://calcite.apache.org/avatica)
+ * Apache Calcite Avatica Metrics (org.apache.calcite.avatica:avatica-metrics:1.23.0 - https://calcite.apache.org/avatica)
+ * Apache Commons Collections (org.apache.commons:commons-collections4:4.4 - https://commons.apache.org/proper/commons-collections/)
+ * Apache Commons Compress (org.apache.commons:commons-compress:1.26.0 - https://commons.apache.org/proper/commons-compress/)
+ * Apache Commons Configuration (org.apache.commons:commons-configuration2:2.10.1 - https://commons.apache.org/proper/commons-configuration/)
+ * Apache Commons CSV (org.apache.commons:commons-csv:1.10.0 - https://commons.apache.org/proper/commons-csv/)
+ * Apache Commons DBCP (org.apache.commons:commons-dbcp2:2.11.0 - https://commons.apache.org/dbcp/)
* Apache Commons Exec (org.apache.commons:commons-exec:1.3 - http://commons.apache.org/proper/commons-exec/)
- * Apache Commons Lang (org.apache.commons:commons-lang3:3.12.0 - https://commons.apache.org/proper/commons-lang/)
+ * Apache Commons Exec (org.apache.commons:commons-exec:1.4.0 - https://commons.apache.org/proper/commons-exec/)
+ * Apache Commons Lang (org.apache.commons:commons-lang3:3.14.0 - https://commons.apache.org/proper/commons-lang/)
* Apache Commons Math (org.apache.commons:commons-math3:3.6.1 - http://commons.apache.org/proper/commons-math/)
- * Apache Commons Pool (org.apache.commons:commons-pool2:2.11.1 - https://commons.apache.org/proper/commons-pool/)
+ * Apache Commons Pool (org.apache.commons:commons-pool2:2.12.0 - https://commons.apache.org/proper/commons-pool/)
* Apache Commons Text (org.apache.commons:commons-text:1.10.0 - https://commons.apache.org/proper/commons-text)
* Curator Client (org.apache.curator:curator-client:2.13.0 - http://curator.apache.org/curator-client)
* Curator Framework (org.apache.curator:curator-framework:2.13.0 - http://curator.apache.org/curator-framework)
* Curator Recipes (org.apache.curator:curator-recipes:2.13.0 - http://curator.apache.org/curator-recipes)
- * Apache Hadoop Annotations (org.apache.hadoop:hadoop-annotations:3.2.2 - no url defined)
- * Apache Hadoop Auth (org.apache.hadoop:hadoop-auth:3.2.2 - no url defined)
- * Apache Hadoop Common (org.apache.hadoop:hadoop-common:3.2.2 - no url defined)
- * Apache Hadoop HDFS Client (org.apache.hadoop:hadoop-hdfs-client:3.2.2 - no url defined)
+ * Apache Hadoop Annotations (org.apache.hadoop:hadoop-annotations:3.2.4 - no url defined)
+ * Apache Hadoop Auth (org.apache.hadoop:hadoop-auth:3.2.4 - no url defined)
+ * Apache Hadoop Common (org.apache.hadoop:hadoop-common:3.2.4 - no url defined)
+ * Apache Hadoop HDFS Client (org.apache.hadoop:hadoop-hdfs-client:3.2.4 - no url defined)
* htrace-core4 (org.apache.htrace:htrace-core4:4.1.0-incubating - http://incubator.apache.org/projects/htrace.html)
- * Apache HttpClient (org.apache.httpcomponents:httpclient:4.5.13 - http://hc.apache.org/httpcomponents-client)
- * Apache HttpClient Cache (org.apache.httpcomponents:httpclient-cache:4.2.6 - http://hc.apache.org/httpcomponents-client)
- * Apache HttpCore (org.apache.httpcomponents:httpcore:4.4.15 - http://hc.apache.org/httpcomponents-core-ga)
- * Apache HttpClient Mime (org.apache.httpcomponents:httpmime:4.5.13 - http://hc.apache.org/httpcomponents-client)
- * Apache James :: Mime4j :: Core (org.apache.james:apache-mime4j-core:0.8.4 - http://james.apache.org/mime4j/apache-mime4j-core)
- * Apache James :: Mime4j :: DOM (org.apache.james:apache-mime4j-dom:0.8.4 - http://james.apache.org/mime4j/apache-mime4j-dom)
- * Apache Jena - Libraries POM (org.apache.jena:apache-jena-libs:2.13.0 - http://jena.apache.org/apache-jena-libs/)
- * Apache Jena - ARQ (SPARQL 1.1 Query Engine) (org.apache.jena:jena-arq:2.13.0 - http://jena.apache.org/jena-arq/)
- * Apache Jena - Core (org.apache.jena:jena-core:2.13.0 - http://jena.apache.org/jena-core/)
- * Apache Jena - IRI (org.apache.jena:jena-iri:1.1.2 - http://jena.apache.org/jena-iri/)
- * Apache Jena - TDB (Native Triple Store) (org.apache.jena:jena-tdb:1.1.2 - http://jena.apache.org/jena-tdb/)
+ * Apache HttpClient (org.apache.httpcomponents:httpclient:4.5.14 - http://hc.apache.org/httpcomponents-client-ga)
+ * Apache HttpClient Cache (org.apache.httpcomponents:httpclient-cache:4.5.14 - http://hc.apache.org/httpcomponents-client-ga)
+ * Apache HttpCore (org.apache.httpcomponents:httpcore:4.4.16 - http://hc.apache.org/httpcomponents-core-ga)
+ * Apache HttpClient Mime (org.apache.httpcomponents:httpmime:4.5.14 - http://hc.apache.org/httpcomponents-client-ga)
+ * Apache HttpClient (org.apache.httpcomponents.client5:httpclient5:5.1.3 - https://hc.apache.org/httpcomponents-client-5.0.x/5.1.3/httpclient5/)
+ * Apache HttpClient (org.apache.httpcomponents.client5:httpclient5:5.3.1 - https://hc.apache.org/httpcomponents-client-5.0.x/5.3.1/httpclient5/)
+ * Apache HttpComponents Core HTTP/1.1 (org.apache.httpcomponents.core5:httpcore5:5.1.3 - https://hc.apache.org/httpcomponents-core-5.1.x/5.1.3/httpcore5/)
+ * Apache HttpComponents Core HTTP/1.1 (org.apache.httpcomponents.core5:httpcore5:5.2.4 - https://hc.apache.org/httpcomponents-core-5.2.x/5.2.4/httpcore5/)
+ * Apache HttpComponents Core HTTP/2 (org.apache.httpcomponents.core5:httpcore5-h2:5.1.3 - https://hc.apache.org/httpcomponents-core-5.1.x/5.1.3/httpcore5-h2/)
+ * Apache HttpComponents Core HTTP/2 (org.apache.httpcomponents.core5:httpcore5-h2:5.2.4 - https://hc.apache.org/httpcomponents-core-5.2.x/5.2.4/httpcore5-h2/)
+ * Apache James :: Mime4j :: Core (org.apache.james:apache-mime4j-core:0.8.10 - http://james.apache.org/mime4j/apache-mime4j-core)
+ * Apache James :: Mime4j :: DOM (org.apache.james:apache-mime4j-dom:0.8.11 - http://james.apache.org/mime4j/apache-mime4j-dom)
+ * Apache Jena - Libraries POM (org.apache.jena:apache-jena-libs:4.9.0 - https://jena.apache.org/apache-jena-libs/)
+ * Apache Jena - ARQ (org.apache.jena:jena-arq:4.9.0 - https://jena.apache.org/jena-arq/)
+ * Apache Jena - Base (org.apache.jena:jena-base:4.9.0 - https://jena.apache.org/jena-base/)
+ * Apache Jena - Core (org.apache.jena:jena-core:4.9.0 - https://jena.apache.org/jena-core/)
+ * Apache Jena - DBOE Base (org.apache.jena:jena-dboe-base:4.9.0 - https://jena.apache.org/jena-dboe-base/)
+ * Apache Jena - DBOE Indexes (org.apache.jena:jena-dboe-index:4.9.0 - https://jena.apache.org/jena-dboe-index/)
+ * Apache Jena - DBOE Storage (org.apache.jena:jena-dboe-storage:4.9.0 - https://jena.apache.org/jena-dboe-storage/)
+ * Apache Jena - DBOE Transactional Datastructures (org.apache.jena:jena-dboe-trans-data:4.9.0 - https://jena.apache.org/jena-dboe-trans-data/)
+ * Apache Jena - DBOE Transactions (org.apache.jena:jena-dboe-transaction:4.9.0 - https://jena.apache.org/jena-dboe-transaction/)
+ * Apache Jena - IRI (org.apache.jena:jena-iri:4.9.0 - https://jena.apache.org/jena-iri/)
+ * Apache Jena - RDF Connection (org.apache.jena:jena-rdfconnection:4.9.0 - https://jena.apache.org/jena-rdfconnection/)
+ * Apache Jena - RDF Patch (org.apache.jena:jena-rdfpatch:4.9.0 - https://jena.apache.org/jena-rdfpatch/)
+ * Apache Jena - SHACL (org.apache.jena:jena-shacl:4.9.0 - https://jena.apache.org/jena-shacl/)
+ * Apache Jena - ShEx (org.apache.jena:jena-shex:4.9.0 - https://jena.apache.org/jena-shex/)
+ * Apache Jena - TDB1 (Native Triple Store) (org.apache.jena:jena-tdb:4.9.0 - https://jena.apache.org/jena-tdb/)
+ * Apache Jena - TDB2 (Native Triple Store) (org.apache.jena:jena-tdb2:4.9.0 - https://jena.apache.org/jena-tdb2/)
* Kerby-kerb core (org.apache.kerby:kerb-core:1.0.1 - http://directory.apache.org/kerby/kerby-kerb/kerb-core)
* Kerby-kerb Util (org.apache.kerby:kerb-util:1.0.1 - http://directory.apache.org/kerby/kerby-kerb/kerb-util)
* Kerby ASN1 Project (org.apache.kerby:kerby-asn1:1.0.1 - http://directory.apache.org/kerby/kerby-common/kerby-asn1)
* Kerby PKIX Project (org.apache.kerby:kerby-pkix:1.0.1 - http://directory.apache.org/kerby/kerby-pkix)
- * Apache Log4j 1.x Compatibility API (org.apache.logging.log4j:log4j-1.2-api:2.20.0 - https://logging.apache.org/log4j/2.x/log4j-1.2-api/)
- * Apache Log4j API (org.apache.logging.log4j:log4j-api:2.20.0 - https://logging.apache.org/log4j/2.x/log4j-api/)
- * Apache Log4j Core (org.apache.logging.log4j:log4j-core:2.20.0 - https://logging.apache.org/log4j/2.x/log4j-core/)
- * Apache Log4j JUL Adapter (org.apache.logging.log4j:log4j-jul:2.20.0 - https://logging.apache.org/log4j/2.x/log4j-jul/)
- * Apache Log4j Layout for JSON template (org.apache.logging.log4j:log4j-layout-template-json:2.17.1 - https://logging.apache.org/log4j/2.x/log4j-layout-template-json/)
- * Apache Log4j SLF4J Binding (org.apache.logging.log4j:log4j-slf4j-impl:2.20.0 - https://logging.apache.org/log4j/2.x/log4j-slf4j-impl/)
- * Apache Log4j Web (org.apache.logging.log4j:log4j-web:2.20.0 - https://logging.apache.org/log4j/2.x/log4j-web/)
- * Lucene Common Analyzers (org.apache.lucene:lucene-analyzers-common:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-analyzers-common)
- * Lucene ICU Analysis Components (org.apache.lucene:lucene-analyzers-icu:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-analyzers-icu)
- * Lucene Kuromoji Japanese Morphological Analyzer (org.apache.lucene:lucene-analyzers-kuromoji:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-analyzers-kuromoji)
- * Lucene Nori Korean Morphological Analyzer (org.apache.lucene:lucene-analyzers-nori:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-analyzers-nori)
- * Lucene Phonetic Filters (org.apache.lucene:lucene-analyzers-phonetic:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-analyzers-phonetic)
- * Lucene Smart Chinese Analyzer (org.apache.lucene:lucene-analyzers-smartcn:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-analyzers-smartcn)
- * Lucene Stempel Analyzer (org.apache.lucene:lucene-analyzers-stempel:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-analyzers-stempel)
- * Lucene Memory (org.apache.lucene:lucene-backward-codecs:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-backward-codecs)
- * Lucene Classification (org.apache.lucene:lucene-classification:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-classification)
- * Lucene codecs (org.apache.lucene:lucene-codecs:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-codecs)
- * Lucene Core (org.apache.lucene:lucene-core:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-core)
- * Lucene Expressions (org.apache.lucene:lucene-expressions:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-expressions)
- * Lucene Grouping (org.apache.lucene:lucene-grouping:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-grouping)
- * Lucene Highlighter (org.apache.lucene:lucene-highlighter:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-highlighter)
- * Lucene Join (org.apache.lucene:lucene-join:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-join)
- * Lucene Memory (org.apache.lucene:lucene-memory:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-memory)
- * Lucene Miscellaneous (org.apache.lucene:lucene-misc:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-misc)
- * Lucene Queries (org.apache.lucene:lucene-queries:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-queries)
- * Lucene QueryParsers (org.apache.lucene:lucene-queryparser:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-queryparser)
- * Lucene Sandbox (org.apache.lucene:lucene-sandbox:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-sandbox)
- * Lucene Spatial Extras (org.apache.lucene:lucene-spatial-extras:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-spatial-extras)
- * Lucene Spatial 3D (org.apache.lucene:lucene-spatial3d:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-spatial3d)
- * Lucene Suggest (org.apache.lucene:lucene-suggest:8.11.2 - https://lucene.apache.org/lucene-parent/lucene-suggest)
- * Apache FontBox (org.apache.pdfbox:fontbox:2.0.28 - http://pdfbox.apache.org/)
+ * Apache Log4j 1.x Compatibility API (org.apache.logging.log4j:log4j-1.2-api:2.23.1 - https://logging.apache.org/log4j/2.x/log4j/log4j-1.2-api/)
+ * Apache Log4j API (org.apache.logging.log4j:log4j-api:2.23.1 - https://logging.apache.org/log4j/2.x/log4j/log4j-api/)
+ * Apache Log4j Core (org.apache.logging.log4j:log4j-core:2.23.1 - https://logging.apache.org/log4j/2.x/log4j/log4j-core/)
+ * Apache Log4j JUL Adapter (org.apache.logging.log4j:log4j-jul:2.23.1 - https://logging.apache.org/log4j/2.x/log4j/log4j-jul/)
+ * Apache Log4j Layout for JSON template (org.apache.logging.log4j:log4j-layout-template-json:2.17.2 - https://logging.apache.org/log4j/2.x/log4j-layout-template-json/)
+ * Apache Log4j SLF4J Binding (org.apache.logging.log4j:log4j-slf4j-impl:2.23.1 - https://logging.apache.org/log4j/2.x/log4j/log4j-slf4j-impl/)
+ * Apache Log4j SLF4J 2.0 Binding (org.apache.logging.log4j:log4j-slf4j2-impl:2.21.1 - https://logging.apache.org/log4j/2.x/log4j/log4j-slf4j2-impl/)
+ * Apache Log4j Web (org.apache.logging.log4j:log4j-web:2.23.1 - https://logging.apache.org/log4j/2.x/log4j/log4j-web/)
+ * Lucene Common Analyzers (org.apache.lucene:lucene-analyzers-common:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-analyzers-common)
+ * Lucene ICU Analysis Components (org.apache.lucene:lucene-analyzers-icu:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-analyzers-icu)
+ * Lucene Kuromoji Japanese Morphological Analyzer (org.apache.lucene:lucene-analyzers-kuromoji:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-analyzers-kuromoji)
+ * Lucene Nori Korean Morphological Analyzer (org.apache.lucene:lucene-analyzers-nori:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-analyzers-nori)
+ * Lucene Phonetic Filters (org.apache.lucene:lucene-analyzers-phonetic:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-analyzers-phonetic)
+ * Lucene Smart Chinese Analyzer (org.apache.lucene:lucene-analyzers-smartcn:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-analyzers-smartcn)
+ * Lucene Stempel Analyzer (org.apache.lucene:lucene-analyzers-stempel:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-analyzers-stempel)
+ * Lucene Memory (org.apache.lucene:lucene-backward-codecs:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-backward-codecs)
+ * Lucene Classification (org.apache.lucene:lucene-classification:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-classification)
+ * Lucene codecs (org.apache.lucene:lucene-codecs:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-codecs)
+ * Lucene Core (org.apache.lucene:lucene-core:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-core)
+ * Lucene Expressions (org.apache.lucene:lucene-expressions:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-expressions)
+ * Lucene Grouping (org.apache.lucene:lucene-grouping:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-grouping)
+ * Lucene Highlighter (org.apache.lucene:lucene-highlighter:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-highlighter)
+ * Lucene Join (org.apache.lucene:lucene-join:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-join)
+ * Lucene Memory (org.apache.lucene:lucene-memory:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-memory)
+ * Lucene Miscellaneous (org.apache.lucene:lucene-misc:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-misc)
+ * Lucene Queries (org.apache.lucene:lucene-queries:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-queries)
+ * Lucene QueryParsers (org.apache.lucene:lucene-queryparser:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-queryparser)
+ * Lucene Sandbox (org.apache.lucene:lucene-sandbox:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-sandbox)
+ * Lucene Spatial Extras (org.apache.lucene:lucene-spatial-extras:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-spatial-extras)
+ * Lucene Spatial 3D (org.apache.lucene:lucene-spatial3d:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-spatial3d)
+ * Lucene Suggest (org.apache.lucene:lucene-suggest:8.11.3 - https://lucene.apache.org/lucene-parent/lucene-suggest)
+ * Apache FontBox (org.apache.pdfbox:fontbox:2.0.31 - http://pdfbox.apache.org/)
* PDFBox JBIG2 ImageIO plugin (org.apache.pdfbox:jbig2-imageio:3.0.4 - https://www.apache.org/jbig2-imageio/)
* Apache JempBox (org.apache.pdfbox:jempbox:1.8.17 - http://www.apache.org/pdfbox-parent/jempbox/)
- * Apache PDFBox (org.apache.pdfbox:pdfbox:2.0.28 - https://www.apache.org/pdfbox-parent/pdfbox/)
- * Apache PDFBox tools (org.apache.pdfbox:pdfbox-tools:2.0.27 - https://www.apache.org/pdfbox-parent/pdfbox-tools/)
- * Apache XmpBox (org.apache.pdfbox:xmpbox:2.0.27 - https://www.apache.org/pdfbox-parent/xmpbox/)
- * Apache POI - Common (org.apache.poi:poi:5.2.3 - https://poi.apache.org/)
- * Apache POI - API based on OPC and OOXML schemas (org.apache.poi:poi-ooxml:5.2.3 - https://poi.apache.org/)
- * Apache POI (org.apache.poi:poi-ooxml-lite:5.2.3 - https://poi.apache.org/)
- * Apache POI (org.apache.poi:poi-scratchpad:5.2.3 - https://poi.apache.org/)
- * Apache Solr Core (org.apache.solr:solr-core:8.11.2 - https://lucene.apache.org/solr-parent/solr-core)
- * Apache Solr Solrj (org.apache.solr:solr-solrj:8.11.2 - https://lucene.apache.org/solr-parent/solr-solrj)
+ * Apache PDFBox (org.apache.pdfbox:pdfbox:2.0.31 - https://www.apache.org/pdfbox-parent/pdfbox/)
+ * Apache PDFBox tools (org.apache.pdfbox:pdfbox-tools:2.0.31 - https://www.apache.org/pdfbox-parent/pdfbox-tools/)
+ * Apache XmpBox (org.apache.pdfbox:xmpbox:2.0.31 - https://www.apache.org/pdfbox-parent/xmpbox/)
+ * Apache POI - Common (org.apache.poi:poi:5.2.5 - https://poi.apache.org/)
+ * Apache POI - API based on OPC and OOXML schemas (org.apache.poi:poi-ooxml:5.2.5 - https://poi.apache.org/)
+ * Apache POI (org.apache.poi:poi-ooxml-lite:5.2.5 - https://poi.apache.org/)
+ * Apache POI (org.apache.poi:poi-scratchpad:5.2.5 - https://poi.apache.org/)
+ * Apache Solr Core (org.apache.solr:solr-core:8.11.3 - https://lucene.apache.org/solr-parent/solr-core)
+ * Apache Solr Solrj (org.apache.solr:solr-solrj:8.11.3 - https://lucene.apache.org/solr-parent/solr-solrj)
* Apache Standard Taglib Implementation (org.apache.taglibs:taglibs-standard-impl:1.2.5 - http://tomcat.apache.org/taglibs/standard-1.2.5/taglibs-standard-impl)
* Apache Standard Taglib Specification API (org.apache.taglibs:taglibs-standard-spec:1.2.5 - http://tomcat.apache.org/taglibs/standard-1.2.5/taglibs-standard-spec)
- * Apache Thrift (org.apache.thrift:libthrift:0.9.2 - http://thrift.apache.org)
- * Apache Tika core (org.apache.tika:tika-core:2.5.0 - https://tika.apache.org/)
- * Apache Tika Apple parser module (org.apache.tika:tika-parser-apple-module:2.5.0 - https://tika.apache.org/tika-parser-apple-module/)
- * Apache Tika audiovideo parser module (org.apache.tika:tika-parser-audiovideo-module:2.5.0 - https://tika.apache.org/tika-parser-audiovideo-module/)
- * Apache Tika cad parser module (org.apache.tika:tika-parser-cad-module:2.5.0 - https://tika.apache.org/tika-parser-cad-module/)
- * Apache Tika code parser module (org.apache.tika:tika-parser-code-module:2.5.0 - https://tika.apache.org/tika-parser-code-module/)
- * Apache Tika crypto parser module (org.apache.tika:tika-parser-crypto-module:2.5.0 - https://tika.apache.org/tika-parser-crypto-module/)
- * Apache Tika digest commons (org.apache.tika:tika-parser-digest-commons:2.5.0 - https://tika.apache.org/tika-parser-digest-commons/)
- * Apache Tika font parser module (org.apache.tika:tika-parser-font-module:2.5.0 - https://tika.apache.org/tika-parser-font-module/)
- * Apache Tika html parser module (org.apache.tika:tika-parser-html-module:2.5.0 - https://tika.apache.org/tika-parser-html-module/)
- * Apache Tika image parser module (org.apache.tika:tika-parser-image-module:2.5.0 - https://tika.apache.org/tika-parser-image-module/)
- * Apache Tika mail commons (org.apache.tika:tika-parser-mail-commons:2.5.0 - https://tika.apache.org/tika-parser-mail-commons/)
- * Apache Tika mail parser module (org.apache.tika:tika-parser-mail-module:2.5.0 - https://tika.apache.org/tika-parser-mail-module/)
- * Apache Tika Microsoft parser module (org.apache.tika:tika-parser-microsoft-module:2.5.0 - https://tika.apache.org/tika-parser-microsoft-module/)
- * Apache Tika miscellaneous office format parser module (org.apache.tika:tika-parser-miscoffice-module:2.5.0 - https://tika.apache.org/tika-parser-miscoffice-module/)
- * Apache Tika news parser module (org.apache.tika:tika-parser-news-module:2.5.0 - https://tika.apache.org/tika-parser-news-module/)
- * Apache Tika OCR parser module (org.apache.tika:tika-parser-ocr-module:2.5.0 - https://tika.apache.org/tika-parser-ocr-module/)
- * Apache Tika PDF parser module (org.apache.tika:tika-parser-pdf-module:2.5.0 - https://tika.apache.org/tika-parser-pdf-module/)
- * Apache Tika package parser module (org.apache.tika:tika-parser-pkg-module:2.5.0 - https://tika.apache.org/tika-parser-pkg-module/)
- * Apache Tika text parser module (org.apache.tika:tika-parser-text-module:2.5.0 - https://tika.apache.org/tika-parser-text-module/)
- * Apache Tika WARC parser module (org.apache.tika:tika-parser-webarchive-module:2.5.0 - https://tika.apache.org/tika-parser-webarchive-module/)
- * Apache Tika XML parser module (org.apache.tika:tika-parser-xml-module:2.5.0 - https://tika.apache.org/tika-parser-xml-module/)
- * Apache Tika XMP commons (org.apache.tika:tika-parser-xmp-commons:2.5.0 - https://tika.apache.org/tika-parser-xmp-commons/)
- * Apache Tika ZIP commons (org.apache.tika:tika-parser-zip-commons:2.5.0 - https://tika.apache.org/tika-parser-zip-commons/)
- * Apache Tika standard parser package (org.apache.tika:tika-parsers-standard-package:2.5.0 - https://tika.apache.org/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/)
- * tomcat-embed-core (org.apache.tomcat.embed:tomcat-embed-core:9.0.75 - https://tomcat.apache.org/)
- * tomcat-embed-el (org.apache.tomcat.embed:tomcat-embed-el:9.0.75 - https://tomcat.apache.org/)
- * tomcat-embed-websocket (org.apache.tomcat.embed:tomcat-embed-websocket:9.0.75 - https://tomcat.apache.org/)
+ * Apache Thrift (org.apache.thrift:libthrift:0.18.1 - http://thrift.apache.org)
+ * Apache Tika core (org.apache.tika:tika-core:2.9.2 - https://tika.apache.org/)
+ * Apache Tika Apple parser module (org.apache.tika:tika-parser-apple-module:2.9.2 - https://tika.apache.org/tika-parser-apple-module/)
+ * Apache Tika audiovideo parser module (org.apache.tika:tika-parser-audiovideo-module:2.9.2 - https://tika.apache.org/tika-parser-audiovideo-module/)
+ * Apache Tika cad parser module (org.apache.tika:tika-parser-cad-module:2.9.2 - https://tika.apache.org/tika-parser-cad-module/)
+ * Apache Tika code parser module (org.apache.tika:tika-parser-code-module:2.9.2 - https://tika.apache.org/tika-parser-code-module/)
+ * Apache Tika crypto parser module (org.apache.tika:tika-parser-crypto-module:2.9.2 - https://tika.apache.org/tika-parser-crypto-module/)
+ * Apache Tika digest commons (org.apache.tika:tika-parser-digest-commons:2.9.2 - https://tika.apache.org/tika-parser-digest-commons/)
+ * Apache Tika font parser module (org.apache.tika:tika-parser-font-module:2.9.2 - https://tika.apache.org/tika-parser-font-module/)
+ * Apache Tika html parser module (org.apache.tika:tika-parser-html-module:2.9.2 - https://tika.apache.org/tika-parser-html-module/)
+ * Apache Tika image parser module (org.apache.tika:tika-parser-image-module:2.9.2 - https://tika.apache.org/tika-parser-image-module/)
+ * Apache Tika mail commons (org.apache.tika:tika-parser-mail-commons:2.9.2 - https://tika.apache.org/tika-parser-mail-commons/)
+ * Apache Tika mail parser module (org.apache.tika:tika-parser-mail-module:2.9.2 - https://tika.apache.org/tika-parser-mail-module/)
+ * Apache Tika Microsoft parser module (org.apache.tika:tika-parser-microsoft-module:2.9.2 - https://tika.apache.org/tika-parser-microsoft-module/)
+ * Apache Tika miscellaneous office format parser module (org.apache.tika:tika-parser-miscoffice-module:2.9.2 - https://tika.apache.org/tika-parser-miscoffice-module/)
+ * Apache Tika news parser module (org.apache.tika:tika-parser-news-module:2.9.2 - https://tika.apache.org/tika-parser-news-module/)
+ * Apache Tika OCR parser module (org.apache.tika:tika-parser-ocr-module:2.9.2 - https://tika.apache.org/tika-parser-ocr-module/)
+ * Apache Tika PDF parser module (org.apache.tika:tika-parser-pdf-module:2.9.2 - https://tika.apache.org/tika-parser-pdf-module/)
+ * Apache Tika package parser module (org.apache.tika:tika-parser-pkg-module:2.9.2 - https://tika.apache.org/tika-parser-pkg-module/)
+ * Apache Tika text parser module (org.apache.tika:tika-parser-text-module:2.9.2 - https://tika.apache.org/tika-parser-text-module/)
+ * Apache Tika WARC parser module (org.apache.tika:tika-parser-webarchive-module:2.9.2 - https://tika.apache.org/tika-parser-webarchive-module/)
+ * Apache Tika XML parser module (org.apache.tika:tika-parser-xml-module:2.9.2 - https://tika.apache.org/tika-parser-xml-module/)
+ * Apache Tika XMP commons (org.apache.tika:tika-parser-xmp-commons:2.9.2 - https://tika.apache.org/tika-parser-xmp-commons/)
+ * Apache Tika ZIP commons (org.apache.tika:tika-parser-zip-commons:2.9.2 - https://tika.apache.org/tika-parser-zip-commons/)
+ * Apache Tika standard parser package (org.apache.tika:tika-parsers-standard-package:2.9.2 - https://tika.apache.org/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/)
+ * tomcat-embed-core (org.apache.tomcat.embed:tomcat-embed-core:10.1.24 - https://tomcat.apache.org/)
+ * tomcat-embed-el (org.apache.tomcat.embed:tomcat-embed-el:10.1.24 - https://tomcat.apache.org/)
+ * tomcat-embed-websocket (org.apache.tomcat.embed:tomcat-embed-websocket:10.1.24 - https://tomcat.apache.org/)
* Apache Velocity - Engine (org.apache.velocity:velocity-engine-core:2.3 - http://velocity.apache.org/engine/devel/velocity-engine-core/)
* Apache Velocity - JSR 223 Scripting (org.apache.velocity:velocity-engine-scripting:2.2 - http://velocity.apache.org/engine/devel/velocity-engine-scripting/)
- * Axiom API (org.apache.ws.commons.axiom:axiom-api:1.2.22 - http://ws.apache.org/axiom/)
- * Abdera Model (FOM) Implementation (org.apache.ws.commons.axiom:fom-impl:1.2.22 - http://ws.apache.org/axiom/implementations/fom-impl/)
- * XmlBeans (org.apache.xmlbeans:xmlbeans:5.1.1 - https://xmlbeans.apache.org/)
+ * Axiom API (org.apache.ws.commons.axiom:axiom-api:1.2.14 - http://ws.apache.org/axiom/)
+ * Axiom Impl (org.apache.ws.commons.axiom:axiom-impl:1.2.14 - http://ws.apache.org/axiom/)
+ * XmlBeans (org.apache.xmlbeans:xmlbeans:5.2.0 - https://xmlbeans.apache.org/)
* Apache ZooKeeper - Server (org.apache.zookeeper:zookeeper:3.6.2 - http://zookeeper.apache.org/zookeeper)
* Apache ZooKeeper - Jute (org.apache.zookeeper:zookeeper-jute:3.6.2 - http://zookeeper.apache.org/zookeeper-jute)
- * org.apiguardian:apiguardian-api (org.apiguardian:apiguardian-api:1.1.0 - https://github.com/apiguardian-team/apiguardian)
- * AssertJ fluent assertions (org.assertj:assertj-core:3.22.0 - https://assertj.github.io/doc/assertj-core/)
+ * org.apiguardian:apiguardian-api (org.apiguardian:apiguardian-api:1.1.2 - https://github.com/apiguardian-team/apiguardian)
+ * AssertJ Core (org.assertj:assertj-core:3.24.2 - https://assertj.github.io/doc/#assertj-core)
* Evo Inflector (org.atteo:evo-inflector:1.3 - http://atteo.org/static/evo-inflector)
+ * Awaitility (org.awaitility:awaitility:4.2.1 - http://awaitility.org)
* jose4j (org.bitbucket.b_c:jose4j:0.6.5 - https://bitbucket.org/b_c/jose4j/)
* TagSoup (org.ccil.cowan.tagsoup:tagsoup:1.2.1 - http://home.ccil.org/~cowan/XML/tagsoup/)
+ * Woodstox (org.codehaus.woodstox:wstx-asl:3.2.6 - http://woodstox.codehaus.org)
* jems (org.dmfs:jems:1.18 - https://github.com/dmfs/jems)
* rfc3986-uri (org.dmfs:rfc3986-uri:0.8.1 - https://github.com/dmfs/uri-toolkit)
* Jetty :: Apache JSP Implementation (org.eclipse.jetty:apache-jsp:9.4.15.v20190215 - http://www.eclipse.org/jetty)
* Apache :: JSTL module (org.eclipse.jetty:apache-jstl:9.4.15.v20190215 - http://tomcat.apache.org/taglibs/standard/)
- * Jetty :: ALPN :: Client (org.eclipse.jetty:jetty-alpn-client:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-client)
- * Jetty :: ALPN :: JDK9 Client Implementation (org.eclipse.jetty:jetty-alpn-java-client:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-client)
- * Jetty :: ALPN :: JDK9 Server Implementation (org.eclipse.jetty:jetty-alpn-java-server:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-server)
- * Jetty :: ALPN :: Server (org.eclipse.jetty:jetty-alpn-server:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-server)
- * Jetty :: ALPN :: Server (org.eclipse.jetty:jetty-alpn-server:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-server)
+ * Jetty :: ALPN :: Client (org.eclipse.jetty:jetty-alpn-client:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-client)
+ * Jetty :: ALPN :: JDK9 Client Implementation (org.eclipse.jetty:jetty-alpn-java-client:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-client)
+ * Jetty :: ALPN :: JDK9 Server Implementation (org.eclipse.jetty:jetty-alpn-java-server:9.4.15.v20190215 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-server)
+ * Jetty :: ALPN :: JDK9 Server Implementation (org.eclipse.jetty:jetty-alpn-java-server:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-server)
+ * Jetty :: ALPN :: Server (org.eclipse.jetty:jetty-alpn-server:9.4.15.v20190215 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-server)
+ * Jetty :: ALPN :: Server (org.eclipse.jetty:jetty-alpn-server:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-server)
* Jetty :: Servlet Annotations (org.eclipse.jetty:jetty-annotations:9.4.15.v20190215 - http://www.eclipse.org/jetty)
- * Jetty :: Asynchronous HTTP Client (org.eclipse.jetty:jetty-client:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-client)
- * Jetty :: Continuation (org.eclipse.jetty:jetty-continuation:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-continuation)
- * Jetty :: Continuation (org.eclipse.jetty:jetty-continuation:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-continuation)
- * Jetty :: Deployers (org.eclipse.jetty:jetty-deploy:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-deploy)
- * Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-http)
- * Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-io)
- * Jetty :: JMX Management (org.eclipse.jetty:jetty-jmx:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-jmx)
+ * Jetty :: Asynchronous HTTP Client (org.eclipse.jetty:jetty-client:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-client)
+ * Jetty :: Continuation (org.eclipse.jetty:jetty-continuation:9.4.15.v20190215 - http://www.eclipse.org/jetty)
+ * Jetty :: Continuation (org.eclipse.jetty:jetty-continuation:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-continuation)
+ * Jetty :: Deployers (org.eclipse.jetty:jetty-deploy:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-deploy)
+ * Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-http)
+ * Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-io)
+ * Jetty :: JMX Management (org.eclipse.jetty:jetty-jmx:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-jmx)
* Jetty :: JNDI Naming (org.eclipse.jetty:jetty-jndi:9.4.15.v20190215 - http://www.eclipse.org/jetty)
* Jetty :: Plus (org.eclipse.jetty:jetty-plus:9.4.15.v20190215 - http://www.eclipse.org/jetty)
- * Jetty :: Rewrite Handler (org.eclipse.jetty:jetty-rewrite:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-rewrite)
- * Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-security)
- * Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-security)
- * Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-server)
- * Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-servlet)
- * Jetty :: Utility Servlets and Filters (org.eclipse.jetty:jetty-servlets:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-servlets)
- * Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-util)
- * Jetty :: Utilities :: Ajax(JSON) (org.eclipse.jetty:jetty-util-ajax:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-util-ajax)
- * Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-webapp)
- * Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-xml)
- * Jetty :: HTTP2 :: Client (org.eclipse.jetty.http2:http2-client:9.4.44.v20210927 - https://eclipse.org/jetty/http2-parent/http2-client)
- * Jetty :: HTTP2 :: Common (org.eclipse.jetty.http2:http2-common:9.4.51.v20230217 - https://eclipse.org/jetty/http2-parent/http2-common)
- * Jetty :: HTTP2 :: HPACK (org.eclipse.jetty.http2:http2-hpack:9.4.44.v20210927 - https://eclipse.org/jetty/http2-parent/http2-hpack)
- * Jetty :: HTTP2 :: HTTP Client Transport (org.eclipse.jetty.http2:http2-http-client-transport:9.4.44.v20210927 - https://eclipse.org/jetty/http2-parent/http2-http-client-transport)
- * Jetty :: HTTP2 :: Server (org.eclipse.jetty.http2:http2-server:9.4.51.v20230217 - https://eclipse.org/jetty/http2-parent/http2-server)
+ * Jetty :: Rewrite Handler (org.eclipse.jetty:jetty-rewrite:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-rewrite)
+ * Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-security)
+ * Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-security)
+ * Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-server)
+ * Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-servlet)
+ * Jetty :: Utility Servlets and Filters (org.eclipse.jetty:jetty-servlets:9.4.15.v20190215 - http://www.eclipse.org/jetty)
+ * Jetty :: Utility Servlets and Filters (org.eclipse.jetty:jetty-servlets:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-servlets)
+ * Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-util)
+ * Jetty :: Utilities :: Ajax(JSON) (org.eclipse.jetty:jetty-util-ajax:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-util-ajax)
+ * Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-webapp)
+ * Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-xml)
+ * Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-xml)
+ * Jetty :: ALPN :: API (org.eclipse.jetty.alpn:alpn-api:1.1.3.v20160715 - http://www.eclipse.org/jetty/alpn-api)
+ * Jetty :: HTTP2 :: Client (org.eclipse.jetty.http2:http2-client:9.4.53.v20231009 - https://eclipse.org/jetty/http2-parent/http2-client)
+ * Jetty :: HTTP2 :: Common (org.eclipse.jetty.http2:http2-common:9.4.54.v20240208 - https://eclipse.org/jetty/http2-parent/http2-common)
+ * Jetty :: HTTP2 :: HPACK (org.eclipse.jetty.http2:http2-hpack:9.4.53.v20231009 - https://eclipse.org/jetty/http2-parent/http2-hpack)
+ * Jetty :: HTTP2 :: HTTP Client Transport (org.eclipse.jetty.http2:http2-http-client-transport:9.4.53.v20231009 - https://eclipse.org/jetty/http2-parent/http2-http-client-transport)
+ * Jetty :: HTTP2 :: Server (org.eclipse.jetty.http2:http2-server:9.4.15.v20190215 - https://eclipse.org/jetty/http2-parent/http2-server)
+ * Jetty :: HTTP2 :: Server (org.eclipse.jetty.http2:http2-server:9.4.53.v20231009 - https://eclipse.org/jetty/http2-parent/http2-server)
* Jetty :: Schemas (org.eclipse.jetty.toolchain:jetty-schemas:3.1.2 - https://eclipse.org/jetty/jetty-schemas)
- * Ehcache (org.ehcache:ehcache:3.4.0 - http://ehcache.org)
- * flyway-core (org.flywaydb:flyway-core:8.4.4 - https://flywaydb.org/flyway-core)
+ * Ehcache (org.ehcache:ehcache:3.10.8 - http://ehcache.org)
+ * flyway-core (org.flywaydb:flyway-core:10.10.0 - https://flywaydb.org/flyway-core)
+ * flyway-database-postgresql (org.flywaydb:flyway-database-postgresql:10.10.0 - https://flywaydb.org/flyway-database-postgresql)
* Ogg and Vorbis for Java, Core (org.gagravarr:vorbis-java-core:0.8 - https://github.com/Gagravarr/VorbisJava)
* Apache Tika plugin for Ogg, Vorbis and FLAC (org.gagravarr:vorbis-java-tika:0.8 - https://github.com/Gagravarr/VorbisJava)
- * jersey-core-client (org.glassfish.jersey.core:jersey-client:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
- * jersey-core-common (org.glassfish.jersey.core:jersey-common:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-common)
- * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
- * Hibernate Validator Engine (org.hibernate.validator:hibernate-validator:6.2.5.Final - http://hibernate.org/validator/hibernate-validator)
- * Hibernate Validator Portable Extension (org.hibernate.validator:hibernate-validator-cdi:6.2.5.Final - http://hibernate.org/validator/hibernate-validator-cdi)
+ * jersey-core-common (org.glassfish.jersey.core:jersey-common:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-common)
+ * Hibernate Validator Engine (org.hibernate.validator:hibernate-validator:8.0.1.Final - http://hibernate.org/validator/hibernate-validator)
+ * Hibernate Validator Portable Extension (org.hibernate.validator:hibernate-validator-cdi:8.0.1.Final - http://hibernate.org/validator/hibernate-validator-cdi)
+ * org.immutables.value-annotations (org.immutables:value-annotations:2.9.2 - http://immutables.org/value-annotations)
* leveldb (org.iq80.leveldb:leveldb:0.12 - http://github.com/dain/leveldb/leveldb)
* leveldb-api (org.iq80.leveldb:leveldb-api:0.12 - http://github.com/dain/leveldb/leveldb-api)
- * Javassist (org.javassist:javassist:3.25.0-GA - http://www.javassist.org/)
- * Java Annotation Indexer (org.jboss:jandex:2.4.2.Final - http://www.jboss.org/jandex)
+ * Javassist (org.javassist:javassist:3.29.2-GA - http://www.javassist.org/)
* JBoss Logging 3 (org.jboss.logging:jboss-logging:3.4.3.Final - http://www.jboss.org)
* JDOM (org.jdom:jdom2:2.0.6.1 - http://www.jdom.org)
* jtwig-core (org.jtwig:jtwig-core:5.87.0.RELEASE - http://jtwig.org)
@@ -335,115 +380,108 @@ https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines
* jtwig-spring (org.jtwig:jtwig-spring:5.87.0.RELEASE - http://jtwig.org)
* jtwig-spring-boot-starter (org.jtwig:jtwig-spring-boot-starter:5.87.0.RELEASE - http://jtwig.org)
* jtwig-web (org.jtwig:jtwig-web:5.87.0.RELEASE - http://jtwig.org)
+ * Proj4J (org.locationtech.proj4j:proj4j:1.1.5 - https://github.com/locationtech/proj4j)
* Spatial4J (org.locationtech.spatial4j:spatial4j:0.7 - https://projects.eclipse.org/projects/locationtech.spatial4j)
* MockServer Java Client (org.mock-server:mockserver-client-java:5.11.2 - http://www.mock-server.com)
* MockServer Core (org.mock-server:mockserver-core:5.11.2 - http://www.mock-server.com)
* MockServer JUnit 4 Integration (org.mock-server:mockserver-junit-rule:5.11.2 - http://www.mock-server.com)
* MockServer & Proxy Netty (org.mock-server:mockserver-netty:5.11.2 - http://www.mock-server.com)
- * MortBay :: Apache EL :: API and Implementation (org.mortbay.jasper:apache-el:8.5.35.1 - https://github.com/jetty-project/jasper-jsp/apache-el)
- * MortBay :: Apache Jasper :: JSP Implementation (org.mortbay.jasper:apache-jsp:8.5.35.1 - https://github.com/jetty-project/jasper-jsp/apache-jsp)
* Jetty Server (org.mortbay.jetty:jetty:6.1.26 - http://www.eclipse.org/jetty/jetty-parent/project/modules/jetty)
* Jetty Servlet Tester (org.mortbay.jetty:jetty-servlet-tester:6.1.26 - http://www.eclipse.org/jetty/jetty-parent/project/jetty-servlet-tester)
* Jetty Utilities (org.mortbay.jetty:jetty-util:6.1.26 - http://www.eclipse.org/jetty/jetty-parent/project/jetty-util)
* Servlet Specification API (org.mortbay.jetty:servlet-api:2.5-20081211 - http://jetty.mortbay.org/servlet-api)
- * jwarc (org.netpreserve:jwarc:0.19.0 - https://github.com/iipc/jwarc)
+ * jwarc (org.netpreserve:jwarc:0.29.0 - https://github.com/iipc/jwarc)
* Objenesis (org.objenesis:objenesis:3.2 - http://objenesis.org/objenesis)
* parboiled-core (org.parboiled:parboiled-core:1.3.1 - http://parboiled.org)
* parboiled-java (org.parboiled:parboiled-java:1.3.1 - http://parboiled.org)
+ * org.roaringbitmap:RoaringBitmap (org.roaringbitmap:RoaringBitmap:0.9.45 - https://github.com/RoaringBitmap/RoaringBitmap)
+ * org.roaringbitmap:shims (org.roaringbitmap:shims:0.9.45 - https://github.com/RoaringBitmap/RoaringBitmap)
* RRD4J (org.rrd4j:rrd4j:3.5 - https://github.com/rrd4j/rrd4j/)
- * Scala Library (org.scala-lang:scala-library:2.13.9 - https://www.scala-lang.org/)
+ * Scala Library (org.scala-lang:scala-library:2.13.11 - https://www.scala-lang.org/)
* Scala Compiler (org.scala-lang:scala-reflect:2.13.0 - https://www.scala-lang.org/)
* scala-collection-compat (org.scala-lang.modules:scala-collection-compat_2.13:2.1.6 - http://www.scala-lang.org/)
* scala-java8-compat (org.scala-lang.modules:scala-java8-compat_2.13:0.9.0 - http://www.scala-lang.org/)
* scala-parser-combinators (org.scala-lang.modules:scala-parser-combinators_2.13:1.1.2 - http://www.scala-lang.org/)
* scala-xml (org.scala-lang.modules:scala-xml_2.13:1.3.0 - http://www.scala-lang.org/)
* JSONassert (org.skyscreamer:jsonassert:1.5.1 - https://github.com/skyscreamer/JSONassert)
- * JCL 1.2 implemented over SLF4J (org.slf4j:jcl-over-slf4j:1.7.36 - http://www.slf4j.org)
- * Spring AOP (org.springframework:spring-aop:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Beans (org.springframework:spring-beans:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Context (org.springframework:spring-context:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Context Support (org.springframework:spring-context-support:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Core (org.springframework:spring-core:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Expression Language (SpEL) (org.springframework:spring-expression:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Commons Logging Bridge (org.springframework:spring-jcl:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring JDBC (org.springframework:spring-jdbc:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Object/Relational Mapping (org.springframework:spring-orm:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring TestContext Framework (org.springframework:spring-test:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Transaction (org.springframework:spring-tx:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Web (org.springframework:spring-web:5.3.27 - https://github.com/spring-projects/spring-framework)
- * Spring Web MVC (org.springframework:spring-webmvc:5.3.27 - https://github.com/spring-projects/spring-framework)
- * spring-boot (org.springframework.boot:spring-boot:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-actuator (org.springframework.boot:spring-boot-actuator:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-actuator-autoconfigure (org.springframework.boot:spring-boot-actuator-autoconfigure:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-autoconfigure (org.springframework.boot:spring-boot-autoconfigure:2.7.12 - https://spring.io/projects/spring-boot)
+ * JCL 1.2 implemented over SLF4J (org.slf4j:jcl-over-slf4j:2.0.11 - http://www.slf4j.org)
+ * Spring AOP (org.springframework:spring-aop:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Beans (org.springframework:spring-beans:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Context (org.springframework:spring-context:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Context Support (org.springframework:spring-context-support:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Core (org.springframework:spring-core:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Expression Language (SpEL) (org.springframework:spring-expression:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Commons Logging Bridge (org.springframework:spring-jcl:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring JDBC (org.springframework:spring-jdbc:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Object/Relational Mapping (org.springframework:spring-orm:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring TestContext Framework (org.springframework:spring-test:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Transaction (org.springframework:spring-tx:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Web (org.springframework:spring-web:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * Spring Web MVC (org.springframework:spring-webmvc:6.1.8 - https://github.com/spring-projects/spring-framework)
+ * spring-boot (org.springframework.boot:spring-boot:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-actuator (org.springframework.boot:spring-boot-actuator:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-actuator-autoconfigure (org.springframework.boot:spring-boot-actuator-autoconfigure:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-autoconfigure (org.springframework.boot:spring-boot-autoconfigure:3.2.6 - https://spring.io/projects/spring-boot)
* Spring Boot Configuration Processor (org.springframework.boot:spring-boot-configuration-processor:2.0.0.RELEASE - https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-tools/spring-boot-configuration-processor)
- * spring-boot-starter (org.springframework.boot:spring-boot-starter:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-actuator (org.springframework.boot:spring-boot-starter-actuator:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-aop (org.springframework.boot:spring-boot-starter-aop:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-cache (org.springframework.boot:spring-boot-starter-cache:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-data-rest (org.springframework.boot:spring-boot-starter-data-rest:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-json (org.springframework.boot:spring-boot-starter-json:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-log4j2 (org.springframework.boot:spring-boot-starter-log4j2:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-security (org.springframework.boot:spring-boot-starter-security:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-test (org.springframework.boot:spring-boot-starter-test:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-tomcat (org.springframework.boot:spring-boot-starter-tomcat:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-starter-web (org.springframework.boot:spring-boot-starter-web:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-test (org.springframework.boot:spring-boot-test:2.7.12 - https://spring.io/projects/spring-boot)
- * spring-boot-test-autoconfigure (org.springframework.boot:spring-boot-test-autoconfigure:2.7.12 - https://spring.io/projects/spring-boot)
- * Spring Data Core (org.springframework.data:spring-data-commons:2.7.12 - https://www.spring.io/spring-data/spring-data-commons)
- * Spring Data REST - Core (org.springframework.data:spring-data-rest-core:3.7.12 - https://www.spring.io/spring-data/spring-data-rest-parent/spring-data-rest-core)
- * Spring Data REST - WebMVC (org.springframework.data:spring-data-rest-webmvc:3.7.12 - https://www.spring.io/spring-data/spring-data-rest-parent/spring-data-rest-webmvc)
- * Spring HATEOAS (org.springframework.hateoas:spring-hateoas:1.5.4 - https://github.com/spring-projects/spring-hateoas)
- * Spring Plugin - Core (org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE - https://github.com/spring-projects/spring-plugin/spring-plugin-core)
- * spring-security-config (org.springframework.security:spring-security-config:5.7.8 - https://spring.io/projects/spring-security)
- * spring-security-core (org.springframework.security:spring-security-core:5.7.8 - https://spring.io/projects/spring-security)
- * spring-security-crypto (org.springframework.security:spring-security-crypto:5.7.8 - https://spring.io/projects/spring-security)
- * spring-security-test (org.springframework.security:spring-security-test:5.7.8 - https://spring.io/projects/spring-security)
- * spring-security-web (org.springframework.security:spring-security-web:5.7.8 - https://spring.io/projects/spring-security)
- * SWORD v2 :: Common Server Library (org.swordapp:sword2-server:1.0 - http://www.swordapp.org/)
- * snappy-java (org.xerial.snappy:snappy-java:1.1.7.6 - https://github.com/xerial/snappy-java)
+ * spring-boot-starter (org.springframework.boot:spring-boot-starter:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-actuator (org.springframework.boot:spring-boot-starter-actuator:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-aop (org.springframework.boot:spring-boot-starter-aop:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-cache (org.springframework.boot:spring-boot-starter-cache:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-data-rest (org.springframework.boot:spring-boot-starter-data-rest:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-json (org.springframework.boot:spring-boot-starter-json:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-log4j2 (org.springframework.boot:spring-boot-starter-log4j2:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-security (org.springframework.boot:spring-boot-starter-security:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-test (org.springframework.boot:spring-boot-starter-test:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-tomcat (org.springframework.boot:spring-boot-starter-tomcat:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-starter-web (org.springframework.boot:spring-boot-starter-web:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-test (org.springframework.boot:spring-boot-test:3.2.6 - https://spring.io/projects/spring-boot)
+ * spring-boot-test-autoconfigure (org.springframework.boot:spring-boot-test-autoconfigure:3.2.6 - https://spring.io/projects/spring-boot)
+ * Spring Data Core (org.springframework.data:spring-data-commons:3.2.6 - https://spring.io/projects/spring-data)
+ * Spring Data REST - Core (org.springframework.data:spring-data-rest-core:4.2.6 - https://www.spring.io/spring-data/spring-data-rest-parent/spring-data-rest-core)
+ * Spring Data REST - WebMVC (org.springframework.data:spring-data-rest-webmvc:4.2.6 - https://www.spring.io/spring-data/spring-data-rest-parent/spring-data-rest-webmvc)
+ * Spring HATEOAS (org.springframework.hateoas:spring-hateoas:2.2.2 - https://github.com/spring-projects/spring-hateoas)
+ * Spring Plugin - Core (org.springframework.plugin:spring-plugin-core:3.0.0 - https://github.com/spring-projects/spring-plugin/spring-plugin-core)
+ * spring-security-config (org.springframework.security:spring-security-config:6.2.4 - https://spring.io/projects/spring-security)
+ * spring-security-core (org.springframework.security:spring-security-core:6.2.4 - https://spring.io/projects/spring-security)
+ * spring-security-crypto (org.springframework.security:spring-security-crypto:6.2.4 - https://spring.io/projects/spring-security)
+ * spring-security-test (org.springframework.security:spring-security-test:6.2.4 - https://spring.io/projects/spring-security)
+ * spring-security-web (org.springframework.security:spring-security-web:6.2.4 - https://spring.io/projects/spring-security)
+ * snappy-java (org.xerial.snappy:snappy-java:1.1.10.1 - https://github.com/xerial/snappy-java)
* xml-matchers (org.xmlmatchers:xml-matchers:0.10 - http://code.google.com/p/xml-matchers/)
- * org.xmlunit:xmlunit-core (org.xmlunit:xmlunit-core:2.8.0 - https://www.xmlunit.org/)
+ * org.xmlunit:xmlunit-core (org.xmlunit:xmlunit-core:2.10.0 - https://www.xmlunit.org/)
* org.xmlunit:xmlunit-core (org.xmlunit:xmlunit-core:2.9.1 - https://www.xmlunit.org/)
* org.xmlunit:xmlunit-placeholders (org.xmlunit:xmlunit-placeholders:2.8.0 - https://www.xmlunit.org/xmlunit-placeholders/)
- * SnakeYAML (org.yaml:snakeyaml:1.30 - https://bitbucket.org/snakeyaml/snakeyaml)
+ * SnakeYAML (org.yaml:snakeyaml:2.2 - https://bitbucket.org/snakeyaml/snakeyaml)
* software.amazon.ion:ion-java (software.amazon.ion:ion-java:1.0.2 - https://github.com/amznlabs/ion-java/)
- * Xalan Java Serializer (xalan:serializer:2.7.2 - http://xml.apache.org/xalan-j/)
- * xalan (xalan:xalan:2.7.0 - no url defined)
- * Xalan Java (xalan:xalan:2.7.2 - http://xml.apache.org/xalan-j/)
* Xerces2-j (xerces:xercesImpl:2.12.2 - https://xerces.apache.org/xerces2-j/)
- * XML Commons External Components XML APIs (xml-apis:xml-apis:1.4.01 - http://xml.apache.org/commons/components/external/)
BSD License:
- * AntLR Parser Generator (antlr:antlr:2.7.7 - http://www.antlr.org/)
* Adobe XMPCore (com.adobe.xmp:xmpcore:6.1.11 - https://www.adobe.com/devnet/xmp/library/eula-xmp-library-java.html)
* coverity-escapers (com.coverity.security:coverity-escapers:1.1.1 - http://coverity.com/security)
* Java Advanced Imaging Image I/O Tools API core (standalone) (com.github.jai-imageio:jai-imageio-core:1.4.0 - https://github.com/jai-imageio/jai-imageio-core)
- * JSONLD Java :: Core (com.github.jsonld-java:jsonld-java:0.5.1 - http://github.com/jsonld-java/jsonld-java/jsonld-java/)
- * curvesapi (com.github.virtuald:curvesapi:1.07 - https://github.com/virtuald/curvesapi)
- * Protocol Buffers [Core] (com.google.protobuf:protobuf-java:3.11.0 - https://developers.google.com/protocol-buffers/protobuf-java/)
+ * JSONLD Java :: Core (com.github.jsonld-java:jsonld-java:0.13.4 - http://github.com/jsonld-java/jsonld-java/jsonld-java/)
+ * curvesapi (com.github.virtuald:curvesapi:1.08 - https://github.com/virtuald/curvesapi)
+ * Protocol Buffers [Core] (com.google.protobuf:protobuf-java:3.15.0 - https://developers.google.com/protocol-buffers/protobuf-java/)
+ * Protocol Buffers [Core] (com.google.protobuf:protobuf-java:3.23.3 - https://developers.google.com/protocol-buffers/protobuf-java/)
* JZlib (com.jcraft:jzlib:1.1.3 - http://www.jcraft.com/jzlib/)
- * dnsjava (dnsjava:dnsjava:2.1.7 - http://www.dnsjava.org)
- * jaxen (jaxen:jaxen:1.1.6 - http://jaxen.codehaus.org/)
- * ANTLR 4 Runtime (org.antlr:antlr4-runtime:4.5.1-1 - http://www.antlr.org/antlr4-runtime)
- * commons-compiler (org.codehaus.janino:commons-compiler:3.0.9 - http://janino-compiler.github.io/commons-compiler/)
- * janino (org.codehaus.janino:janino:3.0.9 - http://janino-compiler.github.io/janino/)
+ * dnsjava (dnsjava:dnsjava:2.1.9 - http://www.dnsjava.org)
+ * jaxen (jaxen:jaxen:2.0.0 - http://www.cafeconleche.org/jaxen/jaxen)
+ * ANTLR 4 Runtime (org.antlr:antlr4-runtime:4.13.1 - https://www.antlr.org/antlr4-runtime/)
+ * commons-compiler (org.codehaus.janino:commons-compiler:3.1.8 - http://janino-compiler.github.io/commons-compiler/)
+ * janino (org.codehaus.janino:janino:3.1.8 - http://janino-compiler.github.io/janino/)
* Stax2 API (org.codehaus.woodstox:stax2-api:4.2.1 - http://github.com/FasterXML/stax2-api)
- * Hamcrest Date (org.exparity:hamcrest-date:2.0.7 - https://github.com/exparity/hamcrest-date)
- * jersey-core-client (org.glassfish.jersey.core:jersey-client:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
- * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * Hamcrest Date (org.exparity:hamcrest-date:2.0.8 - https://github.com/exparity/hamcrest-date)
* Hamcrest (org.hamcrest:hamcrest:2.2 - http://hamcrest.org/JavaHamcrest/)
- * Hamcrest All (org.hamcrest:hamcrest-all:1.3 - https://github.com/hamcrest/JavaHamcrest/hamcrest-all)
- * Hamcrest Core (org.hamcrest:hamcrest-core:1.3 - https://github.com/hamcrest/JavaHamcrest/hamcrest-core)
+ * Hamcrest Core (org.hamcrest:hamcrest-core:2.2 - http://hamcrest.org/JavaHamcrest/)
* HdrHistogram (org.hdrhistogram:HdrHistogram:2.1.12 - http://hdrhistogram.github.io/HdrHistogram/)
* JBibTeX (org.jbibtex:jbibtex:1.0.20 - http://www.jbibtex.org)
* asm (org.ow2.asm:asm:8.0.1 - http://asm.ow2.io/)
- * asm-analysis (org.ow2.asm:asm-analysis:7.1 - http://asm.ow2.org/)
+ * asm-analysis (org.ow2.asm:asm-analysis:8.0.1 - http://asm.ow2.io/)
* asm-commons (org.ow2.asm:asm-commons:8.0.1 - http://asm.ow2.io/)
- * asm-tree (org.ow2.asm:asm-tree:7.1 - http://asm.ow2.org/)
+ * asm-tree (org.ow2.asm:asm-tree:8.0.1 - http://asm.ow2.io/)
* asm-util (org.ow2.asm:asm-util:7.1 - http://asm.ow2.org/)
- * PostgreSQL JDBC Driver (org.postgresql:postgresql:42.6.0 - https://jdbc.postgresql.org)
+ * PostgreSQL JDBC Driver (org.postgresql:postgresql:42.7.3 - https://jdbc.postgresql.org)
* Reflections (org.reflections:reflections:0.9.12 - http://github.com/ronmamo/reflections)
* JMatIO (org.tallison:jmatio:1.5 - https://github.com/tballison/jmatio)
* XMLUnit for Java (xmlunit:xmlunit:1.3 - http://xmlunit.sourceforge.net/)
@@ -454,101 +492,121 @@ https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines
Common Development and Distribution License (CDDL):
- * istack common utility code runtime (com.sun.istack:istack-commons-runtime:3.0.7 - http://java.net/istack-commons/istack-commons-runtime/)
- * JavaMail API (com.sun.mail:javax.mail:1.6.2 - http://javaee.github.io/javamail/javax.mail)
* JavaMail API (no providers) (com.sun.mail:mailapi:1.6.2 - http://javaee.github.io/javamail/mailapi)
* Old JAXB Core (com.sun.xml.bind:jaxb-core:2.3.0.1 - http://jaxb.java.net/jaxb-bundles/jaxb-core)
* Old JAXB Runtime (com.sun.xml.bind:jaxb-impl:2.3.1 - http://jaxb.java.net/jaxb-bundles/jaxb-impl)
- * Jakarta Annotations API (jakarta.annotation:jakarta.annotation-api:1.3.5 - https://projects.eclipse.org/projects/ee4j.ca)
- * jakarta.ws.rs-api (jakarta.ws.rs:jakarta.ws.rs-api:2.1.6 - https://github.com/eclipse-ee4j/jaxrs-api)
- * JavaBeans Activation Framework (JAF) (javax.activation:activation:1.1 - http://java.sun.com/products/javabeans/jaf/index.jsp)
+ * Jakarta Annotations API (jakarta.annotation:jakarta.annotation-api:2.1.1 - https://projects.eclipse.org/projects/ee4j.ca)
+ * Jakarta Mail API (jakarta.mail:jakarta.mail-api:2.1.3 - https://projects.eclipse.org/projects/ee4j/jakarta.mail-api)
+ * Jakarta Servlet (jakarta.servlet:jakarta.servlet-api:6.0.0 - https://projects.eclipse.org/projects/ee4j.servlet)
+ * jakarta.transaction API (jakarta.transaction:jakarta.transaction-api:2.0.1 - https://projects.eclipse.org/projects/ee4j.jta)
* JavaBeans Activation Framework API jar (javax.activation:javax.activation-api:1.2.0 - http://java.net/all/javax.activation-api/)
- * javax.annotation API (javax.annotation:javax.annotation-api:1.3.2 - http://jcp.org/en/jsr/detail?id=250)
+ * javax.annotation API (javax.annotation:javax.annotation-api:1.3 - http://jcp.org/en/jsr/detail?id=250)
* Java Servlet API (javax.servlet:javax.servlet-api:3.1.0 - http://servlet-spec.java.net)
* javax.transaction API (javax.transaction:javax.transaction-api:1.3 - http://jta-spec.java.net)
* jaxb-api (javax.xml.bind:jaxb-api:2.3.1 - https://github.com/javaee/jaxb-spec/jaxb-api)
* JHighlight (org.codelibs:jhighlight:1.1.0 - https://github.com/codelibs/jhighlight)
- * HK2 API module (org.glassfish.hk2:hk2-api:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-api)
- * ServiceLocator Default Implementation (org.glassfish.hk2:hk2-locator:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-locator)
- * HK2 Implementation Utilities (org.glassfish.hk2:hk2-utils:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-utils)
+ * Angus Mail default provider (org.eclipse.angus:jakarta.mail:2.0.3 - http://eclipse-ee4j.github.io/angus-mail/jakarta.mail)
+ * HK2 API module (org.glassfish.hk2:hk2-api:3.0.5 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-api)
+ * ServiceLocator Default Implementation (org.glassfish.hk2:hk2-locator:3.0.5 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-locator)
+ * HK2 Implementation Utilities (org.glassfish.hk2:hk2-utils:3.0.5 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-utils)
* OSGi resource locator (org.glassfish.hk2:osgi-resource-locator:1.0.3 - https://projects.eclipse.org/projects/ee4j/osgi-resource-locator)
- * aopalliance version 1.0 repackaged as a module (org.glassfish.hk2.external:aopalliance-repackaged:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/external/aopalliance-repackaged)
- * javax.inject:1 as OSGi bundle (org.glassfish.hk2.external:jakarta.inject:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/external/jakarta.inject)
- * JAXB Runtime (org.glassfish.jaxb:jaxb-runtime:2.3.1 - http://jaxb.java.net/jaxb-runtime-parent/jaxb-runtime)
- * TXW2 Runtime (org.glassfish.jaxb:txw2:2.3.1 - http://jaxb.java.net/jaxb-txw-parent/txw2)
- * jersey-core-client (org.glassfish.jersey.core:jersey-client:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
- * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
- * Java Transaction API (org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final - http://www.jboss.org/jboss-transaction-api_1.2_spec)
- * Extended StAX API (org.jvnet.staxex:stax-ex:1.8 - http://stax-ex.java.net/)
+ * aopalliance version 1.0 repackaged as a module (org.glassfish.hk2.external:aopalliance-repackaged:3.0.5 - https://github.com/eclipse-ee4j/glassfish-hk2/external/aopalliance-repackaged)
+ * jersey-core-client (org.glassfish.jersey.core:jersey-client:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
+ * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:3.1.3 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-media-multipart)
Cordra (Version 2) License Agreement:
- * net.cnri:cnri-servlet-container (net.cnri:cnri-servlet-container:3.0.0 - https://gitlab.com/cnri/cnri-servlet-container)
- * net.cnri:cnri-servlet-container-lib (net.cnri:cnri-servlet-container-lib:3.0.0 - https://gitlab.com/cnri/cnri-servlet-container)
+ * net.cnri:cnri-servlet-container-lib (net.cnri:cnri-servlet-container-lib:3.1.0 - https://gitlab.com/cnri/cnri-servlet-container)
* net.cnri:cnriutil (net.cnri:cnriutil:2.0 - https://gitlab.com/cnri/cnriutil)
+ Cordra (Version 2.5.0) License Agreement:
+
+ * net.cnri:cnri-servlet-container (net.cnri:cnri-servlet-container:3.1.0 - https://gitlab.com/cnri/cnri-servlet-container)
+
Eclipse Distribution License, Version 1.0:
- * Jakarta Activation API jar (jakarta.activation:jakarta.activation-api:1.2.2 - https://github.com/eclipse-ee4j/jaf/jakarta.activation-api)
- * Jakarta XML Binding API (jakarta.xml.bind:jakarta.xml.bind-api:2.3.3 - https://github.com/eclipse-ee4j/jaxb-api/jakarta.xml.bind-api)
- * javax.persistence-api (javax.persistence:javax.persistence-api:2.2 - https://github.com/javaee/jpa-spec)
- * jersey-core-client (org.glassfish.jersey.core:jersey-client:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
- * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
- * Java Persistence API, Version 2.1 (org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final - http://hibernate.org)
+ * istack common utility code runtime (com.sun.istack:istack-commons-runtime:4.1.2 - https://projects.eclipse.org/projects/ee4j/istack-commons/istack-commons-runtime)
+ * Jakarta Activation API (jakarta.activation:jakarta.activation-api:2.1.3 - https://github.com/jakartaee/jaf-api)
+ * Jakarta Mail API (jakarta.mail:jakarta.mail-api:2.1.3 - https://projects.eclipse.org/projects/ee4j/jakarta.mail-api)
+ * Jakarta Persistence API (jakarta.persistence:jakarta.persistence-api:3.1.0 - https://github.com/eclipse-ee4j/jpa-api)
+ * Jakarta XML Binding API (jakarta.xml.bind:jakarta.xml.bind-api:4.0.2 - https://github.com/jakartaee/jaxb-api/jakarta.xml.bind-api)
+ * Angus Activation Registries (org.eclipse.angus:angus-activation:2.0.2 - https://github.com/eclipse-ee4j/angus-activation/angus-activation)
+ * Angus Mail default provider (org.eclipse.angus:jakarta.mail:2.0.3 - http://eclipse-ee4j.github.io/angus-mail/jakarta.mail)
+ * JAXB Core (org.glassfish.jaxb:jaxb-core:4.0.5 - https://eclipse-ee4j.github.io/jaxb-ri/)
+ * JAXB Runtime (org.glassfish.jaxb:jaxb-runtime:4.0.5 - https://eclipse-ee4j.github.io/jaxb-ri/)
+ * TXW2 Runtime (org.glassfish.jaxb:txw2:4.0.5 - https://eclipse-ee4j.github.io/jaxb-ri/)
+ * jersey-core-client (org.glassfish.jersey.core:jersey-client:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
+ * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:3.1.3 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-media-multipart)
+ * MIME streaming extension (org.jvnet.mimepull:mimepull:1.9.15 - https://github.com/eclipse-ee4j/metro-mimepull)
+ * org.locationtech.jts:jts-core (org.locationtech.jts:jts-core:1.19.0 - https://www.locationtech.org/projects/technology.jts/jts-modules/jts-core)
+ * org.locationtech.jts.io:jts-io-common (org.locationtech.jts.io:jts-io-common:1.19.0 - https://www.locationtech.org/projects/technology.jts/jts-modules/jts-io/jts-io-common)
Eclipse Public License:
* System Rules (com.github.stefanbirkner:system-rules:1.19.0 - http://stefanbirkner.github.io/system-rules/)
- * H2 Database Engine (com.h2database:h2:2.1.210 - https://h2database.com)
- * Jakarta Annotations API (jakarta.annotation:jakarta.annotation-api:1.3.5 - https://projects.eclipse.org/projects/ee4j.ca)
- * jakarta.ws.rs-api (jakarta.ws.rs:jakarta.ws.rs-api:2.1.6 - https://github.com/eclipse-ee4j/jaxrs-api)
- * javax.persistence-api (javax.persistence:javax.persistence-api:2.2 - https://github.com/javaee/jpa-spec)
- * JUnit (junit:junit:4.13.1 - http://junit.org)
- * AspectJ Weaver (org.aspectj:aspectjweaver:1.9.7 - https://www.eclipse.org/aspectj/)
- * Eclipse Compiler for Java(TM) (org.eclipse.jdt:ecj:3.14.0 - http://www.eclipse.org/jdt)
+ * H2 Database Engine (com.h2database:h2:2.2.224 - https://h2database.com)
+ * Jakarta Annotations API (jakarta.annotation:jakarta.annotation-api:2.1.1 - https://projects.eclipse.org/projects/ee4j.ca)
+ * Jakarta Expression Language API (jakarta.el:jakarta.el-api:5.0.1 - https://projects.eclipse.org/projects/ee4j.el)
+ * Jakarta Mail API (jakarta.mail:jakarta.mail-api:2.1.3 - https://projects.eclipse.org/projects/ee4j/jakarta.mail-api)
+ * Jakarta Persistence API (jakarta.persistence:jakarta.persistence-api:3.1.0 - https://github.com/eclipse-ee4j/jpa-api)
+ * Jakarta Servlet (jakarta.servlet:jakarta.servlet-api:6.0.0 - https://projects.eclipse.org/projects/ee4j.servlet)
+ * jakarta.transaction API (jakarta.transaction:jakarta.transaction-api:2.0.1 - https://projects.eclipse.org/projects/ee4j.jta)
+ * Jakarta RESTful WS API (jakarta.ws.rs:jakarta.ws.rs-api:3.1.0 - https://github.com/eclipse-ee4j/jaxrs-api)
+ * JUnit (junit:junit:4.13.2 - http://junit.org)
+ * AspectJ Weaver (org.aspectj:aspectjweaver:1.9.22 - https://www.eclipse.org/aspectj/)
+ * Angus Mail default provider (org.eclipse.angus:jakarta.mail:2.0.3 - http://eclipse-ee4j.github.io/angus-mail/jakarta.mail)
* Jetty :: Apache JSP Implementation (org.eclipse.jetty:apache-jsp:9.4.15.v20190215 - http://www.eclipse.org/jetty)
* Apache :: JSTL module (org.eclipse.jetty:apache-jstl:9.4.15.v20190215 - http://tomcat.apache.org/taglibs/standard/)
- * Jetty :: ALPN :: Client (org.eclipse.jetty:jetty-alpn-client:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-client)
- * Jetty :: ALPN :: JDK9 Client Implementation (org.eclipse.jetty:jetty-alpn-java-client:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-client)
- * Jetty :: ALPN :: JDK9 Server Implementation (org.eclipse.jetty:jetty-alpn-java-server:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-server)
- * Jetty :: ALPN :: Server (org.eclipse.jetty:jetty-alpn-server:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-server)
- * Jetty :: ALPN :: Server (org.eclipse.jetty:jetty-alpn-server:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-server)
+ * Jetty :: ALPN :: Client (org.eclipse.jetty:jetty-alpn-client:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-client)
+ * Jetty :: ALPN :: JDK9 Client Implementation (org.eclipse.jetty:jetty-alpn-java-client:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-client)
+ * Jetty :: ALPN :: JDK9 Server Implementation (org.eclipse.jetty:jetty-alpn-java-server:9.4.15.v20190215 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-server)
+ * Jetty :: ALPN :: JDK9 Server Implementation (org.eclipse.jetty:jetty-alpn-java-server:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-java-server)
+ * Jetty :: ALPN :: Server (org.eclipse.jetty:jetty-alpn-server:9.4.15.v20190215 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-server)
+ * Jetty :: ALPN :: Server (org.eclipse.jetty:jetty-alpn-server:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-alpn-parent/jetty-alpn-server)
* Jetty :: Servlet Annotations (org.eclipse.jetty:jetty-annotations:9.4.15.v20190215 - http://www.eclipse.org/jetty)
- * Jetty :: Asynchronous HTTP Client (org.eclipse.jetty:jetty-client:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-client)
- * Jetty :: Continuation (org.eclipse.jetty:jetty-continuation:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-continuation)
- * Jetty :: Continuation (org.eclipse.jetty:jetty-continuation:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-continuation)
- * Jetty :: Deployers (org.eclipse.jetty:jetty-deploy:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-deploy)
- * Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-http)
- * Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-io)
- * Jetty :: JMX Management (org.eclipse.jetty:jetty-jmx:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-jmx)
+ * Jetty :: Asynchronous HTTP Client (org.eclipse.jetty:jetty-client:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-client)
+ * Jetty :: Continuation (org.eclipse.jetty:jetty-continuation:9.4.15.v20190215 - http://www.eclipse.org/jetty)
+ * Jetty :: Continuation (org.eclipse.jetty:jetty-continuation:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-continuation)
+ * Jetty :: Deployers (org.eclipse.jetty:jetty-deploy:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-deploy)
+ * Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-http)
+ * Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-io)
+ * Jetty :: JMX Management (org.eclipse.jetty:jetty-jmx:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-jmx)
* Jetty :: JNDI Naming (org.eclipse.jetty:jetty-jndi:9.4.15.v20190215 - http://www.eclipse.org/jetty)
* Jetty :: Plus (org.eclipse.jetty:jetty-plus:9.4.15.v20190215 - http://www.eclipse.org/jetty)
- * Jetty :: Rewrite Handler (org.eclipse.jetty:jetty-rewrite:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-rewrite)
- * Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.44.v20210927 - https://eclipse.org/jetty/jetty-security)
- * Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-security)
- * Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-server)
- * Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-servlet)
- * Jetty :: Utility Servlets and Filters (org.eclipse.jetty:jetty-servlets:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-servlets)
- * Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-util)
- * Jetty :: Utilities :: Ajax(JSON) (org.eclipse.jetty:jetty-util-ajax:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-util-ajax)
- * Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-webapp)
- * Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.51.v20230217 - https://eclipse.org/jetty/jetty-xml)
- * Jetty :: HTTP2 :: Client (org.eclipse.jetty.http2:http2-client:9.4.44.v20210927 - https://eclipse.org/jetty/http2-parent/http2-client)
- * Jetty :: HTTP2 :: Common (org.eclipse.jetty.http2:http2-common:9.4.51.v20230217 - https://eclipse.org/jetty/http2-parent/http2-common)
- * Jetty :: HTTP2 :: HPACK (org.eclipse.jetty.http2:http2-hpack:9.4.44.v20210927 - https://eclipse.org/jetty/http2-parent/http2-hpack)
- * Jetty :: HTTP2 :: HTTP Client Transport (org.eclipse.jetty.http2:http2-http-client-transport:9.4.44.v20210927 - https://eclipse.org/jetty/http2-parent/http2-http-client-transport)
- * Jetty :: HTTP2 :: Server (org.eclipse.jetty.http2:http2-server:9.4.51.v20230217 - https://eclipse.org/jetty/http2-parent/http2-server)
+ * Jetty :: Rewrite Handler (org.eclipse.jetty:jetty-rewrite:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-rewrite)
+ * Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-security)
+ * Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-security)
+ * Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-server)
+ * Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-servlet)
+ * Jetty :: Utility Servlets and Filters (org.eclipse.jetty:jetty-servlets:9.4.15.v20190215 - http://www.eclipse.org/jetty)
+ * Jetty :: Utility Servlets and Filters (org.eclipse.jetty:jetty-servlets:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-servlets)
+ * Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-util)
+ * Jetty :: Utilities :: Ajax(JSON) (org.eclipse.jetty:jetty-util-ajax:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-util-ajax)
+ * Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-webapp)
+ * Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.53.v20231009 - https://eclipse.org/jetty/jetty-xml)
+ * Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.54.v20240208 - https://eclipse.org/jetty/jetty-xml)
+ * Jetty :: ALPN :: API (org.eclipse.jetty.alpn:alpn-api:1.1.3.v20160715 - http://www.eclipse.org/jetty/alpn-api)
+ * Jetty :: HTTP2 :: Client (org.eclipse.jetty.http2:http2-client:9.4.53.v20231009 - https://eclipse.org/jetty/http2-parent/http2-client)
+ * Jetty :: HTTP2 :: Common (org.eclipse.jetty.http2:http2-common:9.4.54.v20240208 - https://eclipse.org/jetty/http2-parent/http2-common)
+ * Jetty :: HTTP2 :: HPACK (org.eclipse.jetty.http2:http2-hpack:9.4.53.v20231009 - https://eclipse.org/jetty/http2-parent/http2-hpack)
+ * Jetty :: HTTP2 :: HTTP Client Transport (org.eclipse.jetty.http2:http2-http-client-transport:9.4.53.v20231009 - https://eclipse.org/jetty/http2-parent/http2-http-client-transport)
+ * Jetty :: HTTP2 :: Server (org.eclipse.jetty.http2:http2-server:9.4.15.v20190215 - https://eclipse.org/jetty/http2-parent/http2-server)
+ * Jetty :: HTTP2 :: Server (org.eclipse.jetty.http2:http2-server:9.4.53.v20231009 - https://eclipse.org/jetty/http2-parent/http2-server)
* Jetty :: Schemas (org.eclipse.jetty.toolchain:jetty-schemas:3.1.2 - https://eclipse.org/jetty/jetty-schemas)
- * HK2 API module (org.glassfish.hk2:hk2-api:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-api)
- * ServiceLocator Default Implementation (org.glassfish.hk2:hk2-locator:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-locator)
- * HK2 Implementation Utilities (org.glassfish.hk2:hk2-utils:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-utils)
+ * JSON-P Default Provider (org.glassfish:jakarta.json:2.0.1 - https://github.com/eclipse-ee4j/jsonp)
+ * HK2 API module (org.glassfish.hk2:hk2-api:3.0.5 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-api)
+ * ServiceLocator Default Implementation (org.glassfish.hk2:hk2-locator:3.0.5 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-locator)
+ * HK2 Implementation Utilities (org.glassfish.hk2:hk2-utils:3.0.5 - https://github.com/eclipse-ee4j/glassfish-hk2/hk2-utils)
* OSGi resource locator (org.glassfish.hk2:osgi-resource-locator:1.0.3 - https://projects.eclipse.org/projects/ee4j/osgi-resource-locator)
- * aopalliance version 1.0 repackaged as a module (org.glassfish.hk2.external:aopalliance-repackaged:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/external/aopalliance-repackaged)
- * javax.inject:1 as OSGi bundle (org.glassfish.hk2.external:jakarta.inject:2.6.1 - https://github.com/eclipse-ee4j/glassfish-hk2/external/jakarta.inject)
- * jersey-core-client (org.glassfish.jersey.core:jersey-client:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
- * jersey-core-common (org.glassfish.jersey.core:jersey-common:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-common)
- * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
- * Java Persistence API, Version 2.1 (org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final - http://hibernate.org)
+ * aopalliance version 1.0 repackaged as a module (org.glassfish.hk2.external:aopalliance-repackaged:3.0.5 - https://github.com/eclipse-ee4j/glassfish-hk2/external/aopalliance-repackaged)
+ * jersey-core-client (org.glassfish.jersey.core:jersey-client:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
+ * jersey-core-common (org.glassfish.jersey.core:jersey-common:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-common)
+ * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:3.1.3 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-media-multipart)
+ * org.locationtech.jts:jts-core (org.locationtech.jts:jts-core:1.19.0 - https://www.locationtech.org/projects/technology.jts/jts-modules/jts-core)
+ * org.locationtech.jts.io:jts-io-common (org.locationtech.jts.io:jts-io-common:1.19.0 - https://www.locationtech.org/projects/technology.jts/jts-modules/jts-io/jts-io-common)
* Jetty Server (org.mortbay.jetty:jetty:6.1.26 - http://www.eclipse.org/jetty/jetty-parent/project/modules/jetty)
* Jetty Servlet Tester (org.mortbay.jetty:jetty-servlet-tester:6.1.26 - http://www.eclipse.org/jetty/jetty-parent/project/jetty-servlet-tester)
* Jetty Utilities (org.mortbay.jetty:jetty-util:6.1.26 - http://www.eclipse.org/jetty/jetty-parent/project/jetty-util)
@@ -564,14 +622,13 @@ https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines
* uri-template (com.github.java-json-tools:uri-template:0.10 - https://github.com/java-json-tools/uri-template)
* FindBugs-Annotations (com.google.code.findbugs:annotations:3.0.1u2 - http://findbugs.sourceforge.net/)
* JHighlight (org.codelibs:jhighlight:1.1.0 - https://github.com/codelibs/jhighlight)
- * Hibernate ORM - hibernate-core (org.hibernate:hibernate-core:5.6.15.Final - https://hibernate.org/orm)
- * Hibernate ORM - hibernate-jcache (org.hibernate:hibernate-jcache:5.6.15.Final - https://hibernate.org/orm)
- * Hibernate ORM - hibernate-jpamodelgen (org.hibernate:hibernate-jpamodelgen:5.6.15.Final - https://hibernate.org/orm)
- * Hibernate Commons Annotations (org.hibernate.common:hibernate-commons-annotations:5.1.2.Final - http://hibernate.org)
+ * Hibernate Commons Annotations (org.hibernate.common:hibernate-commons-annotations:6.0.6.Final - http://hibernate.org)
+ * Hibernate ORM - hibernate-core (org.hibernate.orm:hibernate-core:6.4.8.Final - https://hibernate.org/orm)
+ * Hibernate ORM - hibernate-jcache (org.hibernate.orm:hibernate-jcache:6.4.8.Final - https://hibernate.org/orm)
+ * Hibernate ORM - hibernate-jpamodelgen (org.hibernate.orm:hibernate-jpamodelgen:6.4.8.Final - https://hibernate.org/orm)
* im4java (org.im4java:im4java:1.4.0 - http://sourceforge.net/projects/im4java/)
- * Javassist (org.javassist:javassist:3.25.0-GA - http://www.javassist.org/)
- * XOM (xom:xom:1.2.5 - http://xom.nu)
- * XOM (xom:xom:1.3.7 - https://xom.nu)
+ * Javassist (org.javassist:javassist:3.29.2-GA - http://www.javassist.org/)
+ * XOM (xom:xom:1.3.9 - https://xom.nu)
Go License:
@@ -579,63 +636,70 @@ https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines
Handle.Net Public License Agreement (Ver.2):
- * Handle Server (net.handle:handle:9.3.0 - https://www.handle.net)
+ * Handle Server (net.handle:handle:9.3.1 - https://www.handle.net)
+
+ ISC License:
+
+ * Simple Magic (com.j256.simplemagic:simplemagic:1.17 - https://256stuff.com/sources/simplemagic/)
MIT License:
+ * dexx (com.github.andrewoma.dexx:collection:0.7 - https://github.com/andrewoma/dexx)
* better-files (com.github.pathikrit:better-files_2.13:3.9.1 - https://github.com/pathikrit/better-files)
* Java SemVer (com.github.zafarkhaja:java-semver:0.9.0 - https://github.com/zafarkhaja/jsemver)
- * dd-plist (com.googlecode.plist:dd-plist:1.25 - http://www.github.com/3breadt/dd-plist)
- * DigitalCollections: IIIF API Library (de.digitalcollections.iiif:iiif-apis:0.3.9 - https://github.com/dbmdz/iiif-apis)
+ * dd-plist (com.googlecode.plist:dd-plist:1.28 - http://www.github.com/3breadt/dd-plist)
+ * DigitalCollections: IIIF API Library (de.digitalcollections.iiif:iiif-apis:0.3.10 - https://github.com/dbmdz/iiif-apis)
* s3mock (io.findify:s3mock_2.13:0.2.6 - https://github.com/findify/s3mock)
+ * ClassGraph (io.github.classgraph:classgraph:4.8.165 - https://github.com/classgraph/classgraph)
* JOpt Simple (net.sf.jopt-simple:jopt-simple:5.0.4 - http://jopt-simple.github.io/jopt-simple)
- * Bouncy Castle S/MIME API (org.bouncycastle:bcmail-jdk15on:1.70 - https://www.bouncycastle.org/java.html)
- * Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs (org.bouncycastle:bcpkix-jdk15on:1.70 - https://www.bouncycastle.org/java.html)
- * Bouncy Castle Provider (org.bouncycastle:bcprov-jdk15on:1.70 - https://www.bouncycastle.org/java.html)
- * Bouncy Castle ASN.1 Extension and Utility APIs (org.bouncycastle:bcutil-jdk15on:1.70 - https://www.bouncycastle.org/java.html)
+ * Bouncy Castle S/MIME API (org.bouncycastle:bcmail-jdk18on:1.77 - https://www.bouncycastle.org/java.html)
+ * Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs (org.bouncycastle:bcpkix-jdk15on:1.67 - http://www.bouncycastle.org/java.html)
+ * Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs (org.bouncycastle:bcpkix-jdk18on:1.78.1 - https://www.bouncycastle.org/java.html)
+ * Bouncy Castle Provider (org.bouncycastle:bcprov-jdk15on:1.67 - http://www.bouncycastle.org/java.html)
+ * Bouncy Castle Provider (org.bouncycastle:bcprov-jdk18on:1.78.1 - https://www.bouncycastle.org/java.html)
+ * Bouncy Castle ASN.1 Extension and Utility APIs (org.bouncycastle:bcutil-jdk18on:1.78.1 - https://www.bouncycastle.org/java.html)
* org.brotli:dec (org.brotli:dec:0.1.2 - http://brotli.org/dec)
- * Checker Qual (org.checkerframework:checker-qual:3.10.0 - https://checkerframework.org)
* Checker Qual (org.checkerframework:checker-qual:3.31.0 - https://checkerframework.org)
- * jersey-core-client (org.glassfish.jersey.core:jersey-client:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
- * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-core-client (org.glassfish.jersey.core:jersey-client:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
+ * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:3.1.3 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-media-multipart)
* mockito-core (org.mockito:mockito-core:3.12.4 - https://github.com/mockito/mockito)
* mockito-inline (org.mockito:mockito-inline:3.12.4 - https://github.com/mockito/mockito)
- * ORCID - Model (org.orcid:orcid-model:3.0.2 - http://github.com/ORCID/orcid-model)
- * JUL to SLF4J bridge (org.slf4j:jul-to-slf4j:1.7.36 - http://www.slf4j.org)
- * SLF4J API Module (org.slf4j:slf4j-api:1.7.36 - http://www.slf4j.org)
+ * SLF4J API Module (org.slf4j:slf4j-api:2.0.11 - http://www.slf4j.org)
* SLF4J Extensions Module (org.slf4j:slf4j-ext:1.7.28 - http://www.slf4j.org)
* HAL Browser (org.webjars:hal-browser:ad9b865 - http://webjars.org)
* toastr (org.webjars.bowergithub.codeseven:toastr:2.1.4 - http://webjars.org)
* backbone (org.webjars.bowergithub.jashkenas:backbone:1.4.1 - https://www.webjars.org)
* underscore (org.webjars.bowergithub.jashkenas:underscore:1.13.2 - https://www.webjars.org)
- * jquery (org.webjars.bowergithub.jquery:jquery-dist:3.6.0 - https://www.webjars.org)
- * urijs (org.webjars.bowergithub.medialize:uri.js:1.19.10 - https://www.webjars.org)
- * bootstrap (org.webjars.bowergithub.twbs:bootstrap:4.6.1 - https://www.webjars.org)
- * core-js (org.webjars.npm:core-js:3.30.1 - https://www.webjars.org)
+ * jquery (org.webjars.bowergithub.jquery:jquery-dist:3.7.1 - https://www.webjars.org)
+ * urijs (org.webjars.bowergithub.medialize:uri.js:1.19.11 - https://www.webjars.org)
+ * bootstrap (org.webjars.bowergithub.twbs:bootstrap:4.6.2 - https://www.webjars.org)
+ * core-js (org.webjars.npm:core-js:3.37.1 - https://www.webjars.org)
* @json-editor/json-editor (org.webjars.npm:json-editor__json-editor:2.6.1 - https://www.webjars.org)
Mozilla Public License:
- * juniversalchardet (com.googlecode.juniversalchardet:juniversalchardet:1.0.3 - http://juniversalchardet.googlecode.com/)
- * H2 Database Engine (com.h2database:h2:2.1.210 - https://h2database.com)
+ * juniversalchardet (com.github.albfernandez:juniversalchardet:2.4.0 - https://github.com/albfernandez/juniversalchardet)
+ * H2 Database Engine (com.h2database:h2:2.2.224 - https://h2database.com)
* Saxon-HE (net.sf.saxon:Saxon-HE:9.8.0-14 - http://www.saxonica.com/)
- * Javassist (org.javassist:javassist:3.25.0-GA - http://www.javassist.org/)
+ * Javassist (org.javassist:javassist:3.29.2-GA - http://www.javassist.org/)
* Mozilla Rhino (org.mozilla:rhino:1.7.7.2 - https://developer.mozilla.org/en/Rhino)
Public Domain:
- * jersey-core-client (org.glassfish.jersey.core:jersey-client:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
- * jersey-core-common (org.glassfish.jersey.core:jersey-common:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-common)
- * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-core-client (org.glassfish.jersey.core:jersey-client:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
+ * jersey-core-common (org.glassfish.jersey.core:jersey-common:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-common)
+ * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:3.1.3 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-media-multipart)
* HdrHistogram (org.hdrhistogram:HdrHistogram:2.1.12 - http://hdrhistogram.github.io/HdrHistogram/)
- * JSON in Java (org.json:json:20230227 - https://github.com/douglascrockford/JSON-java)
+ * JSON in Java (org.json:json:20231013 - https://github.com/douglascrockford/JSON-java)
* LatencyUtils (org.latencyutils:LatencyUtils:2.0.3 - http://latencyutils.github.io/LatencyUtils/)
* Reflections (org.reflections:reflections:0.9.12 - http://github.com/ronmamo/reflections)
* XZ for Java (org.tukaani:xz:1.9 - https://tukaani.org/xz/java.html)
UnRar License:
- * Java Unrar (com.github.junrar:junrar:7.5.3 - https://github.com/junrar/junrar)
+ * Java Unrar (com.github.junrar:junrar:7.5.5 - https://github.com/junrar/junrar)
Unicode/ICU License:
@@ -643,10 +707,12 @@ https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines
W3C license:
- * jersey-core-client (org.glassfish.jersey.core:jersey-client:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
- * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-core-client (org.glassfish.jersey.core:jersey-client:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
+ * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:3.1.3 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-media-multipart)
jQuery license:
- * jersey-core-client (org.glassfish.jersey.core:jersey-client:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
- * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:2.35 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-core-client (org.glassfish.jersey.core:jersey-client:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/jersey-client)
+ * jersey-inject-hk2 (org.glassfish.jersey.inject:jersey-hk2:3.1.5 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-hk2)
+ * jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:3.1.3 - https://projects.eclipse.org/projects/ee4j.jersey/project/jersey-media-multipart)
diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml
index eb7e30480c62..f4d4a87dd8ce 100644
--- a/bitbucket-pipelines.yml
+++ b/bitbucket-pipelines.yml
@@ -1,4 +1,4 @@
-image: maven:3.6.1
+image: maven:3.9.8-eclipse-temurin-17-focal
definitions:
docker:
diff --git a/docker-compose-cli.yml b/docker-compose-cli.yml
index 72b416d13454..dd77bdf108ca 100644
--- a/docker-compose-cli.yml
+++ b/docker-compose-cli.yml
@@ -1,4 +1,3 @@
-version: "3.7"
networks:
# Default to using network named 'dspacenet' from docker-compose.yml.
# Its full name will be prepended with the project name (e.g. "-p d7" means it will be named "d7_dspacenet")
diff --git a/docker-compose.yml b/docker-compose.yml
index 8cd8b372eed5..94d3157c947e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,4 +1,3 @@
-version: '3.7'
networks:
dspacenet:
ipam:
@@ -29,7 +28,7 @@ services:
# from the host machine. This IP range MUST correspond to the 'dspacenet' subnet defined above.
proxies__P__trusted__P__ipranges: '172.23.0'
LOGGING_CONFIG: /dspace/config/log4j2-container.xml
- image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-8_x-test}"
+ image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-latest-test}"
build:
context: .
dockerfile: Dockerfile.test
@@ -40,8 +39,6 @@ services:
ports:
- published: 8080
target: 8080
- - published: 8009
- target: 8009
- published: 8000
target: 8000
stdin_open: true
@@ -55,14 +52,14 @@ services:
# Ensure that the database is ready BEFORE starting tomcat
# 1. While a TCP connection to dspacedb port 5432 is not available, continue to sleep
# 2. Then, run database migration to init database tables
- # 3. Finally, start Tomcat
+ # 3. Finally, start DSpace
entrypoint:
- /bin/bash
- '-c'
- |
while (! /dev/null 2>&1; do sleep 1; done;
/dspace/bin/dspace database migrate
- catalina.sh run
+ java -jar /dspace/webapps/server-boot.jar --dspace.dir=/dspace
# DSpace PostgreSQL database container
dspacedb:
container_name: dspacedb
diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml
index ff5249c504b7..1ebe51d07fad 100644
--- a/dspace-api/pom.xml
+++ b/dspace-api/pom.xml
@@ -54,21 +54,21 @@
- org.hibernate
+ org.hibernate.orm
hibernate-jpamodelgen
${hibernate.version}
- javax.xml.bind
- jaxb-api
+ jakarta.xml.bind
+ jakarta.xml.bind-api
${jaxb-api.version}
- javax.annotation
- javax.annotation-api
- ${javax-annotation.version}
+ jakarta.annotation
+ jakarta.annotation-api
+ ${jakarta-annotation.version}
@@ -177,7 +177,7 @@
org.codehaus.mojo
jaxb2-maven-plugin
- 2.5.0
+ 3.1.0
workflow-curation
@@ -342,18 +342,15 @@
log4j-api
- org.hibernate
+ org.hibernate.orm
hibernate-core
-
-
-
- org.javassist
- javassist
-
-
- org.hibernate
+ org.hibernate.orm
+ hibernate-jpamodelgen
+
+
+ org.hibernate.orm
hibernate-jcache
@@ -377,26 +374,16 @@
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
- 2.13.5
javax.cache
cache-api
-
- org.hibernate
- hibernate-jpamodelgen
-
org.hibernate.validator
hibernate-validator-cdi
${hibernate-validator.version}
-
- org.hibernate.javax.persistence
- hibernate-jpa-2.1-api
- 1.0.2.Final
-
org.springframework
@@ -407,30 +394,26 @@
net.handle
handle
+
net.cnri
cnri-servlet-container
+ runtime
-
+
- org.ow2.asm
- asm-commons
-
-
-
- org.bouncycastle
- bcpkix-jdk15on
-
-
- org.bouncycastle
- bcprov-jdk15on
+ org.mortbay.jasper
+ apache-jsp
-
+
+
org.eclipse.jetty
jetty-server
+ runtime
org.dspace
@@ -440,12 +423,6 @@
org.apache.jena
apache-jena-libs
pom
-
-
- log4j
- log4j
-
-
commons-cli
@@ -463,10 +440,6 @@
org.apache.commons
commons-dbcp2
-
- commons-fileupload
- commons-fileupload
-
commons-io
@@ -485,17 +458,26 @@
commons-validator
- com.sun.mail
- javax.mail
+ jakarta.mail
+ jakarta.mail-api
+ provided
+
+
+ org.eclipse.angus
+ jakarta.mail
- javax.servlet
- javax.servlet-api
+ jakarta.servlet
+ jakarta.servlet-api
provided
- javax.annotation
- javax.annotation-api
+ jakarta.annotation
+ jakarta.annotation-api
+
+
+ jakarta.el
+ jakarta.el-api
jaxen
@@ -602,6 +584,11 @@
com.google.j2objc
j2objc-annotations
+
+
+ org.antlr
+ antlr4-runtime
+
@@ -646,7 +633,7 @@
dnsjava
dnsjava
- 2.1.9
+ 3.6.0
@@ -682,7 +669,12 @@
org.flywaydb
flyway-core
- 8.5.13
+ ${flyway.version}
+
+
+ org.flywaydb
+ flyway-database-postgresql
+ ${flyway.version}
@@ -722,23 +714,22 @@
joda-time
- javax.inject
- javax.inject
- 1
- jar
+ jakarta.inject
+ jakarta.inject-api
+ 2.0.1
- javax.xml.bind
- jaxb-api
+ jakarta.xml.bind
+ jakarta.xml.bind-api
org.glassfish.jaxb
jaxb-runtime
-
+
org.glassfish.jersey.core
jersey-client
@@ -759,23 +750,14 @@
1.12.261
+
+
- org.orcid
- orcid-model
- 3.0.7
+ org.dspace
+ orcid-model-jakarta
+ 3.3.0
-
- javax.validation
- validation-api
-
-
- com.fasterxml.jackson.jaxrs
- jackson-jaxrs-json-provider
-
-
- org.yaml
- snakeyaml
-
org.javassist
javassist
@@ -843,27 +825,36 @@
- org.apache.xmlgraphics
- fop
- 2.5
-
-
- javax.servlet
- servlet-api
-
+ org.apache.xmlgraphics
+ fop
+ 2.9
+
+
+ javax.servlet
+ servlet-api
+
+
+ xml-apis
+ xml-apis
+
+
+ xml-apis
+ xml-apis-ext
+
-
+
+
+
+ org.apache.xmlgraphics
+ fop-pdf-images
+ 2.9
+
-
- org.apache.xmlgraphics
- fop-pdf-images
- 2.5
-
de.undercouch
citeproc-java
- 1.0.1
+ 2.0.0
org.apache.commons
@@ -877,6 +868,10 @@
org.antlr
antlr4-runtime
+
+ org.ow2.asm
+ asm-util
+
@@ -923,7 +918,17 @@
com.fasterxml.jackson.datatype
- jackson-datatype-jsr310
+ jackson-datatype-jsr310
+
+
+
+ javax.xml.bind
+ jaxb-api
+
+
+
+ javax.servlet
+ javax.servlet-api
@@ -944,7 +949,6 @@
-
@@ -990,7 +994,7 @@
org.xmlunit
xmlunit-core
- 2.9.1
+ 2.10.0
test
@@ -999,14 +1003,9 @@
2.2.14
- jakarta.xml.bind
- jakarta.xml.bind-api
- 2.3.3
-
-
- javax.validation
- validation-api
- 2.0.1.Final
+ jakarta.validation
+ jakarta.validation-api
+ 3.0.2
io.swagger
diff --git a/dspace-api/src/main/java/org/dspace/alerts/SystemWideAlert.java b/dspace-api/src/main/java/org/dspace/alerts/SystemWideAlert.java
index f56cbdcce9e9..432c633ea591 100644
--- a/dspace-api/src/main/java/org/dspace/alerts/SystemWideAlert.java
+++ b/dspace-api/src/main/java/org/dspace/alerts/SystemWideAlert.java
@@ -8,17 +8,17 @@
package org.dspace.alerts;
import java.util.Date;
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Cacheable;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.dspace.core.ReloadableEntity;
diff --git a/dspace-api/src/main/java/org/dspace/alerts/dao/impl/SystemWideAlertDAOImpl.java b/dspace-api/src/main/java/org/dspace/alerts/dao/impl/SystemWideAlertDAOImpl.java
index 13a0e0af236a..79dc1bcf27a3 100644
--- a/dspace-api/src/main/java/org/dspace/alerts/dao/impl/SystemWideAlertDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/alerts/dao/impl/SystemWideAlertDAOImpl.java
@@ -9,10 +9,10 @@
import java.sql.SQLException;
import java.util.List;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Root;
import org.dspace.alerts.SystemWideAlert;
import org.dspace.alerts.SystemWideAlert_;
import org.dspace.alerts.dao.SystemWideAlertDAO;
diff --git a/dspace-api/src/main/java/org/dspace/app/batch/ItemImportOA.java b/dspace-api/src/main/java/org/dspace/app/batch/ItemImportOA.java
index f74146ab91d8..3732c2c82265 100644
--- a/dspace-api/src/main/java/org/dspace/app/batch/ItemImportOA.java
+++ b/dspace-api/src/main/java/org/dspace/app/batch/ItemImportOA.java
@@ -22,9 +22,9 @@
import java.util.StringTokenizer;
import java.util.UUID;
import java.util.stream.Collectors;
-import javax.mail.MessagingException;
import javax.xml.transform.TransformerException;
+import jakarta.mail.MessagingException;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java
index 7f7c64ff5ca8..33a4fc1e9f42 100644
--- a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java
+++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java
@@ -20,8 +20,8 @@
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nullable;
import org.apache.commons.cli.ParseException;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
@@ -830,8 +830,10 @@ protected void compareAndUpdate(Context c, Item item, String[] fromCSV, boolean
addRelationships(c, item, element, values);
} else {
itemService.clearMetadata(c, item, schema, element, qualifier, language);
- itemService.addMetadata(c, item, schema, element, qualifier,
- language, values, authorities, confidences);
+ if (!values.isEmpty()) {
+ itemService.addMetadata(c, item, schema, element, qualifier,
+ language, values, authorities, confidences);
+ }
itemService.update(c, item);
}
}
@@ -1126,8 +1128,8 @@ protected void add(Context c, String[] fromCSV, String md, BulkEditChange change
.getAuthoritySeparator() + dcv.getConfidence();
}
- // Add it
- if ((value != null) && (!"".equals(value))) {
+ // Add it, if value is not blank
+ if (value != null && StringUtils.isNotBlank(value)) {
changes.registerAdd(dcv);
}
}
diff --git a/dspace-api/src/main/java/org/dspace/app/bulkimport/service/BulkImportWorkbookBuilderImpl.java b/dspace-api/src/main/java/org/dspace/app/bulkimport/service/BulkImportWorkbookBuilderImpl.java
index 7831355a7fb2..09683e09d099 100644
--- a/dspace-api/src/main/java/org/dspace/app/bulkimport/service/BulkImportWorkbookBuilderImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/bulkimport/service/BulkImportWorkbookBuilderImpl.java
@@ -33,8 +33,8 @@
import java.util.function.BiConsumer;
import java.util.logging.Level;
import java.util.stream.Collectors;
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
diff --git a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java
index 7c80e1ea7dc6..9eaabc20e862 100644
--- a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java
@@ -31,8 +31,8 @@
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
-import javax.mail.MessagingException;
+import jakarta.mail.MessagingException;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
import org.dspace.app.itemexport.service.ItemExportService;
diff --git a/dspace-api/src/main/java/org/dspace/app/itemexport/service/ItemExportService.java b/dspace-api/src/main/java/org/dspace/app/itemexport/service/ItemExportService.java
index 6ec1027709bb..cc53d952e79b 100644
--- a/dspace-api/src/main/java/org/dspace/app/itemexport/service/ItemExportService.java
+++ b/dspace-api/src/main/java/org/dspace/app/itemexport/service/ItemExportService.java
@@ -11,8 +11,8 @@
import java.util.Date;
import java.util.Iterator;
import java.util.List;
-import javax.mail.MessagingException;
+import jakarta.mail.MessagingException;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.core.Context;
diff --git a/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java
index 255f4bdcbb15..087a33026151 100644
--- a/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java
@@ -46,7 +46,6 @@
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
-import javax.mail.MessagingException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@@ -56,6 +55,7 @@
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
+import jakarta.mail.MessagingException;
import org.apache.commons.collections4.ComparatorUtils;
import org.apache.commons.io.FileDeleteStrategy;
import org.apache.commons.io.FileUtils;
@@ -1743,7 +1743,8 @@ protected void processOptions(Context c, Item myItem, List options)
} else {
logInfo("\tSetting special permissions for "
+ bitstreamName);
- setPermission(c, myGroup, actionID, bs);
+ String rpType = useWorkflow ? ResourcePolicy.TYPE_SUBMISSION : ResourcePolicy.TYPE_INHERITED;
+ setPermission(c, myGroup, rpType, actionID, bs);
}
}
@@ -1801,24 +1802,25 @@ protected void processOptions(Context c, Item myItem, List options)
*
* @param c DSpace Context
* @param g Dspace Group
+ * @param rpType resource policy type string
* @param actionID action identifier
* @param bs Bitstream
* @throws SQLException if database error
* @throws AuthorizeException if authorization error
* @see org.dspace.core.Constants
*/
- protected void setPermission(Context c, Group g, int actionID, Bitstream bs)
+ protected void setPermission(Context c, Group g, String rpType, int actionID, Bitstream bs)
throws SQLException, AuthorizeException {
if (!isTest) {
// remove the default policy
authorizeService.removeAllPolicies(c, bs);
// add the policy
- ResourcePolicy rp = resourcePolicyService.create(c);
+ ResourcePolicy rp = resourcePolicyService.create(c, null, g);
rp.setdSpaceObject(bs);
rp.setAction(actionID);
- rp.setGroup(g);
+ rp.setRpType(rpType);
resourcePolicyService.update(c, rp);
} else {
@@ -1957,58 +1959,57 @@ public String unzip(File zipfile, String destDir) throws IOException {
try {
while (entries.hasMoreElements()) {
entry = entries.nextElement();
+ String entryName = entry.getName();
+ File outFile = new File(zipDir + entryName);
+ // Verify that this file/directory will be extracted into our zipDir (and not somewhere else!)
+ if (!outFile.toPath().normalize().startsWith(zipDir)) {
+ throw new IOException("Bad zip entry: '" + entryName
+ + "' in file '" + zipfile.getAbsolutePath() + "'!"
+ + " Cannot process this file or directory.");
+ }
if (entry.isDirectory()) {
- if (!new File(zipDir + entry.getName()).mkdirs()) {
+ if (!outFile.mkdirs()) {
logError("Unable to create contents directory: " + zipDir + entry.getName());
}
} else {
- String entryName = entry.getName();
- File outFile = new File(zipDir + entryName);
- // Verify that this file will be extracted into our zipDir (and not somewhere else!)
- if (!outFile.toPath().normalize().startsWith(zipDir)) {
- throw new IOException("Bad zip entry: '" + entryName
- + "' in file '" + zipfile.getAbsolutePath() + "'!"
- + " Cannot process this file.");
- } else {
- logInfo("Extracting file: " + entryName);
+ logInfo("Extracting file: " + entryName);
- int index = entryName.lastIndexOf('/');
- if (index == -1) {
- // Was it created on Windows instead?
- index = entryName.lastIndexOf('\\');
+ int index = entryName.lastIndexOf('/');
+ if (index == -1) {
+ // Was it created on Windows instead?
+ index = entryName.lastIndexOf('\\');
+ }
+ if (index > 0) {
+ File dir = new File(zipDir + entryName.substring(0, index));
+ if (!dir.exists() && !dir.mkdirs()) {
+ logError("Unable to create directory: " + dir.getAbsolutePath());
}
- if (index > 0) {
- File dir = new File(zipDir + entryName.substring(0, index));
- if (!dir.exists() && !dir.mkdirs()) {
- logError("Unable to create directory: " + dir.getAbsolutePath());
- }
- //Entries could have too many directories, and we need to adjust the sourcedir
- // file1.zip (SimpleArchiveFormat / item1 / contents|dublin_core|...
- // SimpleArchiveFormat / item2 / contents|dublin_core|...
- // or
- // file2.zip (item1 / contents|dublin_core|...
- // item2 / contents|dublin_core|...
-
- //regex supports either windows or *nix file paths
- String[] entryChunks = entryName.split("/|\\\\");
- if (entryChunks.length > 2) {
- if (StringUtils.equals(sourceDirForZip, sourcedir)) {
- sourceDirForZip = sourcedir + "/" + entryChunks[0];
- }
+ //Entries could have too many directories, and we need to adjust the sourcedir
+ // file1.zip (SimpleArchiveFormat / item1 / contents|dublin_core|...
+ // SimpleArchiveFormat / item2 / contents|dublin_core|...
+ // or
+ // file2.zip (item1 / contents|dublin_core|...
+ // item2 / contents|dublin_core|...
+
+ //regex supports either windows or *nix file paths
+ String[] entryChunks = entryName.split("/|\\\\");
+ if (entryChunks.length > 2) {
+ if (StringUtils.equals(sourceDirForZip, sourcedir)) {
+ sourceDirForZip = sourcedir + "/" + entryChunks[0];
}
}
- byte[] buffer = new byte[1024];
- int len;
- InputStream in = zf.getInputStream(entry);
- BufferedOutputStream out = new BufferedOutputStream(
- new FileOutputStream(outFile));
- while ((len = in.read(buffer)) >= 0) {
- out.write(buffer, 0, len);
- }
- in.close();
- out.close();
}
+ byte[] buffer = new byte[1024];
+ int len;
+ InputStream in = zf.getInputStream(entry);
+ BufferedOutputStream out = new BufferedOutputStream(
+ new FileOutputStream(outFile));
+ while ((len = in.read(buffer)) >= 0) {
+ out.write(buffer, 0, len);
+ }
+ in.close();
+ out.close();
}
}
} finally {
@@ -2233,7 +2234,7 @@ public void emailSuccessMessage(Context context, EPerson eperson,
String fileName) throws MessagingException {
try {
Locale supportedLocale = I18nUtil.getEPersonLocale(eperson);
- Email email = Email.getEmail(I18nUtil.getEmailFilename(supportedLocale, "bte_batch_import_success"));
+ Email email = Email.getEmail(I18nUtil.getEmailFilename(supportedLocale, "batch_import_success"));
email.addRecipient(eperson.getEmail());
email.addArgument(fileName);
@@ -2249,7 +2250,7 @@ public void emailErrorMessage(EPerson eperson, String error)
logError("An error occurred during item import, the user will be notified. " + error);
try {
Locale supportedLocale = I18nUtil.getEPersonLocale(eperson);
- Email email = Email.getEmail(I18nUtil.getEmailFilename(supportedLocale, "bte_batch_import_error"));
+ Email email = Email.getEmail(I18nUtil.getEmailFilename(supportedLocale, "batch_import_error"));
email.addRecipient(eperson.getEmail());
email.addArgument(error);
email.addArgument(configurationService.getProperty("dspace.ui.url") + "/feedback");
diff --git a/dspace-api/src/main/java/org/dspace/app/itemimport/service/ItemImportService.java b/dspace-api/src/main/java/org/dspace/app/itemimport/service/ItemImportService.java
index e99ece31b9bb..90cb6f9b803a 100644
--- a/dspace-api/src/main/java/org/dspace/app/itemimport/service/ItemImportService.java
+++ b/dspace-api/src/main/java/org/dspace/app/itemimport/service/ItemImportService.java
@@ -10,8 +10,8 @@
import java.io.File;
import java.io.IOException;
import java.util.List;
-import javax.mail.MessagingException;
+import jakarta.mail.MessagingException;
import org.dspace.app.itemimport.BatchUpload;
import org.dspace.content.Collection;
import org.dspace.core.Context;
diff --git a/dspace-api/src/main/java/org/dspace/app/itemupdate/DeleteBitstreamsAction.java b/dspace-api/src/main/java/org/dspace/app/itemupdate/DeleteBitstreamsAction.java
index cb5dcfb75dc0..65157f5207e7 100644
--- a/dspace-api/src/main/java/org/dspace/app/itemupdate/DeleteBitstreamsAction.java
+++ b/dspace-api/src/main/java/org/dspace/app/itemupdate/DeleteBitstreamsAction.java
@@ -70,16 +70,19 @@ public void execute(Context context, ItemArchive itarch, boolean isTest,
}
}
- if (alterProvenance) {
+ if (alterProvenance && !bundles.isEmpty()) {
DtoMetadata dtom = DtoMetadata.create("dc.description.provenance", "en", "");
String append = "Bitstream " + bs.getName() + " deleted on " + DCDate
.getCurrent() + "; ";
- Item item = bundles.iterator().next().getItems().iterator().next();
- ItemUpdate.pr("Append provenance with: " + append);
+ List- items = bundles.iterator().next().getItems();
+ if (!items.isEmpty()) {
+ Item item = items.iterator().next();
+ ItemUpdate.pr("Append provenance with: " + append);
- if (!isTest) {
- MetadataUtilities.appendMetadata(context, item, dtom, false, append);
+ if (!isTest) {
+ MetadataUtilities.appendMetadata(context, item, dtom, false, append);
+ }
}
}
}
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/LDNMessageConsumer.java b/dspace-api/src/main/java/org/dspace/app/ldn/LDNMessageConsumer.java
index 9e03cf73927e..210aaa6c9c97 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/LDNMessageConsumer.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/LDNMessageConsumer.java
@@ -163,6 +163,9 @@ private void appendGeneratedMessage(LDN ldn, LDNMessageEntity ldnMessage, String
ldn.addArgument(generateBitstreamDownloadUrl(item));
ldn.addArgument(getBitstreamMimeType(findPrimaryBitstream(item)));
ldn.addArgument(ldnMessage.getID());
+ ldn.addArgument(getRelationUri(item));
+ ldn.addArgument("http://purl.org/vocab/frbr/core#supplement");
+ ldn.addArgument(format("urn:uuid:%s", UUID.randomUUID()));
ldnMessage.setMessage(ldn.generateLDNMessage());
}
@@ -179,6 +182,15 @@ private String getIdentifierUri(Item item) {
.orElse("");
}
+ private String getRelationUri(Item item) {
+ String relationMetadata = configurationService.getProperty("ldn.notify.relation.metadata", "dc.relation");
+ return itemService.getMetadataByMetadataString(item, relationMetadata)
+ .stream()
+ .findFirst()
+ .map(MetadataValue::getValue)
+ .orElse("");
+ }
+
private String generateBitstreamDownloadUrl(Item item) {
String uiUrl = getUiUrl();
return findPrimaryBitstream(item)
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/LDNMessageEntity.java b/dspace-api/src/main/java/org/dspace/app/ldn/LDNMessageEntity.java
index 9fd63e62e47e..27257455e0ce 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/LDNMessageEntity.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/LDNMessageEntity.java
@@ -9,15 +9,15 @@
import java.lang.reflect.Field;
import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
import org.dspace.content.DSpaceObject;
import org.dspace.core.ReloadableEntity;
@@ -88,7 +88,7 @@ public class LDNMessageEntity implements ReloadableEntity {
@JoinColumn(name = "object", referencedColumnName = "uuid")
private DSpaceObject object;
- @Column(name = "message", nullable = false, columnDefinition = "text")
+ @Column(name = "message", columnDefinition = "text")
private String message;
@Column(name = "type")
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/NotifyPatternToTrigger.java b/dspace-api/src/main/java/org/dspace/app/ldn/NotifyPatternToTrigger.java
index b393d8bedbc5..da23471a1c66 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/NotifyPatternToTrigger.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/NotifyPatternToTrigger.java
@@ -7,16 +7,15 @@
*/
package org.dspace.app.ldn;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.dspace.content.Item;
import org.dspace.core.ReloadableEntity;
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/NotifyServiceEntity.java b/dspace-api/src/main/java/org/dspace/app/ldn/NotifyServiceEntity.java
index 206ed16fa00e..c939256b52ba 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/NotifyServiceEntity.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/NotifyServiceEntity.java
@@ -9,15 +9,15 @@
import java.math.BigDecimal;
import java.util.List;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.dspace.core.ReloadableEntity;
/**
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/NotifyServiceInboundPattern.java b/dspace-api/src/main/java/org/dspace/app/ldn/NotifyServiceInboundPattern.java
index 0c367d505131..329d6cb11cec 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/NotifyServiceInboundPattern.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/NotifyServiceInboundPattern.java
@@ -7,16 +7,15 @@
*/
package org.dspace.app.ldn;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.dspace.core.ReloadableEntity;
/**
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/action/LDNRelationCorrectionAction.java b/dspace-api/src/main/java/org/dspace/app/ldn/action/LDNRelationCorrectionAction.java
index 0c2f5dfc1729..f11a42ab2f90 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/action/LDNRelationCorrectionAction.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/action/LDNRelationCorrectionAction.java
@@ -10,6 +10,7 @@
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.Date;
+import java.util.Set;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.logging.log4j.LogManager;
@@ -57,7 +58,12 @@ public LDNActionStatus execute(Context context, Notification notification, Item
QAEvent qaEvent = null;
if (notification.getObject() != null) {
NotifyMessageDTO message = new NotifyMessageDTO();
- message.setHref(notification.getObject().getAsSubject());
+ if (notification.getType().containsAll(Set.of("Announce",
+ "coar-notify:RelationshipAction"))) {
+ message.setHref(notification.getObject().getAsSubject());
+ } else {
+ message.setHref(notification.getObject().getAsObject());
+ }
message.setRelationship(notification.getObject().getAsRelationship());
if (notification.getOrigin() != null) {
message.setServiceId(notification.getOrigin().getId());
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/action/SendLDNMessageAction.java b/dspace-api/src/main/java/org/dspace/app/ldn/action/SendLDNMessageAction.java
index 16fb43317e2c..c0ecf04304b8 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/action/SendLDNMessageAction.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/action/SendLDNMessageAction.java
@@ -58,7 +58,7 @@ public LDNActionStatus execute(Context context, Notification notification, Item
String url = notification.getTarget().getInbox();
HttpPost httpPost = new HttpPost(url);
- httpPost.addHeader("Content-Type", "application, ld+json");
+ httpPost.addHeader("Content-Type", "application/ld+json");
ObjectMapper mapper = new ObjectMapper();
httpPost.setEntity(new StringEntity(mapper.writeValueAsString(notification), "UTF-8"));
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/LDNMessageDaoImpl.java b/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/LDNMessageDaoImpl.java
index f3b620a706a2..d811f6d39f34 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/LDNMessageDaoImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/LDNMessageDaoImpl.java
@@ -12,12 +12,12 @@
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Order;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Order;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
import org.apache.logging.log4j.Logger;
import org.dspace.app.ldn.LDNMessageEntity;
import org.dspace.app.ldn.LDNMessageEntity_;
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyPatternToTriggerDaoImpl.java b/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyPatternToTriggerDaoImpl.java
index 47c584518b14..53cbeabe005a 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyPatternToTriggerDaoImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyPatternToTriggerDaoImpl.java
@@ -9,10 +9,10 @@
import java.sql.SQLException;
import java.util.List;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Root;
import org.dspace.app.ldn.NotifyPatternToTrigger;
import org.dspace.app.ldn.NotifyPatternToTrigger_;
import org.dspace.app.ldn.dao.NotifyPatternToTriggerDao;
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyServiceDaoImpl.java b/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyServiceDaoImpl.java
index cac804ef0c1f..bb4cf791da27 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyServiceDaoImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyServiceDaoImpl.java
@@ -9,11 +9,11 @@
import java.sql.SQLException;
import java.util.List;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.Root;
import org.dspace.app.ldn.NotifyServiceEntity;
import org.dspace.app.ldn.NotifyServiceEntity_;
import org.dspace.app.ldn.NotifyServiceInboundPattern;
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyServiceInboundPatternDaoImpl.java b/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyServiceInboundPatternDaoImpl.java
index 5168fd0bedf8..dc3dc1c74491 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyServiceInboundPatternDaoImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/dao/impl/NotifyServiceInboundPatternDaoImpl.java
@@ -9,10 +9,10 @@
import java.sql.SQLException;
import java.util.List;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Root;
import org.dspace.app.ldn.NotifyServiceEntity;
import org.dspace.app.ldn.NotifyServiceInboundPattern;
import org.dspace.app.ldn.NotifyServiceInboundPattern_;
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/model/Citation.java b/dspace-api/src/main/java/org/dspace/app/ldn/model/Citation.java
index c6629f5e7b91..7abe5c8ef44a 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/model/Citation.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/model/Citation.java
@@ -18,7 +18,7 @@ public class Citation extends Base {
@JsonProperty("ietf:cite-as")
private String ietfCiteAs;
- @JsonProperty("url")
+ @JsonProperty("ietf:item")
private Url url;
/**
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/processor/LDNMetadataProcessor.java b/dspace-api/src/main/java/org/dspace/app/ldn/processor/LDNMetadataProcessor.java
index 223c8b7a3422..43c50173ee61 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/processor/LDNMetadataProcessor.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/processor/LDNMetadataProcessor.java
@@ -13,6 +13,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
import java.util.UUID;
import org.apache.http.HttpStatus;
@@ -22,6 +23,7 @@
import org.dspace.app.ldn.action.LDNAction;
import org.dspace.app.ldn.action.LDNActionStatus;
import org.dspace.app.ldn.model.Notification;
+import org.dspace.app.ldn.service.LDNMessageService;
import org.dspace.app.ldn.utility.LDNUtils;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
@@ -29,6 +31,7 @@
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.handle.service.HandleService;
+import org.dspace.services.ConfigurationService;
import org.springframework.beans.factory.annotation.Autowired;
/**
@@ -42,6 +45,30 @@ public class LDNMetadataProcessor implements LDNProcessor {
@Autowired
private ItemService itemService;
+ @Autowired
+ private LDNMessageService ldnMessageService;
+
+ @Autowired
+ private ConfigurationService configurationService;
+
+ private static final Set OBJECT_SUBJECT_ITEM_TYPES = Set.of(
+ "Announce",
+ "coar-notify:RelationshipAction");
+
+ private static final Set CONTEXT_ID_ITEM_TYPES = Set.of(
+ "Announce",
+ "TentativeReject",
+ "Accept",
+ "coar-notify:ReviewAction",
+ "coar-notify:IngestAction",
+ "coar-notify:EndorsementAction");
+
+ private static final Set OBJECT_ID_ITEM_TYPES = Set.of(
+ "Offer",
+ "coar-notify:ReviewAction",
+ "coar-notify:EndorsementAction",
+ "coar-notify:IngestAction");
+
@Autowired
private HandleService handleService;
@@ -138,16 +165,35 @@ public void setActions(List actions) {
*/
private Item lookupItem(Context context, Notification notification) throws SQLException, HttpResponseException {
Item item = null;
-
String url = null;
- if (notification.getContext() != null) {
+
+ if (CONTEXT_ID_ITEM_TYPES.containsAll(notification.getType())) {
url = notification.getContext().getId();
- } else {
+ } else if (OBJECT_ID_ITEM_TYPES.containsAll(notification.getType())) {
url = notification.getObject().getId();
+ } else if (OBJECT_SUBJECT_ITEM_TYPES.containsAll(notification.getType())) {
+ // need to understand if we're sender or receiver
+ if (ldnMessageService.isTargetCurrent(notification)) {
+ // this means we're sending the notification
+ url = notification.getObject().getAsObject();
+ // use as:object for sender
+ } else {
+ // this means we're receiving the notification
+ url = notification.getObject().getAsSubject();
+ // use as:subject for receiver
+ }
}
log.info("Looking up item {}", url);
+ item = resolveItemByUrl(context, url, notification);
+
+ return item;
+ }
+
+ private Item resolveItemByUrl(Context context, String url, Notification notification)
+ throws SQLException, HttpResponseException {
+ Item item = null;
if (LDNUtils.hasUUIDInURL(url)) {
UUID uuid = LDNUtils.getUUIDFromURL(url);
@@ -155,32 +201,30 @@ private Item lookupItem(Context context, Notification notification) throws SQLEx
if (Objects.isNull(item)) {
throw new HttpResponseException(HttpStatus.SC_NOT_FOUND,
- format("Item with uuid %s not found", uuid));
+ format("Item with uuid %s not found", uuid));
}
+ return item;
+ }
+ String handle = handleService.resolveUrlToHandle(context, url);
- } else {
- String handle = handleService.resolveUrlToHandle(context, url);
-
- if (Objects.isNull(handle)) {
- throw new HttpResponseException(HttpStatus.SC_NOT_FOUND,
- format("Handle not found for %s", url));
- }
+ if (Objects.isNull(handle)) {
+ throw new HttpResponseException(HttpStatus.SC_NOT_FOUND,
+ format("Handle not found for %s", url));
+ }
- DSpaceObject object = handleService.resolveToObject(context, handle);
+ DSpaceObject object = handleService.resolveToObject(context, handle);
- if (Objects.isNull(object)) {
- throw new HttpResponseException(HttpStatus.SC_NOT_FOUND,
- format("Item with handle %s not found", handle));
- }
-
- if (object.getType() == Constants.ITEM) {
- item = (Item) object;
- } else {
- throw new HttpResponseException(HttpStatus.SC_UNPROCESSABLE_ENTITY,
- format("Handle %s does not resolve to an item", handle));
- }
+ if (Objects.isNull(object)) {
+ throw new HttpResponseException(HttpStatus.SC_NOT_FOUND,
+ format("Item with handle %s not found", handle));
}
+ if (object.getType() == Constants.ITEM) {
+ item = (Item) object;
+ } else {
+ throw new HttpResponseException(HttpStatus.SC_UNPROCESSABLE_ENTITY,
+ format("Handle %s does not resolve to an item", handle));
+ }
return item;
}
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/service/LDNMessageService.java b/dspace-api/src/main/java/org/dspace/app/ldn/service/LDNMessageService.java
index d200f0ce84ee..eb18c6a69a70 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/service/LDNMessageService.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/service/LDNMessageService.java
@@ -98,8 +98,9 @@ public interface LDNMessageService {
*
* @return number of messages fixed
* @param context The DSpace context
+ * @throws SQLException
*/
- public int checkQueueMessageTimeout(Context context);
+ public int checkQueueMessageTimeout(Context context) throws SQLException;
/**
* Elaborates the oldest enqueued message
@@ -154,4 +155,11 @@ public interface LDNMessageService {
* @param sourceIp the ip to evaluate
*/
public boolean isValidIp(NotifyServiceEntity origin, String sourceIp);
+
+ /**
+ * check if the notification is targeting the current system
+ *
+ * @param notification the LDN Message entity
+ */
+ boolean isTargetCurrent(Notification notification);
}
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/service/NotifyService.java b/dspace-api/src/main/java/org/dspace/app/ldn/service/NotifyService.java
index 6ff4c34780c5..e6ac0d63b438 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/service/NotifyService.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/service/NotifyService.java
@@ -43,10 +43,11 @@ public interface NotifyService {
* create new notifyServiceEntity
*
* @param context the context
+ * @param name name of the service
* @return the created NotifyServiceEntity
* @throws SQLException if database error
*/
- public NotifyServiceEntity create(Context context) throws SQLException;
+ public NotifyServiceEntity create(Context context, String name) throws SQLException;
/**
* update the provided notifyServiceEntity
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/service/impl/LDNMessageServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/ldn/service/impl/LDNMessageServiceImpl.java
index 193d8cebaf52..15f07a556112 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/service/impl/LDNMessageServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/service/impl/LDNMessageServiceImpl.java
@@ -11,9 +11,11 @@
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
+import java.util.Optional;
import java.util.Set;
import java.util.UUID;
@@ -103,7 +105,19 @@ public LDNMessageEntity create(Context context, String id) throws SQLException {
@Override
public LDNMessageEntity create(Context context, Notification notification, String sourceIp) throws SQLException {
LDNMessageEntity ldnMessage = create(context, notification.getId());
- ldnMessage.setObject(findDspaceObjectByUrl(context, notification.getObject().getId()));
+ DSpaceObject obj = findDspaceObjectByUrl(context, notification.getObject().getId());
+ if (obj == null) {
+ if (isTargetCurrent(notification)) {
+ // this means we're sending the notification
+ obj = findDspaceObjectByUrl(context, notification.getObject().getAsObject());
+ // use as:object for sender
+ } else {
+ // this means we're receiving the notification
+ obj = findDspaceObjectByUrl(context, notification.getObject().getAsSubject());
+ // use as:subject for receiver
+ }
+ }
+ ldnMessage.setObject(obj);
if (null != notification.getContext()) {
ldnMessage.setContext(findDspaceObjectByUrl(context, notification.getContext().getId()));
}
@@ -200,17 +214,17 @@ public void update(Context context, LDNMessageEntity ldnMessage) throws SQLExcep
private DSpaceObject findDspaceObjectByUrl(Context context, String url) throws SQLException {
String dspaceUrl = configurationService.getProperty("dspace.ui.url") + "/handle/";
- if (url.startsWith(dspaceUrl)) {
+ if (StringUtils.startsWith(url, dspaceUrl)) {
return handleService.resolveToObject(context, url.substring(dspaceUrl.length()));
}
String handleResolver = configurationService.getProperty("handle.canonical.prefix", "https://hdl.handle.net/");
- if (url.startsWith(handleResolver)) {
+ if (StringUtils.startsWith(url, handleResolver)) {
return handleService.resolveToObject(context, url.substring(handleResolver.length()));
}
dspaceUrl = configurationService.getProperty("dspace.ui.url") + "/items/";
- if (url.startsWith(dspaceUrl)) {
+ if (StringUtils.startsWith(url, dspaceUrl)) {
return itemService.find(context, UUID.fromString(url.substring(dspaceUrl.length())));
}
@@ -246,93 +260,77 @@ public List findProcessingTimedoutMessages(Context context) th
@Override
public int extractAndProcessMessageFromQueue(Context context) throws SQLException {
- int result = 0;
- int timeoutInMinutes = configurationService.getIntProperty("ldn.processor.queue.msg.timeout");
- if (timeoutInMinutes == 0) {
- timeoutInMinutes = 60;
- }
- List msgs = new ArrayList();
- try {
- msgs.addAll(findOldestMessagesToProcess(context));
- msgs.addAll(findMessagesToBeReprocessed(context));
- if (msgs != null && msgs.size() > 0) {
- LDNMessageEntity msg = null;
- LDNProcessor processor = null;
- for (int i = 0; processor == null && i < msgs.size() && msgs.get(i) != null; i++) {
- processor = ldnRouter.route(msgs.get(i));
- msg = msgs.get(i);
- if (processor == null) {
- log.info(
- "No processor found for LDN message " + msgs.get(i));
- msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_UNMAPPED_ACTION);
- msg.setQueueAttempts(msg.getQueueAttempts() + 1);
- update(context, msg);
- }
- }
- if (processor != null) {
- try {
- msg.setQueueLastStartTime(new Date());
- msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_PROCESSING);
- msg.setQueueTimeout(DateUtils.addMinutes(new Date(), timeoutInMinutes));
- update(context, msg);
- ObjectMapper mapper = new ObjectMapper();
- Notification notification = mapper.readValue(msg.getMessage(), Notification.class);
- processor.process(context, notification);
- msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_PROCESSED);
- result = 1;
- } catch (JsonSyntaxException jse) {
- result = -1;
- log.error("Unable to read JSON notification from LdnMessage " + msg, jse);
- msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_FAILED);
- } catch (Exception e) {
- result = -1;
- log.error(e);
- msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_FAILED);
- } finally {
- msg.setQueueAttempts(msg.getQueueAttempts() + 1);
- update(context, msg);
- }
+ int count = 0;
+ int timeoutInMinutes = configurationService.getIntProperty("ldn.processor.queue.msg.timeout", 60);
+
+ List messages = findOldestMessagesToProcess(context);
+ messages.addAll(findMessagesToBeReprocessed(context));
+
+ Optional msgOpt = getSingleMessageEntity(messages);
+
+ while (msgOpt.isPresent()) {
+ LDNProcessor processor = null;
+ LDNMessageEntity msg = msgOpt.get();
+ processor = ldnRouter.route(msg);
+ try {
+ boolean isServiceDisabled = !isServiceEnabled(msg);
+ if (processor == null || isServiceDisabled) {
+ log.warn("No processor found for LDN message " + msg);
+ Integer status = isServiceDisabled ? LDNMessageEntity.QUEUE_STATUS_UNTRUSTED
+ : LDNMessageEntity.QUEUE_STATUS_UNMAPPED_ACTION;
+ msg.setQueueStatus(status);
+ msg.setQueueAttempts(msg.getQueueAttempts() + 1);
+ update(context, msg);
} else {
- log.info("Found x" + msgs.size() + " LDN messages but none processor found.");
+ msg.setQueueLastStartTime(new Date());
+ msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_PROCESSING);
+ msg.setQueueTimeout(DateUtils.addMinutes(new Date(), timeoutInMinutes));
+ update(context, msg);
+ ObjectMapper mapper = new ObjectMapper();
+ Notification notification = mapper.readValue(msg.getMessage(), Notification.class);
+ processor.process(context, notification);
+ msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_PROCESSED);
+ count++;
}
+ } catch (JsonSyntaxException jse) {
+ log.error("Unable to read JSON notification from LdnMessage " + msg, jse);
+ msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_FAILED);
+ } catch (Exception e) {
+ log.error(e);
+ msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_FAILED);
+ } finally {
+ msg.setQueueAttempts(msg.getQueueAttempts() + 1);
+ update(context, msg);
}
- } catch (SQLException e) {
- result = -1;
- log.error(e);
+
+ messages = findOldestMessagesToProcess(context);
+ messages.addAll(findMessagesToBeReprocessed(context));
+ msgOpt = getSingleMessageEntity(messages);
}
- return result;
+ return count;
}
- @Override
- public int checkQueueMessageTimeout(Context context) {
- int result = 0;
- int timeoutInMinutes = configurationService.getIntProperty("ldn.processor.queue.msg.timeout");
- if (timeoutInMinutes == 0) {
- timeoutInMinutes = 60;
- }
- int maxAttempts = configurationService.getIntProperty("ldn.processor.max.attempts");
- if (maxAttempts == 0) {
- maxAttempts = 5;
+ private boolean isServiceEnabled(LDNMessageEntity msg) {
+ String localInboxUrl = configurationService.getProperty("ldn.notify.inbox");
+ if (msg.getTarget() == null || StringUtils.equals(msg.getTarget().getLdnUrl(), localInboxUrl)) {
+ return msg.getOrigin().isEnabled();
}
- log.debug("Using parameters: [timeoutInMinutes]=" + timeoutInMinutes + ",[maxAttempts]=" + maxAttempts);
+ return msg.getTarget().isEnabled();
+ }
+
+ @Override
+ public int checkQueueMessageTimeout(Context context) throws SQLException {
+ int count = 0;
+ int maxAttempts = configurationService.getIntProperty("ldn.processor.max.attempts", 5);
/*
* put failed on processing messages with timed-out timeout and
* attempts >= configured_max_attempts put queue on processing messages with
* timed-out timeout and attempts < configured_max_attempts
*/
- List msgsToCheck = null;
- try {
- msgsToCheck = findProcessingTimedoutMessages(context);
- } catch (SQLException e) {
- result = -1;
- log.error("An error occured on searching for timedout LDN messages!", e);
- return result;
- }
- if (msgsToCheck == null || msgsToCheck.isEmpty()) {
- return result;
- }
- for (int i = 0; i < msgsToCheck.size() && msgsToCheck.get(i) != null; i++) {
- LDNMessageEntity msg = msgsToCheck.get(i);
+ Optional msgOpt = getSingleMessageEntity(findProcessingTimedoutMessages(context));
+
+ while (msgOpt.isPresent()) {
+ LDNMessageEntity msg = msgOpt.get();
try {
if (msg.getQueueAttempts() >= maxAttempts) {
msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_FAILED);
@@ -340,13 +338,17 @@ public int checkQueueMessageTimeout(Context context) {
msg.setQueueStatus(LDNMessageEntity.QUEUE_STATUS_QUEUED);
}
update(context, msg);
- result++;
+ count++;
} catch (SQLException e) {
- log.error("Can't update LDN message " + msg);
- log.error(e);
+ log.error("Can't update LDN message " + msg, e);
}
+ msgOpt = getSingleMessageEntity(findProcessingTimedoutMessages(context));
}
- return result;
+ return count;
+ }
+
+ public Optional getSingleMessageEntity(Collection messages) {
+ return messages.stream().findFirst();
}
@Override
@@ -358,8 +360,12 @@ public NotifyRequestStatus findRequestsByItem(Context context, Item item) throws
if (msgs != null && !msgs.isEmpty()) {
for (LDNMessageEntity msg : msgs) {
RequestStatus offer = new RequestStatus();
- offer.setServiceName(msg.getOrigin() == null ? "Unknown Service" : msg.getOrigin().getName());
- offer.setServiceUrl(msg.getOrigin() == null ? "" : msg.getOrigin().getUrl());
+ NotifyServiceEntity nse = msg.getOrigin();
+ if (nse == null) {
+ nse = msg.getTarget();
+ }
+ offer.setServiceName(nse == null ? "Unknown Service" : nse.getName());
+ offer.setServiceUrl(nse == null ? "" : nse.getUrl());
offer.setOfferType(LDNUtils.getNotifyType(msg.getCoarNotifyType()));
List acks = ldnMessageDao.findAllRelatedMessagesByItem(
context, msg, item, "Accept", "TentativeReject", "TentativeAccept", "Announce");
@@ -389,4 +395,10 @@ public void delete(Context context, LDNMessageEntity ldnMessage) throws SQLExcep
ldnMessageDao.delete(context, ldnMessage);
}
+ @Override
+ public boolean isTargetCurrent(Notification notification) {
+ String localInboxUrl = configurationService.getProperty("ldn.notify.inbox");
+ return StringUtils.equals(notification.getTarget().getInbox(), localInboxUrl);
+ }
+
}
diff --git a/dspace-api/src/main/java/org/dspace/app/ldn/service/impl/NotifyServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/ldn/service/impl/NotifyServiceImpl.java
index d2289fd77a1c..87be008371aa 100644
--- a/dspace-api/src/main/java/org/dspace/app/ldn/service/impl/NotifyServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/ldn/service/impl/NotifyServiceImpl.java
@@ -37,8 +37,9 @@ public NotifyServiceEntity find(Context context, Integer id) throws SQLException
}
@Override
- public NotifyServiceEntity create(Context context) throws SQLException {
+ public NotifyServiceEntity create(Context context, String name) throws SQLException {
NotifyServiceEntity notifyServiceEntity = new NotifyServiceEntity();
+ notifyServiceEntity.setName(name);
return notifyServiceDao.create(context, notifyServiceEntity);
}
diff --git a/dspace-api/src/main/java/org/dspace/app/metrics/CrisMetrics.java b/dspace-api/src/main/java/org/dspace/app/metrics/CrisMetrics.java
index 98b8e29d51c1..443d46944869 100644
--- a/dspace-api/src/main/java/org/dspace/app/metrics/CrisMetrics.java
+++ b/dspace-api/src/main/java/org/dspace/app/metrics/CrisMetrics.java
@@ -7,19 +7,19 @@
*/
package org.dspace.app.metrics;
import java.util.Date;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.dspace.content.DSpaceObject;
import org.dspace.core.ReloadableEntity;
-import org.hibernate.annotations.Type;
+import org.hibernate.Length;
/**
*
@@ -50,8 +50,7 @@ public class CrisMetrics implements ReloadableEntity {
private boolean last;
- @Lob
- @Type(type = "org.dspace.storage.rdbms.hibernate.DatabaseAwareLobType")
+ @Column(name = "remark", length = Length.LONG32)
private String remark;
private Double deltaPeriod1;
diff --git a/dspace-api/src/main/java/org/dspace/app/metrics/dao/CrisMetricsDAOImpl.java b/dspace-api/src/main/java/org/dspace/app/metrics/dao/CrisMetricsDAOImpl.java
index 6fc2f7575abe..f85cba942eb7 100644
--- a/dspace-api/src/main/java/org/dspace/app/metrics/dao/CrisMetricsDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/metrics/dao/CrisMetricsDAOImpl.java
@@ -12,12 +12,12 @@
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.Root;
import org.dspace.app.metrics.CrisMetrics;
import org.dspace.app.metrics.CrisMetrics_;
import org.dspace.content.DSpaceObject;
@@ -45,7 +45,7 @@ public List findAll(Context context, Integer limit, Integer offset)
Root crisMetricsRoot = criteriaQuery.from(CrisMetrics.class);
criteriaQuery.select(crisMetricsRoot);
- List orderList = new LinkedList<>();
+ List orderList = new LinkedList<>();
orderList.add(criteriaBuilder.asc(crisMetricsRoot.get(CrisMetrics_.id)));
criteriaQuery.orderBy(orderList);
diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItem.java b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItem.java
index cdefd1298c6e..bf2bfb4d60b2 100644
--- a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItem.java
+++ b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItem.java
@@ -8,19 +8,19 @@
package org.dspace.app.requestitem;
import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
import org.dspace.content.Bitstream;
import org.dspace.content.Item;
import org.dspace.core.Context;
diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemEmailNotifier.java b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemEmailNotifier.java
index 6499c45a7830..c489fb4b3ff0 100644
--- a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemEmailNotifier.java
+++ b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemEmailNotifier.java
@@ -11,11 +11,11 @@
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
-import javax.annotation.ManagedBean;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import javax.mail.MessagingException;
+import jakarta.annotation.ManagedBean;
+import jakarta.inject.Inject;
+import jakarta.inject.Singleton;
+import jakarta.mail.MessagingException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.app.requestitem.service.RequestItemService;
diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java
index 008174ded88c..c76bd50d1910 100644
--- a/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java
@@ -9,11 +9,11 @@
import java.sql.SQLException;
import java.util.Iterator;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Root;
import org.dspace.app.requestitem.RequestItem;
import org.dspace.app.requestitem.RequestItem_;
import org.dspace.app.requestitem.dao.RequestItemDAO;
@@ -44,8 +44,12 @@ public RequestItem findByToken(Context context, String token) throws SQLExceptio
}
@Override
public Iterator findByItem(Context context, Item item) throws SQLException {
- Query query = createQuery(context, "FROM RequestItem WHERE item_id= :uuid");
- query.setParameter("uuid", item.getID());
+ CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
+ CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, RequestItem.class);
+ Root requestItemRoot = criteriaQuery.from(RequestItem.class);
+ criteriaQuery.select(requestItemRoot);
+ criteriaQuery.where(criteriaBuilder.equal(requestItemRoot.get(RequestItem_.item), item));
+ Query query = createQuery(context, criteriaQuery);
return iterate(query);
}
}
diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java
index ac4b27c520b8..182609bbf3df 100644
--- a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java
+++ b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java
@@ -12,8 +12,8 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
@@ -94,7 +94,7 @@ private void init() {
* @param query ISSN string to pass in an "issn equals" API query
* @return SHERPAResponse containing an error or journal policies
*/
- @Cacheable(key = "#query", cacheNames = "sherpa.searchByJournalISSN")
+ @Cacheable(key = "#query", condition = "#query != null", cacheNames = "sherpa.searchByJournalISSN")
public SHERPAResponse searchByJournalISSN(String query) {
return performRequest("publication", "issn", "equals", query, 0, 1);
}
diff --git a/dspace-api/src/main/java/org/dspace/app/solrdatabaseresync/SolrDatabaseResyncCli.java b/dspace-api/src/main/java/org/dspace/app/solrdatabaseresync/SolrDatabaseResyncCli.java
index f901c9ca569e..aac42ce1acf9 100644
--- a/dspace-api/src/main/java/org/dspace/app/solrdatabaseresync/SolrDatabaseResyncCli.java
+++ b/dspace-api/src/main/java/org/dspace/app/solrdatabaseresync/SolrDatabaseResyncCli.java
@@ -105,35 +105,17 @@ private void performStatusUpdate(Context context) throws SearchServiceException,
solrQuery.addFilterQuery(dateRangeFilter);
solrQuery.addField(SearchUtils.RESOURCE_ID_FIELD);
solrQuery.addField(SearchUtils.RESOURCE_UNIQUE_ID);
+ solrQuery.setRows(0);
QueryResponse response = solrSearchCore.getSolr().query(solrQuery, solrSearchCore.REQUEST_METHOD);
-
- if (response != null) {
- logInfoAndOut(response.getResults().size() + " items found to process");
-
- for (SolrDocument doc : response.getResults()) {
- String uuid = (String) doc.getFirstValue(SearchUtils.RESOURCE_ID_FIELD);
- String uniqueId = (String) doc.getFirstValue(SearchUtils.RESOURCE_UNIQUE_ID);
- logDebugAndOut("Processing item with UUID: " + uuid);
-
- Optional indexableObject = Optional.empty();
- try {
- indexableObject = indexObjectServiceFactory
- .getIndexableObjectFactory(uniqueId).findIndexableObject(context, uuid);
- } catch (SQLException e) {
- log.warn("An exception occurred when attempting to retrieve item with UUID \"" + uuid +
- "\" from the database, removing related solr document", e);
- }
-
- try {
- if (indexableObject.isPresent()) {
- logDebugAndOut("Item exists in DB, updating solr document");
- updateItem(context, indexableObject.get());
- } else {
- logDebugAndOut("Item doesn't exist in DB, removing solr document");
- removeItem(context, uniqueId);
- }
- } catch (SQLException | IOException e) {
- log.error(e.getMessage(), e);
+ if (response != null && response.getResults() != null) {
+ long nrOfPreDBResults = response.getResults().getNumFound();
+ if (nrOfPreDBResults > 0) {
+ logInfoAndOut(nrOfPreDBResults + " items found to process");
+ int batchSize = configurationService.getIntProperty("script.solr-database-resync.batch-size", 100);
+ for (int start = 0; start < nrOfPreDBResults; start += batchSize) {
+ solrQuery.setStart(start);
+ solrQuery.setRows(batchSize);
+ performStatusUpdateOnNextBatch(context, solrQuery);
}
}
}
@@ -141,6 +123,38 @@ private void performStatusUpdate(Context context) throws SearchServiceException,
indexingService.commit();
}
+ private void performStatusUpdateOnNextBatch(Context context, SolrQuery solrQuery)
+ throws SolrServerException, IOException {
+ QueryResponse response = solrSearchCore.getSolr().query(solrQuery, solrSearchCore.REQUEST_METHOD);
+
+ for (SolrDocument doc : response.getResults()) {
+ String uuid = (String) doc.getFirstValue(SearchUtils.RESOURCE_ID_FIELD);
+ String uniqueId = (String) doc.getFirstValue(SearchUtils.RESOURCE_UNIQUE_ID);
+ logDebugAndOut("Processing item with UUID: " + uuid);
+
+ Optional indexableObject = Optional.empty();
+ try {
+ indexableObject = indexObjectServiceFactory
+ .getIndexableObjectFactory(uniqueId).findIndexableObject(context, uuid);
+ } catch (SQLException e) {
+ log.warn("An exception occurred when attempting to retrieve item with UUID \"" + uuid +
+ "\" from the database, removing related solr document", e);
+ }
+
+ try {
+ if (indexableObject.isPresent()) {
+ logDebugAndOut("Item exists in DB, updating solr document");
+ updateItem(context, indexableObject.get());
+ } else {
+ logDebugAndOut("Item doesn't exist in DB, removing solr document");
+ removeItem(context, uniqueId);
+ }
+ } catch (SQLException | IOException e) {
+ log.error(e.getMessage(), e);
+ }
+ }
+ }
+
private void updateItem(Context context, IndexableObject indexableObject) throws SolrServerException, IOException {
Map fieldModifier = new HashMap<>(1);
fieldModifier.put("remove", STATUS_FIELD_PREDB);
diff --git a/dspace-api/src/main/java/org/dspace/app/suggestion/SuggestionServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/suggestion/SuggestionServiceImpl.java
index 66773fbc128d..57fe42806b12 100644
--- a/dspace-api/src/main/java/org/dspace/app/suggestion/SuggestionServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/suggestion/SuggestionServiceImpl.java
@@ -13,8 +13,8 @@
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import org.apache.logging.log4j.Logger;
import org.dspace.core.Context;
import org.springframework.stereotype.Service;
diff --git a/dspace-api/src/main/java/org/dspace/app/util/AuthorizeUtil.java b/dspace-api/src/main/java/org/dspace/app/util/AuthorizeUtil.java
index b498b693956a..6400820546ce 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/AuthorizeUtil.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/AuthorizeUtil.java
@@ -9,8 +9,8 @@
import java.sql.SQLException;
import java.util.List;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import org.apache.logging.log4j.Logger;
import org.dspace.authenticate.factory.AuthenticateServiceFactory;
import org.dspace.authorize.AuthorizeConfiguration;
diff --git a/dspace-api/src/main/java/org/dspace/app/util/DCInput.java b/dspace-api/src/main/java/org/dspace/app/util/DCInput.java
index 57a9bbb75222..70296ad73a2f 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/DCInput.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/DCInput.java
@@ -15,8 +15,8 @@
import java.util.Optional;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java b/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java
index b0289ec4a4e1..51d78ccaba5c 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java
@@ -13,9 +13,9 @@
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Enumeration;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
import org.apache.logging.log4j.Logger;
/**
diff --git a/dspace-api/src/main/java/org/dspace/app/util/DSpaceWebappListener.java b/dspace-api/src/main/java/org/dspace/app/util/DSpaceWebappListener.java
index c2817169b21e..32c4ff9c1c71 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/DSpaceWebappListener.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/DSpaceWebappListener.java
@@ -8,8 +8,9 @@
package org.dspace.app.util;
import java.lang.reflect.InvocationTargetException;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
+
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
/**
* Class that registers the web application upon startup of the application.
diff --git a/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java
index 514143c93ea0..bff741b5ca42 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java
@@ -155,7 +155,7 @@ protected SyndicationFeed getResults(Context context, String format, String quer
format = "atom_1.0";
}
- SyndicationFeed feed = new SyndicationFeed(labels.get(SyndicationFeed.MSG_UITYPE));
+ SyndicationFeed feed = new SyndicationFeed();
feed.populate(null, context, scope, results, labels);
feed.setType(format);
feed.addModule(openSearchMarkup(query, totalResults, start, pageSize));
diff --git a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java
index 7544718a2d53..a52f76ef9c00 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java
@@ -15,6 +15,7 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
@@ -30,7 +31,6 @@
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService;
import org.dspace.core.Context;
-import org.dspace.discovery.SearchServiceException;
import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.services.RequestService;
import org.dspace.services.factory.DSpaceServicesFactory;
@@ -109,6 +109,13 @@ public class SubmissionConfigReader {
*/
private Map communityToSubmissionConfig = null;
+ /**
+ * Hashmap which stores which submission process configuration is used by
+ * which entityType, computed from the item submission config file
+ * (specifically, the 'submission-map' tag)
+ */
+ private Map entityTypeToSubmissionConfig = null;
+
/**
* Reference to the global submission step definitions defined in the
* "step-definitions" section
@@ -174,9 +181,10 @@ public void reload() throws SubmissionConfigReaderException {
*
*/
private void buildInputs(String fileName) throws SubmissionConfigReaderException {
- collectionToSubmissionConfig = new HashMap();
- communityToSubmissionConfig = new HashMap();
- submitDefns = new LinkedHashMap>>();
+ collectionToSubmissionConfig = new HashMap<>();
+ communityToSubmissionConfig = new HashMap<>();
+ entityTypeToSubmissionConfig = new HashMap<>();
+ submitDefns = new LinkedHashMap<>();
String uri = "file:" + new File(fileName).getAbsolutePath();
@@ -193,9 +201,6 @@ private void buildInputs(String fileName) throws SubmissionConfigReaderException
} catch (FactoryConfigurationError fe) {
throw new SubmissionConfigReaderException(
"Cannot create Item Submission Configuration parser", fe);
- } catch (SearchServiceException se) {
- throw new SubmissionConfigReaderException(
- "Cannot perform a discovery search for Item Submission Configuration", se);
} catch (Exception e) {
throw new SubmissionConfigReaderException(
"Error creating Item Submission Configuration: " + e);
@@ -322,10 +327,11 @@ public SubmissionConfig getSubmissionConfigByCollection(Collection collection) {
}
}
- submitName = collService.getMetadataFirstValue(collection, "dspace", "entity", "type", null);
+ // get entity-type based configuration
+ submitName = getEntityTypeSubmission(collection, collService);
if (submitName != null) {
try {
- SubmissionConfig subConfig = getSubmissionConfigByName(submitName.toLowerCase());
+ SubmissionConfig subConfig = getSubmissionConfigByName(submitName);
if (subConfig != null) {
return subConfig;
}
@@ -367,6 +373,27 @@ public SubmissionConfig getSubmissionConfigByCollection(Collection collection) {
+ "in 'submission-map' section of 'item-submission.xml'.");
}
+ /**
+ * Returns the submission name for the given collection based on the entity type.
+ * It checks for the {@code collection-entity-type} configuration (standard DSpace), otherwise defaults to the
+ * {@code entityType} in lowercase (standard CRIS).
+ *
+ * @param collection Collection of which check the submission configuration
+ * @param collService CollectionService
+ * @return Submission Definition found.
+ */
+ private String getEntityTypeSubmission(Collection collection, CollectionService collService) {
+ String submitName = null;
+ String entityType = collService.getMetadataFirstValue(collection, "dspace", "entity", "type", Item.ANY);
+ if (entityType != null) {
+ // collection-entity-type configuration (DSpace configuration)
+ submitName = Optional.ofNullable(entityTypeToSubmissionConfig.get(entityType))
+ // entity-type lowercase configuration (CRIS configuration)
+ .orElseGet(entityType::toLowerCase);
+ }
+ return submitName;
+ }
+
/**
* Recursive function to return the Item Submission process config
* used for a community or the closest community parent, or null
@@ -397,8 +424,7 @@ private String getSubmissionConfigByCommunity(Community com) {
* @return the SubmissionConfig representing the item submission config
*/
public SubmissionConfig getSubmissionConfigByName(String submitName) {
- log.debug("Loading submission process config named '" + submitName
- + "'");
+ log.debug("Loading submission process config named '" + submitName + "'");
// check mini-cache, and return if match
if (lastSubmissionConfig != null
@@ -421,8 +447,8 @@ public SubmissionConfig getSubmissionConfigByName(String submitName) {
log.debug("Submission process config '" + submitName
+ "' not in cache. Reloading from scratch.");
- lastSubmissionConfig = new SubmissionConfig(StringUtils.equals(getDefaultSubmissionConfigName(), submitName),
- submitName, steps);
+ lastSubmissionConfig =
+ new SubmissionConfig(StringUtils.equals(getDefaultSubmissionConfigName(), submitName), submitName, steps);
log.debug("Submission process config has "
+ lastSubmissionConfig.getNumberOfSteps() + " steps listed.");
@@ -460,7 +486,7 @@ public SubmissionStepConfig getStepConfig(String stepID)
* should correspond to the collection-form maps, the form definitions, and
* the display/storage word pairs.
*/
- private void doNodes(Node n) throws SAXException, SearchServiceException, SubmissionConfigReaderException {
+ private void doNodes(Node n) throws SAXException, SubmissionConfigReaderException {
if (n == null) {
return;
}
@@ -510,9 +536,7 @@ private void doNodes(Node n) throws SAXException, SearchServiceException, Submis
* the collection handle and item submission name, put name in hashmap keyed
* by the collection handle.
*/
- private void processMap(Node e) throws SAXException, SearchServiceException {
- // create a context
- Context context = new Context();
+ private void processMap(Node e) throws SAXException {
NodeList nl = e.getChildNodes();
int len = nl.getLength();
@@ -533,7 +557,7 @@ private void processMap(Node e) throws SAXException, SearchServiceException {
throw new SAXException(
"name-map element is missing submission-name attribute in 'item-submission.xml'");
}
- if (content != null && content.length() > 0) {
+ if (content != null && !content.isEmpty()) {
throw new SAXException(
"name-map element has content in 'item-submission.xml', it should be empty.");
}
@@ -542,7 +566,7 @@ private void processMap(Node e) throws SAXException, SearchServiceException {
} else if (communityId != null) {
communityToSubmissionConfig.put(communityId, value);
} else {
- collectionToSubmissionConfig.putIfAbsent(entityType, value);
+ entityTypeToSubmissionConfig.putIfAbsent(entityType, value);
}
} // ignore any child node that isn't a "name-map"
}
diff --git a/dspace-api/src/main/java/org/dspace/app/util/SubmissionStepConfig.java b/dspace-api/src/main/java/org/dspace/app/util/SubmissionStepConfig.java
index 03d5dc6b7657..40d3ebae602a 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/SubmissionStepConfig.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/SubmissionStepConfig.java
@@ -13,7 +13,7 @@
import org.apache.commons.lang3.BooleanUtils;
import org.dspace.content.InProgressSubmission;
import org.dspace.content.WorkspaceItem;
-import org.hibernate.proxy.HibernateProxyHelper;
+import org.dspace.core.HibernateProxyHelper;
/**
* Class representing configuration for a single step within an Item Submission
diff --git a/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java b/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java
index c1402499c444..654036963572 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java
@@ -13,7 +13,6 @@
import java.util.Date;
import java.util.List;
import java.util.Map;
-import javax.servlet.http.HttpServletRequest;
import com.rometools.modules.itunes.EntryInformation;
import com.rometools.modules.itunes.EntryInformationImpl;
@@ -35,6 +34,7 @@
import com.rometools.rome.feed.synd.SyndPersonImpl;
import com.rometools.rome.io.FeedException;
import com.rometools.rome.io.SyndFeedOutput;
+import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
@@ -84,11 +84,6 @@ public class SyndicationFeed {
public static final String MSG_FEED_TITLE = "feed.title";
public static final String MSG_FEED_DESCRIPTION = "general-feed.description";
public static final String MSG_METADATA = "metadata.";
- public static final String MSG_UITYPE = "ui.type";
-
- // UI keywords
- public static final String UITYPE_XMLUI = "xmlui";
- public static final String UITYPE_JSPUI = "jspui";
// default DC fields for entry
protected String defaultTitleField = "dc.title";
@@ -145,10 +140,6 @@ public class SyndicationFeed {
// the feed object we are building
protected SyndFeed feed = null;
- // memory of UI that called us, "xmlui" or "jspui"
- // affects Bitstream retrieval URL and I18N keys
- protected String uiType = null;
-
protected HttpServletRequest request = null;
protected CollectionService collectionService;
@@ -157,12 +148,9 @@ public class SyndicationFeed {
/**
* Constructor.
- *
- * @param ui either "xmlui" or "jspui"
*/
- public SyndicationFeed(String ui) {
+ public SyndicationFeed() {
feed = new SyndFeedImpl();
- uiType = ui;
ContentServiceFactory contentServiceFactory = ContentServiceFactory.getInstance();
itemService = contentServiceFactory.getItemService();
collectionService = contentServiceFactory.getCollectionService();
@@ -518,8 +506,7 @@ protected static String getDefaultedConfiguration(String key, String dfl) {
protected String urlOfBitstream(HttpServletRequest request, Bitstream logo) {
String name = logo.getName();
return resolveURL(request, null) +
- (uiType.equalsIgnoreCase(UITYPE_XMLUI) ? "/bitstream/id/" : "/retrieve/") +
- logo.getID() + "/" + (name == null ? "" : name);
+ "/bitstreams/" + logo.getID() + "/download";
}
protected String baseURL = null; // cache the result for null
diff --git a/dspace-api/src/main/java/org/dspace/app/util/Util.java b/dspace-api/src/main/java/org/dspace/app/util/Util.java
index 11b6e3528669..cf88e08455e0 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/Util.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/Util.java
@@ -20,8 +20,8 @@
import java.util.Properties;
import java.util.Set;
import java.util.UUID;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
diff --git a/dspace-api/src/main/java/org/dspace/app/util/WebApp.java b/dspace-api/src/main/java/org/dspace/app/util/WebApp.java
index 2f42c1459f63..c2fc133f41c6 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/WebApp.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/WebApp.java
@@ -8,16 +8,16 @@
package org.dspace.app.util;
import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
import org.dspace.core.Context;
import org.dspace.core.ReloadableEntity;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/AuthenticationMethod.java b/dspace-api/src/main/java/org/dspace/authenticate/AuthenticationMethod.java
index 500ee04a979b..d316cb636f87 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/AuthenticationMethod.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/AuthenticationMethod.java
@@ -9,9 +9,9 @@
import java.sql.SQLException;
import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/AuthenticationServiceImpl.java b/dspace-api/src/main/java/org/dspace/authenticate/AuthenticationServiceImpl.java
index a1e096dc4d64..2b07f73c489c 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/AuthenticationServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/AuthenticationServiceImpl.java
@@ -13,8 +13,8 @@
import java.util.Date;
import java.util.Iterator;
import java.util.List;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.authenticate.service.AuthenticationService;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java
index 0c2be211a532..db71ec1c2ff1 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java
@@ -14,9 +14,9 @@
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.Logger;
import org.dspace.core.Context;
import org.dspace.core.LogHelper;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java
index 585eaf9cd8b1..b791df15b5c0 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java
@@ -29,9 +29,9 @@
import javax.naming.ldap.LdapContext;
import javax.naming.ldap.StartTlsRequest;
import javax.naming.ldap.StartTlsResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
import org.dspace.authenticate.factory.AuthenticateServiceFactory;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/OidcAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/OidcAuthentication.java
index 5d4635d48ef5..c7ac1ff55748 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/OidcAuthentication.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/OidcAuthentication.java
@@ -9,9 +9,9 @@
import java.sql.SQLException;
import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/OidcAuthenticationBean.java b/dspace-api/src/main/java/org/dspace/authenticate/OidcAuthenticationBean.java
index 572622aa8fda..cc1cc2654b62 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/OidcAuthenticationBean.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/OidcAuthenticationBean.java
@@ -21,9 +21,9 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/OrcidAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/OrcidAuthentication.java
index 3e9ff6638a61..932d963307f6 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/OrcidAuthentication.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/OrcidAuthentication.java
@@ -10,9 +10,9 @@
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.dspace.authenticate.factory.AuthenticateServiceFactory;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/OrcidAuthenticationBean.java b/dspace-api/src/main/java/org/dspace/authenticate/OrcidAuthenticationBean.java
index 6426aa67654a..cf166a34e671 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/OrcidAuthenticationBean.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/OrcidAuthenticationBean.java
@@ -18,9 +18,9 @@
import java.util.Collections;
import java.util.List;
import java.util.Optional;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java
index 0bf0f9bcbc95..414cb68a5e4c 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java
@@ -12,9 +12,9 @@
import java.util.Collections;
import java.util.List;
import java.util.Optional;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java
index 791634a7dc25..24d8266012d4 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java
@@ -20,9 +20,9 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java b/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java
index 12dc5feda583..55843c710760 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java
@@ -25,10 +25,10 @@
import java.util.Enumeration;
import java.util.List;
import java.util.StringTokenizer;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.logging.log4j.Logger;
import org.dspace.authenticate.factory.AuthenticateServiceFactory;
@@ -505,7 +505,7 @@ public int authenticate(Context context, String username, String password,
X509Certificate[] certs = null;
if (request != null) {
certs = (X509Certificate[]) request
- .getAttribute("javax.servlet.request.X509Certificate");
+ .getAttribute("jakarta.servlet.request.X509Certificate");
}
if ((certs == null) || (certs.length == 0)) {
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/oidc/impl/OidcClientImpl.java b/dspace-api/src/main/java/org/dspace/authenticate/oidc/impl/OidcClientImpl.java
index ddab01e8cb5d..68fffd3fb264 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/oidc/impl/OidcClientImpl.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/oidc/impl/OidcClientImpl.java
@@ -14,10 +14,10 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import javax.annotation.PostConstruct;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.annotation.PostConstruct;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
diff --git a/dspace-api/src/main/java/org/dspace/authenticate/service/AuthenticationService.java b/dspace-api/src/main/java/org/dspace/authenticate/service/AuthenticationService.java
index e955302ec3d7..45ad8932daec 100644
--- a/dspace-api/src/main/java/org/dspace/authenticate/service/AuthenticationService.java
+++ b/dspace-api/src/main/java/org/dspace/authenticate/service/AuthenticationService.java
@@ -10,8 +10,8 @@
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import org.dspace.authenticate.AuthenticationMethod;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java b/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java
index ca5b4a11b543..2ab2bbf90266 100644
--- a/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java
@@ -11,9 +11,9 @@
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
-import javax.inject.Inject;
-import javax.inject.Named;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.SolrClient;
diff --git a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java
index 8a14534d985e..6cb5db91a006 100644
--- a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java
@@ -572,13 +572,11 @@ public void addPolicies(Context c, List policies, DSpaceObject d
List newPolicies = new ArrayList<>(policies.size());
for (ResourcePolicy srp : policies) {
- ResourcePolicy rp = resourcePolicyService.create(c);
+ ResourcePolicy rp = resourcePolicyService.create(c, srp.getEPerson(), srp.getGroup());
// copy over values
rp.setdSpaceObject(dest);
rp.setAction(srp.getAction());
- rp.setEPerson(srp.getEPerson());
- rp.setGroup(srp.getGroup());
rp.setStartDate(srp.getStartDate());
rp.setEndDate(srp.getEndDate());
rp.setRpName(srp.getRpName());
@@ -692,11 +690,9 @@ public ResourcePolicy createResourcePolicy(Context context, DSpaceObject dso, Gr
"We need at least an eperson or a group in order to create a resource policy.");
}
- ResourcePolicy myPolicy = resourcePolicyService.create(context);
+ ResourcePolicy myPolicy = resourcePolicyService.create(context, eperson, group);
myPolicy.setdSpaceObject(dso);
myPolicy.setAction(type);
- myPolicy.setGroup(group);
- myPolicy.setEPerson(eperson);
myPolicy.setRpType(rpType);
myPolicy.setRpName(rpName);
myPolicy.setRpDescription(rpDescription);
@@ -719,7 +715,7 @@ public ResourcePolicy createOrModifyPolicy(ResourcePolicy policy, Context contex
if (!duplicates.isEmpty()) {
policy = duplicates.get(0);
}
- } else {
+ } else if (group != null) {
// if an identical policy (same Action and same Group) is already in place modify it...
policyTemp = findByTypeGroupAction(context, dso, group, action);
}
diff --git a/dspace-api/src/main/java/org/dspace/authorize/FixDefaultPolicies.java b/dspace-api/src/main/java/org/dspace/authorize/FixDefaultPolicies.java
index 61e783920ae5..b430a2635fd9 100644
--- a/dspace-api/src/main/java/org/dspace/authorize/FixDefaultPolicies.java
+++ b/dspace-api/src/main/java/org/dspace/authorize/FixDefaultPolicies.java
@@ -126,10 +126,9 @@ private static void addAnonymousPolicy(Context c, DSpaceObject t,
// now create the default policies for submitted items
ResourcePolicyService resourcePolicyService = AuthorizeServiceFactory.getInstance().getResourcePolicyService();
- ResourcePolicy myPolicy = resourcePolicyService.create(c);
+ ResourcePolicy myPolicy = resourcePolicyService.create(c, null, anonymousGroup);
myPolicy.setdSpaceObject(t);
myPolicy.setAction(myaction);
- myPolicy.setGroup(anonymousGroup);
resourcePolicyService.update(c, myPolicy);
}
}
diff --git a/dspace-api/src/main/java/org/dspace/authorize/PolicySet.java b/dspace-api/src/main/java/org/dspace/authorize/PolicySet.java
index 72998b9fd18a..e22b8e9df026 100644
--- a/dspace-api/src/main/java/org/dspace/authorize/PolicySet.java
+++ b/dspace-api/src/main/java/org/dspace/authorize/PolicySet.java
@@ -229,11 +229,10 @@ public static void setPoliciesFilter(Context c, int containerType,
// before create a new policy check if an identical policy is already in place
if (!authorizeService.isAnIdenticalPolicyAlreadyInPlace(c, myitem, group, actionID, -1)) {
// now add the policy
- ResourcePolicy rp = resourcePolicyService.create(c);
+ ResourcePolicy rp = resourcePolicyService.create(c, null, group);
rp.setdSpaceObject(myitem);
rp.setAction(actionID);
- rp.setGroup(group);
rp.setRpName(name);
rp.setRpDescription(description);
@@ -262,11 +261,10 @@ public static void setPoliciesFilter(Context c, int containerType,
// before create a new policy check if an identical policy is already in place
if (!authorizeService.isAnIdenticalPolicyAlreadyInPlace(c, bundle, group, actionID, -1)) {
// now add the policy
- ResourcePolicy rp = resourcePolicyService.create(c);
+ ResourcePolicy rp = resourcePolicyService.create(c, null, group);
rp.setdSpaceObject(bundle);
rp.setAction(actionID);
- rp.setGroup(group);
rp.setRpName(name);
rp.setRpDescription(description);
@@ -305,11 +303,10 @@ public static void setPoliciesFilter(Context c, int containerType,
if (!authorizeService
.isAnIdenticalPolicyAlreadyInPlace(c, bitstream, group, actionID, -1)) {
// now add the policy
- ResourcePolicy rp = resourcePolicyService.create(c);
+ ResourcePolicy rp = resourcePolicyService.create(c, null, group);
rp.setdSpaceObject(bitstream);
rp.setAction(actionID);
- rp.setGroup(group);
rp.setRpName(name);
rp.setRpDescription(description);
diff --git a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java
index c781400bae45..68a59d46ae2f 100644
--- a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java
+++ b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java
@@ -9,29 +9,28 @@
import java.util.Date;
import java.util.Objects;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
import org.apache.solr.common.StringUtils;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Context;
+import org.dspace.core.HibernateProxyHelper;
import org.dspace.core.ReloadableEntity;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
-import org.hibernate.annotations.Type;
-import org.hibernate.proxy.HibernateProxyHelper;
+import org.hibernate.Length;
/**
* Database entity representation of the ResourcePolicy table
@@ -99,9 +98,7 @@ public class ResourcePolicy implements ReloadableEntity {
@Column(name = "rptype", length = 30)
private String rptype;
- @Lob
- @Type(type = "org.hibernate.type.TextType")
- @Column(name = "rpdescription")
+ @Column(name = "rpdescription", length = Length.LONG32)
private String rpdescription;
/**
diff --git a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java
index d633e303bf66..25875dbdb366 100644
--- a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java
@@ -71,14 +71,22 @@ public ResourcePolicy find(Context context, int id) throws SQLException {
* Create a new ResourcePolicy
*
* @param context DSpace context object
+ * @param ePerson
+ * @param group
* @return ResourcePolicy
* @throws SQLException if database error
*/
@Override
- public ResourcePolicy create(Context context) throws SQLException {
+ public ResourcePolicy create(Context context, EPerson ePerson, Group group) throws SQLException {
// FIXME: Check authorisation
// Create a table row
- ResourcePolicy resourcePolicy = resourcePolicyDAO.create(context, new ResourcePolicy());
+ ResourcePolicy policyToBeCreated = new ResourcePolicy();
+ if (ePerson == null && group == null) {
+ throw new IllegalArgumentException("A resource policy must contain a valid eperson or group");
+ }
+ policyToBeCreated.setEPerson(ePerson);
+ policyToBeCreated.setGroup(group);
+ ResourcePolicy resourcePolicy = resourcePolicyDAO.create(context, policyToBeCreated);
return resourcePolicy;
}
@@ -210,9 +218,7 @@ public boolean isDateValid(ResourcePolicy resourcePolicy) {
@Override
public ResourcePolicy clone(Context context, ResourcePolicy resourcePolicy)
throws SQLException, AuthorizeException {
- ResourcePolicy clone = create(context);
- clone.setGroup(resourcePolicy.getGroup());
- clone.setEPerson(resourcePolicy.getEPerson());
+ ResourcePolicy clone = create(context, resourcePolicy.getEPerson(), resourcePolicy.getGroup());
clone.setStartDate((Date) ObjectUtils.clone(resourcePolicy.getStartDate()));
clone.setEndDate((Date) ObjectUtils.clone(resourcePolicy.getEndDate()));
clone.setRpType((String) ObjectUtils.clone(resourcePolicy.getRpType()));
diff --git a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java
index a2fe951c4845..348c9a48e71d 100644
--- a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java
@@ -10,18 +10,20 @@
import static java.util.Collections.emptyList;
import java.sql.SQLException;
+import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.Order;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.collections4.CollectionUtils;
+
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.Order;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
+import org.apache.commons.collections.CollectionUtils;
import org.dspace.authorize.ResourcePolicy;
import org.dspace.authorize.ResourcePolicyOwnerVO;
import org.dspace.authorize.ResourcePolicy_;
@@ -175,16 +177,30 @@ public List findByTypeGroupActionExceptId(Context context, DSpac
public List findByEPersonGroupTypeIdAction(Context context, EPerson e, List groups,
int action, int type_id) throws SQLException {
+ // If groups and eperson are empty, return immediately
+ if (CollectionUtils.isEmpty(groups) && e == null) {
+ return Collections.emptyList();
+ }
+
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class);
Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class);
criteriaQuery.select(resourcePolicyRoot);
+
+ // Determine which predicate to use to match EPerson or Group(s) based on which were specified in params
+ Predicate compareEpersonOrGroups =
+ (CollectionUtils.isNotEmpty(groups) && e != null) ?
+ // Both are non-empty, so check both via an OR clause
+ criteriaBuilder.or(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.eperson), e),
+ resourcePolicyRoot.get(ResourcePolicy_.epersonGroup).in(groups)) :
+ // Otherwise only check one based on which is non-empty
+ (e != null ? criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.eperson), e) :
+ resourcePolicyRoot.get(ResourcePolicy_.epersonGroup).in(groups));
+
criteriaQuery.where(
criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.resourceTypeId), type_id),
criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action),
- criteriaBuilder
- .or(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.eperson), e),
- (resourcePolicyRoot.get(ResourcePolicy_.epersonGroup).in(groups)))
+ compareEpersonOrGroups
)
);
return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1);
@@ -308,8 +324,8 @@ public List findByEPerson(Context context, EPerson ePerson, int
@Override
public int countByEPerson(Context context, EPerson ePerson) throws SQLException {
Query query = createQuery(context,
- "SELECT count(*) FROM " + ResourcePolicy.class.getSimpleName() + " WHERE eperson_id = (:epersonUuid) ");
- query.setParameter("epersonUuid", ePerson.getID());
+ "SELECT count(*) FROM " + ResourcePolicy.class.getSimpleName() + " WHERE eperson = :eperson ");
+ query.setParameter("eperson", ePerson);
return count(query);
}
@@ -329,9 +345,9 @@ public List findByEPersonAndResourceUuid(Context context, EPerso
@Override
public int countByEPersonAndResourceUuid(Context context, EPerson eperson, UUID resourceUuid) throws SQLException {
Query query = createQuery(context, "SELECT count(*) FROM " + ResourcePolicy.class.getSimpleName()
- + " WHERE eperson_id = (:epersonUuid) AND dspace_object = (:resourceUuid) ");
+ + " WHERE eperson = :eperson AND dSpaceObject.id = :resourceUuid ");
query.setParameter("resourceUuid", resourceUuid);
- query.setParameter("epersonUuid", eperson.getID());
+ query.setParameter("eperson", eperson);
return count(query);
}
@@ -351,7 +367,7 @@ public List findByResouceUuidAndActionId(Context context, UUID r
@Override
public int countByResouceUuidAndActionId(Context context, UUID resourceUuid, int actionId) throws SQLException {
Query query = createQuery(context, "SELECT count(*) FROM " + ResourcePolicy.class.getSimpleName()
- + " WHERE dspace_object = (:resourceUuid) AND action_id = (:actionId) ");
+ + " WHERE dSpaceObject.id = :resourceUuid AND actionId = :actionId ");
query.setParameter("resourceUuid", resourceUuid);
query.setParameter("actionId", actionId);
return count(query);
@@ -371,7 +387,7 @@ public List findByResouceUuid(Context context, UUID resourceUuid
@Override
public int countByResourceUuid(Context context, UUID resourceUuid) throws SQLException {
Query query = createQuery(context, "SELECT count(*) FROM " + ResourcePolicy.class.getSimpleName()
- + " WHERE dspace_object = (:resourceUuid) ");
+ + " WHERE dSpaceObject.id = :resourceUuid ");
query.setParameter("resourceUuid", resourceUuid);
return count(query);
}
@@ -389,8 +405,8 @@ public List findByGroup(Context context, Group group, int offset
@Override
public int countResourcePolicyByGroup(Context context, Group group) throws SQLException {
Query query = createQuery(context, "SELECT count(*) " + "FROM " + ResourcePolicy.class.getSimpleName()
- + " WHERE epersongroup_id = (:groupUuid) ");
- query.setParameter("groupUuid", group.getID());
+ + " WHERE epersonGroup = :group ");
+ query.setParameter("group", group);
return count(query);
}
@@ -410,9 +426,9 @@ public List findByGroupAndResourceUuid(Context context, Group gr
@Override
public int countByGroupAndResourceUuid(Context context, Group group, UUID resourceUuid) throws SQLException {
Query query = createQuery(context, "SELECT count(*) FROM " + ResourcePolicy.class.getSimpleName()
- + " WHERE dspace_object = (:resourceUuid) AND epersongroup_id = (:groupUuid) ");
+ + " WHERE dSpaceObject.id = :resourceUuid AND epersonGroup = :group ");
query.setParameter("resourceUuid", resourceUuid);
- query.setParameter("groupUuid", group.getID());
+ query.setParameter("group", group);
return count(query);
}
diff --git a/dspace-api/src/main/java/org/dspace/authorize/service/ResourcePolicyService.java b/dspace-api/src/main/java/org/dspace/authorize/service/ResourcePolicyService.java
index 662b14b18b2e..f099f72d65ce 100644
--- a/dspace-api/src/main/java/org/dspace/authorize/service/ResourcePolicyService.java
+++ b/dspace-api/src/main/java/org/dspace/authorize/service/ResourcePolicyService.java
@@ -18,7 +18,6 @@
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
-import org.dspace.service.DSpaceCRUDService;
/**
* Service interface class for the ResourcePolicy object.
@@ -27,7 +26,34 @@
*
* @author kevinvandevelde at atmire.com
*/
-public interface ResourcePolicyService extends DSpaceCRUDService {
+public interface ResourcePolicyService {
+
+ public ResourcePolicy create(Context context, EPerson eperson, Group group) throws SQLException, AuthorizeException;
+
+ public ResourcePolicy find(Context context, int id) throws SQLException;
+
+ /**
+ * Persist a model object.
+ *
+ * @param context
+ * @param resourcePolicy object to be persisted.
+ * @throws SQLException passed through.
+ * @throws AuthorizeException passed through.
+ */
+ public void update(Context context, ResourcePolicy resourcePolicy) throws SQLException, AuthorizeException;
+
+
+ /**
+ * Persist a collection of model objects.
+ *
+ * @param context
+ * @param resourcePolicies object to be persisted.
+ * @throws SQLException passed through.
+ * @throws AuthorizeException passed through.
+ */
+ public void update(Context context, List resourcePolicies) throws SQLException, AuthorizeException;
+
+ public void delete(Context context, ResourcePolicy resourcePolicy) throws SQLException, AuthorizeException;
public List find(Context c, DSpaceObject o) throws SQLException;
diff --git a/dspace-api/src/main/java/org/dspace/batch/ImpBitstream.java b/dspace-api/src/main/java/org/dspace/batch/ImpBitstream.java
index c8b3540120b4..a7b87adef6ef 100644
--- a/dspace-api/src/main/java/org/dspace/batch/ImpBitstream.java
+++ b/dspace-api/src/main/java/org/dspace/batch/ImpBitstream.java
@@ -7,20 +7,20 @@
*/
package org.dspace.batch;
+import java.sql.Types;
import java.util.UUID;
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import jakarta.persistence.Cacheable;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.annotations.Type;
+import org.hibernate.annotations.JdbcTypeCode;
/***
* Contains all the information related to bitstreams to attach / replace in the
@@ -77,9 +77,8 @@ public class ImpBitstream {
@Column(name = "name", length = 512)
private String name;
- @Lob
@Column(name = "imp_blob")
- @Type(type = "org.hibernate.type.BinaryType")
+ @JdbcTypeCode(Types.VARBINARY)
private byte[] impBlob;
@Column(name = "embargo_policy")
diff --git a/dspace-api/src/main/java/org/dspace/batch/ImpBitstreamMetadatavalue.java b/dspace-api/src/main/java/org/dspace/batch/ImpBitstreamMetadatavalue.java
index ac98304774b1..35247ad2d2f1 100644
--- a/dspace-api/src/main/java/org/dspace/batch/ImpBitstreamMetadatavalue.java
+++ b/dspace-api/src/main/java/org/dspace/batch/ImpBitstreamMetadatavalue.java
@@ -7,18 +7,16 @@
*/
package org.dspace.batch;
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
+import jakarta.persistence.Cacheable;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Table;
+import org.hibernate.Length;
import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.annotations.Type;
/***
* Contains all the metadata associated to a bitstream that need to be created
@@ -49,9 +47,7 @@ public class ImpBitstreamMetadatavalue {
@Column(name = "imp_qualifier", length = 128)
private String impQualifier;
- @Lob
- @Column(name = "imp_value")
- @Type(type = "org.dspace.storage.rdbms.hibernate.DatabaseAwareLobType")
+ @Column(name = "imp_value", length = Length.LONG32)
private String impValue;
@Column(name = "imp_authority", length = 256)
diff --git a/dspace-api/src/main/java/org/dspace/batch/ImpMetadatavalue.java b/dspace-api/src/main/java/org/dspace/batch/ImpMetadatavalue.java
index b031e058ad16..85878cc62724 100644
--- a/dspace-api/src/main/java/org/dspace/batch/ImpMetadatavalue.java
+++ b/dspace-api/src/main/java/org/dspace/batch/ImpMetadatavalue.java
@@ -7,18 +7,17 @@
*/
package org.dspace.batch;
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
+import jakarta.persistence.Cacheable;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.Lob;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Table;
+import org.hibernate.Length;
import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.annotations.Type;
/***
* Contains all the metadata associated with an item that need to be created or
@@ -50,8 +49,7 @@ public class ImpMetadatavalue {
private String impQualifier;
@Lob
- @Column(name = "imp_value")
- @Type(type = "org.dspace.storage.rdbms.hibernate.DatabaseAwareLobType")
+ @Column(name = "imp_value", length = Length.LONG32)
private String impValue;
@Column(name = "imp_authority", length = 256)
diff --git a/dspace-api/src/main/java/org/dspace/batch/ImpRecord.java b/dspace-api/src/main/java/org/dspace/batch/ImpRecord.java
index b295db26730d..92f3d5602144 100644
--- a/dspace-api/src/main/java/org/dspace/batch/ImpRecord.java
+++ b/dspace-api/src/main/java/org/dspace/batch/ImpRecord.java
@@ -11,15 +11,15 @@
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Cacheable;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
import org.hibernate.annotations.CacheConcurrencyStrategy;
/***
diff --git a/dspace-api/src/main/java/org/dspace/batch/ImpWorkflowNState.java b/dspace-api/src/main/java/org/dspace/batch/ImpWorkflowNState.java
index 527b9d6346df..f21fa5c664fc 100644
--- a/dspace-api/src/main/java/org/dspace/batch/ImpWorkflowNState.java
+++ b/dspace-api/src/main/java/org/dspace/batch/ImpWorkflowNState.java
@@ -10,16 +10,16 @@
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
-import javax.persistence.Cacheable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.Table;
+import jakarta.persistence.Cacheable;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.Table;
import org.hibernate.annotations.CacheConcurrencyStrategy;
/***
diff --git a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpBitstreamDAOImpl.java b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpBitstreamDAOImpl.java
index 208dbb4efc57..844f866b30ce 100644
--- a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpBitstreamDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpBitstreamDAOImpl.java
@@ -9,8 +9,8 @@
import java.sql.SQLException;
import java.util.List;
-import javax.persistence.Query;
+import jakarta.persistence.Query;
import org.dspace.batch.ImpBitstream;
import org.dspace.batch.ImpRecord;
import org.dspace.batch.dao.ImpBitstreamDAO;
diff --git a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpBitstreamMetadatavalueDAOImpl.java b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpBitstreamMetadatavalueDAOImpl.java
index f204da27297b..8b2a996ab76f 100644
--- a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpBitstreamMetadatavalueDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpBitstreamMetadatavalueDAOImpl.java
@@ -9,8 +9,8 @@
import java.sql.SQLException;
import java.util.List;
-import javax.persistence.Query;
+import jakarta.persistence.Query;
import org.dspace.batch.ImpBitstream;
import org.dspace.batch.ImpBitstreamMetadatavalue;
import org.dspace.batch.dao.ImpBitstreamMetadatavalueDAO;
diff --git a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpMetadatavalueDAOImpl.java b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpMetadatavalueDAOImpl.java
index bae2ab70d122..5f6307330a96 100644
--- a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpMetadatavalueDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpMetadatavalueDAOImpl.java
@@ -9,8 +9,8 @@
import java.sql.SQLException;
import java.util.List;
-import javax.persistence.Query;
+import jakarta.persistence.Query;
import org.dspace.batch.ImpMetadatavalue;
import org.dspace.batch.ImpRecord;
import org.dspace.batch.dao.ImpMetadatavalueDAO;
diff --git a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpRecordDAOImpl.java b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpRecordDAOImpl.java
index ffd5deb47a65..af9df75ef925 100644
--- a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpRecordDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpRecordDAOImpl.java
@@ -9,8 +9,8 @@
import java.sql.SQLException;
import java.util.List;
-import javax.persistence.Query;
+import jakarta.persistence.Query;
import org.dspace.batch.ImpRecord;
import org.dspace.batch.dao.ImpRecordDAO;
import org.dspace.core.AbstractHibernateDAO;
diff --git a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpWorkflowNStateDAOImpl.java b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpWorkflowNStateDAOImpl.java
index 109c9d6ed805..45c0a1e3ec11 100644
--- a/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpWorkflowNStateDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/batch/dao/impl/ImpWorkflowNStateDAOImpl.java
@@ -9,8 +9,8 @@
import java.sql.SQLException;
import java.util.List;
-import javax.persistence.Query;
+import jakarta.persistence.Query;
import org.dspace.batch.ImpRecord;
import org.dspace.batch.ImpWorkflowNState;
import org.dspace.batch.dao.ImpWorkflowNStateDAO;
diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAO.java b/dspace-api/src/main/java/org/dspace/browse/ItemCountDAO.java
index ab16f68d3569..6438b5745bdb 100644
--- a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAO.java
+++ b/dspace-api/src/main/java/org/dspace/browse/ItemCountDAO.java
@@ -13,26 +13,17 @@
/**
* Interface for data access of cached community and collection item count
* information
- *
- * @author Richard Jones
*/
public interface ItemCountDAO {
- /**
- * Set the DSpace Context to use during data access
- *
- * @param context DSpace Context
- * @throws ItemCountException if count error
- */
- public void setContext(Context context) throws ItemCountException;
/**
* Get the number of items in the given DSpaceObject container. This method will
* only succeed if the DSpaceObject is an instance of either a Community or a
* Collection. Otherwise it will throw an exception.
*
+ * @param context DSpace context
* @param dso Dspace Object
* @return count
- * @throws ItemCountException if count error
*/
- public int getCount(DSpaceObject dso) throws ItemCountException;
+ int getCount(Context context, DSpaceObject dso);
}
diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOFactory.java b/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOFactory.java
deleted file mode 100644
index 722be645fdaa..000000000000
--- a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * 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.browse;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.dspace.core.Context;
-import org.dspace.services.ConfigurationService;
-import org.dspace.services.factory.DSpaceServicesFactory;
-
-/**
- * Factory class to allow us to load the correct DAO for registering
- * item count information
- *
- * @author Richard Jones
- * @author Ivan Masár
- */
-public class ItemCountDAOFactory {
-
- /**
- * Default constructor
- */
- private ItemCountDAOFactory() { }
-
- /**
- * Get an instance of ItemCountDAO which supports the correct storage backend
- * for the specific DSpace instance.
- *
- * @param context DSpace Context
- * @return DAO
- * @throws ItemCountException if count error
- */
- public static ItemCountDAO getInstance(Context context)
- throws ItemCountException {
-
- /** Log4j logger */
- ItemCountDAO dao = null;
-
- ConfigurationService configurationService
- = DSpaceServicesFactory.getInstance().getConfigurationService();
- String className = configurationService.getProperty("ItemCountDAO.class");
-
- // SOLR implementation is the default since DSpace 4.0
- if (className == null) {
- dao = new ItemCountDAOSolr();
- } else {
- try {
- dao = (ItemCountDAO) Class.forName(className.trim())
- .getDeclaredConstructor()
- .newInstance();
- } catch (ClassNotFoundException | IllegalAccessException
- | InstantiationException | NoSuchMethodException
- | SecurityException | IllegalArgumentException
- | InvocationTargetException e) {
- throw new ItemCountException("The configuration for ItemCountDAO is invalid: " + className, e);
- }
- }
-
- dao.setContext(context);
- return dao;
- }
-}
diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java b/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java
index d233270d813c..e4d0079fe20b 100644
--- a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java
+++ b/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java
@@ -24,14 +24,12 @@
import org.dspace.discovery.SearchServiceException;
import org.dspace.discovery.configuration.DiscoveryConfigurationParameters;
import org.dspace.discovery.indexobject.IndexableItem;
-import org.dspace.services.factory.DSpaceServicesFactory;
+import org.springframework.beans.factory.annotation.Autowired;
/**
* Discovery (Solr) driver implementing ItemCountDAO interface to look up item
* count information in communities and collections. Caching operations are
* intentionally not implemented because Solr already is our cache.
- *
- * @author Ivan Masár, Andrea Bollini
*/
public class ItemCountDAOSolr implements ItemCountDAO {
/**
@@ -39,11 +37,6 @@ public class ItemCountDAOSolr implements ItemCountDAO {
*/
private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemCountDAOSolr.class);
- /**
- * DSpace context
- */
- private Context context;
-
/**
* Hold the communities item count obtained from SOLR after the first query. This only works
* well if the ItemCountDAO lifecycle is bound to the request lifecycle as
@@ -61,41 +54,28 @@ public class ItemCountDAOSolr implements ItemCountDAO {
/**
* Solr search service
*/
- SearchService searcher = DSpaceServicesFactory.getInstance().getServiceManager()
- .getServiceByName(SearchService.class.getName(), SearchService.class);
-
- /**
- * Set the dspace context to use
- *
- * @param context DSpace Context
- * @throws ItemCountException if count error
- */
- @Override
- public void setContext(Context context) throws ItemCountException {
- this.context = context;
- }
+ @Autowired
+ protected SearchService searchService;
/**
* Get the count of the items in the given container.
*
- * @param dso Dspace Context
+ * @param context DSpace context
+ * @param dso DspaceObject
* @return count
- * @throws ItemCountException if count error
*/
@Override
- public int getCount(DSpaceObject dso) throws ItemCountException {
- loadCount();
- Integer val;
+ public int getCount(Context context, DSpaceObject dso) {
+ loadCount(context);
+ Integer val = null;
if (dso instanceof Collection) {
- val = collectionsCount.get(String.valueOf(((Collection) dso).getID()));
+ val = collectionsCount.get(dso.getID().toString());
} else if (dso instanceof Community) {
- val = communitiesCount.get(String.valueOf(((Community) dso).getID()));
- } else {
- throw new ItemCountException("We can only count items in Communities or Collections");
+ val = communitiesCount.get(dso.getID().toString());
}
if (val != null) {
- return val.intValue();
+ return val;
} else {
return 0;
}
@@ -105,15 +85,15 @@ public int getCount(DSpaceObject dso) throws ItemCountException {
* make sure that the counts are actually fetched from Solr (if haven't been
* cached in a Map yet)
*
- * @throws ItemCountException if count error
+ * @param context DSpace Context
*/
- private void loadCount() throws ItemCountException {
+ private void loadCount(Context context) {
if (communitiesCount != null || collectionsCount != null) {
return;
}
- communitiesCount = new HashMap();
- collectionsCount = new HashMap();
+ communitiesCount = new HashMap<>();
+ collectionsCount = new HashMap<>();
DiscoverQuery query = new DiscoverQuery();
query.setFacetMinCount(1);
@@ -125,11 +105,13 @@ private void loadCount() throws ItemCountException {
DiscoveryConfigurationParameters.SORT.COUNT));
query.addFilterQueries("search.resourcetype:" + IndexableItem.TYPE); // count only items
query.addFilterQueries("NOT(discoverable:false)"); // only discoverable
+ query.addFilterQueries("withdrawn:false"); // only not withdrawn
+ query.addFilterQueries("archived:true"); // only archived
query.setMaxResults(0);
- DiscoverResult sResponse = null;
+ DiscoverResult sResponse;
try {
- sResponse = searcher.search(context, query);
+ sResponse = searchService.search(context, query);
List commCount = sResponse.getFacetResult("location.comm");
List collCount = sResponse.getFacetResult("location.coll");
for (FacetResult c : commCount) {
@@ -139,8 +121,7 @@ private void loadCount() throws ItemCountException {
collectionsCount.put(c.getAsFilterQuery(), (int) c.getCount());
}
} catch (SearchServiceException e) {
- log.error("caught exception: ", e);
- throw new ItemCountException(e);
+ log.error("Could not initialize Community/Collection Item Counts from Solr: ", e);
}
}
}
diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemCountException.java b/dspace-api/src/main/java/org/dspace/browse/ItemCountException.java
deleted file mode 100644
index 533e6ecceb97..000000000000
--- a/dspace-api/src/main/java/org/dspace/browse/ItemCountException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * 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.browse;
-
-/**
- * Exception type to handle item count specific problems
- *
- * @author Richard Jones
- */
-public class ItemCountException extends Exception {
-
- public ItemCountException() {
- }
-
- public ItemCountException(String message) {
- super(message);
- }
-
- public ItemCountException(Throwable cause) {
- super(cause);
- }
-
- public ItemCountException(String message, Throwable cause) {
- super(message, cause);
- }
-
-}
diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java b/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java
index 20c43fc37298..b5a695566976 100644
--- a/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java
+++ b/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java
@@ -13,26 +13,18 @@
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.DSpaceObject;
-import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService;
import org.dspace.core.Context;
import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory;
-import org.dspace.web.ContextUtil;
+import org.springframework.beans.factory.annotation.Autowired;
/**
* This class provides a standard interface to all item counting
- * operations for communities and collections. It can be run from the
- * command line to prepare the cached data if desired, simply by
- * running:
+ * operations for communities and collections.
*
- * java org.dspace.browse.ItemCounter
- *
- * It can also be invoked via its standard API. In the event that
- * the data cache is not being used, this class will return direct
+ * In the event that the data cache is not being used, this class will return direct
* real time counts of content.
- *
- * @author Richard Jones
*/
public class ItemCounter {
/**
@@ -40,57 +32,15 @@ public class ItemCounter {
*/
private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemCounter.class);
- /**
- * DAO to use to store and retrieve data
- */
- private ItemCountDAO dao;
-
- /**
- * DSpace Context
- */
- private Context context;
-
- /**
- * This field is used to hold singular instance of a class.
- * Singleton pattern is used but this class should be
- * refactored to modern DSpace approach (injectible service).
- */
-
- private static ItemCounter instance;
-
+ @Autowired
protected ItemService itemService;
+ @Autowired
protected ConfigurationService configurationService;
- private boolean showStrengths;
- private boolean useCache;
-
- /**
- * Construct a new item counter which will use the given DSpace Context
- *
- * @param context current context
- * @throws ItemCountException if count error
- */
- public ItemCounter(Context context) throws ItemCountException {
- this.context = context;
- this.dao = ItemCountDAOFactory.getInstance(this.context);
- this.itemService = ContentServiceFactory.getInstance().getItemService();
- this.configurationService = DSpaceServicesFactory.getInstance().getConfigurationService();
- this.showStrengths = configurationService.getBooleanProperty("webui.strengths.show", false);
- this.useCache = configurationService.getBooleanProperty("webui.strengths.cache", true);
- }
-
/**
- * Get the singular instance of a class.
- * It creates a new instance at the first usage of this method.
- *
- * @return instance af a class
- * @throws ItemCountException when error occurs
+ * Construct a new item counter
*/
- public static ItemCounter getInstance() throws ItemCountException {
- if (instance == null) {
- instance = new ItemCounter(ContextUtil.obtainCurrentRequestContext());
- }
- return instance;
+ protected ItemCounter() {
}
/**
@@ -103,17 +53,24 @@ public static ItemCounter getInstance() throws ItemCountException {
* If it is equal to 'false' it will count the number of items
* in the container in real time.
*
+ * @param context DSpace Context
* @param dso DSpaceObject
- * @return count
- * @throws ItemCountException when error occurs
+ * @return count (-1 is returned if count could not be determined or is disabled)
*/
- public int getCount(DSpaceObject dso) throws ItemCountException {
+ public int getCount(Context context, DSpaceObject dso) {
+ boolean showStrengths = configurationService.getBooleanProperty("webui.strengths.show", false);
+ boolean useCache = configurationService.getBooleanProperty("webui.strengths.cache", true);
if (!showStrengths) {
return -1;
}
if (useCache) {
- return dao.getCount(dso);
+ // NOTE: This bean is NOT Autowired above because it's a "prototype" bean which we want to reload
+ // occasionally. Each time the bean reloads it will update the cached item counts.
+ ItemCountDAO dao =
+ DSpaceServicesFactory.getInstance().getServiceManager().getServiceByName("itemCountDAO",
+ ItemCountDAO.class);
+ return dao.getCount(context, dso);
}
// if we make it this far, we need to manually count
@@ -121,8 +78,8 @@ public int getCount(DSpaceObject dso) throws ItemCountException {
try {
return itemService.countItems(context, (Collection) dso);
} catch (SQLException e) {
- log.error("caught exception: ", e);
- throw new ItemCountException(e);
+ log.error("Error counting number of Items in Collection {} :", dso.getID(), e);
+ return -1;
}
}
@@ -130,8 +87,8 @@ public int getCount(DSpaceObject dso) throws ItemCountException {
try {
return itemService.countItems(context, ((Community) dso));
} catch (SQLException e) {
- log.error("caught exception: ", e);
- throw new ItemCountException(e);
+ log.error("Error counting number of Items in Community {} :", dso.getID(), e);
+ return -1;
}
}
diff --git a/dspace-api/src/main/java/org/dspace/checker/ChecksumHistory.java b/dspace-api/src/main/java/org/dspace/checker/ChecksumHistory.java
index 63779cda02fb..521bf546a4f2 100644
--- a/dspace-api/src/main/java/org/dspace/checker/ChecksumHistory.java
+++ b/dspace-api/src/main/java/org/dspace/checker/ChecksumHistory.java
@@ -8,19 +8,19 @@
package org.dspace.checker;
import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
import org.dspace.content.Bitstream;
import org.dspace.core.Context;
import org.dspace.core.ReloadableEntity;
diff --git a/dspace-api/src/main/java/org/dspace/checker/ChecksumResult.java b/dspace-api/src/main/java/org/dspace/checker/ChecksumResult.java
index 57fcdb8e365e..a63488077703 100644
--- a/dspace-api/src/main/java/org/dspace/checker/ChecksumResult.java
+++ b/dspace-api/src/main/java/org/dspace/checker/ChecksumResult.java
@@ -8,12 +8,13 @@
package org.dspace.checker;
import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.Id;
-import javax.persistence.Table;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
/**
* Database entity representation of the checksum_results table
diff --git a/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java b/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java
index b291232e8b55..50ef4baa98e3 100644
--- a/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java
+++ b/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java
@@ -13,8 +13,8 @@
import java.sql.SQLException;
import java.util.Date;
import java.util.GregorianCalendar;
-import javax.mail.MessagingException;
+import jakarta.mail.MessagingException;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
@@ -63,7 +63,7 @@ public DailyReportEmailer() {
* @throws MessagingException if message cannot be sent.
*/
public void sendReport(File attachment, int numberOfBitstreams)
- throws IOException, javax.mail.MessagingException {
+ throws IOException, jakarta.mail.MessagingException {
if (numberOfBitstreams > 0) {
ConfigurationService configurationService
= DSpaceServicesFactory.getInstance().getConfigurationService();
diff --git a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java
index eff8a8be1cde..5cb1851e7c4f 100644
--- a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java
+++ b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java
@@ -9,16 +9,16 @@
import java.io.Serializable;
import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.Transient;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.dspace.content.Bitstream;
diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java
index 328d4a717eb1..44c594d0eb32 100644
--- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java
@@ -9,9 +9,9 @@
import java.sql.SQLException;
import java.util.Date;
-import javax.persistence.Query;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Query;
+import jakarta.persistence.TemporalType;
import org.dspace.checker.ChecksumHistory;
import org.dspace.checker.ChecksumResultCode;
import org.dspace.checker.dao.ChecksumHistoryDAO;
diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java
index 7552c6d5bb8f..ac882e971dfe 100644
--- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java
@@ -8,10 +8,10 @@
package org.dspace.checker.dao.impl;
import java.sql.SQLException;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Root;
import org.dspace.checker.ChecksumResult;
import org.dspace.checker.ChecksumResultCode;
import org.dspace.checker.ChecksumResult_;
diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java
index a31e02cbab4a..669621aeeb58 100644
--- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java
@@ -11,14 +11,14 @@
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.Order;
-import javax.persistence.criteria.Root;
-import javax.persistence.criteria.Subquery;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.Order;
+import jakarta.persistence.criteria.Root;
+import jakarta.persistence.criteria.Subquery;
import org.dspace.checker.ChecksumHistory;
import org.dspace.checker.ChecksumHistory_;
import org.dspace.checker.ChecksumResult;
diff --git a/dspace-api/src/main/java/org/dspace/content/Bitstream.java b/dspace-api/src/main/java/org/dspace/content/Bitstream.java
index 5485735a2816..3fdb6316b210 100644
--- a/dspace-api/src/main/java/org/dspace/content/Bitstream.java
+++ b/dspace-api/src/main/java/org/dspace/content/Bitstream.java
@@ -11,21 +11,21 @@
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.BitstreamService;
import org.dspace.core.Constants;
import org.dspace.core.Context;
-import org.hibernate.proxy.HibernateProxyHelper;
+import org.dspace.core.HibernateProxyHelper;
/**
* Class representing bitstreams stored in the DSpace system.
diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java b/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java
index 6d64ee3073e9..4dacea0952a5 100644
--- a/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java
+++ b/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java
@@ -11,27 +11,28 @@
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
-import javax.persistence.CollectionTable;
-import javax.persistence.Column;
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import jakarta.persistence.CollectionTable;
+import jakarta.persistence.Column;
+import jakarta.persistence.ElementCollection;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.BitstreamFormatService;
import org.dspace.core.Context;
+import org.dspace.core.HibernateProxyHelper;
import org.dspace.core.ReloadableEntity;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CollectionId;
-import org.hibernate.annotations.Type;
-import org.hibernate.proxy.HibernateProxyHelper;
+import org.hibernate.annotations.CollectionIdJavaType;
+import org.hibernate.type.descriptor.java.IntegerJavaType;
/**
* Class representing a particular bitstream format.
@@ -55,8 +56,6 @@ public class BitstreamFormat implements Serializable, ReloadableEntity
@Column(name = "short_description", length = 128, unique = true)
private String shortDescription;
- // @Column(name="description")
-// @Lob //Generates a TEXT or LONGTEXT data type
@Column(name = "description", columnDefinition = "text")
private String description;
@@ -73,10 +72,10 @@ public class BitstreamFormat implements Serializable, ReloadableEntity
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "fileextension", joinColumns = @JoinColumn(name = "bitstream_format_id"))
@CollectionId(
- columns = @Column(name = "file_extension_id"),
- type = @Type(type = "integer"),
+ column = @Column(name = "file_extension_id"),
generator = "fileextension_seq"
)
+ @CollectionIdJavaType(IntegerJavaType.class)
@SequenceGenerator(name = "fileextension_seq", sequenceName = "fileextension_seq", allocationSize = 1)
@Column(name = "extension")
@Cascade( {org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java
index 07b4f4073634..90f59f58163f 100644
--- a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java
@@ -23,8 +23,8 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nullable;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
diff --git a/dspace-api/src/main/java/org/dspace/content/Bundle.java b/dspace-api/src/main/java/org/dspace/content/Bundle.java
index e5cbdb6ff244..b6fd269f8fc4 100644
--- a/dspace-api/src/main/java/org/dspace/content/Bundle.java
+++ b/dspace-api/src/main/java/org/dspace/content/Bundle.java
@@ -10,22 +10,22 @@
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.OrderColumn;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.OrderColumn;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.BundleService;
import org.dspace.core.Constants;
import org.dspace.core.Context;
-import org.hibernate.proxy.HibernateProxyHelper;
+import org.dspace.core.HibernateProxyHelper;
/**
* Class representing bundles of bitstreams stored in the DSpace system
diff --git a/dspace-api/src/main/java/org/dspace/content/CacheableDSpaceObject.java b/dspace-api/src/main/java/org/dspace/content/CacheableDSpaceObject.java
new file mode 100644
index 000000000000..fa6ec7676a32
--- /dev/null
+++ b/dspace-api/src/main/java/org/dspace/content/CacheableDSpaceObject.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/
+ */
+package org.dspace.content;
+
+import jakarta.persistence.Cacheable;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+/**
+ * Abstract class for DSpaceObjects which are safe to cache in Hibernate's second level cache.
+ * See hibernate-ehcache-config.xml for caching configurations for each DSpaceObject which extends this class.
+ */
+@Cacheable
+@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, include = "non-lazy")
+public abstract class CacheableDSpaceObject extends DSpaceObject {
+}
diff --git a/dspace-api/src/main/java/org/dspace/content/Collection.java b/dspace-api/src/main/java/org/dspace/content/Collection.java
index acce5c69bf08..6cedb0290aba 100644
--- a/dspace-api/src/main/java/org/dspace/content/Collection.java
+++ b/dspace-api/src/main/java/org/dspace/content/Collection.java
@@ -15,29 +15,26 @@
import java.util.List;
import java.util.Set;
import java.util.UUID;
-import javax.annotation.Nonnull;
-import javax.persistence.Cacheable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import jakarta.annotation.Nonnull;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import org.dspace.authorize.AuthorizeException;
-import org.dspace.browse.ItemCountException;
import org.dspace.content.comparator.NameAscendingComparator;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService;
import org.dspace.core.Constants;
import org.dspace.core.Context;
+import org.dspace.core.HibernateProxyHelper;
import org.dspace.eperson.Group;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.proxy.HibernateProxyHelper;
/**
* Class representing a collection.
@@ -54,9 +51,7 @@
*/
@Entity
@Table(name = "collection")
-@Cacheable
-@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, include = "non-lazy")
-public class Collection extends DSpaceObject implements DSpaceObjectLegacySupport {
+public class Collection extends CacheableDSpaceObject implements DSpaceObjectLegacySupport {
@Column(name = "collection_id", insertable = false, updatable = false)
private Integer legacyId;
@@ -344,18 +339,4 @@ private CollectionService getCollectionService() {
}
return collectionService;
}
-
- /**
- * return count of the collection items
- *
- * @return int
- */
- public int countArchivedItems() {
- try {
- return collectionService.countArchivedItems(this);
- } catch (ItemCountException e) {
- throw new RuntimeException(e);
- }
- }
-
}
diff --git a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java
index 20c05dc0915b..85d50c888100 100644
--- a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java
@@ -35,7 +35,6 @@
import org.dspace.authorize.ResourcePolicy;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.authorize.service.ResourcePolicyService;
-import org.dspace.browse.ItemCountException;
import org.dspace.browse.ItemCounter;
import org.dspace.content.dao.CollectionDAO;
import org.dspace.content.service.BitstreamService;
@@ -136,6 +135,9 @@ public class CollectionServiceImpl extends DSpaceObjectServiceImpl i
@Autowired(required = true)
protected WorkflowItemService> workflowItemService;
+ @Autowired
+ protected ItemCounter itemCounter;
+
protected CollectionServiceImpl() {
super();
}
@@ -1304,13 +1306,13 @@ public List findAllCollectionsByEntityType(Context context, String e
/**
* Returns total collection archived items
*
+ * @param context DSpace Context
* @param collection Collection
* @return total collection archived items
- * @throws ItemCountException
*/
@Override
- public int countArchivedItems(Collection collection) throws ItemCountException {
- return ItemCounter.getInstance().getCount(collection);
+ public int countArchivedItems(Context context, Collection collection) {
+ return itemCounter.getCount(context, collection);
}
@Override
diff --git a/dspace-api/src/main/java/org/dspace/content/Community.java b/dspace-api/src/main/java/org/dspace/content/Community.java
index d82e08bab72e..7f362d2f1610 100644
--- a/dspace-api/src/main/java/org/dspace/content/Community.java
+++ b/dspace-api/src/main/java/org/dspace/content/Community.java
@@ -12,28 +12,26 @@
import java.util.List;
import java.util.Set;
import java.util.UUID;
-import javax.persistence.Cacheable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.dspace.browse.ItemCountException;
import org.dspace.content.comparator.NameAscendingComparator;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CommunityService;
import org.dspace.core.Constants;
import org.dspace.core.Context;
+import org.dspace.core.HibernateProxyHelper;
import org.dspace.eperson.Group;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.proxy.HibernateProxyHelper;
+
/**
* Class representing a community
@@ -46,9 +44,7 @@
*/
@Entity
@Table(name = "community")
-@Cacheable
-@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, include = "non-lazy")
-public class Community extends DSpaceObject implements DSpaceObjectLegacySupport {
+public class Community extends CacheableDSpaceObject implements DSpaceObjectLegacySupport {
@Column(name = "community_id", insertable = false, updatable = false)
private Integer legacyId;
@@ -267,17 +263,4 @@ private CommunityService getCommunityService() {
}
return communityService;
}
-
- /**
- * return count of the community items
- *
- * @return int
- */
- public int countArchivedItems() {
- try {
- return communityService.countArchivedItems(this);
- } catch (ItemCountException e) {
- throw new RuntimeException(e);
- }
- }
}
diff --git a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java
index 636b0f3a62a9..70f8e791bb7f 100644
--- a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java
@@ -25,7 +25,6 @@
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.ResourcePolicy;
import org.dspace.authorize.service.AuthorizeService;
-import org.dspace.browse.ItemCountException;
import org.dspace.browse.ItemCounter;
import org.dspace.content.dao.CommunityDAO;
import org.dspace.content.service.BitstreamService;
@@ -81,6 +80,8 @@ public class CommunityServiceImpl extends DSpaceObjectServiceImpl imp
protected SubscribeService subscribeService;
@Autowired(required = true)
protected CrisMetricsService crisMetricsService;
+ @Autowired
+ protected ItemCounter itemCounter;
protected CommunityServiceImpl() {
super();
@@ -722,13 +723,13 @@ public int countTotal(Context context) throws SQLException {
/**
* Returns total community archived items
*
+ * @param context DSpace context
* @param community Community
* @return total community archived items
- * @throws ItemCountException
*/
@Override
- public int countArchivedItems(Community community) throws ItemCountException {
- return ItemCounter.getInstance().getCount(community);
+ public int countArchivedItems(Context context, Community community) {
+ return itemCounter.getCount(context, community);
}
@Override
diff --git a/dspace-api/src/main/java/org/dspace/content/DCDate.java b/dspace-api/src/main/java/org/dspace/content/DCDate.java
index d58aff7b1e22..163e21cdc2c5 100644
--- a/dspace-api/src/main/java/org/dspace/content/DCDate.java
+++ b/dspace-api/src/main/java/org/dspace/content/DCDate.java
@@ -80,6 +80,9 @@ private enum DateGran { YEAR, MONTH, DAY, TIME }
// just year, "2009"
private final SimpleDateFormat yearIso = new SimpleDateFormat("yyyy");
+ // Additional iso-like format which contains milliseconds
+ private final SimpleDateFormat fullIsoWithMs = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'.000'");
+
private static Map dfsLocaleMap = new HashMap();
/**
@@ -193,6 +196,9 @@ public DCDate(String fromDC) {
if (date == null) {
date = tryParse(fullIso4, fromDC);
}
+ if (date == null) {
+ date = tryParse(fullIsoWithMs, fromDC);
+ }
if (date == null) {
// Seems there is no time component to the date.
date = tryParse(dateIso, fromDC);
@@ -244,6 +250,7 @@ private void setUTCForFormatting() {
dateIso.setTimeZone(utcZone);
yearMonthIso.setTimeZone(utcZone);
yearIso.setTimeZone(utcZone);
+ fullIsoWithMs.setTimeZone(utcZone);
}
// Attempt to parse, swallowing errors; return null for failure.
diff --git a/dspace-api/src/main/java/org/dspace/content/DSpaceObject.java b/dspace-api/src/main/java/org/dspace/content/DSpaceObject.java
index cd9e64db7cbe..76426392d10f 100644
--- a/dspace-api/src/main/java/org/dspace/content/DSpaceObject.java
+++ b/dspace-api/src/main/java/org/dspace/content/DSpaceObject.java
@@ -11,19 +11,19 @@
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.Inheritance;
+import jakarta.persistence.InheritanceType;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OrderBy;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import org.apache.commons.collections4.CollectionUtils;
import org.dspace.authorize.ResourcePolicy;
import org.dspace.core.ReloadableEntity;
diff --git a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java
index f520bbfbfdce..69262b58c070 100644
--- a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java
@@ -250,6 +250,20 @@ public List addMetadata(Context context, T dso, MetadataField met
}
+ /**
+ * Add metadata value(s) to a MetadataField of a DSpace Object
+ * @param context current DSpace context
+ * @param dso DSpaceObject to modify
+ * @param metadataField MetadataField to add values to
+ * @param lang Language code to add
+ * @param values One or more metadata values to add
+ * @param authorities One or more authorities to add
+ * @param confidences One or more confidences to add (for authorities)
+ * @param placeSupplier Supplier of "place" for new metadata values
+ * @return List of newly added metadata values
+ * @throws SQLException if database error occurs
+ * @throws IllegalArgumentException for an empty list of values
+ */
public List addMetadata(Context context, T dso, MetadataField metadataField, String lang,
List values, List authorities, List confidences, Supplier placeSupplier)
throws SQLException {
@@ -275,6 +289,13 @@ public List addMetadata(Context context, T dso, MetadataField met
boolean authorityRequired = metadataAuthorityService.isAuthorityRequired(metadataField, dso.getType(),
collection);
+ // Throw an error if we are attempting to add empty values
+ if (values == null || values.isEmpty()) {
+ throw new IllegalArgumentException("Cannot add empty values to a new metadata field " +
+ metadataField.toString() + " on object with uuid = " +
+ dso.getID().toString() + " and type = " + getTypeText(dso));
+ }
+
List newMetadata = new ArrayList<>();
// We will not verify that they are valid entries in the registry
// until update() is called.
@@ -432,20 +453,26 @@ public void addAndShiftRightSecuredMetadata(Context context, T dso, String schem
@Override
public MetadataValue addMetadata(Context context, T dso, MetadataField metadataField, String language,
String value, String authority, int confidence) throws SQLException {
- return addMetadata(context, dso, metadataField, language, Arrays.asList(value), Arrays.asList(authority),
- Arrays.asList(confidence)).get(0);
+ List metadataValues =
+ addMetadata(context, dso, metadataField, language, Arrays.asList(value), Arrays.asList(authority),
+ Arrays.asList(confidence));
+ return CollectionUtils.isNotEmpty(metadataValues) ? metadataValues.get(0) : null;
}
@Override
public MetadataValue addMetadata(Context context, T dso, String schema, String element, String qualifier,
String lang, String value) throws SQLException {
- return addMetadata(context, dso, schema, element, qualifier, lang, Arrays.asList(value)).get(0);
+ List metadataValues =
+ addMetadata(context, dso, schema, element, qualifier, lang, Arrays.asList(value));
+ return CollectionUtils.isNotEmpty(metadataValues) ? metadataValues.get(0) : null;
}
@Override
public MetadataValue addMetadata(Context context, T dso, MetadataField metadataField, String language, String value)
throws SQLException {
- return addMetadata(context, dso, metadataField, language, Arrays.asList(value)).get(0);
+ List metadataValues =
+ addMetadata(context, dso, metadataField, language, Arrays.asList(value));
+ return CollectionUtils.isNotEmpty(metadataValues) ? metadataValues.get(0) : null;
}
@Override
@@ -800,6 +827,7 @@ public void update(Context context, T dso) throws SQLException, AuthorizeExcepti
// E.g. for an Author relationship,
// the place should be updated using the same principle as dc.contributor.author.
StringUtils.startsWith(metadataValue.getAuthority(), Constants.VIRTUAL_AUTHORITY_PREFIX)
+ && metadataValue instanceof RelationshipMetadataValue
&& ((RelationshipMetadataValue) metadataValue).isUseForPlace()
) {
int mvPlace = getMetadataValuePlace(fieldToLastPlace, metadataValue);
diff --git a/dspace-api/src/main/java/org/dspace/content/EntityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/EntityServiceImpl.java
index 2f34129f2e69..9b28203827e0 100644
--- a/dspace-api/src/main/java/org/dspace/content/EntityServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/EntityServiceImpl.java
@@ -8,6 +8,7 @@
package org.dspace.content;
import java.sql.SQLException;
+import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
@@ -51,12 +52,7 @@ public Entity findByItemId(Context context, UUID itemId, Integer limit, Integer
@Override
public EntityType getType(Context context, Entity entity) throws SQLException {
Item item = entity.getItem();
- List list = itemService.getMetadata(item, "dspace", "entity", "type", Item.ANY, false);
- if (!list.isEmpty()) {
- return entityTypeService.findByEntityType(context, list.get(0).getValue());
- } else {
- return null;
- }
+ return itemService.getEntityType(context, item);
}
@Override
@@ -103,7 +99,12 @@ public List getAllRelationshipTypes(Context context, Entity en
@Override
public List getAllRelationshipTypes(Context context, Entity entity, Integer limit, Integer offset)
throws SQLException {
- return relationshipTypeService.findByEntityType(context, this.getType(context, entity), limit, offset);
+ EntityType entityType = this.getType(context, entity);
+ if (entityType != null) {
+ return relationshipTypeService.findByEntityType(context, entityType, limit, offset);
+ } else {
+ return Collections.emptyList();
+ }
}
@Override
@@ -115,7 +116,12 @@ public List getLeftRelationshipTypes(Context context, Entity e
@Override
public List getLeftRelationshipTypes(Context context, Entity entity, boolean isLeft,
Integer limit, Integer offset) throws SQLException {
- return relationshipTypeService.findByEntityType(context, this.getType(context, entity), isLeft, limit, offset);
+ EntityType entityType = this.getType(context, entity);
+ if (entityType != null) {
+ return relationshipTypeService.findByEntityType(context, entityType, isLeft, limit, offset);
+ } else {
+ return Collections.emptyList();
+ }
}
@Override
@@ -128,7 +134,12 @@ public List getRightRelationshipTypes(Context context, Entity
public List getRightRelationshipTypes(Context context, Entity entity, boolean isLeft,
Integer limit, Integer offset) throws SQLException {
- return relationshipTypeService.findByEntityType(context, this.getType(context, entity), isLeft, limit, offset);
+ EntityType entityType = this.getType(context, entity);
+ if (entityType != null) {
+ return relationshipTypeService.findByEntityType(context, entityType, isLeft, limit, offset);
+ } else {
+ return Collections.emptyList();
+ }
}
@Override
diff --git a/dspace-api/src/main/java/org/dspace/content/EntityType.java b/dspace-api/src/main/java/org/dspace/content/EntityType.java
index 20ab758a0b76..720e0c492ca7 100644
--- a/dspace-api/src/main/java/org/dspace/content/EntityType.java
+++ b/dspace-api/src/main/java/org/dspace/content/EntityType.java
@@ -8,14 +8,14 @@
package org.dspace.content;
import java.util.Objects;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.dspace.core.ReloadableEntity;
diff --git a/dspace-api/src/main/java/org/dspace/content/EntityTypeServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/EntityTypeServiceImpl.java
index 6666ad6f802c..babbb9efc7f6 100644
--- a/dspace-api/src/main/java/org/dspace/content/EntityTypeServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/EntityTypeServiceImpl.java
@@ -158,7 +158,7 @@ public List getSubmitAuthorizedTypes(Context context)
sQuery.setFacetMinCount(1);
sQuery.setFacetLimit(Integer.MAX_VALUE);
sQuery.setFacetSort(FacetParams.FACET_SORT_INDEX);
- QueryResponse qResp = solrSearchCore.getSolr().query(sQuery);
+ QueryResponse qResp = solrSearchCore.getSolr().query(sQuery, solrSearchCore.REQUEST_METHOD);
FacetField facetField = qResp.getFacetField("search.entitytype");
if (Objects.nonNull(facetField)) {
for (Count c : facetField.getValues()) {
diff --git a/dspace-api/src/main/java/org/dspace/content/FeedbackServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/FeedbackServiceImpl.java
index 7e34af132b0a..13f149f69f64 100644
--- a/dspace-api/src/main/java/org/dspace/content/FeedbackServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/FeedbackServiceImpl.java
@@ -9,9 +9,9 @@
import java.io.IOException;
import java.util.Date;
import java.util.Objects;
-import javax.mail.MessagingException;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.mail.MessagingException;
+import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.dspace.content.service.FeedbackService;
import org.dspace.core.Context;
diff --git a/dspace-api/src/main/java/org/dspace/content/InstallItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/InstallItemServiceImpl.java
index 851807f4ae82..15e36334476a 100644
--- a/dspace-api/src/main/java/org/dspace/content/InstallItemServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/InstallItemServiceImpl.java
@@ -29,6 +29,7 @@
import org.dspace.identifier.Identifier;
import org.dspace.identifier.IdentifierException;
import org.dspace.identifier.service.IdentifierService;
+import org.dspace.services.ConfigurationService;
import org.dspace.supervision.SupervisionOrder;
import org.dspace.supervision.service.SupervisionOrderService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -57,6 +58,9 @@ public class InstallItemServiceImpl implements InstallItemService {
Logger log = LogManager.getLogger(InstallItemServiceImpl.class);
+ @Autowired
+ protected ConfigurationService configurationService;
+
protected InstallItemServiceImpl() {
}
@@ -281,14 +285,20 @@ public String getSubmittedByProvenanceMessage(Context context, Item item) throws
// Create provenance description
StringBuffer provmessage = new StringBuffer();
- if (item.getSubmitter() != null) {
+ //behavior to generate provenance message, if set true, personal data (e.g. email) of submitter will be hidden
+ //default value false, personal data of submitter will be shown in provenance message
+ String isProvenancePrivacyActiveProperty =
+ configurationService.getProperty("metadata.privacy.dc.description.provenance", "false");
+ boolean isProvenancePrivacyActive = Boolean.parseBoolean(isProvenancePrivacyActiveProperty);
+
+ if (item.getSubmitter() != null && !isProvenancePrivacyActive) {
provmessage.append("Submitted by ").append(item.getSubmitter().getFullName())
- .append(" (").append(item.getSubmitter().getEmail()).append(") on ")
- .append(now.toString());
+ .append(" (").append(item.getSubmitter().getEmail()).append(") on ")
+ .append(now.toString());
} else {
// else, null submitter
- provmessage.append("Submitted by unknown (probably automated) on")
- .append(now.toString());
+ provmessage.append("Submitted by unknown (probably automated or submitter hidden) on ")
+ .append(now.toString());
}
provmessage.append("\n");
diff --git a/dspace-api/src/main/java/org/dspace/content/Item.java b/dspace-api/src/main/java/org/dspace/content/Item.java
index 547ff490b84b..5422528f84a3 100644
--- a/dspace-api/src/main/java/org/dspace/content/Item.java
+++ b/dspace-api/src/main/java/org/dspace/content/Item.java
@@ -14,27 +14,28 @@
import java.util.List;
import java.util.Set;
import java.util.UUID;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.Transient;
import org.dspace.content.comparator.NameAscendingComparator;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService;
import org.dspace.core.Constants;
import org.dspace.core.Context;
+import org.dspace.core.HibernateProxyHelper;
import org.dspace.eperson.EPerson;
-import org.hibernate.proxy.HibernateProxyHelper;
+
/**
* Class representing an item in DSpace.
diff --git a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java
index 8e63bf7b71a4..ea8a369c1229 100644
--- a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java
@@ -46,6 +46,7 @@
import org.dspace.authorize.ResourcePolicy;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.authorize.service.ResourcePolicyService;
+import org.dspace.content.authority.Choices;
import org.dspace.content.dao.ItemDAO;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.BitstreamFormatService;
@@ -59,7 +60,9 @@
import org.dspace.content.service.MetadataSchemaService;
import org.dspace.content.service.RelationshipService;
import org.dspace.content.service.WorkspaceItemService;
+import org.dspace.content.template.TemplateItemValueService;
import org.dspace.content.virtual.VirtualMetadataPopulator;
+import org.dspace.content.vo.MetadataValueVO;
import org.dspace.contentreport.QueryPredicate;
import org.dspace.core.Constants;
import org.dspace.core.Context;
@@ -120,7 +123,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl
- implements It
/**
* log4j category
*/
- private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Item.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger();
@Autowired(required = true)
protected ItemDAO itemDAO;
@@ -162,6 +165,8 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl
- implements It
protected WorkspaceItemService workspaceItemService;
@Autowired(required = true)
protected WorkflowItemService workflowItemService;
+ @Autowired
+ private TemplateItemValueService templateItemValueService;
@Autowired(required = true)
protected RelationshipService relationshipService;
@@ -407,6 +412,62 @@ public Item createTemplateItem(Context context, Collection collection) throws SQ
return collection.getTemplateItem();
}
+ @Override
+ public void populateWithTemplateItemMetadata(Context context, Collection collection, boolean template, Item item)
+ throws SQLException {
+
+ Item templateItem = collection.getTemplateItem();
+
+ Optional colEntityType = getDSpaceEntityType(collection);
+ Optional templateItemEntityType = getDSpaceEntityType(templateItem);
+
+ if (colEntityType.isPresent() && templateItemEntityType.isPresent() &&
+ !StringUtils.equals(colEntityType.get().getValue(), templateItemEntityType.get().getValue())) {
+ throw new IllegalStateException("The template item has entity type : (" +
+ templateItemEntityType.get().getValue() + ") different than collection entity type : " +
+ colEntityType.get().getValue());
+ }
+
+ if (colEntityType.isPresent() && templateItemEntityType.isEmpty()) {
+ MetadataValue original = colEntityType.get();
+ MetadataField metadataField = original.getMetadataField();
+ MetadataSchema metadataSchema = metadataField.getMetadataSchema();
+ // NOTE: dspace.entity.type = does not make sense
+ // the collection entity type is by default blank when a collection is first created
+ if (StringUtils.isNotBlank(original.getValue())) {
+ addMetadata(context, item, metadataSchema.getName(), metadataField.getElement(),
+ metadataField.getQualifier(), original.getLanguage(), original.getValue());
+ }
+ }
+
+ if (template && (templateItem != null)) {
+ List md = getMetadata(templateItem, Item.ANY, Item.ANY, Item.ANY, Item.ANY);
+
+ for (MetadataValue aMd : md) {
+ MetadataField metadataField = aMd.getMetadataField();
+ MetadataSchema metadataSchema = metadataField.getMetadataSchema();
+ List metadataValueFromTemplateList = templateItemValueService.value(context, item,
+ templateItem, aMd);
+
+ for (MetadataValueVO metadataValueFromTemplate : metadataValueFromTemplateList) {
+ addMetadata(context, item, metadataSchema.getName(), metadataField.getElement(),
+ metadataField.getQualifier(), aMd.getLanguage(),
+ metadataValueFromTemplate.getValue(), metadataValueFromTemplate.getAuthority(),
+ metadataValueFromTemplate.getConfidence());
+ }
+ }
+ }
+ }
+
+ private Optional getDSpaceEntityType(DSpaceObject dSpaceObject) {
+ return Objects.nonNull(dSpaceObject) ? dSpaceObject.getMetadata()
+ .stream()
+ .filter(x -> x.getMetadataField().toString('.')
+ .equalsIgnoreCase("dspace.entity.type"))
+ .findFirst()
+ : Optional.empty();
+ }
+
@Override
public Iterator
- findAll(Context context) throws SQLException {
return itemDAO.findAll(context, true);
@@ -1752,7 +1813,7 @@ public Iterator
- findByMetadataField(Context context,
public List
- findByMetadataQuery(Context context, List queryPredicates,
List collectionUuids, long offset, int limit)
throws SQLException {
- return itemDAO.findByMetadataQuery(context, queryPredicates, collectionUuids, "text_value ~ ?",
+ return itemDAO.findByMetadataQuery(context, queryPredicates, collectionUuids, "value ~ ?",
offset, limit);
}
@@ -1761,7 +1822,7 @@ public List
- findByMetadataQuery(Context context, List quer
public long countForMetadataQuery(Context context, List queryPredicates,
List collectionUuids)
throws SQLException {
- return itemDAO.countForMetadataQuery(context, queryPredicates, collectionUuids, "text_value ~ ?");
+ return itemDAO.countForMetadataQuery(context, queryPredicates, collectionUuids, "value ~ ?");
}
@Override
@@ -1910,13 +1971,13 @@ public Iterator
- findByIds(Context context, List ids) throws SQLExc
@Override
public int countItems(Context context, Collection collection) throws SQLException {
- return itemDAO.countItems(context, collection, true, false);
+ return itemDAO.countItems(context, collection, true, false, true);
}
@Override
public int countAllItems(Context context, Collection collection) throws SQLException {
- return itemDAO.countItems(context, collection, true, false) + itemDAO.countItems(context, collection,
- false, true);
+ return itemDAO.countItems(context, collection, true, false, true) + itemDAO.countItems(context, collection,
+ false, true, true);
}
@Override
@@ -1925,7 +1986,7 @@ public int countItems(Context context, Community community) throws SQLException
List collections = communityService.getAllCollections(context, community);
// Now, lets count unique items across that list of collections
- return itemDAO.countItems(context, collections, true, false);
+ return itemDAO.countItems(context, collections, true, false, true);
}
@Override
@@ -1934,8 +1995,17 @@ public int countAllItems(Context context, Community community) throws SQLExcepti
List collections = communityService.getAllCollections(context, community);
// Now, lets count unique items across that list of collections
- return itemDAO.countItems(context, collections, true, false) + itemDAO.countItems(context, collections,
- false, true);
+ return itemDAO.countItems(context, collections, true, false, true) + itemDAO.countItems(context, collections,
+ false, false, true);
+ }
+
+ @Override
+ protected void getAuthoritiesAndConfidences(String fieldKey, int dsoType, Collection collection,
+ List values, List authorities,
+ List confidences, int i) {
+ Choices c = choiceAuthorityService.getBestMatch(fieldKey, values.get(i), dsoType, collection, null);
+ authorities.add(c.values.length > 0 && c.values[0] != null ? c.values[0].authority : null);
+ confidences.add(c.confidence);
}
@Override
@@ -1970,19 +2040,19 @@ public int countTotal(Context context) throws SQLException {
@Override
public int countNotArchivedItems(Context context) throws SQLException {
// return count of items not in archive and also not withdrawn
- return itemDAO.countItems(context, false, false);
+ return itemDAO.countItems(context, false, false, true);
}
@Override
public int countArchivedItems(Context context) throws SQLException {
// return count of items in archive and also not withdrawn
- return itemDAO.countItems(context, true, false);
+ return itemDAO.countItems(context, true, false, true);
}
@Override
public int countWithdrawnItems(Context context) throws SQLException {
// return count of items that are not in archive and withdrawn
- return itemDAO.countItems(context, false, true);
+ return itemDAO.countItems(context, false, true, true );
}
@Override
@@ -2106,12 +2176,15 @@ public void setEntityType(Context context, Item item, String entityType) {
*/
@Override
protected void moveSingleMetadataValue(Context context, Item dso, int place, MetadataValue rr) {
+ // If this is a (virtual) metadata value representing a relationship,
+ // then we must also update the corresponding Relationship with the new place
+ // wut?
if (rr instanceof RelationshipMetadataValue) {
try {
//Retrieve the applicable relationship
Relationship rs = relationshipService.find(context,
((RelationshipMetadataValue) rr).getRelationshipId());
- if (rs.getLeftItem() == dso) {
+ if (rs.getLeftItem().getID().equals(dso.getID())) {
rs.setLeftPlace(place);
} else {
rs.setRightPlace(place);
@@ -2121,7 +2194,7 @@ protected void moveSingleMetadataValue(Context context, Item dso, int place, Met
//should not occur, otherwise metadata can't be updated either
log.error("An error occurred while moving " + rr.getAuthority() + " for item " + dso.getID(), e);
}
- } else {
+ } else {
//just move the metadata
rr.setPlace(place);
}
diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataField.java b/dspace-api/src/main/java/org/dspace/content/MetadataField.java
index 8b767011999e..cbe90a374432 100644
--- a/dspace-api/src/main/java/org/dspace/content/MetadataField.java
+++ b/dspace-api/src/main/java/org/dspace/content/MetadataField.java
@@ -7,23 +7,22 @@
*/
package org.dspace.content;
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
+import jakarta.persistence.Cacheable;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.dspace.core.Context;
+import org.dspace.core.HibernateProxyHelper;
import org.dspace.core.ReloadableEntity;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.proxy.HibernateProxyHelper;
/**
@@ -58,8 +57,6 @@ public class MetadataField implements ReloadableEntity {
@Column(name = "qualifier", length = 64)
private String qualifier = null;
- // @Column(name = "scope_note")
-// @Lob
@Column(name = "scope_note", columnDefinition = "text")
private String scopeNote;
diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataFieldName.java b/dspace-api/src/main/java/org/dspace/content/MetadataFieldName.java
index 702d7dcdbaf5..66d67b3c1f95 100644
--- a/dspace-api/src/main/java/org/dspace/content/MetadataFieldName.java
+++ b/dspace-api/src/main/java/org/dspace/content/MetadataFieldName.java
@@ -9,7 +9,8 @@
import java.util.Arrays;
import java.util.Objects;
-import javax.annotation.Nonnull;
+
+import jakarta.annotation.Nonnull;
/**
* Simple immutable holder for the name of a metadata field.
diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataSchema.java b/dspace-api/src/main/java/org/dspace/content/MetadataSchema.java
index f60e5e1604cf..b9a4665e6672 100644
--- a/dspace-api/src/main/java/org/dspace/content/MetadataSchema.java
+++ b/dspace-api/src/main/java/org/dspace/content/MetadataSchema.java
@@ -7,19 +7,18 @@
*/
package org.dspace.content;
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
+import jakarta.persistence.Cacheable;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.dspace.core.Context;
+import org.dspace.core.HibernateProxyHelper;
import org.dspace.core.ReloadableEntity;
import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.proxy.HibernateProxyHelper;
/**
* Class representing a schema in DSpace.
diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataValue.java b/dspace-api/src/main/java/org/dspace/content/MetadataValue.java
index 923b5575fa46..4c060af0a886 100644
--- a/dspace-api/src/main/java/org/dspace/content/MetadataValue.java
+++ b/dspace-api/src/main/java/org/dspace/content/MetadataValue.java
@@ -7,25 +7,23 @@
*/
package org.dspace.content;
-import javax.annotation.Nullable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
+import jakarta.annotation.Nullable;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import org.dspace.core.Context;
+import org.dspace.core.HibernateProxyHelper;
import org.dspace.core.ReloadableEntity;
-import org.hibernate.annotations.Type;
-import org.hibernate.proxy.HibernateProxyHelper;
+import org.hibernate.Length;
/**
* Database access class representing a Dublin Core metadata value.
@@ -60,9 +58,7 @@ public class MetadataValue implements ReloadableEntity {
/**
* The value of the field
*/
- @Lob
- @Type(type = "org.hibernate.type.TextType")
- @Column(name = "text_value")
+ @Column(name = "text_value", length = Length.LONG32)
private String value;
/**
diff --git a/dspace-api/src/main/java/org/dspace/content/PredefinedUUIDGenerator.java b/dspace-api/src/main/java/org/dspace/content/PredefinedUUIDGenerator.java
index aa4a8ea5429c..15d302ec6152 100644
--- a/dspace-api/src/main/java/org/dspace/content/PredefinedUUIDGenerator.java
+++ b/dspace-api/src/main/java/org/dspace/content/PredefinedUUIDGenerator.java
@@ -7,7 +7,6 @@
*/
package org.dspace.content;
-import java.io.Serializable;
import java.util.UUID;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -21,7 +20,7 @@
public class PredefinedUUIDGenerator extends UUIDGenerator {
@Override
- public Serializable generate(SharedSessionContractImplementor session, Object object) {
+ public Object generate(SharedSessionContractImplementor session, Object object) {
if (object instanceof DSpaceObject) {
UUID uuid = ((DSpaceObject) object).getPredefinedUUID();
if (uuid != null) {
diff --git a/dspace-api/src/main/java/org/dspace/content/QAEventProcessed.java b/dspace-api/src/main/java/org/dspace/content/QAEventProcessed.java
index 3631a2ff68c6..fcca5b45703a 100644
--- a/dspace-api/src/main/java/org/dspace/content/QAEventProcessed.java
+++ b/dspace-api/src/main/java/org/dspace/content/QAEventProcessed.java
@@ -9,15 +9,15 @@
import java.io.Serializable;
import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
import org.dspace.eperson.EPerson;
/**
diff --git a/dspace-api/src/main/java/org/dspace/content/Relationship.java b/dspace-api/src/main/java/org/dspace/content/Relationship.java
index 7c912923a436..0cf9a83d9ddf 100644
--- a/dspace-api/src/main/java/org/dspace/content/Relationship.java
+++ b/dspace-api/src/main/java/org/dspace/content/Relationship.java
@@ -7,19 +7,20 @@
*/
package org.dspace.content;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.dspace.core.Context;
import org.dspace.core.ReloadableEntity;
+import org.hibernate.annotations.JdbcTypeCode;
+import org.hibernate.type.SqlTypes;
/**
* This class represents a relationship
@@ -96,6 +97,7 @@ public class Relationship implements ReloadableEntity {
* This column affects what version of an item appears on search pages or the relationship listings of other items.
*/
@Column(name = "latest_version_status")
+ @JdbcTypeCode(SqlTypes.INTEGER)
private LatestVersionStatus latestVersionStatus = LatestVersionStatus.BOTH;
/**
diff --git a/dspace-api/src/main/java/org/dspace/content/RelationshipType.java b/dspace-api/src/main/java/org/dspace/content/RelationshipType.java
index c4dad42b2316..ca16071b6364 100644
--- a/dspace-api/src/main/java/org/dspace/content/RelationshipType.java
+++ b/dspace-api/src/main/java/org/dspace/content/RelationshipType.java
@@ -7,20 +7,21 @@
*/
package org.dspace.content;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.dspace.core.Context;
import org.dspace.core.ReloadableEntity;
+import org.hibernate.annotations.JdbcTypeCode;
+import org.hibernate.type.SqlTypes;
/**
* Class representing a RelationshipType
@@ -118,6 +119,7 @@ public class RelationshipType implements ReloadableEntity {
* The value indicating whether relationships of this type should be ignored on the right/left/neither.
*/
@Column(name = "tilted")
+ @JdbcTypeCode(SqlTypes.INTEGER)
private Tilted tilted;
/**
diff --git a/dspace-api/src/main/java/org/dspace/content/Site.java b/dspace-api/src/main/java/org/dspace/content/Site.java
index 0bdab6ffe564..904c1d3e6b86 100644
--- a/dspace-api/src/main/java/org/dspace/content/Site.java
+++ b/dspace-api/src/main/java/org/dspace/content/Site.java
@@ -7,28 +7,23 @@
*/
package org.dspace.content;
-import javax.persistence.Cacheable;
-import javax.persistence.Entity;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.SiteService;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
/**
* Represents the root of the DSpace Archive.
* By default, the handle suffix "0" represents the Site, e.g. "1721.1/0"
*/
@Entity
-@Cacheable
-@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "site")
-public class Site extends DSpaceObject {
+public class Site extends CacheableDSpaceObject {
@Transient
private transient SiteService siteService;
diff --git a/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java b/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java
index 37e5bb056ff4..ac3b08f8d3f3 100644
--- a/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java
+++ b/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java
@@ -8,23 +8,23 @@
package org.dspace.content;
import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.dspace.core.Context;
+import org.dspace.core.HibernateProxyHelper;
import org.dspace.eperson.EPerson;
import org.dspace.workflow.WorkflowItem;
-import org.hibernate.proxy.HibernateProxyHelper;
/**
* Class representing an item in the process of being submitted by a user
diff --git a/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java
index f1a8e546ebb1..5e4326cf72a0 100644
--- a/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java
@@ -12,11 +12,8 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
import java.util.UUID;
-import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
import org.dspace.app.util.DCInputsReaderException;
import org.dspace.app.util.Util;
@@ -31,8 +28,6 @@
import org.dspace.content.service.MetadataFieldService;
import org.dspace.content.service.MetadataValueService;
import org.dspace.content.service.WorkspaceItemService;
-import org.dspace.content.template.TemplateItemValueService;
-import org.dspace.content.vo.MetadataValueVO;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.core.LogHelper;
@@ -77,8 +72,7 @@ public class WorkspaceItemServiceImpl implements WorkspaceItemService {
private MetadataFieldService metadataFieldService;
@Autowired
private MetadataValueService metadataValueService;
- @Autowired
- private TemplateItemValueService templateItemValueService;
+
@Autowired(required = true)
protected DOIService doiService;
@@ -109,11 +103,18 @@ public WorkspaceItem find(Context context, int id) throws SQLException {
@Override
public WorkspaceItem create(Context context, Collection collection, boolean template)
throws AuthorizeException, SQLException {
- return create(context, collection, null, template);
+ return create(context, collection, null, template, false);
+ }
+
+ @Override
+ public WorkspaceItem create(Context context, Collection collection, boolean template, boolean isNewVersion)
+ throws AuthorizeException, SQLException {
+ return create(context, collection, null, template, isNewVersion);
}
@Override
- public WorkspaceItem create(Context context, Collection collection, UUID uuid, boolean template)
+ public WorkspaceItem create(Context context, Collection collection, UUID uuid, boolean template,
+ boolean isNewVersion)
throws AuthorizeException, SQLException {
// Check the user has permission to ADD to the collection
authorizeService.authorizeAction(context, collection, Constants.ADD);
@@ -142,57 +143,16 @@ public WorkspaceItem create(Context context, Collection collection, UUID uuid, b
}
// Copy template if appropriate
- Item templateItem = collection.getTemplateItem();
-
- Optional colEntityType = getDSpaceEntityType(collection);
- Optional templateItemEntityType = getDSpaceEntityType(templateItem);
-
- if (colEntityType.isPresent() && templateItemEntityType.isPresent() &&
- !StringUtils.equals(colEntityType.get().getValue(), templateItemEntityType.get().getValue())) {
- throw new IllegalStateException("The template item has entity type : (" +
- templateItemEntityType.get().getValue() + ") different than collection entity type : " +
- colEntityType.get().getValue());
- }
-
- if (colEntityType.isPresent() && templateItemEntityType.isEmpty()) {
- MetadataValue original = colEntityType.get();
- MetadataField metadataField = original.getMetadataField();
- MetadataSchema metadataSchema = metadataField.getMetadataSchema();
- // NOTE: dspace.entity.type = does not make sense
- // the collection entity type is by default blank when a collection is first created
- if (StringUtils.isNotBlank(original.getValue())) {
- itemService.addMetadata(context, item, metadataSchema.getName(), metadataField.getElement(),
- metadataField.getQualifier(), original.getLanguage(), original.getValue());
- }
- }
-
- if (template && (templateItem != null)) {
- List templateMetadataValues = itemService.getMetadata(templateItem, Item.ANY, Item.ANY,
- Item.ANY, Item.ANY);
-
- for (MetadataValue templateMetadataValue : templateMetadataValues) {
-
- MetadataField metadataField = templateMetadataValue.getMetadataField();
- MetadataSchema metadataSchema = metadataField.getMetadataSchema();
-
- List metadataValueFromTemplateList = templateItemValueService.value(context, item,
- templateItem, templateMetadataValue);
-
- for (MetadataValueVO metadataValueFromTemplate : metadataValueFromTemplateList) {
- itemService.addMetadata(context, item, metadataSchema.getName(), metadataField.getElement(),
- metadataField.getQualifier(), templateMetadataValue.getLanguage(),
- metadataValueFromTemplate.getValue(), metadataValueFromTemplate.getAuthority(),
- metadataValueFromTemplate.getConfidence());
- }
- }
- }
+ itemService.populateWithTemplateItemMetadata(context, collection, template, item);
itemService.update(context, item);
// If configured, register identifiers (eg handle, DOI) now. This is typically used with the Show Identifiers
// submission step which previews minted handles and DOIs during the submission process. Default: false
+ // Additional check needed: if we are creating a new version of an existing item we skip the identifier
+ // generation here, as this will be performed when the new version is created in VersioningServiceImpl
if (DSpaceServicesFactory.getInstance().getConfigurationService()
- .getBooleanProperty("identifiers.submission.register", false)) {
+ .getBooleanProperty("identifiers.submission.register", false) && !isNewVersion) {
try {
// Get map of filters to use for identifier types, while the item is in progress
Map, Filter> filters = FilterUtils.getIdentifierFilters(true);
@@ -221,15 +181,6 @@ public WorkspaceItem create(Context context, Collection collection, UUID uuid, b
return workspaceItem;
}
- private Optional getDSpaceEntityType(DSpaceObject dSpaceObject) {
- return Objects.nonNull(dSpaceObject) ? dSpaceObject.getMetadata()
- .stream()
- .filter(x -> x.getMetadataField().toString('.')
- .equalsIgnoreCase("dspace.entity.type"))
- .findFirst()
- : Optional.empty();
- }
-
@Override
public WorkspaceItem create(Context c, WorkflowItem workflowItem) throws SQLException, AuthorizeException {
WorkspaceItem workspaceItem = workspaceItemDAO.create(c, new WorkspaceItem());
diff --git a/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java b/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java
index 65d0f25c3062..24a8f2ec2375 100644
--- a/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java
+++ b/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java
@@ -113,8 +113,9 @@ public boolean accept(File dir, String name) {
}
}
String vocabulariesPath = DSpaceServicesFactory.getInstance().getConfigurationService()
- .getProperty(
- "dspace.dir") + "/config/controlled-vocabularies/";
+ .getProperty("dspace.dir") +
+ File.separator + "config" +
+ File.separator + "controlled-vocabularies";
String[] xmlFiles = (new File(vocabulariesPath)).list(new xmlFilter());
List names = new ArrayList();
for (String filename : xmlFiles) {
@@ -252,6 +253,7 @@ public Choice getChoice(String authKey, String locale) {
@Override
public boolean isHierarchical() {
+ init();
return true;
}
diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java
index 9042a3a7f523..0528c0c20570 100644
--- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java
+++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java
@@ -59,7 +59,6 @@ public void disseminate(Context context, DSpaceObject dso, OutputStream out)
Bitstream cc = creativeCommonsService.getLicenseRdfBitstream((Item) dso);
if (cc != null) {
Utils.copy(bitstreamService.retrieve(context, cc), out);
- out.close();
}
}
}
diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java
index edb9d60a623e..cd26b4d19cee 100644
--- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java
+++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java
@@ -65,7 +65,6 @@ public void disseminate(Context context, DSpaceObject dso, OutputStream out)
Bitstream cc = creativeCommonsService.getLicenseTextBitstream((Item) dso);
if (cc != null) {
Utils.copy(bitstreamService.retrieve(context, cc), out);
- out.close();
}
}
}
diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java
index 75b884613db9..46858747870d 100644
--- a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java
+++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java
@@ -57,7 +57,6 @@ public void disseminate(Context context, DSpaceObject dso, OutputStream out)
if (licenseBs != null) {
Utils.copy(bitstreamService.retrieve(context, licenseBs), out);
- out.close();
}
}
}
diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java
index 7f6622841ba7..bd424598771c 100644
--- a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java
+++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java
@@ -432,31 +432,7 @@ public void ingest(Context context, DSpaceObject dso, List ml, boolean
//get what class of context this is
String contextClass = element.getAttributeValue("CONTEXTCLASS");
- ResourcePolicy rp = resourcePolicyService.create(context);
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
- // get reference to the element
- // Note: we are assuming here that there will only ever be ONE
- // element. Currently there are no known use cases for multiple.
- Element permsElement = element.getChild("Permissions", METSRights_NS);
- if (permsElement == null) {
- log.error("No element was found. Skipping this element.");
- continue;
- }
-
- if (element.getAttributeValue("rpName") != null) {
- rp.setRpName(element.getAttributeValue("rpName"));
- }
- try {
- if (element.getAttributeValue("start-date") != null) {
- rp.setStartDate(sdf.parse(element.getAttributeValue("start-date")));
- }
- if (element.getAttributeValue("end-date") != null) {
- rp.setEndDate(sdf.parse(element.getAttributeValue("end-date")));
- }
- } catch (ParseException ex) {
- log.error("Failed to parse embargo date. The date needs to be in the format 'yyyy-MM-dd'.", ex);
- }
+ ResourcePolicy rp = null;
//Check if this permission pertains to Anonymous users
if (ANONYMOUS_CONTEXTCLASS.equals(contextClass)) {
@@ -464,22 +440,23 @@ public void ingest(Context context, DSpaceObject dso, List ml, boolean
Group anonGroup = groupService.findByName(context, Group.ANONYMOUS);
if (anonGroup == null) {
throw new CrosswalkInternalException(
- "The DSpace database has not been properly initialized. The Anonymous Group is " +
- "missing from the database.");
+ "The DSpace database has not been properly initialized. The Anonymous Group is " +
+ "missing from the database.");
}
- rp.setGroup(anonGroup);
+ rp = resourcePolicyService.create(context, null, anonGroup);
} else if (ADMIN_CONTEXTCLASS.equals(contextClass)) {
// else if this permission declaration pertains to Administrators
// get DSpace Administrator group
Group adminGroup = groupService.findByName(context, Group.ADMIN);
if (adminGroup == null) {
throw new CrosswalkInternalException(
- "The DSpace database has not been properly initialized. The Administrator Group is " +
- "missing from the database.");
+ "The DSpace database has not been properly initialized. " +
+ "The Administrator Group is " +
+ "missing from the database.");
}
- rp.setGroup(adminGroup);
+ rp = resourcePolicyService.create(context, null, adminGroup);
} else if (GROUP_CONTEXTCLASS.equals(contextClass)) {
// else if this permission pertains to another DSpace group
try {
@@ -498,18 +475,17 @@ public void ingest(Context context, DSpaceObject dso, List ml, boolean
//if not found, throw an error -- user should restore group from the SITE AIP
if (group == null) {
throw new CrosswalkInternalException("Cannot restore Group permissions on object ("
- + "type=" + Constants.typeText[dso
- .getType()] + ", "
- + "handle=" + dso.getHandle() + ", "
- + "ID=" + dso.getID()
- + "). The Group named '" + groupName + "' is" +
- " missing from DSpace. "
- + "Please restore this group using the SITE " +
- "AIP, or recreate it.");
+ + "type=" + Constants.typeText[dso.getType()] + ", "
+ + "handle=" + dso.getHandle() + ", "
+ + "ID=" + dso.getID()
+ + "). The Group named '" + groupName + "' is" +
+ " missing from DSpace. "
+ + "Please restore this group using the SITE " +
+ "AIP, or recreate it.");
}
//assign group to policy
- rp.setGroup(group);
+ rp = resourcePolicyService.create(context, null, group);
} catch (PackageException pe) {
//A PackageException will only be thrown if translateDefaultGroupName() fails
//We'll just wrap it as a CrosswalkException and throw it upwards
@@ -535,25 +511,52 @@ public void ingest(Context context, DSpaceObject dso, List ml, boolean
//if not found, throw an error -- user should restore person from the SITE AIP
if (person == null) {
throw new CrosswalkInternalException("Cannot restore Person permissions on object ("
- + "type=" + Constants.typeText[dso
- .getType()] + ", "
- + "handle=" + dso.getHandle() + ", "
- + "ID=" + dso.getID()
- + "). The Person with email/netid '" +
- personEmail + "' is missing from DSpace. "
- + "Please restore this Person object using the " +
- "SITE AIP, or recreate it.");
+ + "type=" + Constants.typeText[dso.getType()] + ", "
+ + "handle=" + dso.getHandle() + ", "
+ + "ID=" + dso.getID()
+ + "). The Person with email/netid '" +
+ personEmail + "' is missing from DSpace. "
+ + "Please restore this Person object using the " +
+ "SITE AIP, or recreate it.");
}
- //assign person to the policy
- rp.setEPerson(person);
+ //create rp with the person
+ rp = resourcePolicyService.create(context, person, null);
} else {
log.error("Unrecognized CONTEXTCLASS: " + contextClass);
}
+ if (rp != null) {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+ // get reference to the element
+ // Note: we are assuming here that there will only ever be ONE
+ // element. Currently there are no known use cases for multiple.
+ Element permsElement = element.getChild("Permissions", METSRights_NS);
+ if (permsElement == null) {
+ log.error("No element was found. Skipping this element.");
+ continue;
+ }
+
+ if (element.getAttributeValue("rpName") != null) {
+ rp.setRpName(element.getAttributeValue("rpName"));
+ }
+ try {
+ if (element.getAttributeValue("start-date") != null) {
+ rp.setStartDate(sdf.parse(element.getAttributeValue("start-date")));
+ }
+ if (element.getAttributeValue("end-date") != null) {
+ rp.setEndDate(sdf.parse(element.getAttributeValue("end-date")));
+ }
+ } catch (ParseException ex) {
+ log.error("Failed to parse embargo date. The date needs to be in the format 'yyyy-MM-dd'.",
+ ex);
+ }
- //set permissions on policy add to list of policies
- rp.setAction(parsePermissions(permsElement));
- policies.add(rp);
+ //set permissions and type on policy and add to list of policies
+ rp.setAction(parsePermissions(permsElement));
+ rp.setRpType(ResourcePolicy.TYPE_CUSTOM);
+ policies.add(rp);
+ }
} //end if "Context" element
} //end for loop
diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/SubscriptionDsoMetadataForEmailCompose.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/SubscriptionDsoMetadataForEmailCompose.java
index 05fda2b97475..ad92018b2220 100644
--- a/dspace-api/src/main/java/org/dspace/content/crosswalk/SubscriptionDsoMetadataForEmailCompose.java
+++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/SubscriptionDsoMetadataForEmailCompose.java
@@ -49,7 +49,7 @@ public void disseminate(Context context, DSpaceObject dso, OutputStream out) thr
for (String actualMetadata : metadata) {
String[] splitted = actualMetadata.split("\\.");
String qualifier = null;
- if (splitted.length == 1) {
+ if (splitted.length == 3) {
qualifier = splitted[2];
}
var metadataValue = itemService.getMetadataFirstValue(item, splitted[0], splitted[1], qualifier, ANY);
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java b/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java
index 8c593da440d2..d5103868faff 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java
@@ -91,7 +91,7 @@ Iterator
- findByMetadataField(Context context, MetadataField metadataField,
* @param collectionUuids UUIDs of the collections to search.
* If none are provided, the entire repository will be searched.
* @param regexClause Syntactic expression used to query the database using a regular expression
- * (e.g.: "text_value ~ ?")
+ * (e.g.: "value ~ ?")
* @param offset The offset for the query
* @param limit Maximum number of items to return
* @return A list containing the items that match the provided criteria
@@ -162,7 +162,8 @@ Iterator
- findAllByCollection(Context context, Collection collection, Integ
* @return item count
* @throws SQLException if database error
*/
- int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn)
+ int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn,
+ boolean discoverable)
throws SQLException;
/**
@@ -179,7 +180,7 @@ int countItems(Context context, Collection collection, boolean includeArchived,
* @throws SQLException if database error
*/
int countItems(Context context, List collections, boolean includeArchived,
- boolean includeWithdrawn) throws SQLException;
+ boolean includeWithdrawn, boolean discoverable) throws SQLException;
/**
* Get all Items installed or withdrawn, discoverable, and modified since a Date.
@@ -214,7 +215,8 @@ Iterator
- findAll(Context context, boolean archived,
* @return count of items
* @throws SQLException if database error
*/
- int countItems(Context context, boolean includeArchived, boolean includeWithdrawn) throws SQLException;
+ int countItems(Context context, boolean includeArchived, boolean includeWithdrawn,
+ boolean discoverable) throws SQLException;
/**
* Count number of items from the specified submitter based on specific status flags
@@ -226,7 +228,8 @@ Iterator
- findAll(Context context, boolean archived,
* @return count of items
* @throws SQLException if database error
*/
- int countItems(Context context, EPerson submitter, boolean includeArchived, boolean includeWithdrawn)
+ int countItems(Context context, EPerson submitter, boolean includeArchived, boolean includeWithdrawn,
+ boolean discoverable)
throws SQLException;
/**
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java
index a3347a40ab93..51cf6c343ec3 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java
@@ -13,16 +13,21 @@
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.Root;
import org.dspace.content.Bitstream;
import org.dspace.content.Bitstream_;
+import org.dspace.content.Bundle;
+import org.dspace.content.Bundle_;
import org.dspace.content.Collection;
+import org.dspace.content.Collection_;
import org.dspace.content.Community;
import org.dspace.content.Item;
+import org.dspace.content.Item_;
import org.dspace.content.dao.BitstreamDAO;
import org.dspace.core.AbstractHibernateDSODAO;
import org.dspace.core.Constants;
@@ -78,14 +83,21 @@ public List findBitstreamsWithNoRecentChecksum(Context context) throw
@Override
public Iterator findByCommunity(Context context, Community community) throws SQLException {
- Query query = createQuery(context, "select b.id from Bitstream b " +
- "join b.bundles bitBundles " +
- "join bitBundles.items item " +
- "join item.collections itemColl " +
- "join itemColl.communities community " +
- "WHERE :community IN community");
-
- query.setParameter("community", community);
+ // Select UUID of all bitstreams, joining from Bitstream -> Bundle -> Item -> Collection -> Community
+ // to find all that exist under the given community.
+ CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UUID.class);
+ Root bitstreamRoot = criteriaQuery.from(Bitstream.class);
+ criteriaQuery.select(bitstreamRoot.get(Bitstream_.id));
+ // Joins from Bitstream -> Bundle -> Item -> Collection
+ Join joinBundle = bitstreamRoot.join(Bitstream_.bundles);
+ Join joinItem = joinBundle.join(Bundle_.items);
+ Join
- joinCollection = joinItem.join(Item_.collections);
+ // Where "community" is a member of the list of Communities linked by the collection(s)
+ criteriaQuery.where(criteriaBuilder.isMember(community, joinCollection.get(Collection_.COMMUNITIES)));
+
+ // Transform into a query object to execute
+ Query query = createQuery(context, criteriaQuery);
@SuppressWarnings("unchecked")
List uuids = query.getResultList();
return new UUIDIterator(context, uuids, Bitstream.class, this);
@@ -93,13 +105,20 @@ public Iterator findByCommunity(Context context, Community community)
@Override
public Iterator findByCollection(Context context, Collection collection) throws SQLException {
- Query query = createQuery(context, "select b.id from Bitstream b " +
- "join b.bundles bitBundles " +
- "join bitBundles.items item " +
- "join item.collections c " +
- "WHERE :collection IN c");
-
- query.setParameter("collection", collection);
+ // Select UUID of all bitstreams, joining from Bitstream -> Bundle -> Item -> Collection
+ // to find all that exist under the given collection.
+ CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UUID.class);
+ Root bitstreamRoot = criteriaQuery.from(Bitstream.class);
+ criteriaQuery.select(bitstreamRoot.get(Bitstream_.id));
+ // Joins from Bitstream -> Bundle -> Item
+ Join joinBundle = bitstreamRoot.join(Bitstream_.bundles);
+ Join joinItem = joinBundle.join(Bundle_.items);
+ // Where "collection" is a member of the list of Collections linked by the item(s)
+ criteriaQuery.where(criteriaBuilder.isMember(collection, joinItem.get(Item_.collections)));
+
+ // Transform into a query object to execute
+ Query query = createQuery(context, criteriaQuery);
@SuppressWarnings("unchecked")
List uuids = query.getResultList();
return new UUIDIterator(context, uuids, Bitstream.class, this);
@@ -107,12 +126,19 @@ public Iterator findByCollection(Context context, Collection collecti
@Override
public Iterator findByItem(Context context, Item item) throws SQLException {
- Query query = createQuery(context, "select b.id from Bitstream b " +
- "join b.bundles bitBundles " +
- "join bitBundles.items item " +
- "WHERE :item IN item");
-
- query.setParameter("item", item);
+ // Select UUID of all bitstreams, joining from Bitstream -> Bundle -> Item
+ // to find all that exist under the given item.
+ CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UUID.class);
+ Root bitstreamRoot = criteriaQuery.from(Bitstream.class);
+ criteriaQuery.select(bitstreamRoot.get(Bitstream_.id));
+ // Join from Bitstream -> Bundle
+ Join joinBundle = bitstreamRoot.join(Bitstream_.bundles);
+ // Where "item" is a member of the list of Items linked by the bundle(s)
+ criteriaQuery.where(criteriaBuilder.isMember(item, joinBundle.get(Bundle_.items)));
+
+ // Transform into a query object to execute
+ Query query = createQuery(context, criteriaQuery);
@SuppressWarnings("unchecked")
List uuids = query.getResultList();
return new UUIDIterator(context, uuids, Bitstream.class, this);
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java
index 4d9283bbec4d..eaf58fbb887a 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java
@@ -10,11 +10,11 @@
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Root;
import org.dspace.content.BitstreamFormat;
import org.dspace.content.BitstreamFormat_;
import org.dspace.content.dao.BitstreamFormatDAO;
@@ -119,7 +119,7 @@ public List findNonInternal(Context context) throws SQLExceptio
);
- List orderList = new LinkedList<>();
+ List orderList = new LinkedList<>();
orderList.add(criteriaBuilder.desc(bitstreamFormatRoot.get(BitstreamFormat_.supportLevel)));
orderList.add(criteriaBuilder.asc(bitstreamFormatRoot.get(BitstreamFormat_.shortDescription)));
criteriaQuery.orderBy(orderList);
@@ -142,13 +142,10 @@ public List findByFileExtension(Context context, String extensi
public List findAll(Context context, Class clazz) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class);
+ CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class);
Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class);
criteriaQuery.select(bitstreamFormatRoot);
-
- List orderList = new LinkedList<>();
- orderList.add(criteriaBuilder.asc(bitstreamFormatRoot.get(BitstreamFormat_.id)));
- criteriaQuery.orderBy(orderList);
+ criteriaQuery.orderBy(criteriaBuilder.asc(bitstreamFormatRoot.get(BitstreamFormat_.id)));
return list(context, criteriaQuery, false, BitstreamFormat.class, -1, -1);
}
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java
index c0ef6ea42fce..841da319f0b2 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java
@@ -12,13 +12,13 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
import org.dspace.authorize.ResourcePolicy;
import org.dspace.authorize.ResourcePolicy_;
import org.dspace.content.Collection;
@@ -71,12 +71,12 @@ public List findAll(Context context, MetadataField order, Integer li
query.append("SELECT c" +
" FROM Collection c" +
" left join c.metadata title on title.metadataField = :sortField and" +
- " title.dSpaceObject = c.id and" +
+ " title.dSpaceObject = c and" +
" title.place = (select min(internal.place) " +
"from c.metadata internal " +
"where internal.metadataField = :sortField and" +
- " internal.dSpaceObject = c.id)" +
- " ORDER BY LOWER(title.value)");
+ " internal.dSpaceObject = c)" +
+ " ORDER BY LOWER(CAST(title.value as string))");
Query hibernateQuery = createQuery(context, query.toString());
if (offset != null) {
hibernateQuery.setFirstResult(offset);
@@ -159,7 +159,8 @@ public List findAuthorizedByGroup(Context context, EPerson ePerson,
@Override
public List findCollectionsWithSubscribers(Context context) throws SQLException {
- return list(createQuery(context, "SELECT DISTINCT col FROM Subscription s join s.collection col"));
+ return list(createQuery(context, "SELECT DISTINCT c FROM Collection c JOIN Subscription s ON c.id = " +
+ "s.dSpaceObject"));
}
@Override
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java
index 7a3750485151..5712b898598e 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java
@@ -10,13 +10,13 @@
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
import org.dspace.authorize.ResourcePolicy;
import org.dspace.authorize.ResourcePolicy_;
import org.dspace.content.Community;
@@ -68,12 +68,12 @@ public List findAll(Context context, MetadataField sortField, Integer
queryBuilder.append("SELECT c" +
" FROM Community c" +
" left join c.metadata title on title.metadataField = :sortField and" +
- " title.dSpaceObject = c.id and" +
+ " title.dSpaceObject = c and" +
" title.place = (select min(internal.place) " +
"from c.metadata internal " +
"where internal.metadataField = :sortField and" +
- " internal.dSpaceObject = c.id)" +
- " ORDER BY LOWER(title.value)");
+ " internal.dSpaceObject = c)" +
+ " ORDER BY LOWER(CAST(title.value as string))");
Query query = createQuery(context, queryBuilder.toString());
if (offset != null) {
query.setFirstResult(offset);
@@ -108,13 +108,13 @@ public List findAllNoParent(Context context, MetadataField sortField)
queryBuilder.append("SELECT c" +
" FROM Community c" +
" left join c.metadata title on title.metadataField = :sortField and" +
- " title.dSpaceObject = c.id and" +
+ " title.dSpaceObject = c and" +
" title.place = (select min(internal.place) " +
"from c.metadata internal " +
"where internal.metadataField = :sortField and" +
- " internal.dSpaceObject = c.id)" +
+ " internal.dSpaceObject = c)" +
" WHERE c.parentCommunities IS EMPTY " +
- " ORDER BY LOWER(title.value)");
+ " ORDER BY LOWER(CAST(title.value as string))");
Query query = createQuery(context, queryBuilder.toString());
query.setParameter("sortField", sortField);
query.setHint("org.hibernate.cacheable", Boolean.TRUE);
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/EntityTypeDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/EntityTypeDAOImpl.java
index 489f4cd0667d..32af7ed35c31 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/EntityTypeDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/EntityTypeDAOImpl.java
@@ -10,11 +10,11 @@
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Order;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Order;
+import jakarta.persistence.criteria.Root;
import org.dspace.content.EntityType;
import org.dspace.content.EntityType_;
import org.dspace.content.dao.EntityTypeDAO;
@@ -59,9 +59,9 @@ public List getEntityTypesByNames(Context context, List name
@Override
public int countEntityTypesByNames(Context context, List names) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EntityType.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root entityTypeRoot = criteriaQuery.from(EntityType.class);
- criteriaQuery.select(entityTypeRoot);
+ criteriaQuery.select(criteriaBuilder.count(entityTypeRoot));
criteriaQuery.where(entityTypeRoot.get(EntityType_.LABEL).in(names));
return count(context, criteriaQuery, criteriaBuilder, entityTypeRoot);
}
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java
index 0f86107f0766..27f1b4607ef4 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java
@@ -15,15 +15,15 @@
import java.util.List;
import java.util.Objects;
import java.util.UUID;
-import javax.persistence.Query;
-import javax.persistence.TemporalType;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaBuilder.In;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import javax.persistence.criteria.Subquery;
+import jakarta.persistence.Query;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaBuilder.In;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
+import jakarta.persistence.criteria.Subquery;
import org.apache.logging.log4j.Logger;
import org.dspace.content.Collection;
import org.dspace.content.DSpaceObject_;
@@ -112,7 +112,7 @@ public Iterator
- findAll(Context context, boolean archived,
queryStr.append(" AND discoverable = :discoverable");
if (lastModified != null) {
- queryStr.append(" AND last_modified > :last_modified");
+ queryStr.append(" AND lastModified > :last_modified");
}
queryStr.append(" ORDER BY i.id");
@@ -223,7 +223,6 @@ public List
- findByMetadataQuery(Context context, List quer
queryPredicates, collectionUuids, regexClause);
criteriaQuery.where(criteriaBuilder.and(predicates.stream().toArray(Predicate[]::new)));
criteriaQuery.orderBy(criteriaBuilder.asc(itemRoot.get(DSpaceObject_.id)));
- criteriaQuery.groupBy(itemRoot.get(DSpaceObject_.id));
try {
return list(context, criteriaQuery, false, Item.class, limit, (int) offset);
} catch (Exception e) {
@@ -237,7 +236,7 @@ public long countForMetadataQuery(Context context, List queryPre
List collectionUuids, String regexClause) throws SQLException {
// Build the query infrastructure
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery
- criteriaQuery = getCriteriaQuery(criteriaBuilder, Item.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
// Select
Root
- itemRoot = criteriaQuery.from(Item.class);
// Apply the selected predicates
@@ -286,7 +285,7 @@ private List toPredicates(CriteriaBuilder criteriaBuilder, Criter
Subquery mvQuery = query.subquery(MetadataValue.class);
Root mvRoot = mvQuery.from(MetadataValue.class);
mvPredicates.add(criteriaBuilder.equal(
- mvRoot.get(MetadataValue_.D_SPACE_OBJECT), root.get(DSpaceObject_.ID)));
+ mvRoot.get(MetadataValue_.D_SPACE_OBJECT), root));
if (!predicate.getFields().isEmpty()) {
In inFields = criteriaBuilder.in(mvRoot.get(MetadataValue_.METADATA_FIELD));
@@ -329,11 +328,18 @@ public Iterator
- findByAuthorityValue(Context context, MetadataField metada
@Override
public Iterator
- findArchivedByCollection(Context context, Collection collection, Integer limit,
Integer offset) throws SQLException {
- Query query = createQuery(context,
- "select i.id from Item i join i.collections c " +
- "WHERE :collection IN c AND i.inArchive=:in_archive ORDER BY i.id");
- query.setParameter("collection", collection);
- query.setParameter("in_archive", true);
+ // Select UUID of all items which have this "collection" in their list of collections and are in_archive
+ CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UUID.class);
+ Root
- itemRoot = criteriaQuery.from(Item.class);
+ criteriaQuery.select(itemRoot.get(Item_.id));
+ criteriaQuery.where(criteriaBuilder.and(
+ criteriaBuilder.isTrue((itemRoot.get(Item_.inArchive))),
+ criteriaBuilder.isMember(collection, itemRoot.get(Item_.collections))));
+ criteriaQuery.orderBy(criteriaBuilder.asc(itemRoot.get((Item_.id))));
+
+ // Transform into a query object to execute
+ Query query = createQuery(context, criteriaQuery);
if (offset != null) {
query.setFirstResult(offset);
}
@@ -357,16 +363,15 @@ public Iterator
- findArchivedByCollectionExcludingOwning(Context context, C
criteriaBuilder.isMember(collection, itemRoot.get(Item_.collections)),
criteriaBuilder.isTrue(itemRoot.get(Item_.inArchive))));
criteriaQuery.orderBy(criteriaBuilder.asc(itemRoot.get(DSpaceObject_.id)));
- criteriaQuery.groupBy(itemRoot.get(DSpaceObject_.id));
return list(context, criteriaQuery, false, Item.class, limit, offset).iterator();
}
@Override
public int countArchivedByCollectionExcludingOwning(Context context, Collection collection) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery
- criteriaQuery = getCriteriaQuery(criteriaBuilder, Item.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root
- itemRoot = criteriaQuery.from(Item.class);
- criteriaQuery.select(itemRoot);
+ criteriaQuery.select(criteriaBuilder.count(itemRoot));
criteriaQuery.where(criteriaBuilder.and(
criteriaBuilder.notEqual(itemRoot.get(Item_.owningCollection), collection),
criteriaBuilder.isMember(collection, itemRoot.get(Item_.collections)),
@@ -376,9 +381,16 @@ public int countArchivedByCollectionExcludingOwning(Context context, Collection
@Override
public Iterator
- findAllByCollection(Context context, Collection collection) throws SQLException {
- Query query = createQuery(context,
- "select i.id from Item i join i.collections c WHERE :collection IN c ORDER BY i.id");
- query.setParameter("collection", collection);
+ // Select UUID of all items which have this "collection" in their list of collections
+ CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UUID.class);
+ Root
- itemRoot = criteriaQuery.from(Item.class);
+ criteriaQuery.select(itemRoot.get(Item_.id));
+ criteriaQuery.where(criteriaBuilder.isMember(collection, itemRoot.get(Item_.collections)));
+ criteriaQuery.orderBy(criteriaBuilder.asc(itemRoot.get((Item_.id))));
+
+ // Transform into a query object to execute
+ Query query = createQuery(context, criteriaQuery);
@SuppressWarnings("unchecked")
List uuids = query.getResultList();
return new UUIDIterator
- (context, uuids, Item.class, this);
@@ -387,10 +399,16 @@ public Iterator
- findAllByCollection(Context context, Collection collection
@Override
public Iterator
- findAllByCollection(Context context, Collection collection, Integer limit, Integer offset)
throws SQLException {
- Query query = createQuery(context,
- "select i.id from Item i join i.collections c WHERE :collection IN c ORDER BY i.id");
- query.setParameter("collection", collection);
+ // Build Query to select UUID of all items which have this "collection" in their list of collections.
+ CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UUID.class);
+ Root
- itemRoot = criteriaQuery.from(Item.class);
+ criteriaQuery.select(itemRoot.get(Item_.id));
+ criteriaQuery.where(criteriaBuilder.isMember(collection, itemRoot.get(Item_.collections)));
+ criteriaQuery.orderBy(criteriaBuilder.asc(itemRoot.get((Item_.id))));
+ // Transform into a query object to execute
+ Query query = createQuery(context, criteriaQuery);
if (offset != null) {
query.setFirstResult(offset);
}
@@ -403,30 +421,38 @@ public Iterator
- findAllByCollection(Context context, Collection collection
}
@Override
- public int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn)
+ public int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn,
+ boolean discoverable)
throws SQLException {
- Query query = createQuery(context,
- "select count(i) from Item i join i.collections c " +
- "WHERE :collection IN c AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn");
- query.setParameter("collection", collection);
- query.setParameter("in_archive", includeArchived);
- query.setParameter("withdrawn", includeWithdrawn);
-
- return count(query);
+ // Build query to select all Items have this "collection" in their list of collections
+ // AND also have the inArchive or isWithdrawn set as specified
+ CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
+ Root
- itemRoot = criteriaQuery.from(Item.class);
+ criteriaQuery.select(criteriaBuilder.count(itemRoot));
+ criteriaQuery.where(criteriaBuilder.and(
+ criteriaBuilder.equal(itemRoot.get(Item_.inArchive), includeArchived),
+ criteriaBuilder.equal(itemRoot.get(Item_.withdrawn), includeWithdrawn),
+ criteriaBuilder.equal(itemRoot.get(Item_.discoverable), discoverable),
+ criteriaBuilder.isMember(collection, itemRoot.get(Item_.collections))));
+ // Execute and return count
+ return count(context, criteriaQuery, criteriaBuilder, itemRoot);
}
@Override
public int countItems(Context context, List collections, boolean includeArchived,
- boolean includeWithdrawn) throws SQLException {
+ boolean includeWithdrawn, boolean discoverable) throws SQLException {
if (collections.size() == 0) {
return 0;
}
Query query = createQuery(context, "select count(distinct i) from Item i " +
"join i.collections collection " +
- "WHERE collection IN (:collections) AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn");
+ "WHERE collection IN (:collections) AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn AND " +
+ "discoverable=:discoverable");
query.setParameter("collections", collections);
query.setParameter("in_archive", includeArchived);
query.setParameter("withdrawn", includeWithdrawn);
+ query.setParameter("discoverable", discoverable);
return count(query);
}
@@ -449,24 +475,29 @@ public int countRows(Context context) throws SQLException {
}
@Override
- public int countItems(Context context, boolean includeArchived, boolean includeWithdrawn) throws SQLException {
+ public int countItems(Context context, boolean includeArchived, boolean includeWithdrawn,
+ boolean discoverable) throws SQLException {
Query query = createQuery(context,
"SELECT count(*) FROM Item i " +
- "WHERE i.inArchive=:in_archive AND i.withdrawn=:withdrawn");
+ "WHERE i.inArchive=:in_archive AND i.withdrawn=:withdrawn AND discoverable=:discoverable");
query.setParameter("in_archive", includeArchived);
query.setParameter("withdrawn", includeWithdrawn);
+ query.setParameter("discoverable", discoverable);
return count(query);
}
@Override
- public int countItems(Context context, EPerson submitter, boolean includeArchived, boolean includeWithdrawn)
+ public int countItems(Context context, EPerson submitter, boolean includeArchived, boolean includeWithdrawn,
+ boolean discoverable)
throws SQLException {
Query query = createQuery(context,
"SELECT count(*) FROM Item i join i.submitter submitter " +
- "WHERE i.inArchive=:in_archive AND i.withdrawn=:withdrawn AND submitter = :submitter");
+ "WHERE i.inArchive=:in_archive AND i.withdrawn=:withdrawn AND submitter = :submitter AND " +
+ "discoverable=:discoverable");
query.setParameter("submitter", submitter);
query.setParameter("in_archive", includeArchived);
query.setParameter("withdrawn", includeWithdrawn);
+ query.setParameter("discoverable", discoverable);
return count(query);
}
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java
index 512e4879bb2e..3bd0407395a5 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java
@@ -12,12 +12,12 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.Root;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
import org.dspace.content.MetadataField;
@@ -159,7 +159,7 @@ public List findAll(Context context, Class clazz)
Join join = metadataFieldRoot.join("metadataSchema");
criteriaQuery.select(metadataFieldRoot);
- List orderList = new LinkedList<>();
+ List orderList = new LinkedList<>();
orderList.add(criteriaBuilder.asc(join.get(MetadataSchema_.name)));
orderList.add(criteriaBuilder.asc(metadataFieldRoot.get(MetadataField_.element)));
orderList.add(criteriaBuilder.asc(metadataFieldRoot.get(MetadataField_.qualifier)));
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java
index 71eb487b8395..4630bed90b16 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java
@@ -10,11 +10,11 @@
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Root;
import org.dspace.content.MetadataSchema;
import org.dspace.content.MetadataSchema_;
import org.dspace.content.dao.MetadataSchemaDAO;
@@ -63,7 +63,7 @@ public List findAll(Context context, Class clazz) throws SQLExce
Root metadataSchemaRoot = criteriaQuery.from(MetadataSchema.class);
criteriaQuery.select(metadataSchemaRoot);
- List orderList = new ArrayList<>();
+ List orderList = new ArrayList<>();
orderList.add(criteriaBuilder.asc(metadataSchemaRoot.get(MetadataSchema_.id)));
criteriaQuery.orderBy(orderList);
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java
index f37ced9ab7d4..dc624c98c6aa 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java
@@ -10,12 +10,12 @@
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.Root;
import org.dspace.content.MetadataField;
import org.dspace.content.MetadataField_;
import org.dspace.content.MetadataValue;
@@ -53,7 +53,7 @@ public Iterator findItemValuesByFieldAndValue(Context context,
MetadataField metadataField, String value)
throws SQLException {
String queryString = "SELECT m from MetadataValue m " +
- "join Item i on m.dSpaceObject = i.id where m.metadataField.id = :metadata_field_id " +
+ "join Item i on m.dSpaceObject = i where m.metadataField.id = :metadata_field_id " +
"and m.value = :text_value";
Query query = createQuery(context, queryString);
query.setParameter("metadata_field_id", metadataField.getID());
@@ -84,7 +84,7 @@ public void deleteByMetadataField(Context context, MetadataField metadataField)
public MetadataValue getMinimum(Context context, int metadataFieldId)
throws SQLException {
String queryString = "SELECT m FROM MetadataValue m JOIN FETCH m.metadataField WHERE m.metadataField.id = " +
- ":metadata_field_id ORDER BY text_value";
+ ":metadata_field_id ORDER BY value";
Query query = createQuery(context, queryString);
query.setParameter("metadata_field_id", metadataFieldId);
query.setMaxResults(1);
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ProcessDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ProcessDAOImpl.java
index c243352a629b..23e78acf5eec 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ProcessDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ProcessDAOImpl.java
@@ -14,11 +14,11 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
import org.apache.commons.lang3.StringUtils;
import org.dspace.content.ProcessStatus;
import org.dspace.content.dao.ProcessDAO;
@@ -75,9 +75,9 @@ public List findAll(Context context, int limit, int offset) throws SQLE
public int countRows(Context context) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Process.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root processRoot = criteriaQuery.from(Process.class);
- criteriaQuery.select(processRoot);
+ criteriaQuery.select(criteriaBuilder.count(processRoot));
return count(context, criteriaQuery, criteriaBuilder, processRoot);
@@ -143,9 +143,9 @@ public int countTotalWithParameters(Context context, ProcessQueryParameterContai
throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Process.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root processRoot = criteriaQuery.from(Process.class);
- criteriaQuery.select(processRoot);
+ criteriaQuery.select(criteriaBuilder.count(processRoot));
addProcessQueryParameters(processQueryParameterContainer, criteriaBuilder, criteriaQuery, processRoot);
return count(context, criteriaQuery, criteriaBuilder, processRoot);
@@ -160,7 +160,7 @@ public List findByUser(Context context, EPerson user, int limit, int of
criteriaQuery.select(processRoot);
criteriaQuery.where(criteriaBuilder.equal(processRoot.get(Process_.E_PERSON), user));
- List orderList = new LinkedList<>();
+ List orderList = new LinkedList<>();
orderList.add(criteriaBuilder.desc(processRoot.get(Process_.PROCESS_ID)));
criteriaQuery.orderBy(orderList);
@@ -170,10 +170,10 @@ public List findByUser(Context context, EPerson user, int limit, int of
@Override
public int countByUser(Context context, EPerson user) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Process.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root processRoot = criteriaQuery.from(Process.class);
- criteriaQuery.select(processRoot);
+ criteriaQuery.select(criteriaBuilder.count(processRoot));
criteriaQuery.where(criteriaBuilder.equal(processRoot.get(Process_.E_PERSON), user));
return count(context, criteriaQuery, criteriaBuilder, processRoot);
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipDAOImpl.java
index e2f84bc1cb64..43bbc15c31b8 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipDAOImpl.java
@@ -12,13 +12,13 @@
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
-import javax.persistence.Query;
-import javax.persistence.Tuple;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.Query;
+import jakarta.persistence.Tuple;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
import org.dspace.content.Item;
import org.dspace.content.Item_;
import org.dspace.content.Relationship;
@@ -167,9 +167,9 @@ public int countByItem(
Context context, Item item, boolean excludeTilted, boolean excludeNonLatest
) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Relationship.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root relationshipRoot = criteriaQuery.from(Relationship.class);
- criteriaQuery.select(relationshipRoot);
+ criteriaQuery.select(criteriaBuilder.count(relationshipRoot));
criteriaQuery.where(
criteriaBuilder.or(
@@ -355,9 +355,9 @@ public List findByTypeName(Context context, String typeName, Integ
public int countByRelationshipType(Context context, RelationshipType relationshipType) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Relationship.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root relationshipRoot = criteriaQuery.from(Relationship.class);
- criteriaQuery.select(relationshipRoot);
+ criteriaQuery.select(criteriaBuilder.count(relationshipRoot));
criteriaQuery
.where(criteriaBuilder.equal(relationshipRoot.get(Relationship_.relationshipType), relationshipType));
return count(context, criteriaQuery, criteriaBuilder, relationshipRoot);
@@ -366,9 +366,9 @@ public int countByRelationshipType(Context context, RelationshipType relationshi
@Override
public int countRows(Context context) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Relationship.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root relationshipRoot = criteriaQuery.from(Relationship.class);
- criteriaQuery.select(relationshipRoot);
+ criteriaQuery.select(criteriaBuilder.count(relationshipRoot));
return count(context, criteriaQuery, criteriaBuilder, relationshipRoot);
}
@@ -377,9 +377,9 @@ public int countByItemAndRelationshipType(
Context context, Item item, RelationshipType relationshipType, boolean isLeft, boolean excludeNonLatest
) throws SQLException {
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Relationship.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root relationshipRoot = criteriaQuery.from(Relationship.class);
- criteriaQuery.select(relationshipRoot);
+ criteriaQuery.select(criteriaBuilder.count(relationshipRoot));
if (isLeft) {
criteriaQuery.where(
@@ -407,8 +407,9 @@ public int countByTypeName(Context context, String typeName)
ids.add(relationshipType.getID());
}
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
- CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Relationship.class);
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root relationshipRoot = criteriaQuery.from(Relationship.class);
+ criteriaQuery.select(criteriaBuilder.count(relationshipRoot));
criteriaQuery.where(relationshipRoot.get(Relationship_.relationshipType).in(ids));
return count(context, criteriaQuery, criteriaBuilder, relationshipRoot);
}
@@ -417,14 +418,14 @@ public int countByTypeName(Context context, String typeName)
public List findByItemAndRelationshipTypeAndList(Context context, UUID focusUUID,
RelationshipType relationshipType, List items, boolean isLeft,
int offset, int limit) throws SQLException {
- String side = isLeft ? "left_id" : "right_id";
- String otherSide = !isLeft ? "left_id" : "right_id";
+ String side = isLeft ? "leftItem.id" : "rightItem.id";
+ String otherSide = !isLeft ? "leftItem.id" : "rightItem.id";
Query query = createQuery(context, "FROM " + Relationship.class.getSimpleName() +
- " WHERE type_id = (:typeId) " +
+ " WHERE relationshipType = :type " +
"AND " + side + " = (:focusUUID) " +
"AND " + otherSide + " in (:list) " +
"ORDER BY id");
- query.setParameter("typeId", relationshipType.getID());
+ query.setParameter("type", relationshipType);
query.setParameter("focusUUID", focusUUID);
query.setParameter("list", items);
return list(query, limit, offset);
@@ -433,14 +434,14 @@ public List findByItemAndRelationshipTypeAndList(Context context,
@Override
public int countByItemAndRelationshipTypeAndList(Context context, UUID focusUUID, RelationshipType relationshipType,
List items, boolean isLeft) throws SQLException {
- String side = isLeft ? "left_id" : "right_id";
- String otherSide = !isLeft ? "left_id" : "right_id";
+ String side = isLeft ? "leftItem.id" : "rightItem.id";
+ String otherSide = !isLeft ? "leftItem.id" : "rightItem.id";
Query query = createQuery(context, "SELECT count(*) " +
"FROM " + Relationship.class.getSimpleName() +
- " WHERE type_id = (:typeId) " +
+ " WHERE relationshipType = :type " +
"AND " + side + " = (:focusUUID) " +
"AND " + otherSide + " in (:list)");
- query.setParameter("typeId", relationshipType.getID());
+ query.setParameter("type", relationshipType);
query.setParameter("focusUUID", focusUUID);
query.setParameter("list", items);
return count(query);
diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipTypeDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipTypeDAOImpl.java
index 375ac88954e7..6733329ec40c 100644
--- a/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipTypeDAOImpl.java
+++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipTypeDAOImpl.java
@@ -10,10 +10,10 @@
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Root;
import org.dspace.content.EntityType;
import org.dspace.content.RelationshipType;
import org.dspace.content.RelationshipType_;
@@ -95,7 +95,7 @@ public List findByEntityType(Context context, EntityType entit
.equal(relationshipTypeRoot.get(RelationshipType_.rightType), entityType)
)
);
- List orderList = new LinkedList<>();
+ List